<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tharos70</title>
    <description>The latest articles on DEV Community by tharos70 (@tharos70).</description>
    <link>https://dev.to/tharos70</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F113569%2F355510b9-6f80-469d-83cc-ee43c47e9619.gif</url>
      <title>DEV Community: tharos70</title>
      <link>https://dev.to/tharos70</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tharos70"/>
    <language>en</language>
    <item>
      <title>Logseq - Yet another knowledge base tracking tool?</title>
      <dc:creator>tharos70</dc:creator>
      <pubDate>Thu, 15 Dec 2022 17:11:56 +0000</pubDate>
      <link>https://dev.to/tharos70/logseq-yet-another-knowledge-base-tracking-tool-5b5m</link>
      <guid>https://dev.to/tharos70/logseq-yet-another-knowledge-base-tracking-tool-5b5m</guid>
      <description>&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;If you are a curious developer like me, you may be in constant search for the best tool for tracking what is generally called Knowledge basew and logging daily activities. I've tried several tools but I often fall in love with some of them and then I find others better in resolving specific needs. Let's see those I tried from an individual usage perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Options
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://notion.so"&gt;Notion&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROS: Fast learning curve, great flexibility, full text search, templates. Data stored in the cloud are accessible almost anytime and anywhere. Free (so far)&lt;/li&gt;
&lt;li&gt;CONS: It becomes a mess if you don't approach it with extreme attention at organizing things. Too many templates and functionalities to try. 
Is this a pro or a con? For my state of mind it is a dramatic con... It may not be the same for everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://keep.google.com/u/0/"&gt;Google Keep&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROS: Fast learning curve, full text search, tags. Free (so far)&lt;/li&gt;
&lt;li&gt;CONS: After years of usage it is a mess. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://app.clickup.com/"&gt;Clickup&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROS: Free (so far), lightly project management oriented, templates, fast learning curve&lt;/li&gt;
&lt;li&gt;CONS: Some functionalities are available only if you pay. UX is not so easy to understand.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.airtable.com/"&gt;Airtable&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PROS: Free (so far for individuals), fast learning curve, it is essentially a classic database.&lt;/li&gt;
&lt;li&gt;CONS: If you don't often deal with database you may find yourself unconfortable. Filters and grouping are not for beginners.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Logseq
&lt;/h2&gt;

&lt;p&gt;Is this better than the previous tools?&lt;br&gt;
Short answer? No. &lt;br&gt;
Longer answer: no but....&lt;br&gt;
&lt;em&gt;Logseq&lt;/em&gt; has a bit different approach which made me curious about it.&lt;/p&gt;

&lt;p&gt;It works locally, so it implements a privacy by design approach. It is just something that works on files stored under a specific local folder and it has predefined object to work with, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;journal&lt;/em&gt;: where you can store your daily activities&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;pages&lt;/em&gt;: where you can create your organised Knowledge Base content&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;logseq&lt;/em&gt;: where it stores its internal configurations, styles etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there are some interesting features which I think are one of a kind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;graph&lt;/em&gt; view: this is something which grows as long as you create links across your pages. It lets you analyze your knowledge base by highlighting relations between different topics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;presentation&lt;/em&gt; view automatically converts pages into a live presentation document. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;flashcard&lt;/em&gt; item lets you create some sort of information dialog directly inside the page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;This is what I discovered so far in about a couple of weeks working on &lt;em&gt;Logseq&lt;/em&gt;. This is not a game changing, though it has some features which I had never seen in other similar tools.&lt;br&gt;
It's definetely worth checking out.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bonus:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Introduction video:
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SUOdfa3MucE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.logseq.com/#/page/Contents"&gt;Logseq Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>knowledgebase</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A simple guide to Java http calls</title>
      <dc:creator>tharos70</dc:creator>
      <pubDate>Fri, 02 Dec 2022 14:57:19 +0000</pubDate>
      <link>https://dev.to/tharos70/a-simple-guide-to-java-http-calls-j7f</link>
      <guid>https://dev.to/tharos70/a-simple-guide-to-java-http-calls-j7f</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xq3lREM6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8h11cnqgx43lx8orlhsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xq3lREM6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8h11cnqgx43lx8orlhsa.png" alt="Java http calls" width="477" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to consume an api with Java there are several options. One of my fovourite is Square's &lt;em&gt;&lt;a href="https://square.github.io/okhttp/"&gt;OkHttp&lt;/a&gt;&lt;/em&gt;.&lt;br&gt;
It is a well known, full feature and highly customizable library which is moreover very easy to deal with. I noticed, in my daily job, that most of the times I have to deal with problems which force me to change my approach in calling APIs/Urls. That's why I decided to write a few &lt;em&gt;recipe&lt;/em&gt; classes in order to organize my job when it comes to this topic.&lt;/p&gt;

&lt;p&gt;The OkHttpClient API documentation states very clear that:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OkHttp performs best when you create a single OkHttpClient instance and reuse it for all of your HTTP calls. This is because each client holds its own connection pool and thread pools. Reusing connections and threads reduces latency and saves memory. Conversely, creating a client for each request wastes resources on idle pools.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In order to do this I set up an &lt;em&gt;OkHttpClientInstanceHolder&lt;/em&gt; class so that in every call I need I can relate to the correct instance.&lt;/p&gt;

&lt;p&gt;Why do we need different instances? Beacause we may want to have different flavoured http clients (ex. proxy enabled, with or without ssl channel checks, with or without a timeout handling, etc.)&lt;/p&gt;

&lt;p&gt;Here are some of the HTTP request examples available in the repo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Simple GET Call&lt;/em&gt;: Performs a simple http GET call to the specified url with the specified query parameter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Simple Get Call Timeout Aware&lt;/em&gt;: Performs a simple http GET call to the specified url with the specified query parameter with a specified timeout expressed in millisecond. When the timeout occurs, the call will be canceled.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Simple Unsafe GET Call&lt;/em&gt;: Performs a simple unsafe http GET call to the specified url with the specified query parameter with a specified timeout expressed in millisecond. When the timeout occurs, the call will be canceled. It is unsafe beacause in case of an https url call, the certificates chain will not be checked. It is not a recommended usage, but sometimes it may be useful for troubleshooting purpose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Simple Async GET Call&lt;/em&gt;: Performs a simple asyncronous http GET call to the specified url.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Simple POST Call&lt;/em&gt;: Performs a simple http POST call to the specified url with the specified json payload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Simple PUT Call&lt;/em&gt;: Performs a simple http PUT call to the specified url with the specified json payload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Simple DELETE Call&lt;/em&gt;: Performs a simple http DELETE call to the specified url.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A complete list of the available sample calls can be found in the readme of the repo.&lt;/p&gt;

&lt;p&gt;Please feel free to fork and submit you CR.&lt;/p&gt;

&lt;p&gt;Here's the repo link: &lt;a href="https://github.com/tharos70/http-client-samples"&gt;https://github.com/tharos70/http-client-samples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope you like it!&lt;/p&gt;

</description>
      <category>java</category>
      <category>http</category>
      <category>client</category>
      <category>programming</category>
    </item>
    <item>
      <title>GIS Viewers - reducing the impact of technologies upgrade</title>
      <dc:creator>tharos70</dc:creator>
      <pubDate>Fri, 28 Feb 2020 08:29:52 +0000</pubDate>
      <link>https://dev.to/tharos70/gis-viewers-reducing-the-impact-of-technologies-upgrade-20jm</link>
      <guid>https://dev.to/tharos70/gis-viewers-reducing-the-impact-of-technologies-upgrade-20jm</guid>
      <description>&lt;h3&gt;
  
  
  Long story short...
&lt;/h3&gt;

&lt;p&gt;After talking at 2020 foss4g Italy event, I was asked to publish my slides, but, since they're in italian language I decided to write a little summary of what I talked about. &lt;/p&gt;

&lt;h3&gt;
  
  
  FOSS GIS viewers
&lt;/h3&gt;

&lt;p&gt;GIS web viewer share often a similar architecture. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--asshgCv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YOfcD47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--asshgCv8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YOfcD47.png" alt="GIS Viewer diagram" width="342" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see from the image above a GIS (Web) Client is a bunch of html and js files which can handle access to some Web services standardized by the &lt;a href="https://www.opengeospatial.org/"&gt;Open Geospatial Consortium&lt;/a&gt;. There are many FOSS projects out there providing common functionalities of a web viewer. Lower level ones like &lt;a href="https://openlayers.org/"&gt;Openlayers&lt;/a&gt; or &lt;a href="https://leafletjs.com/"&gt;Leaflet&lt;/a&gt;, and some more engineered solutions like &lt;a href="https://github.com/geosolutions-it/MapStore2"&gt;Mapstore2&lt;/a&gt;, &lt;a href="https://github.com/geoadmin/mf-geoadmin3"&gt;Geoadmin&lt;/a&gt; or &lt;a href="https://geomapfish.org/"&gt;Geomapfish&lt;/a&gt;. What happens anytime a technology upgrade occurs on the client side? &lt;/p&gt;

&lt;h3&gt;
  
  
  Development lifecycle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZJo1EytW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/6CQBI6B.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZJo1EytW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/6CQBI6B.png" alt="Development lifecycle" width="358" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image above, describes the classic development lifecycle. What happens when we happen to be in the green phase (Evolution) and the evolution includes an important technology upgrade (for example like when you decide to rewrite your software in a completely different programming language)? Typically you may be able to reuse Requirement Analysis, maybe some design, but all the next steps will need a complete rewrite. What can we do when such an event occurs in the development of a GIS Web Viewer? &lt;/p&gt;

&lt;h3&gt;
  
  
  The approach
&lt;/h3&gt;

&lt;p&gt;Well in my company we have setup a software solution in order to keep as much developed software as possible. The concept is quite simple. We have a three step process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nwJ6fHGc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/oLEQxXY.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nwJ6fHGc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/oLEQxXY.png" alt="Process" width="432" height="72"&gt;&lt;/a&gt;&lt;br&gt;
At configuration time, in a &lt;a href="http://qgis.org/"&gt;QGis&lt;/a&gt; project we handle the organization of the TOC and all the OGC services we want to use in our specific context. Then via a QGis plugin, we wil enrich the configuration model by adding informations about tools we may want to enable in that specific application (like features searching, graphics specifications, feature fusion, cutting, etc.). Then all this configuration data is stored in a DBMS via a REST API. The specific configuration is identified by a UUID that will remain the same throughout the technology upgrades. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KYZPa__Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/iXlj3TY.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KYZPa__Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/iXlj3TY.png" alt="Architectural model" width="748" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see from the image above, at configuration time we have set up our viewer context and stored it in the DBMS. When a viewer needs to access the desired configuration, it has to present itself by the corresponding UUID to its specific API. So what happens behind the scenes is a Model To Model conversion: from the ER model of the DBMS to the domain specific one of the requesting viewer. Furthermore, there's a Tools api which needs some more explanation. Tools are components with a specific configuration and an optional specific API. These objects are transversal to the frontend technology, so as the supported frameworks increase in number the available tools needs the only presentation logic to be reimplemented, while the backend API remains untouched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and Cons
&lt;/h3&gt;

&lt;p&gt;So, what do we gain by approaching GIS viewers development in such a way? First of all the choice of using a Model driven development makes the whole ecosystem of configurations highly reusable (for example you may want to publish different viewers displaying the same configuration). Another interesting feature is that the modular architecture enables us to increase tools and features that can be added also to older configurations as long as they're made available to the ecosystem. And now some cons too. What we are doing here is some heavy integrating duties, that said it's obvious that choosing to support someone else work (a.k.a. FOSS framework and libraries) we have to compromise to some UX/UI choices that may not be suitable to every needs. But hey, there's plenty of them to choose from so that can be an opportunity to integrate one more community! And then the worst con IMHO: this approach leads to a highly configurable system. Which means that if you don't plan a heavy integration test plan you may occur in some serious problems (like setting up a viewer for production pointing to an internal API. Real sad story…)&lt;/p&gt;

&lt;h3&gt;
  
  
  What's next
&lt;/h3&gt;

&lt;p&gt;We are planning to publish all this ecosystem under FOSS licenses in the next months in an incremental way. When all the documentation and the code will be available I'll publish a short recap. For now you can check our &lt;a href="https://github.com/csipiemonte"&gt;organization on github&lt;/a&gt; for some interesting FOSS projects.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>gis</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
