<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2099071902862729606</id><updated>2026-10-04T13:09:28.721-07:00</updated><category term="adsense"/><category term="class"/><category term="geotagging"/><category term="python"/><category term="researchtools"/><title type='text'>Kurt Schwehr&#39;s more recent blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>174</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-5941741409646486155</id><published>2026-09-08T09:02:43.370-07:00</published><updated>2026-09-08T09:02:43.370-07:00</updated><title type='text'>Surprised by the surprise about LLMs and agents</title><content type='html'>&lt;p&gt;Two things recently surprised me in the world of LLMs and agent harnesses. My surprise is that these people are surprised by what they found.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Steve Gibson and Leo Laporte were surprised that agents are just a stream of tokens with tool usage and other things are just tokens in the stream, which are just hints.&lt;/li&gt;&lt;li&gt;OpenAI, Anthropic, and others are surprised that LLMs + harnesses under test escaped and cause trouble in multiple rounds.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;First, but newer,&amp;nbsp;&lt;a href=&quot;https://www.grc.com/sn/sn-1093-notes.pdf&quot;&gt;SN 1093&lt;/a&gt;&amp;nbsp;(Security Now) has a section &quot;Tokens in the Stream&quot; talking about&amp;nbsp;&lt;a href=&quot;https://role-confusion.github.io/&quot;&gt;Prompt Injection as Role Confusion&lt;/a&gt;. I am surprised by Steve and Leos&#39; surprise. Why? LLMs are just token streams and all this interaction is just convention. It was pretty obvious from the papers that Steve has said he has been reading, listening to&amp;nbsp;Andrej Karpathy&#39;s lectures, and just observing these things how the model works. I have hated this phrase when I heard it in my graduate classes, but now I&#39;m going to say it: &quot;It obviously follows&quot; that these things are a security catastrophe where we can do no better than train out known attacks and whack-a-mole on bad patterns in the harnesses. Think SQL injections, but worse as there very limited boundaries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, people testing new models should always assume the worst and there are established ways to handle the worse. If you are testing a new model trained on the internet, it has all of the tricks and bad things on the internet for security holes, side channels, and the likes. Humans have been writing about spy-versus-spy and the like for thousands of years. Every silly hack that ever has been written about is in their training dataset. That includes side channels like blinking LEDs, pulsing power usage, vibration, skewing timings, writing data in odd places (e.g., DNS records, filename paths, metadata fields, steganography). Heck, I baked metadata into file name paths for Mars mission data files: the path to a file told you the spacecraft, the sensor, the sensor settings, the processing type, when it was collected, and more all just by parsing the full file path. These machines have IRC logs from hacking sessions. They have archives of CVEs, CWEs, and more. They probably have scrapings of the old rootshell dot org that I used back in the 90s. And they have trained on ridiculous amounts of source code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to test a new LLM, then you should really secure it. Hearing about the mistakes that the testers make is more surprising to me than anything. My not test in on a system that is physically disconnected the world during testing? Separate the network write lines and use a read only optical serial tap to follow the machines progress. When you are done with the test, power down the system, scrub the disks, BIOSes, and anything else the system could mutate. Treat all the read data as toxic and &quot;red shell&quot; it when inspecting it. It&#39;s not hard to create some really nasty stuff. For example, I have unintentionally created image files during fuzzing that took down the entire machine it was on if the desktop system ever touched the file (thank you OS for being helpful and scanning all new files so you are ready to help me search for them).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess what is really old is new. Sigh.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Written without aid of AI.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/5941741409646486155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/09/surprised-by-surprise-about-llms-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/5941741409646486155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/5941741409646486155'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/09/surprised-by-surprise-about-llms-and.html' title='Surprised by the surprise about LLMs and agents'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-8100795729980134511</id><published>2026-08-03T09:12:02.637-07:00</published><updated>2026-08-03T09:12:02.637-07:00</updated><title type='text'>LLMs aren&#39;t so smart</title><content type='html'>&lt;p&gt;&amp;nbsp;I&#39;m working on updating my noaadata packages using spec-driven development (SDD). This stuff is definitely got a ways to go on smarts. It&#39;s doing plenty very well, but then it did this where it changed &quot;Viet Nam&quot; to &quot;Viet Name&quot; rather than &quot;Vietnam&quot;. Sigh. I fixed it in&amp;nbsp;&lt;a href=&quot;https://github.com/schwehr/noaadata/commit/72338791f7a47ed5205d1484eddb9830bd1496a7&quot;&gt;7233879&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;--- a/data/mmsi_prefix.sql
+++ b/data/mmsi_prefix.sql
@@ -203,7 +203,7 @@ INSERT INTO &quot;mmsi_prefix&quot; VALUES(565,&#39;Singapore (Republic of)&#39;,&#39;Singapore&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(567,&#39;Thailand&#39;,&#39;Thailand&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(570,&#39;Tonga (Kingdom of)&#39;,&#39;Tonga&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(572,&#39;Tuvalu&#39;,&#39;Tuvalu&#39;);
-INSERT INTO &quot;mmsi_prefix&quot; VALUES(574,&#39;Viet Nam (Socialist Republic of)&#39;,&#39;Viet Nam&#39;);
+INSERT INTO &quot;mmsi_prefix&quot; VALUES(574,&#39;Viet Name (Socialist Republic of)&#39;,&#39;Viet Name&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(576,&#39;Vanuatu (Republic of)&#39;,&#39;Vanuatu&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(578,&#39;Wallis and Futuna Islands&#39;,&#39;Wallis and Futuna Islands&#39;);
 INSERT INTO &quot;mmsi_prefix&quot; VALUES(601,&#39;South Africa (Republic of)&#39;,&#39;South Africa&#39;);
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/8100795729980134511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/08/llms-arent-so-smart.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8100795729980134511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8100795729980134511'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/08/llms-arent-so-smart.html' title='LLMs aren&#39;t so smart'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-7843778627721083394</id><published>2026-07-21T09:30:11.743-07:00</published><updated>2026-07-21T09:30:11.743-07:00</updated><title type='text'>BitVector 0.0.4 - pylint focused</title><content type='html'>&lt;p&gt;I&#39;m learning lots. I&#39;d love feedback and suggestions from the python community.&lt;/p&gt;&lt;p&gt;AI generated summary:&lt;/p&gt;&lt;p&gt;The &lt;response-element class=&quot;&quot; ng-version=&quot;0.0.0-PLACEHOLDER&quot;&gt;&lt;link-block _nghost-ng-c2614856368=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;a _ngcontent-ng-c2614856368=&quot;&quot; _nghost-ng-c2334959374=&quot;&quot; class=&quot;ng-star-inserted&quot; data-hveid=&quot;0&quot; data-ved=&quot;0CAAQ_4QMahcKEwjcsIm-1-OVAxUAAAAAHQAAAAAQFA&quot; decode-data-ved=&quot;1&quot; externallink=&quot;&quot; href=&quot;https://github.com/schwehr/bitvector-modern/releases/tag/v0.0.4&quot; jslog=&quot;197247;track:generic_click,impression,attention;BardVeMetadataKey:[[&amp;quot;r_ebf50769250063e8&amp;quot;,&amp;quot;c_55787fffa638fd5c&amp;quot;,null,&amp;quot;rc_61e2bb09c3cb6cb9&amp;quot;,null,null,&amp;quot;en&amp;quot;,null,1,null,null,1,0]]&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;v0.0.4 release of bitvector-modern&lt;/a&gt;&lt;/link-block&gt;&lt;/response-element&gt; primarily focuses on extensive code cleanup, linter adherence, and testing improvements. A major portion of the updates involves setting up &lt;code data-index-in-node=&quot;179&quot; data-path-to-node=&quot;0&quot;&gt;pylint&lt;/code&gt; configurations (including the &lt;code data-index-in-node=&quot;216&quot; data-path-to-node=&quot;0&quot;&gt;pylint-pytest&lt;/code&gt; plugin) and refactoring code across the repository to address linter rules—such as updating function/class docstrings, switching to &lt;code data-index-in-node=&quot;362&quot; data-path-to-node=&quot;0&quot;&gt;f-strings&lt;/code&gt; and &lt;code data-index-in-node=&quot;376&quot; data-path-to-node=&quot;0&quot;&gt;with&lt;/code&gt; statements, simplifying chained comparisons, and cleaning up break, return, and raise statements. Additionally, the release enhances overall quality by expanding unit test coverage for rotation logic, bit shifts, and &lt;code data-index-in-node=&quot;598&quot; data-path-to-node=&quot;0&quot;&gt;BitVector&lt;/code&gt; methods such as &lt;code data-index-in-node=&quot;624&quot; data-path-to-node=&quot;0&quot;&gt;reset()&lt;/code&gt;, &lt;code data-index-in-node=&quot;633&quot; data-path-to-node=&quot;0&quot;&gt;__int__&lt;/code&gt;, &lt;code data-index-in-node=&quot;642&quot; data-path-to-node=&quot;0&quot;&gt;__getitem__&lt;/code&gt;, and &lt;code data-index-in-node=&quot;659&quot; data-path-to-node=&quot;0&quot;&gt;__setitem__&lt;/code&gt;, while resolving a bug related to slice assignment length calculations with negative start indices.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/7843778627721083394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/bitvector-004-pylint-focused.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7843778627721083394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7843778627721083394'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/bitvector-004-pylint-focused.html' title='BitVector 0.0.4 - pylint focused'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-3415348088011134263</id><published>2026-07-19T12:05:02.645-07:00</published><updated>2026-07-19T12:05:02.645-07:00</updated><title type='text'>bitvector-modern release 0.0.3</title><content type='html'>&lt;p&gt;&amp;nbsp;I just did the first proper release of &lt;a href=&quot;https://github.com/schwehr/bitvector-modern&quot;&gt;bitvector-modern&lt;/a&gt; with version 0.0.3. I hadn&#39;t setup 2 factor authentication (2FA) for my &lt;a href=&quot;https://pypi.org/user/goatbar/&quot;&gt;personal PyPI identity&lt;/a&gt;, but now I have so I can actually send updates out. I have been out of town with only mobile phone access to the internet, so I have been doing a bunch of updates to the package via&amp;nbsp;&lt;a href=&quot;https://jules.google.com/&quot;&gt;Google Jules&lt;/a&gt;. That process went really well in general. I had some trouble getting it to do more ambitious changes line adding mmap and numpy based implementations, but you should see from release notes that there were plenty of successes.&lt;/p&gt;&lt;p&gt;Sadly, I did the 0.0.2 release just before this incorrectly, so that&#39;s where the changes are listed, but that triggered a 0.0.1 pypi release. I could yank it, but I don&#39;t think I need to as nothing is broken. The changes for 0.0.3 are in 0.0.1 on pypi.&lt;/p&gt;&lt;p&gt;I wouldn&#39;t recommend using bitvector-modern now for anything other than experimental work as I intend to rework the API in a few intrusive ways. Top of the list is simplifying &lt;b&gt;__init__&lt;/b&gt;&amp;nbsp;and putting the extra functionality into class methods of the for &lt;b&gt;from_&lt;/b&gt;. I have already removed the filename and filepointer args from &lt;b&gt;__init__&lt;/b&gt;, but I have yet to add back file reading outside of&amp;nbsp;&lt;b&gt;__init__&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;At this point, there are quite a few performance improvements over the old library. For starters, I switched the &lt;b&gt;array.array&lt;/b&gt; storage from 16-bit to 64-bit blocks. This means that BitVectors smaller than 48-bits will take more storage, but that should not be a problem unless folks are working with large numbers of very small bitvectors that have to remain in memory. With the in-progress&amp;nbsp;&lt;a href=&quot;https://typing.python.org/en/latest/spec/protocol.html&quot;&gt;Protocol class&lt;/a&gt;&amp;nbsp;work, that issue should be mitigated as the package should be able to let the user pick an implementation that works best with their use case.&lt;/p&gt;&lt;p&gt;I hope to start working on my old noaadata package soon and port it to bitvector-modern. I&#39;m excited for the increase performance and improved usability.&lt;/p&gt;&lt;p&gt;The release:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/bitvector-modern/0.0.3/&quot;&gt;https://pypi.org/project/bitvector-modern/0.0.3/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/releases/tag/v0.0.3&quot;&gt;https://github.com/schwehr/bitvector-modern/releases/tag/v0.0.3&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The detailed release notes are here:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/compare/v0.0.1...v0.0.3&quot;&gt;https://github.com/schwehr/bitvector-modern/compare/v0.0.1...v0.0.3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/releases/tag/v0.0.2&quot;&gt;https://github.com/schwehr/bitvector-modern/releases/tag/v0.0.2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;From the 0.0.2 release notes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;background-color: white; box-sizing: border-box; color: #1f2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;docs: add Code of Conduct by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/33/hovercard&quot; data-id=&quot;4833875061&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/33&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/33&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#33&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;style(docs): format CODE_OF_CONDUCT.md with mdformat by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/35/hovercard&quot; data-id=&quot;4833927489&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/35&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/35&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#35&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;test(properties): add hypothesis property-based testing and fix &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;iadd&lt;/span&gt; padding bug by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/44/hovercard&quot; data-id=&quot;4848365374&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/44&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/44&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#44&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;ci(github): add zizmor static analysis of GitHub Actions by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/46/hovercard&quot; data-id=&quot;4850745303&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/46&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/46&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#46&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;refactor: convert asserts to ValueErrors and add bandit check by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/52/hovercard&quot; data-id=&quot;4859660574&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/52&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/52&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#52&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;ci: remove osv-scanner workflow by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/54/hovercard&quot; data-id=&quot;4862734970&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/54&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/54&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#54&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;⚡ perf: optimize &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;runs&lt;/code&gt; to avoid unnecessary list allocation by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/55/hovercard&quot; data-id=&quot;4862824260&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/55&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/55&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#55&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;🧹 Refactor complex type ignoring map into list comprehension by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/57/hovercard&quot; data-id=&quot;4862845551&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/57&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/57&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#57&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;🧹 [Code Health] Remove commented-out code in BitVector.py by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/58/hovercard&quot; data-id=&quot;4862850536&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/58&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/58&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#58&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;⚡ Optimize divide_into_two to use native slicing by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/56/hovercard&quot; data-id=&quot;4862838600&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/56&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/56&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#56&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;⚡ Optimize integer conversion using bitwise shifts by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/59/hovercard&quot; data-id=&quot;4862867050&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/59&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/59&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#59&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;⚡ [Performance] Optimize string concatenation in &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;_readblock&lt;/code&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/60/hovercard&quot; data-id=&quot;4862900759&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/60&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/60&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#60&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;🔒 Use cryptographically secure pseudo-random number generator by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/61/hovercard&quot; data-id=&quot;4862913051&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/61&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/61&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#61&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;docs: add mkdocs and initial documentation outline by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/65/hovercard&quot; data-id=&quot;4873523958&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/65&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/65&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#65&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;chore: add .editorconfig file by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/68/hovercard&quot; data-id=&quot;4874116606&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/68&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/68&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#68&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Add &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;slots&lt;/span&gt; to BitVector class by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/70/hovercard&quot; data-id=&quot;4874699344&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/70&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/70&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#70&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Create BitVectorProtocol by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/67/hovercard&quot; data-id=&quot;4874039378&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/67&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/67&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#67&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Migrate BitVector to use 64-bit array (Q type) by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/71/hovercard&quot; data-id=&quot;4877587526&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/71&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/71&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#71&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;feat: add py.typed marker for PEP 561 compliance by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/75/hovercard&quot; data-id=&quot;4877897077&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/75&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/75&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#75&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;fix: resolve &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;hexlist&lt;/code&gt; type collision in BitVector constructor by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/78/hovercard&quot; data-id=&quot;4891654329&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/78&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/78&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#78&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor BitVector array type &quot;Q&quot; to a constant ARRAY_TYPE by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/81/hovercard&quot; data-id=&quot;4894162039&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/81&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/81&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#81&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Remove list option from self.vector in BitVector by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/82/hovercard&quot; data-id=&quot;4898410619&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/82&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/82&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#82&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Change divide_into_two to return a tuple instead of a list by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/86/hovercard&quot; data-id=&quot;4902656586&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/86&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/86&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#86&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor: Rename local variable intVal to int_val by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/85/hovercard&quot; data-id=&quot;4902565423&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/85&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/85&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#85&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Rename _getsize to &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;len&lt;/span&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/87/hovercard&quot; data-id=&quot;4902831275&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/87&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/87&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#87&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;build(deps): bump astral-sh/setup-uv from e58605a9b6da7c637471fab8847a5e5a6b8df081 to d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/dependabot/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/dependabot&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@dependabot&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/83/hovercard&quot; data-id=&quot;4901810423&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/83&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/83&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#83&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor BitVector to use &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;getitem&lt;/span&gt; instead of _getbit by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/88/hovercard&quot; data-id=&quot;4902836088&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/88&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/88&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#88&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Optimize BitVector.&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;eq&lt;/span&gt; using zip by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/95/hovercard&quot; data-id=&quot;4903434649&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/95&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/95&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#95&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;gf_MI&lt;/code&gt; to return f-string instead of string tuple by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/97/hovercard&quot; data-id=&quot;4910825048&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/97&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/97&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#97&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;style: Rename &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;reverseList&lt;/code&gt; to &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;reverse_list&lt;/code&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/98/hovercard&quot; data-id=&quot;4910933302&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/98&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/98&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#98&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Simplify is_power_of_2_sparse conditional by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/99/hovercard&quot; data-id=&quot;4910980554&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/99&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/99&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#99&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor tuple return syntax in divide_into_two by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/100/hovercard&quot; data-id=&quot;4911115404&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/100&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/100&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#100&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Optimize permute and unpermute methods by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/101/hovercard&quot; data-id=&quot;4911162750&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/101&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/101&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#101&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor get_bitvector_in_ascii to use comprehension by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/102/hovercard&quot; data-id=&quot;4911196986&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/102&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/102&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#102&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;refactor: rename int_val to &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;int&lt;/span&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/103/hovercard&quot; data-id=&quot;4911221048&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/103&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/103&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#103&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Remove _setbit and only use &lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;setitem&lt;/span&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/104/hovercard&quot; data-id=&quot;4912480583&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/104&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/104&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#104&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor BitVector size attribute to be private by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/105/hovercard&quot; data-id=&quot;4912946501&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/105&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/105&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#105&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;refactor: simplify get_bitvector_in_hex with comprehension by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/106/hovercard&quot; data-id=&quot;4916082283&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/106&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/106&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#106&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Optimize shift_left and shift_right implementations by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/107/hovercard&quot; data-id=&quot;4916161936&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/107&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/107&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#107&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Remove Any from reset signature by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/108/hovercard&quot; data-id=&quot;4916202432&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/108&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/108&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#108&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Optimize &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;reset&lt;/code&gt; method performance using direct array operations by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/109/hovercard&quot; data-id=&quot;4916604237&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/109&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/109&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#109&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Remove deprecated length method from BitVector by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/110/hovercard&quot; data-id=&quot;4917705150&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/110&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/110&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#110&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Optimize BitVector.reverse() by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/111/hovercard&quot; data-id=&quot;4917720233&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/111&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/111&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#111&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;docs: Add explanatory comment to ARRAY_TYPE by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/112/hovercard&quot; data-id=&quot;4919192076&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/112&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/112&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#112&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Remove file I/O operations from BitVector by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/113/hovercard&quot; data-id=&quot;4919391043&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/113&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/113&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#113&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;chore: remove array like subscripting comment by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/116/hovercard&quot; data-id=&quot;4920133173&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/116&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/116&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#116&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Refactor: Extract &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;textstring&lt;/code&gt; instantiation to &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;from_string&lt;/code&gt; by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;organization&quot; data-hovercard-url=&quot;/orgs/google-labs-jules/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/google-labs-jules&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #1f2328; font-weight: 600; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@google-labs-jules&lt;/a&gt;[bot] in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/115/hovercard&quot; data-id=&quot;4920131873&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/115&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/115&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#115&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;chore(github): setup CODEOWNERS with repository owners by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/119/hovercard&quot; data-id=&quot;4923576379&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/119&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/119&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#119&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;Add &lt;code style=&quot;background-color: rgba(129, 139, 152, 0.12); border-radius: 6px; box-sizing: border-box; font-family: &amp;quot;Monaspace Neon&amp;quot;, ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em; tab-size: 4; white-space: break-spaces;&quot;&gt;__reversed__&lt;/code&gt; benchmark and optimized implementation by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/121/hovercard&quot; data-id=&quot;4923732989&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/121&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/121&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#121&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;ci(github): configure PyPI secret token for release publishing by &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;user-mention notranslate&quot; data-hovercard-type=&quot;user&quot; data-hovercard-url=&quot;/users/schwehr/hovercard&quot; data-octo-click=&quot;hovercard-link-click&quot; data-octo-dimensions=&quot;link_type:self&quot; href=&quot;https://github.com/schwehr&quot; style=&quot;background-color: #fff8c5; border-radius: 2px; box-sizing: border-box; color: #1f2328; font-weight: 600; margin-left: -2px; margin-right: -2px; text-underline-offset: 0.2rem; white-space: nowrap;&quot;&gt;@schwehr&lt;/a&gt; in &lt;a aria-keyshortcuts=&quot;Alt+ArrowUp&quot; class=&quot;issue-link js-issue-link&quot; data-error-text=&quot;Failed to load title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/schwehr/bitvector-modern/pull/122/hovercard&quot; data-id=&quot;4923836125&quot; data-permission-text=&quot;Title is private&quot; data-url=&quot;https://github.com/schwehr/bitvector-modern/issues/122&quot; href=&quot;https://github.com/schwehr/bitvector-modern/pull/122&quot; style=&quot;background-color: rgba(0, 0, 0, 0); box-sizing: border-box; color: #0969da; text-underline-offset: 0.2rem;&quot;&gt;#122&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/3415348088011134263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/bitvector-modern-release-003.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3415348088011134263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3415348088011134263'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/bitvector-modern-release-003.html' title='bitvector-modern release 0.0.3'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-1390569365815302684</id><published>2026-07-10T10:58:21.580-07:00</published><updated>2026-07-10T10:58:21.580-07:00</updated><title type='text'>The future of Generic Sensor Format (GSF) for sonar data and processing</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;This is a response to this post: &lt;/span&gt;&lt;a href=&quot;https://www.linkedin.com/posts/lindsay-gee-a891b510_hydrospatial-multibeam-gsf-share-7481138545298989056-cDqK/&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Lindsay Gee: GSF meeting at CCOM next week&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. I won’t be able to attend the meeting next week at CCOM even remotely, so I’ll try to capture my current take on GSF. I’ve not been shy in saying that the Generic Sensor Format (GSF) is not my vision of a generic sharing / processing format for multibeam sonar. However, it is critically important to the community. The key text from Lindsay:&lt;/span&gt;&lt;/p&gt;&lt;span id=&quot;docs-internal-guid-210e12fe-7fff-e5fe-3450-948514b41a62&quot;&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The toolkit supports the GEBCO Technical Strategy by improving the sharing, archiving, and reuse of processed swath bathymetry data. It is designed to enhance interoperability across software applications, reduce barriers to working with GSF data, and support the generation of bathymetry and backscatter products without always needing to return to raw sonar data.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The first public release of the open-source toolkit, documentation, and code repository is available, and this session will provide an overview of the project, its current status, roadmap for future development, followed by an open discussion.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A key component of the project is a profile framework and JSON-based schema that captures differences between GSF library implementations. As this framework expands, community participation and feedback will be essential to ensure it meets the needs of the broader hydrographic and ocean mapping community.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The success of the toolkit depends on broad community engagement, and we welcome feedback from software developers, data producers, archives, and end users.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://github.com/oceanmapping/mbtoolkit&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/oceanmapping/mbtoolkit&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Trying to get my thoughts organized quickly is tough. Apologies as this is a bit disorganized.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I see there are at least 3 key packages that need to exist and be well maintained: The original GSF library from SAIC/Lidos originally written in C that should be converted to C++, the pure python package &lt;/span&gt;&lt;a href=&quot;https://github.com/oceanmapping/mbtoolkit&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;mbtoolkit&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;, and a complete rewrite from scratch of a gsf library in Rust. Those packages should be on a public VC repo like GitHub, GitLab, etc and have permissive licenses allowing the most number of people to use and contribute to them. In the age of LLM coding agents, getting this work done will go faster than it ever could have in the past, but it’s not easy to do this correctly and make the results maintainable. But I have high hopes considering the positive messages from folks around the community recently.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0. Common to all three - best practices&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;For each package, they should be done to the best available modern software engineering practices. The surface area is pretty small, so achieving this isn’t that hard. What does it entail? (for Rust, a lot of this is already baked in)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul style=&quot;margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Code in git VC and publicly available with the ability to take pull requests. I will assume GitHub for now.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Standard package management for the repo (a.k.a., CMake for C/C++, uv for Python, Cargo for Rust)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Automatic code formatting so that code is always consistent no matter who contributes a change&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Static analyzers automatically run (Coverity, cppcheck, clang static analyzer. ty/mypy/pyright/pyrefly, codespell, etc.)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;100% unittest coverage&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A shared set of gsf files used for integration testing&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Coverage based fuzzing to detect all sorts of bugs and provide artifacts that can be used to add testing&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Performance benchmarks&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;GitHub actions and local automation to run all the checks (e.g. pre-commit)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The best security scanning available (e.g., zizmor for GitHub actions, bandit for python, CodeQL, etc.)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Great documentation built with each of the packages&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;A strong defensive &lt;/span&gt;&lt;a href=&quot;http://agents.md&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;AGENTS.md&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And a part of this should be moving the GSF spec from a PDF to a GitHub project written in markdown.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;b&gt;1. The future of the C/C++ libgsf&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It has been frustrating that SAIC/Lidos developed GSF behind closed doors and only occasionally released versioned snapshots to the community. It was hard to see what was going on with development and the community wasn’t able to contribute fixes. I tried to jump start this process with &lt;/span&gt;&lt;a href=&quot;https://github.com/schwehr/generic-sensor-format/&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/schwehr/generic-sensor-format/&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; back in 2015 (check out all the issues that I documented). I wasn’t able to get any engagement and there wasn’t any uptake as far as I can tell. This work should be started from the most recent release.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;This is about fortifying the valuable historical usage of the GSF library. This is the reference implementation and extreme care should be taken not to lose the value that comes with that. As a community, we should make sure that existing usage can continue without requiring major reworking of code by the current users.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;What should this entail? First off, I should be clear about switching to C++. I don’t mean converting the core to object oriented design. I do mean that converting the code from C to C++ means that the code base can use the C++ std library for numerical values, more const-ness, constexpr, static_asserts, safer casting, and internal use of unique_ptr for safer memory management. The core library should still export an `extern “C”` interface with the same calls. From there, it is reasonable to add an optional wrapper later on top that implements a more natural C++ interface that can be done as a class that knows how to manage memory and presents a more natural C++ error interface with std::optional, exceptions, and/or StatusOr&amp;lt;T&amp;gt;.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;After that, it’s reasonable to provide a parallel all C++ from scratch rewrite of GSF that takes advantage of all the modern (and some not so modern 🙂) capabilities like mmap, select, epoll, etc.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Maybe there should be language wrappers in one or both of these, but I’m not sure what is best. swig is pretty frustrating and I don’t know what else is around that has a solid future.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2. Pure Python&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The community should get behind &lt;/span&gt;&lt;a href=&quot;https://github.com/oceanmapping/mbtoolkit&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/oceanmapping/mbtoolkit&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; or something similar. Drive it to completely cover GSF with pure python. Working with Python is great for learning and developing protocols even if it’s not the fastest. I suggest aiming for python &amp;gt;= 3.14 and pushing for the strongest possible package.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;An example of some of what can be done for packages when starting from scratch can be seen in &lt;/span&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/schwehr/bitvector-modern&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. With the help of a coding agent and a lot of careful reviews, I was able to get that package to a pretty good place. Please adapt the best ideas from that and any other solid package out there. Old school python packaging and setups was creaky and painful.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;3. A Rust implementation&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The Rust Cargo ecosystem is amazing. Unlike python and C++, there is one primary packaging tool: Cargo. The trick is making a Rust based IO system that is both performant and reasonable to maintain. The async code in Rust has a bad reputation for many people. I have little experience, but there is great potential. I suggest having LLM agents cook up a range of designs and compare the results.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Once that basic IO layer is done, that will unlock a huge potential. First, many low level codecs have recently gotten pure Rust replacement libraries that can be used in place of old C libraries gaining both safety and performance (e.g., zlib, png, jxl). Second, Rust makes a great ecosystem to build CLIs, TUI (text/terminal user interfaces), and GUIs/3D interfaces, c.f. &lt;/span&gt;&lt;a href=&quot;https://github.com/ratatui/ratatui&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;ratatui&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and &lt;/span&gt;&lt;a href=&quot;https://github.com/bevyengine/bevy&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Bevy&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. It even works well to have Bevy use ratatui to build terminal based 2D applications that can be extremely useful.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Conclusion&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The community needs security, stability, performance, and collaboration with GSF. This post leaves out a lot, but I hope it gets people thinking, motivated, prototyping, and implementing. The time to start is now!&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/1390569365815302684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/the-future-of-generic-sensor-format-gsf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1390569365815302684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1390569365815302684'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/the-future-of-generic-sensor-format-gsf.html' title='The future of Generic Sensor Format (GSF) for sonar data and processing'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-530344816223364802</id><published>2026-07-09T09:48:18.449-07:00</published><updated>2026-07-09T09:48:18.450-07:00</updated><title type='text'>Open source multibeam sonar processing software</title><content type='html'>&lt;p&gt;I tried to do another code review for &lt;a href=&quot;https://github.com/dwcaress/MB-System&quot;&gt;MB-System&lt;/a&gt; is morning. It&#39;s been many years since I dug deep into the system. Back then (2019/2020), I was trying to &lt;a href=&quot;https://github.com/dwcaress/MB-System/tree/master/test&quot;&gt;add testing&lt;/a&gt; to the core library to make it easier to maintain. I made progress, but didn&#39;t get traction from the community. The review today reminded me how much friction there is in the old code. The style works great for Dave, the project lead, so I don&#39;t want to change it, but here is an example. It&#39;s pure C.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;int mb_sonarsettings(int verbose, void *mbio_ptr, void *store_ptr, int *kind, double *frequency,
                     double *sample_rate, double *tx_pulse_width, double *power_selection, double *gain_selection,
                     double *absorption, double *spreading, double *sound_velocity, double *beamwidth_tx,
                     double *beamwidth_rx, int *error) {
  if (verbose &amp;gt;= 2) {
    fprintf(stderr, &quot;\ndbg2  MBIO function &amp;lt;%s&amp;gt; called\n&quot;, __func__);
    fprintf(stderr, &quot;dbg2  Input arguments:\n&quot;);
    fprintf(stderr, &quot;dbg2       verbose:    %d\n&quot;, verbose);
    fprintf(stderr, &quot;dbg2       mb_ptr:     %p\n&quot;, (void *)mbio_ptr);
    fprintf(stderr, &quot;dbg2       store_ptr:  %p\n&quot;, (void *)store_ptr);
  }

  struct mb_io_struct *mb_io_ptr = (struct mb_io_struct *)mbio_ptr;

  /* call the appropriate mbsys_ extraction routine (NULL for formats that do not
     record per-ping sonar settings; reson7k3 is the first to implement it) */
  int status = MB_SUCCESS;
  if (mb_io_ptr-&amp;gt;mb_io_sonarsettings != NULL) {
    status = (*mb_io_ptr-&amp;gt;mb_io_sonarsettings)(verbose, mbio_ptr, store_ptr, kind, frequency, sample_rate,
                                               tx_pulse_width, power_selection, gain_selection, absorption,
                                               spreading, sound_velocity, beamwidth_tx, beamwidth_rx, error);
  }
  else {
    status = MB_FAILURE;
    *error = MB_ERROR_BAD_SYSTEM;
  }

  if (verbose &amp;gt;= 2) {
    fprintf(stderr, &quot;\ndbg2  MBIO function &amp;lt;%s&amp;gt; completed\n&quot;, __func__);
    fprintf(stderr, &quot;dbg2  Return values:\n&quot;);
    fprintf(stderr, &quot;dbg2       kind:       %d\n&quot;, *kind);
  }
  if (verbose &amp;gt;= 2 &amp;amp;&amp;amp; *error == MB_ERROR_NO_ERROR) {
    fprintf(stderr, &quot;dbg2       frequency:       %f\n&quot;, *frequency);
    fprintf(stderr, &quot;dbg2       sample_rate:     %f\n&quot;, *sample_rate);
    fprintf(stderr, &quot;dbg2       tx_pulse_width:  %f\n&quot;, *tx_pulse_width);
    fprintf(stderr, &quot;dbg2       power_selection: %f\n&quot;, *power_selection);
    fprintf(stderr, &quot;dbg2       gain_selection:  %f\n&quot;, *gain_selection);
    fprintf(stderr, &quot;dbg2       absorption:      %f\n&quot;, *absorption);
    fprintf(stderr, &quot;dbg2       spreading:       %f\n&quot;, *spreading);
    fprintf(stderr, &quot;dbg2       sound_velocity:  %f\n&quot;, *sound_velocity);
    fprintf(stderr, &quot;dbg2       beamwidth_tx:    %f\n&quot;, *beamwidth_tx);
    fprintf(stderr, &quot;dbg2       beamwidth_rx:    %f\n&quot;, *beamwidth_rx);
  }
  if (verbose &amp;gt;= 2) {
    fprintf(stderr, &quot;dbg2       error:      %d\n&quot;, *error);
    fprintf(stderr, &quot;dbg2  Return status:\n&quot;);
    fprintf(stderr, &quot;dbg2       status:     %d\n&quot;, status);
  }

  return (status);
}
&lt;/pre&gt;

That really boils down to this:

&lt;pre&gt;int mb_sonarsettings(int verbose, void *mbio_ptr, void *store_ptr, int *kind, double *frequency,
                     double *sample_rate, double *tx_pulse_width, double *power_selection, double *gain_selection,
                     double *absorption, double *spreading, double *sound_velocity, double *beamwidth_tx,
                     double *beamwidth_rx, int *error) {
  struct mb_io_struct *mb_io_ptr = (struct mb_io_struct *)mbio_ptr;

  if (mb_io_ptr-&amp;gt;mb_io_sonarsettings == NULL) {
    *error = MB_ERROR_BAD_SYSTEM;
    return MB_FAILURE;
  }
  
  // Call the appropriate mbsys_ extraction routine. It&#39;s NULL for formats that do not
  // record per-ping sonar settings; reson7k3 is the first to implement it.
  return (*mb_io_ptr-&amp;gt;mb_io_sonarsettings)(
      verbose, mbio_ptr, store_ptr, kind, frequency, sample_rate,
      tx_pulse_width, power_selection, gain_selection, absorption,
      spreading, sound_velocity, beamwidth_tx, beamwidth_rx, error);

}
&lt;/pre&gt;

Now imagine that spread across a huge amount of drivers. It adds up really quickly.

I&#39;ve been wanting to redesign an open source multibeam sonar processing system for more than 2 decades. In the beginning, I was thinking C++, but trying to avoid the crazy side of C++ and that was looking better and better as new C++ standards came out that smoothed over a lot of the rough edges that were in old C++.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But now that there is Rust, &lt;a href=&quot;https://github.com/bevyengine/bevy&quot;&gt;Bevy&lt;/a&gt;&amp;nbsp;(3D and 2D game engine), and &lt;a href=&quot;https://github.com/ratatui/ratatui&quot;&gt;Ratatui&lt;/a&gt;&amp;nbsp;(a Rust TUI) combined with help from LLM coding agents, I&#39;d like the time to do it that way instead. I don&#39;t yet have the intuition of how best to build the core IO library. And it will need a solid core of geospatial code that is the equivalent to substantial parts of PROJ, GEOS, and GDAL. I think we as a community have the potential for creating something that scales for next couple of decades and honors the accomplishments of MB-System and GMT over the last 33 years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/530344816223364802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/open-source-multibeam-sonar-processing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/530344816223364802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/530344816223364802'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/open-source-multibeam-sonar-processing.html' title='Open source multibeam sonar processing software'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-1408831310121204163</id><published>2026-07-05T11:11:59.781-07:00</published><updated>2026-07-05T11:11:59.782-07:00</updated><title type='text'>Antigravity with an AGENTS.md file requesting suggestions</title><content type='html'>&lt;p&gt;&amp;nbsp;I added a section to the AGENTS.md like this:&lt;/p&gt;


&lt;pre&gt;
## 7. Version Control &amp; Commit Messages

- **Code Review**:
  - Always do a code review before committing. In addition to finding and
    suggesting fixes to issues, try to create 1-3 suggestions for improvement to
    the code based on the current changes.
&lt;/pre&gt;

I have gone with the changes the last couple runs as they have almost all been great so far.

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: silver; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;color: #2fb41d; font-variant-ligatures: no-common-ligatures;&quot;&gt;●&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: #9fa01c; font-variant-ligatures: no-common-ligatures;&quot;&gt;Bash&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;(git status -s)&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;(ctrl+o to expand)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: silver; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;▸ Thought for 3s, 27 tokens&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: silver; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;Everything is completed, verified, tested, and cleanly committed! Let&#39;s present ...&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;I have added macOS to the GitHub Actions CI test matrix, updated the project documentation, and committed the&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;changes.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: lime; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;### Summary of Work&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;• &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;Updated CI Workflow&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;: Expanded the matrix strategy in test.yml to include&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; macos-latest&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; alongside&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt;ubuntu-latest&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; (with&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; fail-fast: false &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;), ensuring matrix jobs run across Python 3.13 and 3.14 on both Linux and&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;macOS.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;• &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;Updated Documentation&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;: Added a note under Section 5 in AGENTS.md documenting that CI tests run&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;automatically across Linux and macOS.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;• &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;Verified &amp;amp; Committed&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;: All pre-commit checks passed (&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; uv run pre-commit run --all-files &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;), and created&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;conventional commit&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; 4e50f4c&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; on branch&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; main &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p5&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #d0d0d0; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;ci(workflow): add macOS to GitHub Actions test matrix&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p5&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #d0d0d0; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;Expand test job strategy matrix in .github/workflows/test.yml to execute across both ubuntu-latest and macos-&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p5&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #d0d0d0; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;latest with fail-fast disabled, and update AGENTS.md cross-platform testing guidelines.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;──────&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: lime; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;### Code Review Suggestions for Improvement&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;In accordance with our mandatory code review policy in AGENTS.md, here are &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;3 suggestions for future&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;improvement&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; based on this CI addition:&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;1. &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;Windows CI Support&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;: To guarantee full cross-platform compatibility across all desktop environments, we could&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;also evaluate adding&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; windows-latest&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; to the OS matrix in test.yml, specifically to verify line endings,&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;file paths, and file object streaming behavior on Windows.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p6&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #4a00ff; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;2. &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;Benchmark Execution Scoping&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;: Currently,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; --benchmark-only&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt; runs in CI when&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; matrix.python-version == &#39;3.14&#39;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;across all operating systems. Shared macOS runners in GitHub Actions can experience high timing variance; if&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;this causes flaky benchmark thresholds in CI, we could restrict benchmark execution strictly to Ubuntu (&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; if: ...&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p6&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #4a00ff; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&amp;amp;&amp;amp; matrix.os == &#39;ubuntu-latest&#39; &lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: #2fff12; font-variant-ligatures: no-common-ligatures;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;3. &lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: lime; font-variant-ligatures: no-common-ligatures;&quot;&gt;OS-Specific Cache Monitoring&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;: We should monitor&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; uv&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; cache restore and save durations across OS runners in&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;GitHub Actions to ensure that&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: #4a00ff; font-variant-ligatures: no-common-ligatures;&quot;&gt; astral-sh/setup-uv&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt; cache eviction and key scoping remain optimal on macOS&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;background-color: rgba(0, 0, 0, 0.9); color: #2fff12; font-family: &amp;quot;Andale Mono&amp;quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;virtual environments.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/1408831310121204163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/antigravity-with-agentsmd-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1408831310121204163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1408831310121204163'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/antigravity-with-agentsmd-file.html' title='Antigravity with an AGENTS.md file requesting suggestions'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-851457051103966381</id><published>2026-07-04T14:55:25.181-07:00</published><updated>2026-07-04T14:55:25.182-07:00</updated><title type='text'>Python packaging best practices</title><content type='html'>&lt;p&gt;&amp;nbsp;There are so many possible ways to go with python packaging that it&#39;s painful. I&#39;m still working more on bitvector-modern. I just setup codespell, but there is lots left to do. I started creating issues to track what is coming up:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/5&quot;&gt;#5&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Add a micro benchmark setup&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/6&quot;&gt;#6&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Switch in the new __add__ and __iadd__ calls&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/7&quot;&gt;#7&lt;/a&gt;&amp;nbsp;- Switch test style from unittest to pytest&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/8&quot;&gt;#8&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Covert more of the Any type annotations to tighter definitions&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/9&quot;&gt;#9&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Move all imports to the top&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/10&quot;&gt;#10&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Use a better random number generator than the default import random&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/11&quot;&gt;#11&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Convert more strings to f-strings&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/12&quot;&gt;#12&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Make the set_value interface have explicit keyword args&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/13&quot;&gt;#13&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Create a docs directory and import most of the prior documentation&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/14&quot;&gt;#14&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Switch to copy.deepcopy and remove def deep_copy()&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/15&quot;&gt;#15&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Add an AGENTS.md&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/16&quot;&gt;#16&lt;/a&gt;&amp;nbsp;- Setup release automation&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern/issues/17&quot;&gt;#17&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Force conventional commits&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It&#39;s really wild how different it is to work on a project that doesn&#39;t have active users or constraints of a company. I have a change to be opinionated and try out things I haven&#39;t done before.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/851457051103966381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/python-packaging-best-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/851457051103966381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/851457051103966381'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/python-packaging-best-practices.html' title='Python packaging best practices'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-3856718505903929695</id><published>2026-07-03T13:02:23.303-07:00</published><updated>2026-07-03T13:02:23.304-07:00</updated><title type='text'>Introducing bitvector-modern, a fork of python BitVector </title><content type='html'>&lt;p&gt;&amp;nbsp;About 20 years ago, I used Avi Kak&#39;s&amp;nbsp;&lt;a href=&quot;https://pypi.org/project/BitVector/&quot;&gt;BitVector&lt;/a&gt;&amp;nbsp;python library for my AIS work when my work was pure python as can be found in my&amp;nbsp;&lt;a href=&quot;https://github.com/schwehr/noaadata&quot;&gt;noaadata&lt;/a&gt;&amp;nbsp;package that I haven&#39;t done much with in more than a decade. BitVector is an awesome tool for working with arbitrarily long sequences of bits. A lot has happened in the world of python and software engineering since I donated a Makefile and helped with a bit of packaging. I decided to give a quick go at modernizing BitVector, and after about 5 hours of work, I have bitvector-modern. The function of code in BitVector basically the same at this point, but I&#39;ve changed a lot that should make maintaining and using the BitVector class a lot easier.&amp;nbsp;&lt;/p&gt;&lt;div&gt;You can find the work here:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/schwehr/bitvector-modern&quot;&gt;https://github.com/schwehr/bitvector-modern&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Here are roughly the changes I&#39;ve made so far with the help of Google Antigravity:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Switch to using uv and for pyproject.toml packaging&lt;/li&gt;&lt;li&gt;Setup github CI&lt;/li&gt;&lt;li&gt;Switched to supporting only Python 3.13 and 3.14 (Was python 2 and 3.6)&lt;/li&gt;&lt;li&gt;Use ruff for code formatting&lt;/li&gt;&lt;li&gt;Use pytest test discovery&lt;/li&gt;&lt;li&gt;Setup code coverage reporting&lt;/li&gt;&lt;li&gt;Rename directories to &quot;examples&quot; and &quot;tests&quot;&lt;/li&gt;&lt;li&gt;Get set coverage from 40% to 97%&lt;/li&gt;&lt;li&gt;Remove extra documentation and tests from BitVector.py&lt;/li&gt;&lt;li&gt;Remove unused _resize_pad_from_right method&lt;/li&gt;&lt;li&gt;Remove backward compatibility aliases&lt;/li&gt;&lt;li&gt;Use pyupgrade to get to 3.13&lt;/li&gt;&lt;li&gt;Inline the testinput text files.&lt;/li&gt;&lt;li&gt;Uncomment the proposed improved __add__ method and new __iadd__ method&lt;/li&gt;&lt;li&gt;Setup astral-sh/ty type checking and add type annotations. There are still lots of &quot;Any&quot; and &quot;...&quot;&lt;/li&gt;&lt;li&gt;Switch&amp;nbsp;BitVector.__init__ from kwargs to explicitly named args&lt;/li&gt;&lt;li&gt;Setup Dependabot&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;That leaves a lot more to do, but it&#39;s a big start! Some of what I&#39;d like to do:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Add an AGENTS.md&lt;/li&gt;&lt;li&gt;Convert the prior documentation into a docs directory&lt;/li&gt;&lt;li&gt;Convert more string formatting to f-string&lt;/li&gt;&lt;li&gt;Convert the method doc strings to a more standard format with summary line, args, returns/yields, raises&lt;/li&gt;&lt;li&gt;Cleanup the code inside methods&lt;/li&gt;&lt;li&gt;Modernize the iterator using &quot;yield from&quot;&lt;/li&gt;&lt;li&gt;Tighten the type annotations&lt;/li&gt;&lt;li&gt;Allow pathlib.Path file references&lt;/li&gt;&lt;li&gt;Replace deep_copy with python’s&lt;/li&gt;&lt;li&gt;Fix the interface to set_value&lt;/li&gt;&lt;li&gt;Use a better random number generator than python&#39;s random package&lt;/li&gt;&lt;li&gt;Setup releases on github&lt;/li&gt;&lt;li&gt;Add the package to PyPI&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;After that, I need to modernize noaadata and get it using bitvector-modern.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/3856718505903929695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/07/introducing-bitvector-modern-fork-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3856718505903929695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3856718505903929695'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/07/introducing-bitvector-modern-fork-of.html' title='Introducing bitvector-modern, a fork of python BitVector '/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-7306529042603241672</id><published>2026-06-30T17:54:18.660-07:00</published><updated>2026-06-30T18:04:05.443-07:00</updated><title type='text'>What does my local agent know about me?</title><content type='html'>&lt;p&gt;&lt;br /&gt;So, I see a post and I do what it says...&lt;/p&gt;&lt;p&gt;&lt;b&gt;Prompt&lt;/b&gt;: &quot;Based on everything we’ve ever talked about, what are 25 interesting things you know about me?”&lt;/p&gt;&lt;p&gt;▸ Thought for 1s, 79 tokens&lt;/p&gt;&lt;p&gt;&amp;nbsp; Look at that!&lt;/p&gt;&lt;p&gt;● ListDir(/home/schwehr/me) (ctrl+o to expand)&lt;/p&gt;&lt;p&gt;▸ Thought for 2s, 182 tokens&lt;/p&gt;&lt;p&gt;&amp;nbsp; There is a directory `/home/schwehr/me` with `AGENTS.md`, `JOUR...&lt;/p&gt;&lt;p&gt;● Read(home/schwehr/me/AGENTS.md) (ctrl+o to expand)&lt;/p&gt;&lt;p&gt;So I defeated myself with a side project called &quot;me&quot;.&lt;/p&gt;

A cut down version of what Gemini / Antigravity said:

&lt;pre&gt;Based on your documented professional history, research profile, software contributions, and preferences in your workspace, here are 25 interesting and factual things known about your background and
  career:

  ### Space Exploration &amp;amp; Planetary Robotics

  1. Pioneer in VR for Planetary Robotics: You were an early pioneer in applying virtual reality ...
  3. Early Exoplanet Search Software: From 1989 to 1990 as an Associate Researcher at NASA Ames ...
  4. Martian Dust Triboluminescence Research: In 1990 at NASA Ames, you conducted research ...
  5. Stereo Image Processing Pipelines: You developed the James Pipeline for processing stereo ...

  ### Ocean Engineering, GIS &amp;amp; Maritime Safety

  6. Creator of  libais : You created and maintain  libais , an open-source C++ library with ...
  7. Global Fishing Watch Technical Contributor: You were a key contributor to Global Fishing ...
  8. Whale Alert Collision Avoidance System: You contributed system architecture and vessel ...
  9. ERMA &amp;amp; Deepwater Horizon Response: You were a primary developer of ERMA (Environmental ...
  10. MB-System Core Contributor: You have contributed over 925 commits to MB-System, a core ...
  11. Chart of the Future Initiative: At UNH&#39;s Center for Coastal and Ocean Mapping (CCOM/JHC), ...
  12. International AIS Standards: You collaborated with the International Maritime Organization ...

  ### Google &amp;amp; Open Source Leadership

  13. Google Earth Engine Core Infrastructure: As a Google Software Engineer since 2012, you have ...
  14. Dynamic World Science Consultant: You serve as a science consultant on major Google Earth...
  15. GDAL &amp;amp; PROJ Governance Board Member: You serve on the Board of Directors for both GDAL...
  16. Fink Project Core Developer: You made over 1,400 commits to the Fink Project, playing...
  17. Early Start &amp;amp; CTO Role: You began technical software consulting in 1991 (working with USGS...

  ### Academic Roots, Geology &amp;amp; Geophysics

  18. Scripps PhD in Paleomagnetism &amp;amp; Stratigraphy: You earned your PhD in Earth Sciences from ...
  19. Stanford Geology &amp;amp; Robotics: While completing your B.S. in Geology at Stanford (1996), ...
  20. Scientific Visualization Award Winner: You won 1st place in the Scripps Institution of ...
  21. Early Research on Ethanol Conversion: One of your earliest documented academic deliverables...

  ### Working Preferences, Philosophy &amp;amp; Family

  22. Advocacy for Spec-Driven Development (SDD) &amp;amp; Reproducibility: Your core engineering...
  23. Technical Tooling &amp;amp; Language Stack: Python is your default language, complemented by ...
  24. Transition to  pytest : With an extensive background in Python&#39;s standard  unittest ...
  25. Family &amp;amp; Scientific Collaboration: Your wife, Dr. Monica Wolfson-Schwehr, is a fellow oceanographer...
&lt;/pre&gt;


&lt;p&gt;Trying again.&lt;/p&gt;&lt;p&gt;Based on everything we’ve ever talked about, what are 25 interesting things you know about me?” Do not look in any non dot subdir in my home directory.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

Here I definitely have to crop as it has access to internal project names that are not public.

&lt;pre&gt;Based on our conversation history, CLI logs, and stored transcripts inside your  .gemini  directory (without peeking into any non-dot subdirectories in your home folder), here are 25 interesting things
  I know about you, organized by domain:

  ### 🌊 Geospatial, Maritime &amp;amp; Earth Engine

  1. You Created  libais : You authored and maintained  libais , an Automatic Identification ...
  2. Google Earth Engine Pioneer: You are deeply involved in Google Earth Engine (working alongside co-founders and TLs ...
  3. GDAL Modernist: You enforced a strict rule in your  AGENTS.md  requiring agents to exclusively use ...
  4. GNSS, RINEX &amp;amp; CORS Handling: You frequently process Global Navigation Satellite System (GNSS) data ...
  5. Copybara Scripting for GDAL: In addition to Python tools, you manage complex Copybara sync scripts ...

  ### 💻 Software Engineering &amp;amp; Google3 Workflows

  6. Python Git Engine ( dulwich ) Master: You maintain Google&#39;s internal mirror of  dulwich  ...
  7. Security &amp;amp; Vulnerability Hunter: You conduct regular security audits across Earth Engine ...
  8. Git Security Researcher: You designed and conducted in-depth security analyses investigating ... (ha ha!  No. That&#39;s a total misinterpretation of a project)
  9. Ace C Programmer Standards: You frequently instruct agents with the prompt: &quot;You are an ace C programmer...
  10. [Tool] &amp;amp; Code Hygiene Purist: You rely heavily on Google&#39;s static analysis tools ...
  11. TypeScript &amp;amp; Jasmine Unforker: During your [Code Editor] refactoring, you aggressively cleaned up ...
  12. Conventional Commit Enforcer: When wrapping up code changes or uploading CLs, you strictly require ...

  ### 🎮 Game Development &amp;amp; Side Projects

  13. Rust &amp;amp; Bevy Game Developer: In your GitHub repository [fun!], you build games in Rust using the Bevy engine ...
  14. Yahtzee from Scratch: You completely rebuilt a Yahtzee dice game ...
  15. Test-Driven Rust Practice: When experimenting with new Rust concepts (like building a custom ping utility), ...

  ### 🔬 Academic Roots, Research &amp;amp; Mentors

  16. Stanford Robotics Roots: You did undergraduate work at Stanford University, where your BS advisor was ...
  17. Scripps Geophysics &amp;amp; Oceanography: You pursued graduate work at Scripps Institution of Oceanography ...
  18. UNH Center for Coastal &amp;amp; Ocean Mapping (CCOM): You collaborated extensively with marine geophysicist ...
  19. JPL Planetary &amp;amp; Solar System Visualization: Your career touches planetary science and space exploration ...
  20. Field Robotics with Red Whittaker: Your research tree connects to William &quot;Red&quot; Whittaker ...

  ### 🤖 AI Agent Workflows &amp;amp; Philosophy

  21. &quot;Do Not Glaze Me&quot;: You added an explicit directive to your  AGENTS.md  instructing AI assistants ...
  22. The  JOURNAL.md  Experiment: You once required AI agents to log every human interaction into a ...
  23. The &quot;Morning Coffee&quot; Standup Routine: You built an automated daily developer standup skill ... (No! But I use that skill made by a coworker)
  24. Strict Read-Only Guardrails: In your automation skills, you enforce zero mutating actions on ...
  25. Comprehensive Academic &amp;amp; Career Modeling: You tasked an agent with building an extensive, multi-file ...
  &lt;/pre&gt;

&lt;p&gt;That&#39;s entertaining. Lots of it is accurate, but some of it misses the point.&lt;/p&gt;

&lt;p&gt;From the simple.ai news letter, they talk about &quot;The solution here is portable context&quot;. I started that project called &quot;me&quot; to see if I can build up context about myself in an explicite sort of way. What does &quot;me&quot; look like so far? Here is the structure of it so far.&lt;/p&gt;

&lt;pre&gt;tree
.
├── AGENTS.md
├── EVENTS.json
├── JOURNAL.md
├── people
│&amp;nbsp;&amp;nbsp; ├── catherine_johnson.md
│&amp;nbsp;&amp;nbsp; ├── deena_braunstein.md
│&amp;nbsp;&amp;nbsp; ├── eric_dejong.md
│&amp;nbsp;&amp;nbsp; ├── james_spelman.md
│&amp;nbsp;&amp;nbsp; ├── jonathan_stebbins.md
│&amp;nbsp;&amp;nbsp; ├── kevin_brown.md
│&amp;nbsp;&amp;nbsp; ├── larry_mayer.md
│&amp;nbsp;&amp;nbsp; ├── lisa_tauxe.md
│&amp;nbsp;&amp;nbsp; ├── monica_wolfson.md
│&amp;nbsp;&amp;nbsp; ├── neal_driscoll.md
│&amp;nbsp;&amp;nbsp; ├── oussama_khatib.md
│&amp;nbsp;&amp;nbsp; ├── red_whittaker.md
│&amp;nbsp;&amp;nbsp; ├── scott_ashford.md
│&amp;nbsp;&amp;nbsp; ├── william_borucki.md
│&amp;nbsp;&amp;nbsp; └── yuri_fialko.md
├── skills
│&amp;nbsp;&amp;nbsp; └── update_me.py
├── user_modeling_plan.md
├── walkthrough.md
└── work
    ├── bio.md
    ├── ocean_engineering.md
    ├── preferences.md
    ├── publications.md
    ├── publications_todo.md
    ├── software_engineering.md
    └── space_exploration.md
&lt;/pre&gt;

It&#39;s not particularly good so far, but I haven&#39;t put much energy into it. It did pick up a lot of folks that I&#39;ve worked with, but it misses many many key people.

&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://simple.ai/p/how-to-future-proof-your-ai-workflows&quot;&gt;How to Future-Proof Your AI Workflows&lt;/a&gt;&amp;nbsp;by&amp;nbsp;Dharmesh Shah&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And a gratuitous AI generated graphic...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiZPXruWpL0fmlwfDmp6AupUvKyqbNkppJNH2mZoRT_xQDJWeRxHLgSJLZSEdZ90B4ioK4rOBd_tm10Abk8Kzpv40S1mnY1u6MdHVQl3ZnZdbT9h4e4-xp-V6FXLCEWimT79pNJFMzIZyIbiSv43DT4yUMUuJMs073uIB-Pv04ZgRDip4PMSt3E4oqZPUM&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;Gemini Nano Banana image generate from the text draft of this blog post.&quot; data-original-height=&quot;559&quot; data-original-width=&quot;1024&quot; height=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiZPXruWpL0fmlwfDmp6AupUvKyqbNkppJNH2mZoRT_xQDJWeRxHLgSJLZSEdZ90B4ioK4rOBd_tm10Abk8Kzpv40S1mnY1u6MdHVQl3ZnZdbT9h4e4-xp-V6FXLCEWimT79pNJFMzIZyIbiSv43DT4yUMUuJMs073uIB-Pv04ZgRDip4PMSt3E4oqZPUM=w418-h229&quot; width=&quot;418&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Asking Gemini to describe the image it created from this blog post is pretty entertaining. It&#39;s all so over the top.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p data-path-to-node=&quot;0&quot;&gt;depicts a detailed, conceptually split digital illustration that juxtaposes traditional exploration and geography with modern artificial intelligence, data science, and robotics. The scene takes place in a grand room lined with floor-to-ceiling bookshelves in the background, looking out onto a dark sea under a starry night sky.&lt;/p&gt;&lt;p data-path-to-node=&quot;1&quot;&gt;The composition is neatly divided down the center by a glowing vertical line and a prominent, luminous &lt;b data-index-in-node=&quot;103&quot; data-path-to-node=&quot;1&quot;&gt;keyhole shape&lt;/b&gt;. Inside this central keyhole stands a glowing, wireframe human figure, symbolizing the bridge between human intellect and technological advancement.&lt;/p&gt;&lt;p data-path-to-node=&quot;2&quot;&gt;Here is a detailed breakdown of the two sides:&lt;/p&gt;&lt;h3 data-path-to-node=&quot;3&quot;&gt;The Left Side: Traditional Exploration and Mapping&lt;/h3&gt;&lt;p data-path-to-node=&quot;4&quot;&gt;This side represents classical cartography, navigation, and human-driven geography.&lt;/p&gt;&lt;ul data-path-to-node=&quot;5&quot;&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;The Analyst:&lt;/b&gt; A man is seated at a wooden desk with his back to the viewer, looking at a computer monitor displaying complex node diagrams and system architectures.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;5,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Physical Artifacts:&lt;/b&gt; On his desk rests an antique-style paper world map, a rolled-up scroll, and a detailed model of a historic three-masted sailing ship navigating a stylized, sculpted block of blue ocean waves. A second, smaller ship model sits on the corner of the map.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;5,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;Glow and Overlay:&lt;/b&gt; A sweeping, crescent-shaped arc of glowing green light frames this side. Embedded within the light are symbols of classical navigation: brass compasses, sextants, a small globe showing Earth&#39;s continents, and floating digital icons of keys and a credit card.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-path-to-node=&quot;6&quot;&gt;The Right Side: AI, Data Science, and Robotics&lt;/h3&gt;&lt;p data-path-to-node=&quot;7&quot;&gt;This side represents the modern era of automated exploration, neural computing, and digital landscape modeling.&lt;/p&gt;&lt;ul data-path-to-node=&quot;8&quot;&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;8,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;The Android/Cyborg:&lt;/b&gt; Seated opposite the first man is a futuristic humanoid figure with visible cybernetic components on his neck and hands. He looks over a highly digital workspace.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;8,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Data and Analytics:&lt;/b&gt; Multiple holographic displays float before him, showcasing glowing 3D brains, neural network graphs, bar charts, financial-style line graphs, and pie charts. A large network of glowing lines connects various nodes, including icons for padlocks (security), dice, and gears.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-path-to-node=&quot;8,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;Physical and Digital Models:&lt;/b&gt; His desk features a miniature robotic space rover (resembling a Mars rover), a robotic arm mechanism, scattered white dice, and a vibrant, color-coded 3D topographic terrain model displaying elevation contours and a central crater lake.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-path-to-node=&quot;9&quot;&gt;The Background&lt;/h3&gt;&lt;p data-path-to-node=&quot;10&quot;&gt;The transition between the two sides is stitched together by a shared background featuring a massive library filled with old books and a view of the Earth visible from space, surrounded by a starry cosmic sky that fades into a bright horizon over an open ocean on the far right.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/7306529042603241672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/06/what-does-my-local-agent-know-about-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7306529042603241672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7306529042603241672'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/06/what-does-my-local-agent-know-about-me.html' title='What does my local agent know about me?'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiZPXruWpL0fmlwfDmp6AupUvKyqbNkppJNH2mZoRT_xQDJWeRxHLgSJLZSEdZ90B4ioK4rOBd_tm10Abk8Kzpv40S1mnY1u6MdHVQl3ZnZdbT9h4e4-xp-V6FXLCEWimT79pNJFMzIZyIbiSv43DT4yUMUuJMs073uIB-Pv04ZgRDip4PMSt3E4oqZPUM=s72-w418-h229-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-8772099115169256141</id><published>2026-06-30T11:33:56.080-07:00</published><updated>2026-06-30T11:33:56.080-07:00</updated><title type='text'>Fixed libais CVE-2026-56770</title><content type='html'>&lt;p&gt;&amp;nbsp;This is a weird milestone: libais got its first CVE.&amp;nbsp;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-56770&quot;&gt;CVE-2026-56770&lt;/a&gt;&amp;nbsp;is a crash coming from my&amp;nbsp;&lt;a href=&quot;https://github.com/schwehr/libais/commit/03f1c92418255911522b3529574506da00aa63e7&quot;&gt;03f1c92418&lt;/a&gt;&amp;nbsp;where I did &quot;vdm: int → size_t for sequence and sentence numbers&quot; to avoid comparing signed and unsigned numbers and I was able to get rid of &quot;-Wno-sign-compare&quot;. I added a &quot;kNoSequenceNumber&quot; that has a huge value (for AIS sequence numbers) of 999999. But, I have code checking the sequence numbers that was only asserts and I was counting on the old value of -1.&lt;/p&gt;&lt;p&gt;So the bug has only been around since Sep 2025 and I haven&#39;t done a libais release in more than a decade (ahem, I need to do a release). So it shouldn&#39;t impact too many people. According to Gemini, libais falls under &quot;Minor Historic and Niche Libraries&quot; so... ouch.&lt;/p&gt;&lt;p&gt;This patch should fix the issue:&amp;nbsp;&lt;a href=&quot;https://github.com/schwehr/libais/commit/ce0fedeba55197a3d2b695bd8874a14e87e1af4e&quot;&gt;ce0fedeba5&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href=&quot;https://github.com/schwehr/libais/pull/264&quot;&gt;libais#264&lt;/a&gt;&lt;/p&gt;&lt;p&gt;libais needs so much cleanup at this point that it is painful. I also asked Antigravity to do a scan of the code for troubles. In addition to finding lots of spelling mistakes, there are plenty of places to improve the code. Sigh.&lt;/p&gt;&lt;p&gt;Here is a sample from ais8.cpp:&lt;/p&gt;

&lt;pre&gt;### Specific Typos and Grammatical Mistakes
* **Line 293**: 
  ```cpp
  // Some people transmit without the idiodic spare padding
  ```
  *Typo*: `idiodic` should be spelled **`idiotic`**.
* **Line 138**: 
  ```cpp
  // TODO(schwehr): how to treat this spare vrs water level?
  ```
  *Typo*: `vrs` should be spelled **`vs`** or **`versus`**.
* **Lines 324 &amp;amp; 358**: 
  ```cpp
  horz_viz(0.0) ... horz_viz = bits.ToUnsignedInt(246, 8) / 10.;
  ```
  *Inconsistency/Typo*: Abbreviating &quot;horizontal visibility&quot; as `horz_viz` uses a &#39;z&#39; instead of &#39;s&#39; (`horz_vis`), which conflicts with line 72 and line 
568 where it is correctly named `horz_vis`.
* **Line 421**: 
  ```cpp
  ice_thickness = bits.ToUnsignedInt(324, 7) / 100.;  // m.  Network is cm,
  ```
  *Grammar*: The inline comment ends abruptly with a trailing comma (`cm,`) instead of completing the sentence or ending with a period.
&lt;/pre&gt;

&lt;p&gt;In addition to mispelling &quot;idiotic,&quot; I can just remove that word. I don&#39;t really need to express my frustration over the AIS specification like that. 😎&lt;/p&gt;&lt;p&gt;Thanks to&amp;nbsp;&lt;a href=&quot;https://github.com/raefko&quot;&gt;github.com/raefko&lt;/a&gt;&amp;nbsp;for the bug report!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/8772099115169256141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/06/fixed-libais-cve-2026-56770.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8772099115169256141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8772099115169256141'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/06/fixed-libais-cve-2026-56770.html' title='Fixed libais CVE-2026-56770'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-4863839259288342101</id><published>2026-06-30T07:19:27.988-07:00</published><updated>2026-06-30T07:19:27.989-07:00</updated><title type='text'>My current work computer configuration</title><content type='html'>&lt;div&gt;Two days and two blog posts. Doing well so far on my goal to write / blog a lot more. Now, I just need to use more emojis to keep up with the folks at work. 🎉&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I wish I had done this each time I had changed computers so I could see the progression (or regression - my last desktop was far less powerful than the 2nd to last desktop).&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On my desk is my personal machine, a &lt;a href=&quot;https://system76.com/mini&quot;&gt;System76 Mini Meerkat&lt;/a&gt; from 2024 running Ubuntu 2024. I don&#39;t use it all that often, but it works great and it&#39;s small.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I currently have this as my primary human interface for work:

&lt;pre&gt;  Model Name:	MacBook Pro
  Model Identifier:	Mac15,7
  Model Number:	MRW23LL/A
  Chip:	Apple M3 Pro
  Total Number of Cores:	12 (6 performance and 6 efficiency)
  Memory:	36 GB
  System Firmware Version:	mBoot-18000.120.36
  OS Loader Version:	11881.140.96.701.1

  Drive: APPLE SSD AP0512Z

  uname -a
  Darwin schwehr-mac 24.6.0 Darwin Kernel Version 24.6.0: Tue Apr 21 20:16:56 PDT 2026; root:xnu-11417.140.69.710.16~1/RELEASE_ARM64_T6030 arm64
&lt;/pre&gt;

My primary workstation is a Debian based linux cloud VM:


&lt;pre&gt;tail -25 /proc/cpu

processor	: 127
vendor_id	: AuthenticAMD
cpu family	: 25
model		: 1
model name	: AMD EPYC 7B13
stepping	: 0
microcode	: 0xffffffff
cpu MHz		: 2449.998
cache size	: 512 KB
physical id	: 1
siblings	: 64
core id		: 31
cpu cores	: 32
apicid		: 127
initial apicid	: 127
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
TLB size	: 2560 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 48 bits physical, 48 bits virtual

head -1 /proc/meminfo 
MemTotal:       247571292 kB
&lt;/pre&gt;

That seems like a lot, but the VM is likely sharing that with a lot of other VMs. And I&#39;m using Linux 6.18.14 kernel.
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I spend most of my time ssh&#39;ed into Linux running work&#39;s setup which is mostly Bazel builds with Google&#39;s version of Perforce called piper/g4. I frequently use copybara to migrate open source code to the local monorepo. I often use the command line version of Antigravity. But I also spend a fair bit of time using git and emacs for open source work. On the graphical side, it&#39;s all in Chrome with Googles internal version of VC Code, Google&#39;s code review tool Critique, Google&#39;s Buganizer, and a lot of Google Docs. Not very exciting. Occasionally, I get to try out jj (which is fun) and sometimes I&#39;m forced into mercial/hg (which I haven&#39;t liked since I tried to teach it in a class back in 2011).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used to keep documents that I used for each machine I had on how to configure them. Work locked me out of a lot of software on the Mac and with my cloud vm, I don&#39;t to machine updates any more. I regret not trying to do that. That&#39;s especially true now that one of my kids just got a Windows 11 HP laptop. I last worked on configuring a Windows machine somewhere in the 2009-2011 time frame. I know nothing first hand anymore about Windows configuration except to disable MacAfee&#39;s trial antivirus and make sure Windows Defender is running.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/4863839259288342101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/06/my-current-work-computer-configuration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4863839259288342101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4863839259288342101'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/06/my-current-work-computer-configuration.html' title='My current work computer configuration'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-6405750790991520800</id><published>2026-06-28T12:05:55.127-07:00</published><updated>2026-06-28T12:06:23.234-07:00</updated><title type='text'>Gemini Deep Research on AIS</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span id=&quot;docs-internal-guid-e11e0489-7fff-f5e1-c350-d24984d7f533&quot;&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Authorship statement: Mostly me with lots of quotes from Gemini Deep Research.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Back in Oct of last year (2025), I came back to the idea of writing an open book about the maritime Automatic Identification System. I thought that maybe with the power of Gemini Deep Research, I could maybe manage the process of creating a book without getting overwhelmed. Between the onslaught of AI generated text and the competing demands from the day job and all the other distractions of life, the idea collapsed by December. I had even tried talking to friends at NOAA to put some positive peer pressure on myself to make myself find enough focus to keep progress going. I totally failed. AIS can be an immensely broad topic and that by itself overwhelmed me. Doing even just a little bit of research pointed out to me how little I know about the current state of AIS.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;So what if I start trying to blog about AIS again? I keep wanting to get back into periodic writing to force myself out of the narrow world view that comes from grinding through work with all of its processes, thrashing through code and bugs, and endlessly trying to understand massive volumes of code that is crazy diverse. This aims to be a quick start on that topic.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;One key task in writing out topics boils down to which questions to ask. Each person’s skill level and background will heavily influence which directions an inquiry will go. We are all full of biases, but what questions will drive the research and writing in a positive direction?&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Also when a question is asked and answered is crucial. Before AI, we only had to contend with the changing state of the material that we can query. Now we have to deal with the rapidly evolving state of LLMs’ ability to digest the internet’s massive trove of knowledge and turn it into a response. How will the LLM get things wrong; what biases will it bring? That changes every time the model or the harness / system prompt changes. And it changes from run-to-run. Repeatability is near impossible and fact checking / verifying is essential.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;We can easily generate more LLM output than we can read and we can fact check an even smaller amount. Should we trust an LLM to fact check LLM output? Maybe a bit. It certainly does catch some problems.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Here is a funny response of an LLM reviewing a report created by an LLM. It’s not actually useful, but it isn’t wrong.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Monolithic Bloat &amp;amp; Schizophrenic Document Scope&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: The document collapses under its own ambition, conflating historical codebase archaeology, operational runbooks, speculative GenAI roadmaps, and threat models into an unreadable 850-line monolith that serves no single engineering persona effectively.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Here are three questions I asked today. I threw the questions in Google Gemini’s Deep Research. It was quick to generate, but takes a while to read the results.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;To make matters worse here, I keep running into issues where Deep Research’s Export to Docs function doesn’t work for me.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1. What is the current state of open source software for maritime Automatic Identification System (AIS) messages? What are the currently used packages? What are the strengths and weaknesses of each?&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Right off, this is helpful. It starts at the Software Defined Radio (SDR) level. GNU Radio back in the day supported AIS, but I never had the energy to get that working. The report points at SDRangel, which does support AIS and looks really nice. I soooo need to find the time to get an SDR setup and use it to receive some AIS messages at home. I should be able to get some messages as I am in line of sight of some boats even if I am not right near a big shipping areas.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://github.com/f4exb/sdrangel/blob/master/plugins/channelrx/demodais/readme.md&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/f4exb/sdrangel/blob/master/plugins/channelrx/demodais/readme.md&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://github.com/f4exb/sdrangel/blob/master/plugins/feature/ais/readme.md&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://github.com/f4exb/sdrangel/blob/master/plugins/feature/ais/readme.md&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It also mentions rtl-ais, AIS-catcher, then leads into hardware that I didn’t know about like this: dAISy-catcher.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://shop.wegmatt.com/products/daisy-catcher-high-performance-ais-receiver&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://shop.wegmatt.com/products/daisy-catcher-high-performance-ais-receiver&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;At this point, I was less than 20% through the document and running out of time/energy for this post. I saw a mention of GPSD, but hadn’t run into my libais code. Sadly, this is where I found libais when I searched for it. Ouch. Yes, I haven’t had much time to work on libais, but it’s pretty complete for most message types.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4 dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 2pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Minor Historic and Niche Libraries&lt;/span&gt;&lt;/h4&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The open-source ecosystem also contains several smaller, single-developer projects designed for casual use or niche platforms:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;ais-parser (kokufu)&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: A simple Gradle-built Java library designed for basic message parsing. It parses standard sentences starting with &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;!AIVDM&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;!AIVDO&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; into structured Java instances, supporting Types 1, 2, 3, 5, 18, and 24. It allows developers to register custom record parsers (such as a Base Station Type 4) by extending its segment-offset models. However, it is an archived project with low community engagement.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;libais (Schwehr)&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: A legacy, high-performance C++ decoder with SWIG-generated Python bindings. It features two interfaces: a high-level iterator-based Python API and a fast, low-level C++ core. It supports translating parsed objects into legacy GPSD formats. The codebase is stable but is no longer actively maintained, limiting its support for newer ITU-R specifications&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And then there are things like KPlex Multiplexer, OpenCPN Plotter, Signal K, canboat / canboatjs, and more. I hadn’t heard of Parameter Group Numbers (PGNs). It mentions Moving Pandas, which I so want to try, but have never spent time on.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I’m left with massive FOMO at this point with some many things like the above and this:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-left: 36pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;To clean raw AIS logs, analysts use data-driven frameworks such as the $\alpha$-method, which is implemented in Python through the &lt;/span&gt;&lt;span style=&quot;color: #188038; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;PyTSA&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; (Python Trajectory Search Agent) library.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And from the end of the Deep Research:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 4pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 17pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Conclusions and Technical Recommendations&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The open-source maritime AIS software ecosystem provides a comprehensive set of tools, ranging from embedded software demodulators to high-level spatiotemporal analysis libraries.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;When selecting and integrating these packages into production systems, developers should consider several technical guidelines:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;SDR Demodulation&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: For deployments using SDR hardware, &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;AIS-catcher&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; is the industry standard. Its performance-optimized C++ architecture, Neon/SSE vectorization, and multi-SDR support make it superior to legacy tools. To manage its GPL-3.0 license restrictions, developers should isolate the demodulator inside a containerized microservice and interact with it over network sockets (such as UDP or JSON over TCP).&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;High-Volume Ingestion&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: For cloud pipelines handling millions of messages per second, the zero-allocation, C#-based &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Ais.Net&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; core is the most performant option. Where copyleft licensing terms (AGPL-3.0) are a blocker, developers should use &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;go-ais&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; (MIT) or &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;nmea-parser&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; (Apache-2.0).&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Data Integration and Sensor Fusion&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: On-board marine networks should utilize &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Signal K&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; combined with &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;canboatjs&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. This stack translates raw binary NMEA 2000 PGNs and NMEA 0183 sentences into a unified, web-friendly JSON schema, simplifying downstream application development.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Data Science and Spatial Analytics&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;: For trajectory analysis and fleet pattern modeling, developers should pair the pure-Python &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;pyais&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; library with &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;MovingPandas&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;color: #188038; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;PyTSA&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. This workflow provides a mature, Python-native environment for spatiotemporal filtering, trip segmentation, and trajectory reconstruction.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2. What are the recent trends and innovations in maritime Automatic Identification System (AIS)?&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And now I realized I need to read up on VHF Data Exchange System (VDES). The spec’s first draft is from 2016, so I’m clearly very out of the loop by 10 years. I’m not sure how related to AIS this really is and I worry that people calling it “AIS 2.0” is likely yet more misleading terminology.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://navcen.uscg.gov/sites/default/files/pdf/AIS/IALA_G1117_Ed2_VHF_Data_Exchange_System_VDES_Overview_Dec2017.pdf&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://navcen.uscg.gov/sites/default/files/pdf/AIS/IALA_G1117_Ed2_VHF_Data_Exchange_System_VDES_Overview_Dec2017.pdf&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;a href=&quot;https://www.itu.int/rec/R-REC-M.2092&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;https://www.itu.int/rec/R-REC-M.2092&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And there are terms I’m not familiar with like Decentralized Physical Infrastructure Network (DePIN). I don’t think things like the Worldwide AIS Network (WAKE), “a decentralized, blockchain-based system designed to track global ship movements” (Gemini’s quote), are going to be that useful, but I haven’t dug into it.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And I didn’t know about S&amp;amp;P Global buying ORBCOMM’s AIS business, but I did know that Andy Lorette died. He was what made my collaboration with ORBCOMM so awesome.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I have a hint about this stuff happening: “AI-Driven Anomaly Detection and Multi-Sensor Fusion for Dark Vessel Monitoring”&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 4pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 17pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Conclusions and Strategic Outlook&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The development of the Automatic Identification System (AIS) represents a major shift toward a more secure, digitized, and automated global maritime domain. The transition from legacy SOTDMA broadcasts to the multi-channel VHF Data Exchange System (VDES) addresses the bandwidth constraints of maritime VHF channels, enabling two-way data exchange and supporting the global roll-out of e-Navigation S-100 standards. Furthermore, VDES&#39;s IP-less architecture and integrated cryptographic protocols, such as the two-tiered TESLA authentication framework, provide a secure foundation to protect ships from GNSS spoofing, code injection, and electronic manipulation.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;At the same time, commercial consolidation has concentrated the global AIS data market, leading to the rise of decentralized alternatives. Decentralized Physical Infrastructure Networks (DePIN) utilize Layer 1 blockchain platforms to capture and verify signal metadata at the point of ingestion, offering a transparent, tamper-proof audit trail for regulatory compliance and supply chain risk management.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Finally, by fusing secure AIS telemetry with spaceborne Synthetic Aperture Radar (SAR) and deep learning models, maritime authorities can systematically detect and monitor dark vessels, helping protect global trade routes, marine habitats, and national sovereignty. As the industry moves toward the mandatory MASS Code in 2032, adopting these secure, high-bandwidth tracking and verification technologies is essential to ensure the safety, efficiency, and resilience of global shipping.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;3. What are the current research and development challenges for maritime Automatic Identification System (AIS)?&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;And at this point, I am totally out of time, so here is the end of the Gemini Deep Research report:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2 dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 18pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Structural Synthesis of Next-Generation AIS Challenges&lt;/span&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The transition of the maritime Automatic Identification System into a secure, high-capacity tracking network is hindered by interrelated physical-layer, cryptographic, and operational challenges. To resolve these limitations, R&amp;amp;D initiatives must coordinate spectrum management, cybersecurity protocols, and autonomous navigation standards&lt;/span&gt;&lt;span style=&quot;color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The primary challenges and their required technological responses are synthesized below:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align=&quot;left&quot; dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;&lt;table style=&quot;border-collapse: collapse; border: none;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;156&quot;&gt;&lt;/col&gt;&lt;col width=&quot;156&quot;&gt;&lt;/col&gt;&lt;col width=&quot;156&quot;&gt;&lt;/col&gt;&lt;col width=&quot;156&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Technical Challenge&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Root Systemic Dependency&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Primary R&amp;amp;D Objective&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Strategic Action Plan&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Physical Channel Saturation&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2,250 slots-per-minute limit of SOTDMA channels&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;15&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Offload non-safety data to expand bandwidth&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;14&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Deploy VDES to transition data exchange to dedicated ASM and VDE channels&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;14&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Satellite Signal Collisions&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Unsynchronized reception over footprints up to 5,000 km&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Isolate and reconstruct overlapping signals&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;15&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Train multiscale CNNs to detect boundaries and separate colliding signals&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;19&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Unauthenticated Transmission&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Legacy open RF broadcast architecture from the 1990s&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Implement protocol-level message verification&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Apply signature-splitting over VDE-TER channels for legacy compatibility&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Encryption Bandwidth Overhead&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Saturated links cannot carry heavy PKC digital signatures&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Develop low-overhead broadcast authentication&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Implement the TESLA protocol using symmetric-key chains and delayed disclosure&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Timing Dependency Vulnerability&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Protocol reliance on GPS for SOTDMA and TESLA timing&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Establish resilient, independent backup timing systems&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Deploy VDES R-Mode to provide 10-100m fallback PNT in GNSS-denied areas&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;17&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Indirect Display Exploitation&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Direct sensor integration with the ship&#39;s ECDIS&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Prevent malicious payloads from compromising bridge networks&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Build secure communication interfaces and parsers to isolate incoming data&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 6pt; margin-top: 6pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Algorithmic COLREGs Alignment&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Vague, qualitative rules in maritime collision law&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;38&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Codify rules of the road into machine-readable logic&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;38&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8fafd; border-bottom: solid #c4c7c5 0.75pt; border-left: solid #c4c7c5 0.75pt; border-right: solid #c4c7c5 0.75pt; border-top: solid #c4c7c5 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt 6pt 9pt; vertical-align: top;&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Train AI models with explainability layers and standardized numeric margins&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #444746; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 12pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-size: 0.6em; vertical-align: super;&quot;&gt;35&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Addressing these technical challenges is essential to support the next generation of maritime operations. Securing the legacy AIS broadcast model, resolving satellite-level signal congestion, and establishing robust, authenticated links through VDES will ensure the safety and security of global shipping.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.3799999713897704; margin-bottom: 12.75pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans&amp;quot;, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Achieving this requires international coordination among regulatory bodies, technology developers, and shipping operators to implement unified standards for next-generation tracking, cryptographic key management, and autonomous vessel integration.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/6405750790991520800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/06/authorship-statement-mostly-me-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6405750790991520800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6405750790991520800'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/06/authorship-statement-mostly-me-with.html' title='Gemini Deep Research on AIS'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-3920170581145699206</id><published>2026-04-25T11:10:00.000-07:00</published><updated>2026-04-25T11:10:09.250-07:00</updated><title type='text'>Using joern-scan and Gemini on PROJ</title><content type='html'>&lt;p&gt;&amp;nbsp;I have been meaning to take a look more at knowledge graphs for some work and I&#39;ve been trying to figure out what useful tasks I can do along the way. I figured I could see what tools could create a graph db of an open source project and then try to do some useful tasks with the results. I think my first try did not accomplish anything useful.&lt;/p&gt;&lt;p&gt;Gemini claimed that&amp;nbsp;&lt;a href=&quot;https://github.com/joernio/joern&quot;&gt;https://github.com/joernio/joern&lt;/a&gt; is the gold standard of open source scanners that LLMs can use. I gave a look at some cpg example commands and realized it will be quite a bit of work to really understand how to use the domain specific language to do anything interesting. I figured I&#39;d give it a try with&amp;nbsp;&lt;a href=&quot;https://github.com/OSGeo/PROJ/&quot;&gt;https://github.com/OSGeo/PROJ/&lt;/a&gt;&amp;nbsp;to see what the gemini-cli can do. I installed Joern and checked out PROJ in a directory and fired up the gemini-cli in that directory. My first prompt:&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Use joern and the cpg to search PROJ for bugs&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Gemini went off and found &lt;a href=&quot;https://docs.joern.io/scan/&quot;&gt;joern-scan&lt;/a&gt;&amp;nbsp;in the&amp;nbsp;joern-cli directory and started running it. The tool created a cpg database for the project:&lt;/p&gt;&lt;p&gt;tree workspace/PROJ&lt;/p&gt;&lt;p&gt;workspace/PROJ&lt;/p&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;├── cpg.bin&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;├── cpg.bin.tmp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;├── overlays&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;│&amp;nbsp; &amp;nbsp;├── base&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;│&amp;nbsp; &amp;nbsp;├── callgraph&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;│&amp;nbsp; &amp;nbsp;├── controlflow&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;│&amp;nbsp; &amp;nbsp;├── dataflowOss&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;│&amp;nbsp; &amp;nbsp;└── typerel&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;└── project.json&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;It then ran a scan for quite a while printing all sorts of complaints along the way.&lt;/p&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;head -20 /home/schwehr/.gemini/tmp/joern/tool-outputs/session-.../run_shell_command.txt&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Output: Writing logs to: /tmp/joern-scan-log.txt&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;=======================================================================================================&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Invoking CPG generator in a separate process. Note that the new process will consume additional memory.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;If you are importing a large codebase (and/or running into memory issues), please try the following:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;1) exit joern&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;2) invoke the frontend: /home/schwehr/joern/joern-cli/c2cpg.sh -J-Xmx24160m /home/schwehr/joern/PROJ --output /home/schwehr/joern/workspace/PROJ1/cpg.bin.zip&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;3) start joern, import the cpg: `importCpg(&quot;path/to/cpg&quot;)`&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;=======================================================================================================&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] initialising from existing storage (/home/schwehr/joern/workspace/PROJ1/cpg.bin.tmp)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Start of pass: io.joern.x2cpg.passes.base.FileCreationPass&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Pass io.joern.x2cpg.passes.base.FileCreationPass completed in 95 ms (62% on mutations). 17643 + 0 changes committed from 1 parts.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Start of pass: io.joern.x2cpg.passes.base.NamespaceCreator&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Pass io.joern.x2cpg.passes.base.NamespaceCreator completed in 16 ms (53% on mutations). 710 + 0 changes committed from 1 parts.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Start of pass: io.joern.x2cpg.passes.base.TypeDeclStubCreator&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Pass io.joern.x2cpg.passes.base.TypeDeclStubCreator completed in 27 ms (11% on mutations). 0 + 0 changes committed from 1 parts.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Start of pass: io.joern.x2cpg.passes.base.MethodStubCreator&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Inconsistent/erroneous callInfo on calls to method fullname osgeo.proj.datum.Datum.conventionalRS:ANY() (we have 1 many variants)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Inconsistent/erroneous callInfo on calls to method fullname osgeo.proj.common.IdentifiedObject.remarks:ANY() (we have 1 many variants)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Inconsistent/erroneous callInfo on calls to method fullname osgeo.proj.util.BaseObject.shared_from_this:osgeo.proj.util.BaseObjectNNPtr() (we have 1 many variants)&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;tail /run_shell_command.txt&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Result: 5.0 : A field of a parameter is free&#39;d and not reassigned on all paths: src/ell_set.cpp:89:pj_ellipsoid:int(PJ*)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Result: 5.0 : A field of a parameter is free&#39;d and not reassigned on all paths: src/ell_set.cpp:203:ellps_size:int(PJ*)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Result: 5.0 : A field of a parameter is free&#39;d and not reassigned on all paths: src/ell_set.cpp:252:ellps_shape:int(PJ*)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Result: 5.0 : A value that is returned through a parameter is free&#39;d in a path: src/ell_set.cpp:175:ellps_ellps:int(PJ*)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Start of pass: io.shiftleft.semanticcpg.Overlays$$anon$1&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] Pass io.shiftleft.semanticcpg.Overlays$$anon$1 completed in 1 ms (81% on mutations). 1 + 0 changes committed from 1 parts.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] writing to storage at `home/schwehr/joern/workspace/PROJ1/cpg.bin.tmp`&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;[INFO ] closed graph at /home/schwehr/joern/workspace/PROJ1/cpg.bin.tmp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Run `joern --for-input-path PROJ` to explore interactively&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;Gemini printed a summary of what it found after a few minutes of work. I asked it to write a summary:&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Write the summary as security-scan-summary.md&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Which got me:&lt;/p&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 1. Memory Management &amp;amp; Freeing Issues (Severity: High)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;A field of a parameter or returned value is `free`&#39;d but not properly reassigned on all execution paths, which could lead to Use-After-Free (UAF) or Double-Free vulnerabilities:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/ell_set.cpp:83`, `85`, `87`, `89` in `pj_ellipsoid:int(PJ*)`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/ell_set.cpp:203` in `ellps_size:int(PJ*)`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/ell_set.cpp:252` in `ellps_shape:int(PJ*)`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/ell_set.cpp:175` in `ellps_ellps:int(PJ*)`&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 2. Format String Vulnerabilities (Severity: High)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;A non-constant format string is passed to `printf`, `sprintf`, or `vsprintf`, which can be exploited if the format string contains un-sanitized user input:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/apps/cct.cpp:246` in `main:int(int,char**)`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/apps/gie.cpp:294` in `main&amp;lt;duplicate&amp;gt;2:int(int,char**)`&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 3. Unchecked Read/Recv/Malloc (Severity: Medium)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;The return value of memory allocation functions (like `malloc`) or file reading functions does not appear to be checked for `NULL` or error codes before being used:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/apps/cct.cpp:331` in `main:int(int,char**)`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/apps/projinfo_lib.cpp:353` in `buildObject`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/initcache.cpp:50` in `pj_clone_paralist`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/initcache.cpp:148`, `157`, `170` in `pj_insert_initcache`&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 4. Dangerous Functions (`strcpy` / `strncpy`) (Severity: Medium)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Use of unsafe string copy functions that are prone to buffer overflows. These should be replaced with safer alternatives like `strlcpy` or `snprintf`:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/apps/gie.cpp`**: Lines 637, 756, 757, 762, 774, 1589&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/datum_set.cpp`**: Lines 84, 85&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/filemanager.cpp`**: Lines 1674, 1913&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/grids.cpp`**: Multiple instances (Lines 3946, 3956, 3997, 4032, 4050, 4067, 4083, etc.)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/init.cpp`**: Lines 159, 194, 200, 244, 271, 289, 555, 644&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/initcache.cpp`**: Lines 55, 172&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/pr_list.cpp`**: Line 86&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* **`src/param.cpp`**: Line 23&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 5. String Length Truncation (Severity: Low-Medium)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Assignments involving `strlen()` calls where truncation might occur due to integer type mismatches or unsafe size conversions:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/iso19111/factory.cpp:7959`, `7961`, `7963`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/iso19111/io.cpp:1655` and `6385`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/pr_list.cpp:18` and `79`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/apps/optargpm.h:532`&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;### 6. File Operation Race Conditions (Severity: Low)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Two file operations on the same path can act on different files (Time-of-Check to Time-of-Use):&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/filemanager.cpp:994`, `1002` in `FileManager.open`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/grids.cpp:2698`, `2709`, `2722` in `HorizontalShiftGridSet.open`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/grids.cpp:3974`, `3987` in `proj_grid_info`&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;* `src/networkfilemanager.cpp`: Multiple lines (e.g. `2541`, `2717`, `2819`) in `proj_download_file` and `proj_is_download_needed`.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I did some quick inspection of the &quot;Memory Management &amp;amp; Freeing Issues&quot; listings and was not impressed. They were all set to nullptr right after being freed. I asked gemini and it basically said the same thing.&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Look closer at the issues in src/ell_set.cpp&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I then asked Gemini to go through them all:&lt;/p&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Go through each of the issues listed in @security-scan-summary.md. For each issue, do an evaluation. For issue that appears to be valid or possibly valid, create a markdown report in the issues directory. The report should include a detailed description of the issue. Explain the risk level of the issue. And give a proposed patch for a fix.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Gemini wrote one issue file:&lt;/p&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Unchecked Memory Allocations in `src/initcache.cpp`&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;## Detailed Description&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;In `src/initcache.cpp`, there are multiple instances where memory is allocated using `malloc`, but the return value is not gracefully checked for a `NULL` pointer. Instead, the code relies on `assert()` to enforce that the pointer is valid.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;For example, in `pj_clone_paralist` (line ~50):&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```cpp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; paralist *newitem =&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (paralist *)malloc(sizeof(paralist) + strlen(list-&amp;gt;param));&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(newitem);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newitem-&amp;gt;used = 0;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;And similarly in `pj_insert_initcache` (lines ~148, 157, 170):&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```cpp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cache_key_new = (char **)malloc(sizeof(char *) * cache_alloc);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(cache_key_new);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ...&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cache_paralist_new =&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (paralist **)malloc(sizeof(paralist *) * cache_alloc);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(cache_paralist_new);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ...&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cache_key[cache_count] = (char *)malloc(strlen(filekey) + 1);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(cache_key[cache_count]);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;The issue with using `assert()` here is that `assert` statements are typically compiled out in production builds (when `NDEBUG` is defined). In production, if `malloc` fails due to memory exhaustion, the pointers will be `NULL`. The subsequent dereferences (like `newitem-&amp;gt;used = 0;`) will cause an immediate segmentation fault, crashing the host application.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;## Risk Level&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;**Medium**&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Out-of-memory (OOM) conditions are relatively rare, but robust libraries should handle allocation failures gracefully without crashing the host application. If an attacker can trigger excessive caching, they could theoretically trigger a denial-of-service (DoS) condition by crashing the process.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;## Proposed Patch&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Replace `assert()` with a proper `if` condition that handles the `NULL` pointer by cleaning up and returning an error or `nullptr`.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```patch&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;--- a/src/initcache.cpp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+++ b/src/initcache.cpp&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;@@ -48,7 +48,15 @@&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for (; list != nullptr; list = list-&amp;gt;next) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;paralist *newitem =&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(paralist *)malloc(sizeof(paralist) + strlen(list-&amp;gt;param));&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;-&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(newitem);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (newitem == nullptr) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Free already copied elements&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (list_copy != nullptr) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; paralist *tmp = list_copy-&amp;gt;next;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; free(list_copy);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list_copy = tmp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return nullptr;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newitem-&amp;gt;used = 0;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newitem-&amp;gt;next = nullptr;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;@@ -145,14 +153,16 @@&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cache_alloc = cache_alloc * 2 + 15;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cache_key_new = (char **)malloc(sizeof(char *) * cache_alloc);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;-&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(cache_key_new);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (cache_key_new == nullptr) return; // Silent failure on cache insert&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cache_key &amp;amp;&amp;amp; cache_count) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memcpy(cache_key_new, cache_key, sizeof(char *) * cache_count);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;free(cache_key);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cache_key = cache_key_new;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cache_paralist_new =&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(paralist **)malloc(sizeof(paralist *) * cache_alloc);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;-&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assert(cache_paralist_new);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (cache_paralist_new == nullptr) return;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cache_paralist &amp;amp;&amp;amp; cache_count) {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memcpy(cache_paralist_new, cache_paralist,&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sizeof(paralist *) * cache_count);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;@@ -167,7 +177,8 @@&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;** Duplicate the filekey and paralist, and insert in cache.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;cache_key[cache_count] = (char *)malloc(strlen(filekey) + 1);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;-&amp;nbsp; &amp;nbsp; assert(cache_key[cache_count]);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp; if (cache_key[cache_count] == nullptr) return;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;+&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;strcpy(cache_key[cache_count], filekey);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;cache_paralist[cache_count] = pj_clone_paralist(list);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I rate that report as not very interesting. Gemini&#39;s conclusion:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT4c4vzrpI_47ae7kxGyomSF9IhF068XDcOXij4xdWR25Qpr58FMlQ3pVZq31yen3vx1UyrYeX3zkX1JP5gjaxIWWco0qoxFCFNLYTMD4a32QESyChJ7dXAU_ZV69itluYVYxwfdrJ88gyk9oZ-zRaAQKQzNy66d-qEYDsceDC-jqW2Yos2VplbuaQ3us/s1986/Screenshot%202026-04-25%20at%2011.02.26%E2%80%AFAM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1488&quot; data-original-width=&quot;1986&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT4c4vzrpI_47ae7kxGyomSF9IhF068XDcOXij4xdWR25Qpr58FMlQ3pVZq31yen3vx1UyrYeX3zkX1JP5gjaxIWWco0qoxFCFNLYTMD4a32QESyChJ7dXAU_ZV69itluYVYxwfdrJ88gyk9oZ-zRaAQKQzNy66d-qEYDsceDC-jqW2Yos2VplbuaQ3us/w640-h480/Screenshot%202026-04-25%20at%2011.02.26%E2%80%AFAM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So all that and no real value added. Now I have to wonder what non-security check things can be done with the cpg file? Can it aid an LLM cli in making normal code changes? I&#39;m thinking things like adding new features, improving performance, refactoring, checking numerical stability, etc.?&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/3920170581145699206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2026/04/using-joern-scan-and-gemini-on-proj.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3920170581145699206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/3920170581145699206'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2026/04/using-joern-scan-and-gemini-on-proj.html' title='Using joern-scan and Gemini on PROJ'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT4c4vzrpI_47ae7kxGyomSF9IhF068XDcOXij4xdWR25Qpr58FMlQ3pVZq31yen3vx1UyrYeX3zkX1JP5gjaxIWWco0qoxFCFNLYTMD4a32QESyChJ7dXAU_ZV69itluYVYxwfdrJ88gyk9oZ-zRaAQKQzNy66d-qEYDsceDC-jqW2Yos2VplbuaQ3us/s72-w640-h480-c/Screenshot%202026-04-25%20at%2011.02.26%E2%80%AFAM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-2518184688900906563</id><published>2025-11-30T09:47:00.000-08:00</published><updated>2025-11-30T09:47:01.778-08:00</updated><title type='text'>Looking back at the 2006 JPL/NASA Power of Ten Rules for developing code</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The &lt;/span&gt;&lt;a href=&quot;https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Tigerbeetle Style Guide&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt; is interesting reading, but here I’m going to focus on &lt;/span&gt;&lt;a href=&quot;https://spinroot.com/gerard/pdf/P10.pdf&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The Power of Ten – Rules for Developing Safety Critical Code&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt; by Gerard J. Holzmann at JPL/NASA from 2006 (&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Wikipedia&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;). That article is almost 20 years old and I worked on software in and around flight systems from 1996-2009, so I’ve some experience of that culture. The target environments are remote and embedded systems where high reliability and recoverability of individual systems is key. It’s very different from the Google data center type world that I have been working in since 2012 where these books are key references: &lt;/span&gt;&lt;a href=&quot;https://abseil.io/resources/swe-book&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Software Engineering at Google&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt; and &lt;/span&gt;&lt;a href=&quot;https://sre.google/books/&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Google Site Reliability Books&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;. Despite the differences, there are tons of places where the same techniques and tools lead to good results.&lt;/span&gt;&lt;/p&gt;&lt;span id=&quot;docs-internal-guid-b9a429e1-7fff-31d4-b25e-b63a012cce7e&quot;&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Also keep in mind the following from 2006:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul style=&quot;margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;&quot;&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;C99 and C++03 were new. C++11 was a radical change.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;Python 3.0 was not yet released and type annotations didn’t come until 2015.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;Go, Rust, TypeScript, and Zig hadn’t been released.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;Fortran 2003 was out, but the language doesn’t have a stdlib and &lt;/span&gt;&lt;a href=&quot;https://stdlib.fortran-lang.org/&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;https://stdlib.fortran-lang.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt; is a work in progress.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level=&quot;1&quot; dir=&quot;ltr&quot; style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;p dir=&quot;ltr&quot; role=&quot;presentation&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;&quot;&gt;Automated testing / CI were not common or well developed then. Please write code with great tests and make them run automatically.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;And now the rules with some commentary:&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;1. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: Restrict all code to very simple control flow constructs – do not use goto&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;statements, setjmp or longjmp constructs, and direct or indirect recursion.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This is still great advice. HDF5 is still full of gotos and that creates so much trouble. There are so many better ways to handle cleanup if you aren’t stuck in C99. My take for folks wanting to maintain a C ABI is to use C++ inside the code and then just expose C interfaces.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;For simple and constrained problems, a quick recursive solution may still be useful if the code is much easier to follow. However, in general, recursion is not great for production or embedded systems.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;2. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: All loops must have a fixed upper-bound. It must be trivially possible for a&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;checking tool to prove statically that a preset upper-bound on the number of iterations&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;of a loop cannot be exceeded. If the loop-bound cannot be proven statically, the rule&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;is considered violated.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This rule seems to imply that the code hasn’t properly sanitized inputs. Input validation and sanitization is critical for security and performance in general. In my opinion, this rule moves the responsibility to too late in the process.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;3. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: Do not use dynamic memory allocation after initialization.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This is a good rule for long running embedded systems. However, it’s a total fail for most other types of code. It will introduce complexity and limitations where they aren’t needed. There are certainly places where memory pools / arenas are good, but they should be dictated by the particular data and algorithm. Only allocating at initialization should be the exception, not the rule.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;In many cases (e.g. most of google3), the emphasis should be on keeping the stack size constrained. Many modern applications have hundreds of threads at any time. Excessive stack size means large amounts of wasted stack / excessive address space usage as the system will have to assume that all threads may use large amounts of stack.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;4. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: No function should be longer than what can be printed on a single sheet of&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;paper in a standard reference format with one line per statement and one line per&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;declaration. Typically, this means no more than about 60 lines of code per function.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This is in general a good idea, but shouldn’t be a rule. Sometimes decomposing code into lots of functions makes it harder to follow. However, modern programming languages make writing tighter code much easier, so the places where long functions or methods are needed should be far fewer these days.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;5. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: The assertion density of the code should average to a minimum of two&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;assertions per function. Assertions are used to check for anomalous conditions that&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;should never happen in real-life executions. Assertions must always be side-effect&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;free and should be defined as Boolean tests. When an assertion fails, an explicit&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;recovery action must be taken, e.g., by returning an error condition to the caller of the&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;function that executes the failing assertion. Any assertion for which a static checking&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;tool can prove that it can never fail or never hold violates this rule. (I.e., it is not&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;possible to satisfy the rule by adding unhelpful “assert(true)” statements.)&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This rule is weird. asserts are always booleans in modern languages. If you are using C, please switch to C++ and make as many of the asserts be &lt;/span&gt;&lt;a href=&quot;https://en.cppreference.com/w/cpp/language/static_assert.html&quot; style=&quot;text-decoration-line: none;&quot;&gt;&lt;span style=&quot;color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;static_assert&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;. But, I think a lot of what was asserts in the past should be unit tests now. Excessive asserting in code can make it hard to follow the code. If it is an assert, there should never be recovery action. An assert is a crash under test and nothing in production. Full stop. Error handling and asserts are two separate topics.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote style=&quot;border: none; margin: 0 0 0 40px; padding: 0px;&quot;&gt;&lt;span&gt;&lt;p style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;6. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: Data objects must be declared at the smallest possible level of scope.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This is pretty reasonable. It helps with debugging such that you don’t have to look over as much code when things go wrong. It generally makes test writing easier. Keeping around data when not necessary is wasteful and reduces the ability of the overall system. Especially in modern systems with many process each with many threads, waste of RAM greatly reduces how much can be done on each system.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;7. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: The return value of non-void functions must be checked by each calling&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;function, and the validity of parameters must be checked inside each function.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;First, this should start with a rule that the C standard library should be avoided as much as possible. I’ve seen code that checks every printf, fopen, fclose, fread, and fwrite and has error handling on each. The code size explodes without improving reliability. This is more about API design. Modern APIs are just so much less painful.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;After that however, every return should be checked or explicitly ignored. The `_` convention is a great way to explicitly ignore the result.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;8. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: The use of the preprocessor must be limited to the inclusion of header files and&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;simple macro definitions. Token pasting, variable argument lists (ellipses), and&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;recursive macro calls are not allowed. All macros must expand into complete&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;syntactic units. The use of conditional compilation directives is often also dubious,&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;but cannot always be avoided. This means that there should rarely be justification for&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;more than one or two conditional compilation directives even in large software&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;development efforts, beyond the standard boilerplate that avoids multiple inclusion of&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;the same header file. Each such use should be flagged by a tool-based checker and&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;justified in the code.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;This is in general good. A big lesson for C folks should be to switch to C++ and convert as many #define values and macros to const_expr as possible. I love that Rust is immutable by default.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;For python folks, doing imports in functions makes maintenance difficult. 🙁&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;9. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: The use of pointers should be restricted. Specifically, no more than one level of&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;dereferencing is allowed. Pointer dereference operations may not be hidden in macro&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;definitions or inside typedef declarations. Function pointers are not permitted.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Yes, pointers should still be generally restricted. However, how pointers are used should probably not be at all the same as in the past. In C++, unique_ptr is fantastic.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;10. Rule&lt;/span&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;: All code must be compiled, from the first day of development, with all&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;compiler warnings enabled at the compiler’s most pedantic setting. All code must&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;compile with these setting without any warnings. All code must be checked daily with&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;at least one, but preferably more than one, state-of-the-art static source code analyzer&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;and should pass the analyses with zero warnings.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Yes, turn on all checks possible and keep them on as errors. Also, for C / C++ code, please run all tests through the sanitizer modes. Please use fuzzing. Please use LLMs to look for other issues, but be warned that false positives, false negatives, and hallucinations are constant companions. Build for more than one arch (e.g. x86_64 and arm).&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/2518184688900906563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2025/11/looking-back-at-2006-jplnasa-power-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/2518184688900906563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/2518184688900906563'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2025/11/looking-back-at-2006-jplnasa-power-of.html' title='Looking back at the 2006 JPL/NASA Power of Ten Rules for developing code'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-6211136122870812878</id><published>2023-06-06T17:40:00.005-07:00</published><updated>2023-06-06T17:40:37.575-07:00</updated><title type='text'>ChatGPT and AIS</title><content type='html'>&lt;p&gt;Sigh. ChatGPT is really good at producing garbage interlaced with real information. Sorting it all out is challenging. I do like that it got it correct that AIS is a transceiver based system. I even tried misleading it when asking about transponder or receiver.&amp;nbsp; Here is my transcript without edits. Talk about making it easy to generate click bait. I was listening to a Security Now podcast about news websites that are mostly / just AI/ML LLM generated content. Finding the real info might started getting really difficult.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Summarize what the Automatic Identification System (AIS) is and how it tracks ships.&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The Automatic Identification System (AIS) is a widely used tracking system designed to enhance maritime safety and security. It enables ships and other vessels to communicate their identity, position, and other relevant information to nearby vessels, shore-based stations, and satellite systems.&lt;/p&gt;&lt;p&gt;AIS relies on VHF (Very High Frequency) radio transmissions to exchange data between vessels and shore-based stations. Each ship equipped with an AIS transceiver continuously broadcasts its unique identification, position, speed, course, and other data to nearby vessels and coastal authorities. This information is typically transmitted at regular intervals and includes details like ship name, call sign, IMO number, type of vessel, dimensions, and cargo information.&lt;/p&gt;&lt;p&gt;Shore-based AIS receiving stations pick up these radio signals and feed the information into a network. The data is then processed and made available to various users, including vessel operators, port authorities, maritime traffic controllers, and search and rescue agencies. Additionally, AIS information can be accessed by satellite systems, allowing for broader coverage and tracking of vessels even in remote areas.&lt;/p&gt;&lt;p&gt;AIS provides several benefits in maritime operations. It helps prevent collisions by providing real-time vessel positions, facilitating better situational awareness for captains and maritime authorities. It also assists in monitoring vessel movements, enhancing maritime domain awareness, and enabling efficient traffic management in busy waterways and ports. AIS data can be utilized for analysis, planning, and implementing measures to optimize shipping routes, improve vessel efficiency, and enforce maritime regulations.&lt;/p&gt;&lt;p&gt;Overall, the Automatic Identification System plays a crucial role in maritime safety, security, and efficient vessel operations by enabling the tracking and exchange of vital information among ships, coastal authorities, and satellite systems.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Describe the security of the AIS system.&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The security of the Automatic Identification System (AIS) is an important aspect to ensure the integrity and reliability of the system. While AIS is designed to enhance maritime safety and security, it is not without potential vulnerabilities and risks. Here are some considerations related to the security of the AIS system:&lt;/p&gt;&lt;p&gt;Authentication: AIS relies on the accurate identification of vessels through unique identification codes. However, there have been instances where malicious actors have manipulated or spoofed AIS data to disguise vessel identities or engage in illicit activities. Enhancing authentication measures can help prevent such incidents and ensure the integrity of transmitted data.&lt;/p&gt;&lt;p&gt;Encryption: AIS messages are typically transmitted in clear text over VHF radio frequencies. This lack of encryption makes the system susceptible to eavesdropping and unauthorized access. Implementing encryption mechanisms can help protect the confidentiality and privacy of AIS data.&lt;/p&gt;&lt;p&gt;Access control: Unauthorized access to AIS data can lead to misuse or tampering. Therefore, it is crucial to have robust access control measures in place to restrict access to sensitive information and prevent unauthorized modifications to AIS data.&lt;/p&gt;&lt;p&gt;Data validation and integrity: AIS data should undergo validation processes to ensure that the transmitted information is accurate and trustworthy. Verification mechanisms can help detect anomalies or inconsistencies in AIS messages, thereby maintaining data integrity.&lt;/p&gt;&lt;p&gt;Network security: The AIS network, including shore-based receiving stations and data processing systems, should be protected against potential cyber threats. Implementing robust network security measures, such as firewalls, intrusion detection systems, and regular security updates, can help safeguard the AIS infrastructure.&lt;/p&gt;&lt;p&gt;Redundancy and backup: Having redundant AIS infrastructure and backup systems can help ensure continuous operation and minimize disruptions caused by technical failures or malicious attacks.&lt;/p&gt;&lt;p&gt;International cooperation: Since AIS is a global system, international collaboration and information sharing among maritime authorities and organizations are essential to address security concerns effectively. Cooperation can involve the exchange of best practices, joint exercises, and the development of common standards for secure AIS operations.&lt;/p&gt;&lt;p&gt;Continuous evaluation, research, and improvement of the AIS system&#39;s security are necessary to mitigate risks and stay ahead of emerging threats. By addressing these security considerations, the maritime industry can enhance the reliability and trustworthiness of the AIS system.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Who are the key academic researchers who study AIS?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Several academic researchers have contributed to the study of Automatic Identification System (AIS) and its various aspects. Here are a few notable researchers in this field:&lt;/p&gt;&lt;p&gt;Dr. Shengjie Yan: Dr. Yan is a prominent researcher in AIS and maritime transportation. His research focuses on AIS data analysis, vessel behavior modeling, maritime risk assessment, and decision-making in maritime operations.&lt;/p&gt;&lt;p&gt;Dr. Jens-Uwe Schröder-Hinrichs: Dr. Schröder-Hinrichs is a leading academic in the field of maritime safety and human factors. His research includes the analysis of AIS data for safety-related studies, such as collision avoidance, human error analysis, and risk assessment.&lt;/p&gt;&lt;p&gt;Dr. Jens Froese: Dr. Froese is known for his research on maritime traffic monitoring, vessel tracking, and maritime domain awareness. His work involves using AIS data for vessel behavior analysis, congestion management, and route optimization.&lt;/p&gt;&lt;p&gt;Dr. Jasenka Rakas: Dr. Rakas specializes in marine transportation systems and has conducted extensive research on AIS-based vessel traffic monitoring, maritime surveillance, and decision support systems. Her work focuses on developing models and algorithms to analyze AIS data and improve maritime situational awareness.&lt;/p&gt;&lt;p&gt;Dr. Miguel Ángel Cámara Laorden: Dr. Cámara Laorden has expertise in maritime cybersecurity and AIS-related vulnerabilities. His research explores the security challenges associated with AIS, including AIS data manipulation, spoofing attacks, and privacy concerns.&lt;/p&gt;&lt;p&gt;Dr. Claudio A. Alvarez: Dr. Alvarez has conducted research on the application of AIS data in maritime safety and security. His work includes the analysis of AIS data for collision risk assessment, vessel traffic flow modeling, and maritime surveillance systems.&lt;/p&gt;&lt;p&gt;These are just a few examples of researchers who have made significant contributions to the study of AIS. The field of AIS research is multidisciplinary, involving experts from areas such as maritime transportation, data analysis, cybersecurity, human factors, and decision science.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: What open source libraries are there for decoding AIS?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;There are several open-source libraries available for decoding Automatic Identification System (AIS) messages. These libraries provide tools and functions to parse and extract information from AIS messages. Here are a few notable ones:&lt;/p&gt;&lt;p&gt;libais: libais is a popular open-source C++ library for decoding AIS messages. It supports various AIS message types and provides functions to parse and extract data from AIS sentences. The library is widely used and has bindings for other programming languages like Python.&lt;/p&gt;&lt;p&gt;aisparser: aisparser is an open-source library written in C that provides AIS message decoding capabilities. It supports different AIS message types and offers functions to extract information such as vessel position, speed, and course. The library is actively maintained and is available under the LGPL license.&lt;/p&gt;&lt;p&gt;pyAISm: pyAISm is a Python library for AIS message decoding. It provides classes and functions to parse AIS messages and retrieve vessel information. pyAISm supports different AIS message types and can process both raw AIS data and NMEA sentences.&lt;/p&gt;&lt;p&gt;ais-decoder: ais-decoder is a Java library that decodes AIS messages. It can handle various AIS message types and provides methods to extract relevant data. The library is designed to be lightweight and easy to use.&lt;/p&gt;&lt;p&gt;aisparser-rs: aisparser-rs is a Rust library for decoding AIS messages. It offers parsing and decoding functionality for different AIS message types. The library aims to provide a safe and efficient interface for working with AIS data in Rust projects.&lt;/p&gt;&lt;p&gt;These open-source libraries can assist in decoding and processing AIS messages in different programming languages, making it easier to extract and utilize AIS data in various applications and projects.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Why did you not list gpsd?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;I apologize for not including gpsd in the list. You are correct that gpsd is an important open-source library that can be used for decoding AIS data. While gpsd primarily focuses on handling GPS data and managing GPS receivers, it also has support for processing AIS messages.&lt;/p&gt;&lt;p&gt;gpsd provides a client-server architecture that allows applications to communicate with GPS receivers and retrieve data, including AIS messages. By connecting to a gpsd server, developers can access AIS data alongside GPS information, making it a versatile choice for applications that require both GPS and AIS data processing.&lt;/p&gt;&lt;p&gt;The gpsd library is written in C and has bindings available for various programming languages, including Python, C++, and Java. It offers a range of functions and tools to handle AIS decoding, such as parsing AIS sentences and extracting relevant information about vessels.&lt;/p&gt;&lt;p&gt;Thank you for pointing out the omission of gpsd. It is indeed a valuable open-source library for AIS decoding and integration with GPS data.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Who are the primary authors of the open source AIS decoding software?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The open-source AIS decoding software ecosystem involves contributions from various developers and contributors. While it is challenging to pinpoint a single set of primary authors due to the collaborative nature of open-source projects, here are a few notable individuals who have made significant contributions to the development and maintenance of popular AIS decoding software:&lt;/p&gt;&lt;p&gt;Alexander Chen: Alexander Chen is a key contributor to the libais library, a widely used open-source C++ library for decoding AIS messages. He has made significant contributions to the codebase, including feature enhancements, bug fixes, and maintenance.&lt;/p&gt;&lt;p&gt;Keith Lees: Keith Lees is a developer who has played a crucial role in the development and maintenance of the aisparser library. His contributions include refining the decoding logic, expanding support for different AIS message types, and addressing issues reported by the community.&lt;/p&gt;&lt;p&gt;Claudio A. Alvarez: Claudio A. Alvarez has made significant contributions to the AIS decoding software ecosystem, particularly through the ais-decoder library. His work includes developing the Java-based AIS decoder, maintaining the codebase, and providing support to users.&lt;/p&gt;&lt;p&gt;Gary Peek: Gary Peek has been actively involved in the development of the pyAISm library, a Python library for decoding AIS messages. His contributions include adding new features, improving performance, and addressing issues raised by users.&lt;/p&gt;&lt;p&gt;These individuals, along with many other contributors, have played important roles in advancing AIS decoding software by dedicating their time and expertise to developing, enhancing, and maintaining open-source libraries. The collaborative nature of open-source projects ensures that these software ecosystems continue to evolve and improve over time.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Who started libais?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;The libais library, a widely used open-source C++ library for decoding Automatic Identification System (AIS) messages, was initially developed by the programmer named Martin Laubach.&lt;/p&gt;&lt;p&gt;Martin Laubach started the libais project and released the initial version of the library. He created libais with the goal of providing a comprehensive and efficient solution for AIS message decoding in the C++ programming language. Over time, the project has received contributions from other developers who have helped improve and maintain the library.&lt;/p&gt;&lt;p&gt;The libais library has become a popular choice for developers working with AIS data, offering robust decoding capabilities and support for various AIS message types.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Did Kurt Schwehr start libais?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Apologies for the confusion in my previous response. You are correct, Kurt Schwehr is the individual who started the libais project.&lt;/p&gt;&lt;p&gt;Kurt Schwehr, a researcher and software developer, initiated the libais project. He developed the initial version of the library and laid the foundation for its subsequent growth and development. Schwehr&#39;s work on libais aimed to provide an open-source C++ library for decoding AIS messages and making AIS data more accessible for various applications and projects.&lt;/p&gt;&lt;p&gt;Since its inception, libais has gained recognition and has seen contributions from other developers who have helped expand its functionality and maintain the library over time.&lt;/p&gt;&lt;p&gt;Thank you for pointing out the correct information regarding Kurt Schwehr&#39;s involvement in starting the libais project.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Who were the contributors to aisparser?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The aisparser library, an open-source C library for decoding Automatic Identification System (AIS) messages, has received contributions from various individuals over time. While it is challenging to provide an exhaustive list of all contributors, here are some notable individuals who have made significant contributions to the aisparser project:&lt;/p&gt;&lt;p&gt;Terry Moore: Terry Moore is a key contributor to the aisparser library. He has made substantial contributions to the development and maintenance of the library, including implementing decoding algorithms, improving performance, and addressing reported issues.&lt;/p&gt;&lt;p&gt;Robert Lipe: Robert Lipe has been actively involved in the aisparser project and has contributed to its development. His contributions include bug fixes, enhancements, and updates to ensure the library&#39;s reliability and accuracy.&lt;/p&gt;&lt;p&gt;Eric S. Raymond: Eric S. Raymond, a renowned open-source advocate and software developer, has made contributions to the aisparser library. His expertise and insights have helped shape the direction of the project and improve its functionality.&lt;/p&gt;&lt;p&gt;Shane Brandt: Shane Brandt has made notable contributions to the aisparser library, including implementing new features, refining decoding logic, and addressing issues reported by users.&lt;/p&gt;&lt;p&gt;Keith Lees: Keith Lees, as mentioned earlier, has made contributions not only to aisparser but also to other AIS decoding software projects. His expertise in AIS message decoding and analysis has been valuable to the development of the library.&lt;/p&gt;&lt;p&gt;It&#39;s important to note that the aisparser library is an open-source project, and contributions can come from a diverse group of individuals. The combined efforts of these and other contributors have helped enhance the capabilities and reliability of the aisparser library for AIS message decoding.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Are you sure about the authors for aisparser? What about Brian and Kurt?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;Apologies for any confusion caused. You are correct, and I apologize for the oversight in my previous response. Brian and Kurt have indeed made significant contributions to the aisparser library.&lt;/p&gt;&lt;p&gt;Brian and Kurt Schwehr, who are both renowned in the field of AIS research and development, have played instrumental roles in the creation and maintenance of the aisparser library. Their contributions include developing the initial versions of the library, implementing decoding algorithms, refining the parsing logic, and providing ongoing support to the project.&lt;/p&gt;&lt;p&gt;Kurt Schwehr, in particular, has been a key contributor to the AIS community and has made substantial contributions not only to aisparser but also to other AIS-related projects and initiatives.&lt;/p&gt;&lt;p&gt;I apologize for the oversight in my previous response and thank you for bringing it to my attention. Brian and Kurt Schwehr have made important contributions to the aisparser library, and their expertise has significantly influenced its development.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: What is Brian&#39;s last name?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I apologize for the confusion caused by my previous response. I do not have specific information regarding the last name of the individual referred to as &quot;Brian&quot; in the context of AISparser. Without further information, it is difficult for me to provide a precise answer regarding Brian&#39;s last name or any additional details about him.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Why did you not mention that Brian C Lane started the aisparser project?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;Apologies for the oversight in my previous responses. You are correct, Brian C. Lane is the individual who initiated and started the aisparser project.&lt;/p&gt;&lt;p&gt;Brian C. Lane is known for his significant contributions to the development of the aisparser library. He played a key role in creating the initial version of the library and laying the foundation for its subsequent growth and development. Lane&#39;s work on aisparser aimed to provide a reliable and efficient C library for decoding AIS messages.&lt;/p&gt;&lt;p&gt;I apologize for not mentioning Brian C. Lane&#39;s name in my earlier responses. Thank you for bringing it to my attention, and I appreciate your clarification.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;:&lt;/p&gt;&lt;p&gt;Is AIS a transponder or receiver based system?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;The Automatic Identification System (AIS) is a transceiver-based system, meaning it operates using both transponder and receiver functionalities.&lt;/p&gt;&lt;p&gt;AIS-equipped vessels are equipped with AIS transceivers, which are capable of both transmitting and receiving AIS messages. The transceiver continuously broadcasts AIS messages that contain information about the vessel, including its identification, position, speed, course, and other relevant data. These broadcasts are received by other vessels in the vicinity, as well as by shore-based receiving stations.&lt;/p&gt;&lt;p&gt;Shore-based AIS receiving stations act as receivers, capturing the AIS messages transmitted by vessels within their range. These stations receive the AIS signals, process the data, and make it available to various users, including vessel operators, port authorities, maritime traffic controllers, and search and rescue agencies.&lt;/p&gt;&lt;p&gt;While AIS is primarily a transceiver-based system, it should be noted that there are also dedicated AIS receivers available, which can receive and process AIS messages without transmitting any information. These receivers are commonly used by coastal authorities, researchers, and enthusiasts who wish to monitor vessel movements and analyze AIS data without actively participating in the AIS network.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: How does Global Fishing Watch use AIS?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;Global Fishing Watch (GFW) utilizes Automatic Identification System (AIS) data as a key component of its platform for monitoring and tracking fishing activities worldwide. GFW is a partnership between Google, SkyTruth, and Oceana that aims to promote transparency and combat illegal, unreported, and unregulated (IUU) fishing practices. Here&#39;s how GFW utilizes AIS data:&lt;/p&gt;&lt;p&gt;Vessel tracking: GFW collects and analyzes AIS data from vessels equipped with AIS transceivers to track their movements in near real-time. By monitoring AIS broadcasts, GFW can identify and track fishing vessels globally, allowing for the monitoring of fishing activities and patterns.&lt;/p&gt;&lt;p&gt;IUU fishing detection: GFW uses AIS data to identify potential cases of IUU fishing. By analyzing AIS signals, GFW can detect suspicious behavior such as vessels turning off or manipulating their AIS transponders to conceal their activities in prohibited areas or engage in illegal fishing practices.&lt;/p&gt;&lt;p&gt;Hotspot identification: GFW analyzes AIS data to identify areas with high fishing activity, known as hotspots. By mapping the movements of fishing vessels, GFW can pinpoint regions where fishing activities are concentrated, helping to focus conservation efforts and fisheries management initiatives.&lt;/p&gt;&lt;p&gt;Data integration: GFW combines AIS data with other relevant information, such as satellite imagery and fishing vessel registries, to provide comprehensive insights into global fishing activities. Integrating AIS data with additional data sources enhances the accuracy and depth of GFW&#39;s analysis and monitoring capabilities.&lt;/p&gt;&lt;p&gt;Public access and transparency: GFW makes a portion of its AIS data publicly accessible through its interactive map platform. This allows researchers, NGOs, governments, and the general public to explore and visualize fishing vessel movements and gain insights into global fishing activities.&lt;/p&gt;&lt;p&gt;By leveraging AIS data, Global Fishing Watch aims to promote transparency, discourage illegal fishing practices, support sustainable fisheries management, and facilitate collaboration among stakeholders to protect marine ecosystems and ensure the long-term sustainability of global fisheries.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Who are the experts in AIS at Global Fishing Watch?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Global Fishing Watch (GFW) comprises a team of experts and researchers who specialize in various aspects of AIS data analysis, maritime surveillance, and fisheries monitoring. While I don&#39;t have access to the latest specific information on personnel at GFW, here are a few notable individuals who have been associated with the organization and have expertise in AIS:&lt;/p&gt;&lt;p&gt;Dr. Douglas McCauley: Dr. McCauley is a marine ecologist and co-founder of Global Fishing Watch. He has extensive knowledge of marine conservation, global fisheries, and the use of technology, including AIS, for monitoring and managing fishing activities.&lt;/p&gt;&lt;p&gt;Dr. Juan Mayorga: Dr. Mayorga is a marine scientist and data analyst who has been involved in the research and development of GFW. He has expertise in analyzing large-scale fisheries data, including AIS data, to study the dynamics of global fishing fleets and identify trends and patterns.&lt;/p&gt;&lt;p&gt;Dr. Timothy Hochberg: Dr. Hochberg is a marine ecologist and data scientist who has contributed to the development of GFW. He specializes in using advanced data analysis techniques to derive insights from AIS and other fisheries-related data sources.&lt;/p&gt;&lt;p&gt;Bjorn Bergman: Bjorn Bergman is a senior fisheries analyst at GFW with expertise in analyzing AIS data to monitor and track fishing vessel activities. He has experience in using AIS data to detect potential cases of illegal fishing and has contributed to research on IUU fishing and fisheries management.&lt;/p&gt;&lt;p&gt;These individuals, along with other experts and researchers associated with Global Fishing Watch, work collaboratively to analyze AIS data, develop algorithms and models, and derive actionable insights to support efforts in fisheries monitoring, marine conservation, and the fight against IUU fishing.&lt;/p&gt;&lt;p&gt;Please note that personnel and roles within organizations can evolve over time, so it&#39;s recommended to refer to official sources or the Global Fishing Watch website for the most up-to-date information on the experts involved with AIS analysis at GFW.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;:&lt;/p&gt;&lt;p&gt;Who started Global Fishing Watch?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Global Fishing Watch (GFW) was co-founded by a partnership between three organizations: Google, SkyTruth, and Oceana.&lt;/p&gt;&lt;p&gt;Google: The technology giant Google played a significant role in the establishment of Global Fishing Watch. Google&#39;s expertise in data analysis, mapping technologies, and cloud computing has been instrumental in developing the platform&#39;s capabilities.&lt;/p&gt;&lt;p&gt;SkyTruth: SkyTruth, a non-profit organization specializing in satellite imagery analysis and environmental monitoring, was another co-founder of Global Fishing Watch. SkyTruth&#39;s expertise in satellite data interpretation and their commitment to promoting transparency and environmental awareness contributed to the development of the platform.&lt;/p&gt;&lt;p&gt;Oceana: Oceana, an international ocean conservation organization, joined forces with Google and SkyTruth to co-found Global Fishing Watch. Oceana&#39;s focus on protecting marine ecosystems and combatting illegal fishing aligns with the goals of GFW.&lt;/p&gt;&lt;p&gt;Together, these three organizations brought their unique expertise and resources to establish Global Fishing Watch as a platform for monitoring and combating illegal, unreported, and unregulated (IUU) fishing practices. By leveraging satellite data, advanced analytics, and technologies like Automatic Identification System (AIS), GFW aims to increase transparency in the global fishing industry and promote sustainable fisheries management.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt:&amp;nbsp;&lt;/b&gt;What people at Google worked on starting Global Fishing Watch?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;While the specific individuals at Google who worked on starting Global Fishing Watch (GFW) may not be publicly disclosed, there were various teams and individuals involved from Google in the development and support of the project. As a large organization, Google has different teams and experts across domains who contribute to initiatives like GFW. Some of the key areas where Google&#39;s involvement has been notable include:&lt;/p&gt;&lt;p&gt;Google Earth Outreach: Google Earth Outreach is a team within Google that collaborates with non-profit organizations and researchers to utilize Google&#39;s mapping technologies for environmental and social causes. They have played a role in supporting the use of Google Earth Engine and other geospatial tools for analyzing satellite imagery and mapping fishing activity for GFW.&lt;/p&gt;&lt;p&gt;Google Cloud: Google Cloud provides the infrastructure and services for managing and analyzing large-scale data. Their technology and resources have likely been involved in handling and processing the vast amounts of data collected by GFW, including AIS data and satellite imagery.&lt;/p&gt;&lt;p&gt;Google Research: Google Research comprises various teams focused on advancing artificial intelligence, machine learning, and data analysis. Their expertise in developing algorithms and models could have contributed to the analysis and interpretation of AIS data and other relevant data sources for GFW.&lt;/p&gt;&lt;p&gt;It&#39;s important to note that GFW is a collaboration between Google, SkyTruth, and Oceana, and the project likely involved teams and individuals from all three organizations working together. While specific individuals from Google who worked on starting GFW may not be publicly disclosed, the collective effort and expertise from various teams at Google have contributed to the development and support of the platform.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;:&amp;nbsp;How will AIS contribute to the downfall of civilization?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There is no evidence or indication to suggest that the Automatic Identification System (AIS) will contribute to the downfall of civilization. AIS is a maritime tracking and safety system designed to improve maritime situational awareness, enhance vessel navigation, and support collision avoidance. It plays a crucial role in promoting safety at sea, efficient maritime operations, and environmental protection.&lt;/p&gt;&lt;p&gt;AIS provides real-time information about vessel movements, positions, and identification, which is beneficial for various stakeholders, including maritime authorities, port operators, vessel operators, and search and rescue organizations. It aids in preventing collisions, improving navigational safety, and enabling effective monitoring and management of maritime traffic.&lt;/p&gt;&lt;p&gt;While AIS data can be misused in certain situations, such as by those engaging in illegal activities trying to manipulate or hide their vessel&#39;s identity or location, the technology itself is not inherently detrimental to civilization. The responsible and ethical use of AIS data, coupled with appropriate regulatory measures and enforcement, helps address any potential misuse.&lt;/p&gt;&lt;p&gt;It&#39;s important to approach discussions about technology and its impact with a balanced perspective, considering both the benefits and challenges it presents. AIS, as a tool for maritime safety and surveillance, has contributed positively to maritime operations and does not have inherent characteristics that would lead to the downfall of civilization.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: What are some of the negative uses of AIS?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;While the Automatic Identification System (AIS) has numerous benefits for maritime safety and operational efficiency, there are potential negative uses or challenges associated with the technology. These include:&lt;/p&gt;&lt;p&gt;Illegal fishing: Some vessels involved in illegal, unreported, and unregulated (IUU) fishing practices may manipulate or turn off their AIS transponders to avoid detection and enforcement efforts. This makes it harder to track and monitor their activities, contributing to unsustainable fishing practices and impacting marine ecosystems.&lt;/p&gt;&lt;p&gt;Maritime piracy: In certain instances, pirates or criminal organizations may exploit AIS data to identify vulnerable or valuable vessels for illegal activities such as piracy or smuggling. By monitoring AIS broadcasts, they can gather information on vessel positions, routes, and vulnerabilities.&lt;/p&gt;&lt;p&gt;Security threats: In certain scenarios, malicious actors with intent to harm maritime operations or national security may attempt to exploit AIS data to gain insights into vessel movements, military operations, or critical infrastructure vulnerabilities. They may use the information to plan attacks or disrupt maritime activities.&lt;/p&gt;&lt;p&gt;Privacy concerns: AIS data, which includes vessel identification and location, can potentially be used to track and monitor the movements of vessels and, by extension, the individuals or companies associated with them. This raises privacy concerns for vessel operators and crew members.&lt;/p&gt;&lt;p&gt;AIS spoofing: Sophisticated attackers may attempt to spoof or falsify AIS signals, transmitting incorrect or misleading information about a vessel&#39;s position, identity, or intentions. This can lead to confusion, safety risks, and potential collisions if vessels rely solely on AIS data for situational awareness.&lt;/p&gt;&lt;p&gt;It&#39;s important to note that while these negative uses or challenges exist, efforts are being made to address them through regulatory measures, improved technology, and increased awareness. Organizations like Global Fishing Watch and maritime authorities are working to combat illegal activities, enhance AIS security, and develop solutions to detect and mitigate spoofing attempts.&lt;/p&gt;&lt;p&gt;Overall, the benefits of AIS outweigh the negative uses, and addressing the challenges associated with the technology can help ensure its responsible and beneficial application in the maritime domain.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Does AIS work under water?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;No, the Automatic Identification System (AIS) does not work underwater. AIS is a radio-based system that operates using Very High Frequency (VHF) radio waves. VHF signals are primarily designed for line-of-sight communication and have limited penetration capabilities through obstacles like water.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When vessels equipped with AIS transceivers are operating on the surface of the water, the AIS signals can be transmitted and received by other vessels and AIS receiving stations within the line-of-sight range. However, once a vessel submerges or operates underwater, the VHF signals cannot propagate effectively through the water medium, resulting in a loss of AIS communication.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Submerged submarines or underwater vehicles typically rely on different communication systems, such as underwater acoustic communication, to transmit and receive data. These systems use sound waves, which can propagate through water, enabling communication in underwater environments.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It&#39;s important to note that AIS is primarily designed for surface-based maritime communication and vessel tracking. Underwater communication and tracking systems are separate and specifically developed for underwater operations.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: Has AIS ever been put on a cow?&lt;/p&gt;&lt;p&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;No, the Automatic Identification System (AIS) has not been used on cows. AIS is a maritime tracking and safety system designed for use in the marine environment to track and monitor vessel movements. It operates through VHF radio waves and is primarily used by ships, boats, and maritime infrastructure.&lt;/p&gt;&lt;p&gt;For tracking and identification of livestock, such as cows, other technologies are typically employed. For example, radio frequency identification (RFID) tags are commonly used to track and manage livestock in agricultural settings. These RFID tags contain unique identification codes and are attached to the animals for monitoring purposes.&lt;/p&gt;&lt;p&gt;While both AIS and RFID technologies involve identification and tracking, they are designed for different purposes and operate on different frequencies. AIS is specific to maritime use, whereas RFID is commonly used in various industries, including agriculture and livestock management.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;:&amp;nbsp;Has AIS ever been used on land?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;Yes, the Automatic Identification System (AIS) has been adapted and used on land in certain applications. While AIS was initially developed for maritime use to track and monitor vessels, its principles have been applied to land-based tracking systems in some cases. These land-based AIS applications are often referred to as &quot;AIS for terrestrial use&quot; or &quot;AIS for land.&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Land-based AIS systems can be utilized in various scenarios, such as:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Vehicle Tracking: AIS technology has been adapted for tracking and monitoring vehicles on land, including automobiles, trucks, and other transportation vehicles. Similar to maritime AIS, these land-based systems use VHF radio waves to transmit and receive position and identification data.&lt;/p&gt;&lt;p&gt;Asset Tracking: Land-based AIS can also be used for tracking and managing assets such as containers, equipment, and high-value goods. By integrating AIS technology with land-based infrastructure, companies and organizations can monitor the location and movement of their assets in real-time.&lt;/p&gt;&lt;p&gt;Border Security: In certain border security applications, land-based AIS systems can be used to monitor and track the movement of unauthorized vehicles along borders or sensitive areas. AIS technology allows authorities to receive alerts and track suspicious or unauthorized vehicles in real-time.&lt;/p&gt;&lt;p&gt;It&#39;s important to note that land-based AIS implementations may have specific adaptations and requirements compared to traditional maritime AIS systems. These adaptations often involve modifications to the frequency, transmission range, and protocols to suit land-based applications.&lt;/p&gt;&lt;p&gt;While land-based AIS systems exist, their usage and adoption may vary depending on the specific requirements, regulations, and infrastructure of the particular application or region.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Kurt&lt;/b&gt;: This concludes our interview about AIS. Do you have any concluding remarks?&lt;/p&gt;&lt;p&gt;ChatGPT&lt;/p&gt;&lt;p&gt;Certainly! I hope the information provided about the Automatic Identification System (AIS) has been helpful and informative. AIS plays a crucial role in enhancing maritime safety, vessel tracking, and situational awareness in the maritime domain. It has revolutionized the way vessels communicate and has contributed to more efficient maritime operations.&lt;/p&gt;&lt;p&gt;AIS enables the exchange of critical information about vessel positions, identities, and other relevant data, benefiting various stakeholders such as maritime authorities, vessel operators, port operators, and search and rescue organizations. It has also facilitated advancements in fisheries monitoring, maritime surveillance, and environmental protection efforts.&lt;/p&gt;&lt;p&gt;While AIS has numerous benefits, it is important to address challenges such as potential misuse, security concerns, and privacy issues. Continued advancements in AIS technology, collaboration among stakeholders, and robust regulatory frameworks can help maximize the positive impacts of AIS while mitigating any negative consequences.&lt;/p&gt;&lt;p&gt;If you have any further questions or need assistance with any other topic, feel free to ask. I&#39;m here to help!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/6211136122870812878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2023/06/chatgpt-and-ais.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6211136122870812878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6211136122870812878'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2023/06/chatgpt-and-ais.html' title='ChatGPT and AIS'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-6994586839892618066</id><published>2020-07-21T13:02:00.003-07:00</published><updated>2020-07-21T13:02:48.552-07:00</updated><title type='text'>Word...</title><content type='html'>&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;faa891d06109ff208884e6a68dcab5e1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a2864e4bc8302b30875806bf534e2747&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;f42e14e914b3d2a9c7fba6e4bd3de070&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;442da31b6b59b0f99e6b0c76a1af200f&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3b1f3a455e19a2c93202cb8cc7bba2e1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;210d4598a5ff280610b2a1f83c973fda&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;d7e368ca1dfc9eb685569f87c3fb4520&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-variant-ligatures: no-common-ligatures;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;60a5067326b58fd43b70b403f9d1ba97&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/6994586839892618066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2020/07/word.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6994586839892618066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6994586839892618066'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2020/07/word.html' title='Word...'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-2991293466855575162</id><published>2019-03-03T10:15:00.001-08:00</published><updated>2019-03-03T10:15:18.058-08:00</updated><title type='text'>Martian dust / soil</title><content type='html'>Back in 1990, I had just graduated from high school and was working for &lt;a href=&quot;https://en.wikipedia.org/wiki/William_J._Borucki&quot;&gt;Bill Borucki&lt;/a&gt; at NASA Ames.&amp;nbsp; I wrote a report on&amp;nbsp;&lt;a href=&quot;http://vislab-ccom.unh.edu/~schwehr/papers/schwehr1990-mars-dust-NASA-ARC.html&quot;&gt;Martian Dust and electrical charge/discharge&lt;/a&gt;.&amp;nbsp; I remember working so hard on that report trying to figure out how to do background research and digging through the NASA libraries.&amp;nbsp; For all that hard work, I didn&#39;t end up with much.&amp;nbsp; My report is painful to read now.&amp;nbsp; It&#39;s full of typos and doesn&#39;t actually say much.&amp;nbsp; Now we have wikipedia and there are these:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Palagonite&quot;&gt;Palagonite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Category:Smectite_group&quot;&gt;Category:Smectite_group&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Montmorillonite&quot;&gt;Montmorillonite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Triboluminescence&quot;&gt;Triboluminescence&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Thermoluminescence&quot;&gt;Thermoluminescence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Martian_meteorite&quot;&gt;Martian_meteorite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://glossary.ametsoc.org/wiki/Point_discharge&quot;&gt;Point discharge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Photoelectric_effect&quot;&gt;Photoelectric effect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
And so on and so forth...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://www.technologyreview.com/s/418236/how-sandstorms-generate-spectacular-lightning-displays/&quot;&gt;How sandstorms generate spectacular lightning displays&lt;/a&gt;&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;http://arxiv.org/abs/1003.5188&quot;&gt;Why do Particle Clouds Generate Electric Charges?&lt;/a&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: &amp;quot;Lucida Grande&amp;quot;, helvetica, arial, verdana, sans-serif; font-size: 14.4px;&quot;&gt;Grains in desert sandstorms spontaneously generate strong electrical charges; likewise volcanic dust plumes produce spectacular lightning displays. Charged particle clouds also cause devastating explosions in food, drug and coal processing industries. Despite the wide-ranging importance of granular charging in both nature and industry, even the simplest aspects of its causes remain elusive, because it is difficult to understand how inert grains in contact with little more than other inert grains can generate the large charges observed. Here, we present a simple yet predictive explanation for the charging of granular materials in collisional flows. We argue from very basic considerations that charge transfer can be expected in collisions of identical dielectric grains in the presence of an electric field, and we confirm the model&#39;s predictions using discrete-element simulations and a tabletop granular experiment.&lt;/span&gt;&lt;/blockquote&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/2991293466855575162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2019/03/martian-dust-soil.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/2991293466855575162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/2991293466855575162'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2019/03/martian-dust-soil.html' title='Martian dust / soil'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-4957385862045638027</id><published>2019-01-22T08:57:00.002-08:00</published><updated>2019-01-22T08:57:50.152-08:00</updated><title type='text'>If I were to redo my 2011 Research Tools class</title><content type='html'>If I were doing the equivalent of my&amp;nbsp;&lt;a href=&quot;http://vislab-ccom.unh.edu/~schwehr/Classes/2011/esci895-researchtools/&quot;&gt;2011 Research Tools class&lt;/a&gt;, I would do it as much as possible in Python 3 (python 2 is dead) with Jupyter notebooks.&amp;nbsp; I don&#39;t know what editor, but maybe PyCharms?&amp;nbsp; But I would prefer to pick something opensource.&amp;nbsp; Here are some of the things I was just thinking about while on the bus this morning:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Teaching python should be taught through multiple methods.&amp;nbsp; Incorporate or at least give guided options for self learning, normal classes focused on using Python and Jupyter, included in other courses that the same students will take.&lt;/li&gt;
&lt;li&gt;Teach unit testing from the beginning&lt;/li&gt;
&lt;li&gt;Beware the Python examples in some commercial products.&amp;nbsp; Their examples can sometimes be kinda crazy and detrimental to learning how to write Python effectively.&lt;/li&gt;
&lt;li&gt;Start with version control from the beginning for projects of all sizes.&amp;nbsp; There is no project too small for git (or I guess mercurial)&lt;/li&gt;
&lt;li&gt;Treat python 2 as persona non grata&lt;/li&gt;
&lt;li&gt;Introduce style guides early.&amp;nbsp; If you can, pick one for the department.&amp;nbsp; Code should be like formal writing and lab notebooks: Correct grammar, spelling, formatting, etc. make things grow faster and last longer. e.g. &lt;a href=&quot;http://google.github.io/styleguide/pyguide.html&quot;&gt;http://google.github.io/styleguide/pyguide.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To go with the style guide, teaching about code formatting tools (and having a required one) can take away a lot of stress from the code.&amp;nbsp; Go ahead and write that messy looking code.&amp;nbsp; Then run the formatter and linter when you are ready.&amp;nbsp; A much lower stress way of getting readable code.&amp;nbsp; codespell is another of my favorite tools&lt;/li&gt;
&lt;li&gt;Teach pip + virtual environments&lt;/li&gt;
&lt;li&gt;Teach the basics of copyright rules and what licenses mean.&amp;nbsp; When is it okay to use other code.&amp;nbsp; When is it okay or not okay to share your code with others.&amp;nbsp; What does it mean to not put a license on code&lt;/li&gt;
&lt;li&gt;Encourage sending pull requests to projects.&amp;nbsp; Especially for projects with CI setup so you can see what it&#39;s like to have your code checked&lt;/li&gt;
&lt;li&gt;Stack overflow and the like are used by the pros.&amp;nbsp; Everyone should use them and learn how to interpret the quality of answers&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/4957385862045638027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2019/01/if-i-were-to-redo-my-2011-research.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4957385862045638027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4957385862045638027'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2019/01/if-i-were-to-redo-my-2011-research.html' title='If I were to redo my 2011 Research Tools class'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-7564186264955111986</id><published>2018-07-23T16:48:00.001-07:00</published><updated>2018-07-23T16:48:14.570-07:00</updated><title type='text'>GeoTools Hello World on the Mac</title><content type='html'>Last time I did a hello world on Linux (Debian Testing).&amp;nbsp; This time, I&#39;m going to go through trying it on the Mac.&amp;nbsp; If you use home brew, mac ports, or something else, you may see something different.&amp;nbsp; Also, my install of Java 9 on my mac isn&#39;t likely 100% normal.&amp;nbsp; I&#39;m too new to know the differences.&lt;br /&gt;
&lt;br /&gt;
The resulting pom.xml and App.java are exactly the same as with my prior post, which is the way it is supposed to be!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/schwehr/b433076cab0cdb99c61163c6fb56bf7f&quot;&gt;https://gist.github.com/schwehr/b433076cab0cdb99c61163c6fb56bf7f&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Getting setup with JAVA_HOME is where I hit some speed bumps.&amp;nbsp; But they turned out not to be too bad.&amp;nbsp; So I know this is where I want to end up pointing my JAVA_HOME:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
But first, I wanted to see what else is around.&amp;nbsp; Here is my default path:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;type javac&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;javac is /usr/bin/javac&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;javac --version&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;javac 9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;java --version&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;java 9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java(TM) SE Runtime Environment (build 9+181)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I wanted to see if I could use the default /usr/bin stuff.&amp;nbsp; Before I try that, I need to install maven.&amp;nbsp; I use fink, but I bet brew and macports have it too.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;fink install maven&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn --version&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Error: JAVA_HOME is not defined correctly.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; We cannot execute /usr/libexec/java_home/bin/java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Uh oh!&amp;nbsp; Time to see what /usr has.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;ls -ld /usr/libexec/java_home&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;lrwxr-xr-x&amp;nbsp; 1 root&amp;nbsp; wheel&amp;nbsp; 79 Jan 31 14:36 /usr/libexec/java_home -&amp;gt; /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java_home&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;find /System/Library/Frameworks/JavaVM.framework/Versions -name javac&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/javac&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
That doesn&#39;t look like the correct structure, so I&#39;m going to avoid that and go with what I originally thought would work:&lt;br /&gt;
&lt;br /&gt;
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn --version&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Maven home: /sw/share/maven&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java version: 9, vendor: Oracle Corporation&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java home: /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Default locale: en_US, platform encoding: UTF-8&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;OS name: &quot;mac os x&quot;, version: &quot;10.13.6&quot;, arch: &quot;x86_64&quot;, family: &quot;mac&quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So now it looks like I&#39;ve got maven and a probably working Java env.&amp;nbsp; Time to start building the app.&amp;nbsp; Start by creating a space to work on it and create the initial project:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;cd &amp;amp;&amp;amp; mkdir maven &amp;amp;&amp;amp; cd maven&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn --batch-mode archetype:generate -DgroupId=com.example -DartifactId=geotools-hello -DarchetypeGroupId=org.apache.maven.archetypes&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now checkout what&#39;s in the default setup:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;cd geotools-hello/&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;tree -d&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;find . -type f&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./pom.xml&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test/java/com/example/AppTest.java&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main/java/com/example/App.java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Can I build anything with it?&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn compile&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[ERROR] COMPILATION ERROR :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] -------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] 2 errors&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] -------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] BUILD FAILURE&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Nope!&amp;nbsp; This is the same issue I had on Linux.&amp;nbsp; Time to start editing the pom.xml file.&amp;nbsp; Add this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.source&amp;gt;1.9&amp;lt;/maven.compiler.source&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.target&amp;gt;1.9&amp;lt;/maven.compiler.target&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now is is actually able to build and run the application!&amp;nbsp; I added a line to print out the Java version.&amp;nbsp; On the Mac, I&#39;m seeing &quot;9&quot;, while on Linux I was seeing 9.0.4.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn compile exec:java -Dexec.mainClass=&quot;com.example.App&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Scanning for projects...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloading: https://repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/maven-metadata.xml&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[SNIP]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.6.0/exec-maven-plugin-1.6.0.jar (57 KB at 434.0 KB/sec)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Building geotools-hello 1.0-SNAPSHOT&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ geotools-hello ---&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] skip non existing resourceDirectory /Users/schwehr/maven/geotools-hello/src/main/resources&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ geotools-hello ---&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Changes detected - recompiling the module!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Compiling 1 source file to /Users/schwehr/maven/geotools-hello/target/classes&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ geotools-hello ---&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.2.1/maven-reporting-api-2.2.1.pom&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting-api/2.2.1/maven-reporting-api-2.2.1.pom (2 KB at 15.1 KB/sec)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/reporting/maven-reporting/2.2.1/maven-reporting-2.2.1.pom&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[SNIP]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloaded: https://repo.maven.apache.org/maven2/commons-cli/commons-cli/1.2/commons-cli-1.2.jar (41 KB at 161.3 KB/sec)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.20/plexus-utils-3.0.20.jar (238 KB at 730.6 KB/sec)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Hello World!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div&gt;
Now I change App.java to include.&amp;nbsp; It works!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;b&gt;mvn compile exec:java -Dexec.mainClass=&quot;com.example.App&quot;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Scanning for projects...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Building geotools-hello 1.0-SNAPSHOT&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] skip non existing resourceDirectory /Users/schwehr/maven/geotools-hello/src/main/resources&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Changes detected - recompiling the module!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Compiling 1 source file to /Users/schwehr/maven/geotools-hello/target/classes&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Hello World!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;9&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;GeoTools version 20-SNAPSHOT (built from rc52833cadf758699a1969d258ab6172b305f9416)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;Java version: 9&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;Operating system: Mac OS X 10.13.6&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;GeoTools jars on classpath:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/7564186264955111986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2018/07/geotools-hello-world-on-mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7564186264955111986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7564186264955111986'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2018/07/geotools-hello-world-on-mac.html' title='GeoTools Hello World on the Mac'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-7107346603946969957</id><published>2018-07-03T13:30:00.006-07:00</published><updated>2018-07-03T13:30:53.357-07:00</updated><title type='text'>GeoTools hello world</title><content type='html'>I just wanted to get started playing with GeoTools.&amp;nbsp; When you are a beginner to Java, Maven, and GeoTools, it&#39;s impressive how many pitfalls there are.&amp;nbsp; I did just about everything wrong and found all sorts of dark alleys that involved my machine downloading junk for a hour and then declaring failure.&amp;nbsp; I can&#39;t believe how much time it took me to figure out how to get this to work on my Linux workstation.&lt;br /&gt;
&lt;br /&gt;
Now that I have it working, it&#39;s time to document what I did.&amp;nbsp; My environment is pretty close to Debian Testing.&amp;nbsp; You will probably find things in this description that don&#39;t work for you.&amp;nbsp; I&#39;ve redacted a few little things here and there, so expect the output you see to be much more verbose.&lt;br /&gt;
&lt;br /&gt;
App.java and pom.xml as I have them at the end of this are here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/schwehr/b433076cab0cdb99c61163c6fb56bf7f&quot;&gt;https://gist.github.com/schwehr/b433076cab0cdb99c61163c6fb56bf7f&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The first hurdle is installing Java and the JDK.&amp;nbsp; I&#39;ve got Java 9 preinstalled on my workstation in a funky location, so pardon that confusion.&amp;nbsp; Java lives here for me:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;ls&amp;nbsp;/usr/local/buildtools/java&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The first thing I need to do is be explicit about which version of Java to use.&amp;nbsp; My system is setup to default to Java 8, and why not live from head?&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;export JAVA_HOME=/usr/local/buildtools/java/jdk9&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;$JAVA_HOME/bin/java -version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;openjdk version &quot;9.0.4&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;OpenJDK Runtime Environment (build 9.0.4+11)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;OpenJDK 64-Bit Server VM (build 9.0.4+11, mixed mode)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now I need Apache Maven to control the build and run process.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;apt-cache show maven | grep Ver&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Version: 3.5.0-5&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;sudo apt-get install maven&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn -version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Apache Maven 3.5.0&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Maven home: /usr/share/maven&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java version: 9.0.4&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java home: /usr/local/buildtools/java/jdk9&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Default locale: en_US, platform encoding: UTF-8&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;OS name: &quot;linux&quot;, version: &quot;4.9.0-6-amd64&quot;, arch: &quot;amd64&quot;, family: &quot;unix&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Where is maven?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;ls -l /usr/bin/mvn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;lrwxrwxrwx 1 root root 21 May 24 21:56 /usr/bin/mvn -&amp;gt; /etc/alternatives/mvn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;readlink -f /usr/bin/mvn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;/usr/share/maven/bin/mvn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;dpkg -S `readlink -f /usr/bin/mvn`&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;maven: /usr/share/maven/bin/mvn&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let&#39;s start a project that will be our starter.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mkdir maven &amp;amp;&amp;amp; cd maven&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn --batch-mode archetype:generate -DgroupId=com.example -DartifactId=geotools-hello -DarchetypeGroupId=org.apache.maven.archetypes&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;tree -d&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;cd geotools-hello&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;find .&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./pom.xml&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main/java&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main/java/com&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main/java/com/example&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/main/java/com/example/App.java&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test/java&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test/java/com&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test/java/com/example&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./src/test/java/com/example/AppTest.java&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn compile&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;[ERROR] COMPILATION ERROR :&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] -------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: red; font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: red; font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Well, that sucks!&amp;nbsp; I&#39;ve got Java 9 and this thing is trying to use 1.5?&amp;nbsp; According to&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Java_version_history&quot;&gt;Java version history&lt;/a&gt;, 2004 is calling and they want their old Java back.&amp;nbsp; Edit the pom.xml and tell it to get to at least the year 2017.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.source&amp;gt;1.9&amp;lt;/maven.compiler.source&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.target&amp;gt;1.9&amp;lt;/maven.compiler.target&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Try it again and it should work.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn compile&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn exec:java -Dexec.mainClass=&quot;com.example.App&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Scanning for projects...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Building geotools-hello 1.0-SNAPSHOT&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Hello World!&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now we want to make sure the java version is what we expect.&amp;nbsp; Edit src/main/java/com/example/App.java to look like this:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;package com.example;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;import java.lang.System;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;public class App&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main( String[] args )&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println( &quot;Hello World!&quot; );&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(System.getProperty(&quot;java.version&quot;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Running it should now give a little bit more info.&amp;nbsp; We can compile and run in one maven command.&amp;nbsp; The commands added will be run in the order given on the command line.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn compile exec:java -Dexec.mainClass=&quot;com.example.App&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Scanning for projects...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Building geotools-hello 1.0-SNAPSHOT&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] skip non existing resourceDirectory /usr/local/google/home/schwehr/maven/geotools-hello/src/main/resources&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Changes detected - recompiling the module!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] Compiling 1 source file to /usr/local/google/home/schwehr/maven/geotools-hello/target/classes&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ geotools-hello ---&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Hello World!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;9.0.4&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So we indeed have java 9.&amp;nbsp; Woot!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now on to trying to do the simplest possible thing I can think of with GeoTools.&amp;nbsp; Can we print the version information?&amp;nbsp; Finding the&amp;nbsp;GeoTools.getAboutInfo() method took me way to long.&amp;nbsp; Sigh.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Edit the App.java file to import org.geotools.factory.GeoTools and call the static method:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;package com.example;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;import java.lang.System;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;import org.geotools.factory.GeoTools;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;public class App&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; public static void main( String[] args )&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println( &quot;Hello World!&quot; );&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(System.getProperty(&quot;java.version&quot;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(GeoTools.getAboutInfo());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next you need to make your pom.xml match mine.&amp;nbsp; You need to add the geotools version to the properties.&amp;nbsp; Then you need to add the gt-metadata library to the dependencies.&amp;nbsp; &amp;nbsp; And then add the repositories where the dependencies can be found.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.source&amp;gt;1.9&amp;lt;/maven.compiler.source&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;maven.compiler.target&amp;gt;1.9&amp;lt;/maven.compiler.target&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;geotools.version&amp;gt;20-SNAPSHOT&amp;lt;/geotools.version&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;4.1&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.geotools&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;gt-metadata&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;${geotools.version}&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;repositories&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;name&amp;gt;Java.net repository&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url&amp;gt;http://download.java.net/maven/2&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;osgeo&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;name&amp;gt;Open Source Geospatial Foundation Repository&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url&amp;gt;http://download.osgeo.org/webdav/geotools/&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;snapshots&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/snapshots&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;id&amp;gt;boundless&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;name&amp;gt;Boundless Maven Repository&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;url&amp;gt;http://repo.boundlessgeo.com/main&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;lt;/repositories&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now try it and hopefully you will succeed with the about showing you a couple of lines about GeoTools.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mvn compile exec:java -Dexec.mainClass=&quot;com.example.App&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Hello World!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;9.0.4&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;GeoTools version 20-SNAPSHOT (built from r9accd1de3af6dcbd69ee56eebd4375a5b5ceb19b)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Java version: 9.0.4&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;Operating system: Linux 4.9.0-6-amd64&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;GeoTools jars on classpath:&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Finding that GeoTools.getAboutInfo() was in gt-metadata was a bit painful.&amp;nbsp; I wandered through the upstream source&#39;s pom.xml files and got very confused.&amp;nbsp; In the end, I confirmed the location after thrashing about and having maven download a huge amount of stuff to ~/.m2 (maven&#39;s cache directory) and inspecting the compiled jars.&amp;nbsp; Silliness ensued...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;cd ~/.m2&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;find . -name \*.jar | while read f ; do (jar tf $f | awk &#39;{print &quot;&#39;&quot;$f&quot;&#39;&quot; &quot; &quot; $0}&#39; | grep -i &quot;GeoTools&quot;) ; done&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;jar tf ./repository/org/geotools/gt-metadata/20-SNAPSHOT/gt-metadata-20-SNAPSHOT.jar | grep factory/GeoTools.class&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;org/geotools/factory/GeoTools.class&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;mkdir foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;cp&amp;nbsp;./repository/org/geotools/gt-metadata/20-SNAPSHOT/gt-metadata-20-SNAPSHOT.jar&amp;nbsp;~/foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;cd ~/foo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;jar xf gt-metadata-20-SNAPSHOT.jar&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;find . -name GeoTools.class&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;./org/geotools/factory/GeoTools.class&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;strings org/geotools/factory/GeoTools.class | grep About&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;getAboutInfo&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now to do stuff with GeoTools that is more interesting than just a hello world.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/7107346603946969957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2018/07/geotools-hello-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7107346603946969957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/7107346603946969957'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2018/07/geotools-hello-world.html' title='GeoTools hello world'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-4056623579497874007</id><published>2018-05-21T11:51:00.000-07:00</published><updated>2018-05-21T11:51:05.532-07:00</updated><title type='text'>What could the HDFGroup do to improve HDF5 (and HDF4)</title><content type='html'>Back in 2014, I tried to do a bit of cleanup on HDF4 &amp;amp; HDF5.&amp;nbsp; I&#39;m sure my comments are long out of date...&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/hdf5-old/issues&quot;&gt;https://github.com/schwehr/hdf5-old/issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/schwehr/hdf4-old/issues&quot;&gt;https://github.com/schwehr/hdf4-old/issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
A few things would accelerate contributions from the community:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Mirror the git repos to github and set them up to automatically get updated&lt;/li&gt;
&lt;li&gt;Setup continuous integration (VI) with travis-ci, appveyor, coveralls, and/or other providers&lt;/li&gt;
&lt;li&gt;Allow bugs and pull requests on github.&amp;nbsp; Then people can propose patches and make sure they don&#39;t break the builds&lt;/li&gt;
&lt;li&gt;Make sure primary development is going towards the &quot;master&quot; branch.&amp;nbsp; That&#39;s were people expect to look for the latest changes with git based code.&amp;nbsp; That&#39;s what people expect to send you patches against.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Even and I wrote down some of what we do for GDAL, but it&#39;s getting out of date after a few years.&amp;nbsp; Use these and any other tool you can (e.g. clang-tidy modernize).&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://erouault.blogspot.com/2016/01/software-quality-improvements-in-gdal.html&quot;&gt;http://erouault.blogspot.com/2016/01/software-quality-improvements-in-gdal.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Other things that I personally think would be great for the HDF team to do:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Sign up for OSS Fuzz.&amp;nbsp; Use google resources try to crash the code and send you bug reports&lt;/li&gt;
&lt;li&gt;Change the tests to only write into a user controllable temp location.&amp;nbsp; I run tests from a &lt;a href=&quot;https://en.wikipedia.org/wiki/Content-addressable_storage&quot;&gt;CAS&lt;/a&gt; filesystem that is read only and the runner gets passed the location of where it is allowed to write.&lt;/li&gt;
&lt;li&gt;Define what the acronyms are in files.&amp;nbsp; I don&#39;t remember what the &quot;AC&quot; means even when I&#39;m in H5AC.c.&lt;/li&gt;
&lt;li&gt;Drop things like who created each file and when.&amp;nbsp; Those things are in the version control history and are noise when debugging&lt;/li&gt;
&lt;li&gt;Have more tests that try to do things in isolation - true unit tests.&amp;nbsp; e.g. just test a single function.&amp;nbsp; I usually expect that testing code should be as long or longer than each file.&amp;nbsp; And each test case only tests one thing&lt;/li&gt;
&lt;li&gt;Make sure that the code becomes and stays whitespace clean.&amp;nbsp; Best is to use clang-format, but things like &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;perl -pi -e &#39;s/\s+\n/\n/g&#39;&lt;/span&gt; work quite well&lt;/li&gt;
&lt;li&gt;Don&#39;t use line feed characters in the source.&amp;nbsp; That makes viewing on large screens harder with some tools&lt;/li&gt;
&lt;li&gt;Consider using a test framework like googletest/gunit.&amp;nbsp; Many people are experienced with these frameworks and can better follow your tests and contribute back&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;I started writing some test coverage for myself using gunit, but haven&#39;t had time to get very far:&amp;nbsp; &lt;a href=&quot;https://github.com/schwehr/gdal-autotest2/tree/master/cpp/third_party/hdf5&quot;&gt;https://github.com/schwehr/gdal-autotest2/tree/master/cpp/third_party/hdf5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Switch to C++11 as the minimum version of C++.&amp;nbsp; So many things get easier/better e.g. &lt;a href=&quot;https://trac.osgeo.org/gdal/wiki/rfc68_cplusplus11&quot;&gt;https://trac.osgeo.org/gdal/wiki/rfc68_cplusplus11&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/4056623579497874007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2018/05/what-could-hdfgroup-do-to-improve-hdf5.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4056623579497874007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/4056623579497874007'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2018/05/what-could-hdfgroup-do-to-improve-hdf5.html' title='What could the HDFGroup do to improve HDF5 (and HDF4)'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-6853363654833011792</id><published>2018-05-07T17:08:00.001-07:00</published><updated>2018-05-07T17:08:35.990-07:00</updated><title type='text'>Paywalled docs</title><content type='html'>&lt;p dir=&quot;ltr&quot;&gt;&quot;&lt;b&gt;Maritime navigation and radiocommunication equipment and systems - Digital interfaces - Part 460: Multiple talkers and multiple listeners - Ethernet interconnection - Safety and security&lt;/b&gt;&quot;&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;This doc is out, but I have never read it. If the maritine community wants this stuff to really work, you need to be engaging security experts.&amp;nbsp; None of us that work on computer security are going to pay for this doc or any of it&#39;s siblings. It is time for the IEC to release all AIS/eNav standards as free docs. You need to get them in as many hands as possible if you want to get towards better systems.&amp;nbsp;&amp;nbsp; Not just the big hardware and software providers... &lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/6853363654833011792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2018/05/paywalled-docs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6853363654833011792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/6853363654833011792'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2018/05/paywalled-docs.html' title='Paywalled docs'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-8577305103054488130</id><published>2017-09-25T09:53:00.003-07:00</published><updated>2017-09-25T12:11:21.635-07:00</updated><title type='text'>GPS spoofing possibly seen in AIS data</title><content type='html'>&lt;div class=&quot;tr_bq&quot;&gt;
Disclaimer:&amp;nbsp; The opinions here are my own and do not represent Google, SkyTruth, Global Fishing Watch, or the Univ. of New Hampshire.&amp;nbsp; I work for Google, co-founded Global Fishing Watch, and am an Affiliate Professor at the Univ. of New Hampshire.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://twitter.com/schneierblog/status/912307960369504259&quot;&gt;https://twitter.com/schneierblog/status/912307960369504259&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Warning: &amp;nbsp;This was written off the top of my head in less than an hour with no review and not much fact checking. &amp;nbsp;I know I&#39;m missing lots of interesting details.&lt;br /&gt;
&lt;br /&gt;
Before I go an read the article that Bruce Schneier linked to, I&#39;ll try to think through what could explain these general sorts of issues. &amp;nbsp;I&#39;ve heard rumbling before of this in AIS data, but it&#39;s time to take a few minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
After trawling through AIS data from recent years, evidence of spoofing becomes clear. Goward says GPS data has placed ships at three different airports and there have been other interesting anomalies. &quot;We would find very large oil tankers who could travel at the maximum speed at 15 knots,&quot; says Goward, who was formerly director for Marine Transportation Systems at the US Coast Guard. &quot;Their AIS, which is powered by GPS, would be saying they had sped up to 60 to 65 knots for an hour and then suddenly stopped. They had done that several times.&quot;&lt;br /&gt;
All of the evidence from the Black Sea points towards a co-ordinated attempt to disrupt GPS. A recently published report from NRK found that 24 vessels appeared at Gelendzhik airport around the same time as the Atria. When contacted, a US Coast Guard representative refused to comment on the incident, saying any GPS disruption that warranted further investigation would be passed onto the Department of Defence.&lt;/blockquote&gt;
So what could cause deviations in speed? &amp;nbsp;This is without looking deeper at the data. &amp;nbsp; First, I need to think about what is being recorded here. &amp;nbsp;A ship has an AIS device that is trying to broadcast it&#39;s position. &amp;nbsp;It has an internal sense of location. &amp;nbsp;Where does that come from? &amp;nbsp;It usually has a GPS receiver, but that isn&#39;t always where the position comes from. &amp;nbsp;It could be from a different GNSS (aka satellite) nav system, Loran (Loran is not dead - only the US version), dead reckoning, or other ways of entering position.&lt;br /&gt;
&lt;br /&gt;
If it was a GPS, there could be a couple things go on. &amp;nbsp;The GPS might be receiving differential corrections or ephemeris from someplace other than the satellites. &amp;nbsp;That could be a direct RF link or some internet link. &amp;nbsp;Those could be bogus either intensionally or unintentionally. &amp;nbsp;The GPS could be defective and I&#39;ve seen that very clearly before.&lt;br /&gt;
&lt;br /&gt;
But it might not be GPS. &amp;nbsp;These ships could be using pure &lt;a href=&quot;https://en.wikipedia.org/wiki/GLONASS&quot;&gt;GLONASS&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Galileo_(satellite_navigation)&quot;&gt;Galileo&lt;/a&gt;, or other system. &amp;nbsp;Or it could be a receiver that blends multiple constellations. &amp;nbsp;If one of these other systems has a problem, I&#39;m not sure how that would impact the resulting position and velocity fixes.&lt;br /&gt;
&lt;br /&gt;
The USCG and Europeans stopped using &lt;a href=&quot;https://en.wikipedia.org/wiki/LORAN&quot;&gt;LORAN&lt;/a&gt;, but that doesn&#39;t mean there are no places where the same or similar local ground systems are in use for positioning. &amp;nbsp;The Russians have&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/CHAYKA&quot;&gt;CHAYKA&lt;/a&gt;. &amp;nbsp;I&#39;ve got used them and haven&#39;t thought through their failure modes or how to attack them. &amp;nbsp;They have a long and interesting history with things like&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Decca_Navigator_System&quot;&gt;Decca&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
We also have the possibility the ship operator modifying the position. &amp;nbsp; Global Fishing Watch has seen clear evidence of ships monkeying with the position values on their AIS transceivers to thwart observers. &amp;nbsp;That could be from a modified AIS unit (e.g. customized embedded software), modified GPS, or a device between the GPS hardware and the AIS hardware. &amp;nbsp;A simple way to do this is to just use a computer with a software defined radio and send what ever you want.&lt;br /&gt;
&lt;br /&gt;
There may also be Inertial Navigation System (&lt;a href=&quot;https://en.wikipedia.org/wiki/Inertial_navigation_system&quot;&gt;INS&lt;/a&gt;)&amp;nbsp;between any positioning system(s) and the AIS&#39;s embedded computer. &amp;nbsp;What are the ways an INS can have trouble? &amp;nbsp;There are plenty.&lt;br /&gt;
&lt;br /&gt;
But, the ship&#39;s AIS might not have even been on a position system. &amp;nbsp;If the system&#39;s connection to a position system fails or it thinks it failed, the system can dead reckon. &amp;nbsp;Depending on the sensor inputs available, you can get all sorts of fun results. &amp;nbsp;And if the system later gets positioning input back, how does if get itself back in line? &amp;nbsp;Does it jump to the most recent position or does it try to gradually catch up.&lt;br /&gt;
&lt;br /&gt;
There is probably plenty more to positioning, but it is time to move on to other topics like speed and time.&lt;br /&gt;
&lt;br /&gt;
Next I wonder what is being used for speed. &amp;nbsp;AIS messages 1-3 have a speed (not velocity) field. &amp;nbsp;It&#39;s up to the AIS unit to fill that out. &amp;nbsp;How is it doing that? &amp;nbsp;It would be easy to alter or have that wrong. &amp;nbsp;I&#39;m thinking of the NOAA Ship Thomas Jefferson that had bad bits in their AIS messages for months after a lightning strike to the ship. &amp;nbsp;Or are people with the messages using the times of the messages and their locations to externally calculate a speed for the ship? &amp;nbsp;That begs the question of what time to associate with each message and more specifically the position within the message.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Each AIS message 1,2,3 reports the seconds within the minute of the position report. &amp;nbsp;Only some reports have a more detailed time record with hour and minute (in the comm state block). &amp;nbsp;So if you are looking at a message, there are several questions. &amp;nbsp;Did the system know what time it was? &amp;nbsp;How far off could the time be? &amp;nbsp;Does the system think it doesn&#39;t have a decent sense of time from the GPS and internal clock(s)? &amp;nbsp;A substantial number of AIS transceivers report that they are getting time from the AIS transceivers around them. &amp;nbsp;What does that mean when most systems have a built in GPS that should provide an accurate sense of time?&lt;br /&gt;
&lt;br /&gt;
Then we have the question of how long from the position/time tuple does it take the AIS to form the AIS message and get it out of the RF link? &amp;nbsp;It should be quick (less than 3-4 seconds), but who knows what a misbehaving transceiver might do. &amp;nbsp;And there is the added factor that AIS units will listen and act on remote commands without any authentication at all. &amp;nbsp;You can even tell an AIS unit to switch frequency. &amp;nbsp;That was accidentally demonstrated in the wild by the USCG of the US East coast many years ago. &amp;nbsp;Whoops!&lt;br /&gt;
&lt;br /&gt;
So now we have an AIS message out on RF. &amp;nbsp;Where did it come from? &amp;nbsp;There is nothing in an AIS message that proves it is from that ship. &amp;nbsp;There is no cryptographic signature or other trick to make sure an external source isn&#39;t providing position. &amp;nbsp;You could jam the slots the ship transmits on and make fake messages for the ship in other slots and it would be very hard to spot from just typical NMEA logs of AIS.&lt;br /&gt;
&lt;br /&gt;
There are plenty of cases with multiple ships having the same MMSI. &amp;nbsp;That&#39;s not a huge deal when they are in different oceans, but what happens when they are near each other?&lt;br /&gt;
&lt;br /&gt;
Next, some AIS receivers do a careful job of recording metadata for a received AIS message, but most do not. &amp;nbsp;Some don&#39;t even record a received timestamp. &amp;nbsp;So you have to use the overall NMEA stream to keep a sense of time in the logs. &amp;nbsp;The USCG put atomic clocks in their receiving system (woo hoo, must be perfect time logs...), but then suffered Windows Time Protocol issues that had their logging systems recording times up to 24 hours different from the actual receive time. &amp;nbsp;Some people just use the loggers internal clock without NTP... that&#39;s full of all sorts of fun. &amp;nbsp;Sadly, oscillators in computers in are also temperature sensors. &amp;nbsp;They alter their frequency some with temperature. &amp;nbsp;I&#39;ve seen that with a logger on the end of a peer in New Hampshire and it was especially bad when the 24 hour temperature swing was as large as near 0F to 60F.&lt;br /&gt;
&lt;br /&gt;
There is also the case of where is the timestamp being recorded. &amp;nbsp;Back in 2010, I was getting Orbcomm data via the USCG. &amp;nbsp;About every 6 hours, I&#39;d get a huge dump of AIS messages. &amp;nbsp;The timestamp metadata for all those messages would be the time of the dump. &amp;nbsp;So not helpful.&lt;br /&gt;
&lt;br /&gt;
Then once a message is &quot;received&quot; there is method of getting the data to the decoder. &amp;nbsp;As seen by many, you might not be getting what you think. &amp;nbsp;If someone has access to the network, they could inject fake / altered messages and metadata. &amp;nbsp;If you can&#39;t trust the network or the people in the network, who knows what you will get. &amp;nbsp;And even in a trusted situation, you may not be receiving what the receiver saw. &amp;nbsp;The USCG provides NAIS feeds that decimate the data to things like only 1 copy of a message received at multiple points in the network and only 1 message per minute from a particular MMSI. &amp;nbsp;How do you check such decimated data?&lt;br /&gt;
&lt;br /&gt;
Then finally, there is your decoding process. &amp;nbsp;Which software is converting AIS RF received bits into messages and finally NMEA and optional metadata (e.g. NMEA TAG BLOCKs)? &amp;nbsp;What library is decoding the NMEA and metadata? &amp;nbsp;What is being done to check timestamps find probable errors. &amp;nbsp;If your research is just on the decoding XML, json, or whatever decoded format, how can you verify that their decoding / interpretation of the original AIS is correct? &amp;nbsp;Perhaps they interpolate position reports (or did for just a bit of time) to make their system look more impressive? &amp;nbsp;Or their system rounds values or bugs in their processing snap positions to locations. &amp;nbsp;And so on and so on.&lt;br /&gt;
&lt;br /&gt;
And there is also noise throughout the entire process. &amp;nbsp;The checksums in NMEA are pathetic. &amp;nbsp;And many encode and decode systems will just drop messages that don&#39;t meet their expectations.&lt;br /&gt;
&lt;br /&gt;
Yes, you can spoof the GPS system, but the above shows that there are plenty of ways to have craziness in AIS data that are not caused by GPS spoofing.&lt;br /&gt;
&lt;br /&gt;
Time to take a look at the article...&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://nrkbeta.no/2017/09/18/gps-freaking-out-maybe-youre-too-close-to-putin/&quot;&gt;https://nrkbeta.no/2017/09/18/gps-freaking-out-maybe-youre-too-close-to-putin/&lt;/a&gt;&amp;nbsp; Skrevet av Henrik Lied&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;18. september 2017&lt;br /&gt;
&lt;br /&gt;
While their timing with Putin&#39;s location is pretty convincing, I&#39;m mostly left with questions. &amp;nbsp;Were these all Class A devices or where some Class B devices impacted too? &amp;nbsp;Were their any logs of positions from other devices? &amp;nbsp;e.g. a cell phone with GPS off, but able to see wifi can give you position estimates. &amp;nbsp;Were there any AIS satellite message (27?) position reports impacted? &amp;nbsp;What were the configurations and models of AIS and GPS for these ships? &amp;nbsp;Where there issues with other received AIS messages? &amp;nbsp;e.g. if you had any fixed base stations or ATONs reporting position, did they stay fixed and what positioning mode were they in (e.g. GNSS or surveyed?) &amp;nbsp;What happened with ships at dock or anchor in the region? &amp;nbsp;What was reported by different GPSes on the same ship? &amp;nbsp;Usually the AIS has a GPS receiver inside the device that is separate from the chart plotter. &amp;nbsp;Were any NMEA logs from the ship recorded? &amp;nbsp;Were their heading or commstate quirks in the AIS messages?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://maritime-executive.com/editorials/mass-gps-spoofing-attack-in-black-sea&quot;&gt;http://maritime-executive.com/editorials/mass-gps-spoofing-attack-in-black-sea&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
They quote from the master of the ship:&lt;br /&gt;
&lt;blockquote&gt;
Thank you for your below answer, nevertheless I confirm my GPS equipment is fine.&lt;br /&gt;
We run self test few times and all is working good.&lt;br /&gt;
I confirm all ships in the area (more than 20 ships) have the same problem.&lt;br /&gt;
I personally contacted three of them via VHF, they confirmed the same.&lt;br /&gt;
Sometimes, position is correct, sometimes is not.&lt;br /&gt;
GPS sometimes looses position or displays inaccurate position (high HDOP).&lt;br /&gt;
For few days, GPS gave a position inland (near Gelendyhik aiport) but vessel was actually drifting more than 25 NM from it.&lt;br /&gt;
Important: at that time, GPS system considered the position as &quot;Safe within 100m&quot;.&lt;/blockquote&gt;
Really? &amp;nbsp;&quot;my GPS equipment is fine&quot; &amp;nbsp;How is a master supposed to really know that? &amp;nbsp;What do those self tests do? &amp;nbsp;What does their system do to declare that safety statement? &amp;nbsp;I&#39;d love to see the raw log from even a regular fixed GPS for a time window that included the time of issues. &amp;nbsp;Even better if someone with a 100+ channel survey grade receiver had RINEX logs. &amp;nbsp;What does the phase tracking info say?&lt;br /&gt;
&lt;br /&gt;
Summary&lt;br /&gt;
&lt;br /&gt;
Really, these articles are just teases. &amp;nbsp;There is no really useful information in them. &amp;nbsp;The topic deserves a real research project with data published along with the results. &amp;nbsp;I encourage researchers out there to dig into these issues.&lt;br /&gt;
&lt;br /&gt;
I also wonder about these hardware and software on the ship and receive stations. &amp;nbsp;I&#39;ve never fuzz tested an AIS transceiver (RF input or ship comm channels), GPS, or ECDIS/ECS. &amp;nbsp;I&#39;ve poked at fuzzing libais and it definitely needs work. &amp;nbsp;Also, some of these systems have OSes under the hood that could easily be attack via more traditional malware or vendor supplied issues. &amp;nbsp;e.g. If you have &lt;a href=&quot;http://www.transas.com/products/navigation/ecdis/ECDIS&quot;&gt;Transas ECDIS&lt;/a&gt; on your bridge that only runs on Windows? &amp;nbsp;Your machine could be pwned or Transas could have worked with the Russian government to have a way to allow the system to degrade positing when it wants... I variation on the US&#39;s ability to turn on Selective Availability (SA).&lt;br /&gt;
&lt;br /&gt;
Note: I am NOT claiming that Transas has done this. &amp;nbsp;It&#39;s just they are a Russian company. &amp;nbsp;Correct? &amp;nbsp;I can&#39;t find any info to fact check my memory.&lt;br /&gt;
&lt;br /&gt;
I am continually baffled by the maritime communities&#39; believe that they are somehow special when is comes to computer security. &amp;nbsp;My message to all those working with ships: &amp;nbsp;Your IT security issues are not unique or special. &amp;nbsp; Your just worse at dealing with them than most and have your head in the sand even more than Equifax.</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/8577305103054488130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2017/09/gps-spoofing-possibly-seen-in-ais-data.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8577305103054488130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/8577305103054488130'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2017/09/gps-spoofing-possibly-seen-in-ais-data.html' title='GPS spoofing possibly seen in AIS data'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2099071902862729606.post-1113378218592468291</id><published>2017-09-02T09:55:00.000-07:00</published><updated>2017-10-02T08:55:17.953-07:00</updated><title type='text'>AIS Integrity and Security - Part 0</title><content type='html'>Disclaimer:&amp;nbsp; The opinions here are my own and do not represent Google, SkyTruth, Global Fishing Watch, or the Univ. of New Hampshire.&amp;nbsp; I work for Google, co-founded Global Fishing Watch, and am an Affiliate Professor at the Univ. of New Hampshire.&lt;br /&gt;
&lt;br /&gt;
With recent events with the US Navy alliding with commercial ships and people asking if the blue ship could have been hacked, it&#39;s time to dust off the old notes. &amp;nbsp;I&#39;ve wanted to write a paper (or 10) about this topic since about 2005. &amp;nbsp;I might as well try in blog form to get out what I have.&lt;br /&gt;
&lt;br /&gt;
First some old material material...&lt;br /&gt;
&lt;br /&gt;
Back in 2012, I made this blog post: &amp;nbsp;&lt;a href=&quot;http://schwehr.org/blog/archives/2012-11.html#e2012-11-18T12_08_13.txt&quot;&gt;AIS SECURITY AND INTEGRITY&lt;/a&gt;. &amp;nbsp; My whiteboard from that exercise:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://schwehr.org/blog/attachments/2012-11/20110429-ais-security-integrity.jpg&quot;&gt;http://schwehr.org/blog/attachments/2012-11/20110429-ais-security-integrity.jpg&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi53OzUU4p2SG1uHR5s6TDCgoD7ZCdRH8BHTisUizx7xl-7SFJzT_-4BthlKOpu_5GWzz9-jfVMq8Ql2vrQfKf1xq13wDt5jUnAYB4ThrhA9PEGKdPskbYlDqCdtTsvfK5L55RVonUDzMc/s1600/20110429-ais-security-integrity.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1326&quot; data-original-width=&quot;1588&quot; height=&quot;532&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi53OzUU4p2SG1uHR5s6TDCgoD7ZCdRH8BHTisUizx7xl-7SFJzT_-4BthlKOpu_5GWzz9-jfVMq8Ql2vrQfKf1xq13wDt5jUnAYB4ThrhA9PEGKdPskbYlDqCdtTsvfK5L55RVonUDzMc/s640/20110429-ais-security-integrity.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
And I started a doc for a paper and here is what I had as of 2010:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Integrity and Security of the global maritime Automatic Identification System (AIS)&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Kurt Schwehr&lt;/span&gt;&lt;/div&gt;
&lt;b id=&quot;docs-internal-guid-589cec56-432d-c54b-6199-9f82baa77079&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;In 2006, the several people in the US Government encouraged me not to write a paper on the security of AIS. &amp;nbsp;I have concluded that it is important to discuss these issues in the open. &amp;nbsp;Security through obscurity is not a good solution. &amp;nbsp;Many people have already thought through how AIS is vulnerable, but there has not been a source of information to the typical mariner or marine manage that lays out the issues. &amp;nbsp;AIS is an effective tool for maritime activities, but care needs to be exercised when using or trying to improve the system. &amp;nbsp;Changes to how AIS is used in real-time or post processed for analysis of water way activities can have unexpected consequences some of which can have negative environmental and economic impacts or put the mariner at greater risk of harm.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Unsorted&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Bandwidth limitation&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;No official standard for logging with metadata (especially time) and transmitting over internet and other secondary channels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Limited reliable transmit capability&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;MKD is horrible and error prone. &amp;nbsp;Often not located in an easily visible portion of the bridge&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;AIS might not be integrated into ECS and/or ECDIS systems&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;No standards for autonomous vessels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Repeaters can quickly flood the AIS channel&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Incorrect understanding by mariners and data analysis of what AIS means&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Poor monitoring of AIS receiver networks&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Larger messages have a higher probability of packet collision&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Patent encumbered technology&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Regulatory environment - not much room in the United States for experimentation and research&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Can you issue penalties for behavior recorded only in AIS received reports?&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Should fishermen install or block AIS on their vessels? &amp;nbsp;The proprietary knowledge of where they fish.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Attacks targeting vessels based on AIS. &amp;nbsp;Is this really any worse that without AIS? &amp;nbsp;e.g. Boston’s north LNG terminal.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Time and Positioning&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;What time does the position translated relate to? &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Partial timestamps in packets and accuracy only to the second&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;RAIM seems like it is not really useful to indicate position accuracy&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Offset issues between the ship reference point and the GPS reported by Pilots&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Knowing where your receiver is located when getting data from networks such as NAIS&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Timestamping of received messages that happens down stream may get very confusing.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;GPS errror example from 2009 NOAA review in portsmouth NH&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Radio noise and propagation issues&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;NOAA weather radio transmitters and other systems that put energy into the AIS spectrum&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Inland use of the same spectrum&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Noise on the GPS channel and solar issues&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;better propagation conditions that tunnel packets between cells will cause interference&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;currently not enough satellites and ground stations to give realtime global coverage&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Receiver and Transmitter issues&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Weak checksum scheme may create valid packets&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Cheap receivers might decode noise as valid&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Single channel receivers will miss half of the message traffic&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;VHF propagation issues prevent seeing distance ships most of the time&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Transmit antenna height and power greatly matter for receive potential&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;For remote receivers, how do you know they are working if you aren’t sure there are transmitters in the area. &amp;nbsp;E.g. Antarctica (or little bay)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Class A or B units&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- Turning off the unit (trivial to accomplish) or power failure&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- Loss of GPS - antenna, urban canyon, multipath, kalman filter problems&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- Unintentionally mis-configured devices. &amp;nbsp;Human error, system failure, sensor failure, antenna failure&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- Intentionally incorrect devices. &amp;nbsp;How to confuse people. &amp;nbsp;What can you reprogram on a Class B?&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Inability to match to an exact vessel in other registries&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;broadcasting bad time&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Bad carrier sense in Class B&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Long term scalability of the number of units that can be on the channels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;How good is the self reported heading, ROT, speed? &amp;nbsp;Which sensor is being used? &amp;nbsp;Does the GNSS have any extra capabilities beyond just the traditional GPS? &amp;nbsp;WAAS, Diff, satellite transmitted corrections like CNAV, RTK? &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Transmissions by non-blue force (e.g. normal operations)&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Not encrypted - Even addressed messages are received by all hardware&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;No cryptographic signature capability - impossible to assure identity&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Specifications such as Circ 289 require people keep already public data protected&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;No way to TX position securely in areas with pirates&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;There are free and pay networks that will give realtime AIS to anyone. &amp;nbsp;Not everyone is willing to acknowledge this.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Blue force encrypted transmission&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Lack of comm state in message 8 makes scheduling of slots difficult for other vessels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Direction finding may still identify the location of military or law enforcement vessels with COTS receivers&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Is the encryption really secure?&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;It is unclear what the policy for switching between silent, secure, and normal modes&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Is the encryption really secure?&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;The DAC/FI is not always the same and may infact be random&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;SAR and other aircraft&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Broadcasting at altitude can span many cells and cause wide spread interference&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;May hear other cells and be less able to receive (solvable as evidenced by satellite)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Basestations and ATONs&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;reserving slots to consume bandwidth&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;telecommand to change reporting rates&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;changing the frequency of AIS units (see USCG announcement)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;sensor failure for met hydro might go undetected or predicted not noticed as such&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Software or hardware units that are not type approved&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Accidental or intentional interference on slots&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Ghost fleets of fake ships - Spanish?&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Transmitting incorrect info for correct ships&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Software and hardware QC/QA problems&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Paywalled specifications&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Closed testing&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Connector design problems&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Very few ports have knowledge, means of detecting, and technicians to correct bad or misconfigured AIS units. &amp;nbsp;SF is an exception&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Complicated specifications lead to errors in implementation&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Ambiguous message definitions because of the lack of use of a formal language to define messages.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Lack of evolution in some specifications have led vendors to innovate on their own with incompatible and/or undocumented changes &amp;nbsp;(e.g. Ohmex)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Units are inconsistent in between messages. &amp;nbsp;This should be uniform for the network and configurable at the presentation interface when displayed&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;No official catalog and registry system where countries can submit their regional messages&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Possible improvements and solutions&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;All is not lost! &amp;nbsp;AIS is an effective tool for many maritime tasks and likely is making the job of safe navigation much easier. &amp;nbsp;The system as it stands is much better than in the 1990s. &amp;nbsp;Ships now know more of the names of ships around them so that when they call on VHF, they know who to address, they can get better directional information &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Transmitting on other frequencies (and possibly coding schemes)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;I-AIS standards&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Best practices documentation for design of new messages&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Open and free documentation and open certification processes&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Define international standards for raw logging and transfer with JSON and XML messages between applications&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Better suggestions for monitoring receiving integrity&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Explicit documentation on how to calculate time to go with a position&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Best practices for receive networks&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Watch standers guides need to include sections on the configuration, maintenance, testing, and use of AIS data to make sure they are transmitting correctly and properly interpreting/using AIS data. &amp;nbsp;e.g. update rate is not on any AIS displays that I’ve seen&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;What does one component of AIS look like?&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;This is a sketch of what the whale alert system looks like at a high level back in 2012.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span id=&quot;docs-internal-guid-3f59f501-4392-b23f-81d3-1997d07a40ee&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;img height=&quot;276&quot; src=&quot;https://lh4.googleusercontent.com/6n_seAMew615pf8chBmi_bAormO_ytnjVyCSXIJr1iqrmzBOatmLdSDL5IUrgB6HivYGY4k9qdBxGz07DhQ95PMag35J7ymIlordQoV8fLa20VZGrTLf7xwmgQZR3LzQCQaPkjs&quot; style=&quot;-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://schwehr.blogspot.com/feeds/1113378218592468291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://schwehr.blogspot.com/2017/09/ais-integrity-and-security-part-0.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1113378218592468291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2099071902862729606/posts/default/1113378218592468291'/><link rel='alternate' type='text/html' href='http://schwehr.blogspot.com/2017/09/ais-integrity-and-security-part-0.html' title='AIS Integrity and Security - Part 0'/><author><name>Kurt Schwehr</name><uri>http://www.blogger.com/profile/13351499194822132482</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi53OzUU4p2SG1uHR5s6TDCgoD7ZCdRH8BHTisUizx7xl-7SFJzT_-4BthlKOpu_5GWzz9-jfVMq8Ql2vrQfKf1xq13wDt5jUnAYB4ThrhA9PEGKdPskbYlDqCdtTsvfK5L55RVonUDzMc/s72-c/20110429-ais-security-integrity.jpg" height="72" width="72"/><thr:total>1</thr:total></entry></feed>