<?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: Alexander Chichigin</title>
    <description>The latest articles on DEV Community by Alexander Chichigin (@gabrielfallen).</description>
    <link>https://dev.to/gabrielfallen</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%2F309148%2F7ec95485-4679-4cb1-b7df-0713d9fc250d.jpeg</url>
      <title>DEV Community: Alexander Chichigin</title>
      <link>https://dev.to/gabrielfallen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabrielfallen"/>
    <language>en</language>
    <item>
      <title>A cold shower for a cold shower</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Thu, 11 Jan 2024 14:23:02 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/a-cold-shower-for-a-cold-shower-237d</link>
      <guid>https://dev.to/gabrielfallen/a-cold-shower-for-a-cold-shower-237d</guid>
      <description>&lt;h1&gt;
  
  
  Background
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://hillelwayne.com"&gt;Hillel Wayne&lt;/a&gt; being a firm believer in scientific empirical methods in general and in the field of Software Engineering in particular has prepared a list of&lt;br&gt;
&lt;a href="https://github.com/hwayne/awesome-cold-showers"&gt;"cold showers"&lt;/a&gt; — papers challenging some widely held beliefs about various aspects of Software Development.&lt;/p&gt;

&lt;p&gt;The very first "cold shower" addresses the question of Formal Verification, specifically the belief that&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Formal Verification is a great way to write software. We should prove all of our code correct."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, no source for the quote is given, presumably, it's a well-known and widely-held belief, though I personally know no one who would seriously believe and argue this point in this form.&lt;/p&gt;

&lt;p&gt;As a counterargument and a "cold shower" Hillel offers "Verification Techniques", the fourth chapter of Peter Gutmann's thesis, "The Design and Verification of a Cryptographic Security Architecture". Wayne summarizes it as&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Extensive literature review showing that formal methods are hard to learn, extremely expensive to apply, and often miss critical bugs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, he counterbalances it with some caveats:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Written in 2000 and doesn't cover modern tools/techniques, such as TLA+ or dependent typing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Considering that Coq Proof Assistant was released back in 1989, I wouldn't say Dependent Types were very modern even back in 2000, but yeah, a lot of development has happened during the last 20 years...&lt;/p&gt;

&lt;p&gt;Anyway, the thesis that "extensive literature review showing that formal methods are hard to learn, extremely expensive to apply, and often miss critical bugs" was employed in a certain online discussion to support the POV that Formal Methods are useless or at least too costly to use in practice, any caveats were ignored, and the paper was referenced as the definitive proof. This prompted me to actually take a peek inside the paper, see what actual claims the author made, and what literature he analysed.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Fourth Chapter
&lt;/h1&gt;

&lt;p&gt;I've only skimmed the initial part of the chapter and started digging in from the third section which promised to describe the problems of Formal Methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Problems with Formal Verification
&lt;/h2&gt;

&lt;p&gt;The first paragraph of this section gives the following literature review:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Empirical studies of the results of applying these methods, however, have had some difficulty in finding any correlation between their use and any gains in software quality [31], with no hard evidence available that the use of formal methods can deliver reliability more cost-effectively than traditional structured methods with enhanced testing [32]. Even in places where there has been a concerted push to apply formal methods, penetration has been minimal and the value of their use has been difficult to establish, especially where high quality can be achieved through other methods [33].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The citations are for the following papers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  [31] “Observation on Industrial Practice Using Formal Methods”, Susan Gerhart, Dan Craigen, and Ted Ralston, Proceedings of the 15th International Conference on Software Engineering (ICSE’93), 1993, p.24.&lt;/li&gt;
&lt;li&gt;  [32] “How Effective Are Software Engineering Methods?”, Norman Fenton, The Journal of Systems and Software, Vol.22, No.2 (August 1993), p.141.&lt;/li&gt;
&lt;li&gt;  [33] “Industrial Applications of Formal Methods to Model, Design, and Analyze Computer Systems: An International Survey”, Dan Craigen, Susan Gerhart, and Ted Ralston, Noyes Data Corporation, 1994 (originally published by NIST).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without digging further into the referenced papers, what catches my eye is the fact they all were more than five years old by 2000 when the "Verification Techniques" came out. As far as I can tell it's a recurring theme in the chapter: it relies on heavily outdated papers, even for the time of writing, and I see no relevance for 2024 at all...&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Problems with Tools and Scalability
&lt;/h3&gt;

&lt;p&gt;Issues with the scalability of both large proofs themselves and the running time of a proof assistant checking these proofs are very well-known. We can say that the invention of Symbolic Model-Checking, which scaled the approach by two orders of magnitude, led to a breakthrough in Hardware Verification, and largely won the inventors the Turing Award. But what exactly Gutmann was talking about?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Attempts to use the Boyer–Moore prover in practice lead to the observation that “the amount of effort required to verify the system was very large. The tools were often very slow, difficult to use, and unable to completely process a complex specification. There were many areas where tedious hand analysis had to be used” [46]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds plausible and relatable. What source does it cite?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  [46] “Verification Technology and the A1 Criteria”, Terry Vickers Benzel, ACM SIGSOFT Software Engineering Notes, Vol.10, No.4 (August 1985), p.108.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hmm... This paper was already 15 years (sic!) old by 2000... Anyway, what's a Boyer–Moore prover?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nqthm&lt;/strong&gt; is a &lt;a href="https://en.wikipedia.org/wiki/Automated_theorem_proving"&gt;theorem prover&lt;/a&gt; sometimes referred to as the &lt;strong&gt;Boyer–Moore theorem prover&lt;/strong&gt;. It was a precursor to &lt;a href="https://en.wikipedia.org/wiki/ACL2"&gt;ACL2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Nqthm"&gt;https://en.wikipedia.org/wiki/Nqthm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wikipedia says it was a &lt;em&gt;research&lt;/em&gt; theorem prover that later was replaced by ACL2 with the explicit aim of producing an industrial-strength prover addressing Nqthm's performance problems. So Gutmann criticises a piece of research software for being a research software not suitable for industrial applications. Interesting... Anyway, what's up with ACL2?&lt;/p&gt;

&lt;p&gt;Wikipedia says ACL2 first appeared in 1990 but became publicly available only in 1996. This is still 4 years before 2000, and already in 1995, ACL2 was successfully employed to verify the floating point division of the AMD K5 CPU. And was pretty popular in Hardware Verification since then.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ACL2 is intended to be an "industrial strength" version of the Boyer–Moore theorem prover, &lt;a href="https://en.wikipedia.org/wiki/Nqthm"&gt;NQTHM&lt;/a&gt;. Toward this goal, ACL2 has many features to support clean engineering of interesting mathematical and computational theories.&lt;/p&gt;

&lt;p&gt;Industrial users of ACL2 include AMD, Arm, Centaur Technology, IBM, Intel, Oracle, and Collins Aerospace.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.cs.utexas.edu/users/moore/acl2/current/manual/index.html?topic=ACL2____INTERESTING-APPLICATIONS"&gt;ACL2 Interesting applications&lt;/a&gt; among other things says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Key properties of the &lt;strong&gt;Sun Java Virtual Machine&lt;/strong&gt; and its &lt;strong&gt;bytecode verifier&lt;/strong&gt; were verified in ACL2. Among the properties proved were that certain invariants are maintained by &lt;strong&gt;class loading&lt;/strong&gt; and that the bytecode verifier ensures that execution is safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That happened sometime after 2000, and Gutmann couldn't possibly write about it, but I just want you to pause and appreciate the fact that you rely on some ACL2 proofs right now if you run HotSpot JVM or use services that run on it. And Oracle Labs still doing proofs about JVM in ACL2, they hired for such a position a couple of years ago.&lt;/p&gt;

&lt;p&gt;Now back to the section, later we read&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Another approach which has been suggested is to automatically verify (in the “formal proof of correctness” sense) the specification against the implementation as it is compiled [49]. This has the disadvantage that is can’t be done using any known technology.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, now we at least &lt;strong&gt;know&lt;/strong&gt; the technologies: proof-carrying code, binary symbolic execution and abstract interpretation, concolic testing…&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Formal Methods as a Swiss Army Chainsaw
&lt;/h3&gt;

&lt;p&gt;This is the section where we can expect Gutmann to debunk that "formal Verification is a great way to write software. We should prove all of our code correct" statement. More than that, we now have the source for the quote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Formal methods have in the past been touted as the ultimate cure for all security software assurance problems, a “panacea with unbounded applicability and potency” [50]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  [50] “Problems, methods, and specialisation”, Michael Jackson, Software Engineering Journal, Vol.9, No.6 (November 1994), p.249.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait a bit. Michael Jackson is a very well-known and well-respected researcher in Software Engineering, we know him as a deep thinker very far from fads and hype, did he really say that Formal Methods are a "panacea with unbounded applicability and potency"?&lt;/p&gt;

&lt;p&gt;Let's look into his 1994 paper:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The continuing search for panaceas, for universal materials out of which everything can be made, for universal methods to solve all problems, strongly suggests that we have not yet begun to understand the nature of our field. Object-orientation is only the most recent in a long line of proposed panaceas, all claiming unbounded applicability and potency.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;WOW, turns out it's OOP a "panacea with unbounded applicability and potency", and there's no mention of Formal Methods in sight at all!&lt;/p&gt;

&lt;p&gt;Frankly speaking, I got very disappointed at this point and stopped reading...&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Alternative Approaches
&lt;/h2&gt;

&lt;p&gt;I've also skimmed through the rest of the chapter, and this last chapter compares XP (eXtreme Programming, do you still remember it?) as the main Agile method at the time to some "waterfall-like" methodologies you never heard and don't care about like ISO 9000, CMM, and CASE, which were criticised in the earlier sections.&lt;/p&gt;

&lt;p&gt;Again, much better known to us now SCRUM had been developed throughout the 1990s with the defining paper appearing in 1995. Still, it hadn't gained mass adoption until later in the 2000s, thus Gutmann couldn't do a literature review on it even if he wanted to. This simply illustrates how outdated this work become in the years passed, now that we have half a dozen SCRUM variants, Lean, Kanban and several others. Likewise, Formal Methods and Theorem Provers didn't stuck in the 90s or even 2000s, improving usability, automation, performance, accreting libraries and users, and lately even actively integrating with Machine Learning methods.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Well, Peter Gutmann wasn't the first to totally misquote a reference changing the meaning to the opposite in a desire to support his opinion. And it doesn't make him a bad researcher. I firmly believe he did a great job at his original research and presented very valuable results. I suspect doing an extensive literature review and a thorough analysis of evidence for or against Formal Methods never was his aim and priority. I guess it was something he needed for his thesis, so he collected a big pile of somewhat outdated papers supporting his outlook on Formal Verification and threaded a believable narrative through it. That's a much-much better job than most PhD students care to do!&lt;/p&gt;

&lt;p&gt;The only problem, this doesn't count as an "extensive literature review showing that formal methods are hard to learn, extremely expensive to apply, and often miss critical bugs". It didn't support this claim even at the time of publication, and even less so now, 20 years later.&lt;/p&gt;

&lt;p&gt;And for the folks throwing around "scientific papers that prove or disprove bold claims" — you should actually read the papers you're waiving, and check the sources these papers cite...&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Advancing AlgebraicJulia</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Tue, 27 Jun 2023 08:50:12 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/advancing-algebraicjulia-2i4g</link>
      <guid>https://dev.to/gabrielfallen/advancing-algebraicjulia-2i4g</guid>
      <description>&lt;p&gt;Cross-posted from &lt;a href="https://forem.julialang.org/gabrielfallen/advancing-algebraicjulia-329a"&gt;Julia Forem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks like the &lt;a href="https://topos.institute/"&gt;Topos Institute&lt;/a&gt; got a grant from Mozilla to further develop &lt;a href="https://www.algebraicjulia.org/"&gt;AlgebraicJulia&lt;/a&gt;: &lt;a href="https://blog.mozilla.org/en/mozilla/mieco-alegbraic-julia-brendan-fong/"&gt;https://blog.mozilla.org/en/mozilla/mieco-alegbraic-julia-brendan-fong/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AlgebraicJulia is a damn cool project. They use advanced categorical notions like cospans and what not as a basis for compositional modelling of physical-chemical-biological-epidemiological-etc. processes. But on the surface they use good 'ol "stock and flow" diagrams that are supposed to be drawn by unsuspecting scientists, possibly from different fields. That's where compositionality becomes crucial: it guarantees that combination of any two (or more) diagrams works as expected without falling apart.&lt;/p&gt;

&lt;p&gt;I can only speculate why they decided to use Julia for this development, but my guess is to tap into rich ecosystem of &lt;a href="https://sciml.ai"&gt;Differential Equations&lt;/a&gt;. Which is necessary as long as "stock and flow" diagrams (as well as many other formalisms) define a system of differential equations modelling dynamics of a real-world processes.&lt;/p&gt;

&lt;p&gt;Anyway, as long as Mozilla's &lt;a href="https://future.mozilla.org/mieco/"&gt;MIECO&lt;/a&gt; program accepts and supports individual contributors, you can get paid for developing Category Theory in Julia! How crazy is that, huh? 😄&lt;/p&gt;

</description>
      <category>julialang</category>
      <category>mozilla</category>
      <category>sciml</category>
    </item>
    <item>
      <title>Setting Docker build context to CWD with Compose</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Tue, 20 Apr 2021 17:36:25 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/setting-docker-build-context-to-cwd-with-compose-jp5</link>
      <guid>https://dev.to/gabrielfallen/setting-docker-build-context-to-cwd-with-compose-jp5</guid>
      <description>&lt;p&gt;The problem is rather contrived so the solution is rarely needed. But if you'll ever find yourself in this situation apparently it's easy to get out. 😃&lt;/p&gt;

&lt;p&gt;Suppose you want to run the same &lt;code&gt;docker-compose&lt;/code&gt; with the same &lt;code&gt;Dockerfile&lt;/code&gt; but from several subfolders and you don't like duplication. So you fave a folder structure like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project
  |- subproject1
    |- the_file.txt
  |- subproject2
    |- the_file.txt
  |- Dockerfile
  |- compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you'd like to run &lt;code&gt;docker-compose -f ../compose.yml up&lt;/code&gt; from each of &lt;code&gt;subproject1&lt;/code&gt; and &lt;code&gt;subproject2&lt;/code&gt; and for &lt;code&gt;docker-compose&lt;/code&gt; to set the context for the &lt;code&gt;Dockerfile&lt;/code&gt; to each of the folders respectively.&lt;/p&gt;

&lt;p&gt;You do it with &lt;code&gt;$PWD&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;assignment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$PWD&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;../Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;database"&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mariadb:10.5"&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;always"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secret_pass"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in the &lt;code&gt;compose.yml&lt;/code&gt; file. For the sake of argument we pretend we need a separate service with a database in each case.&lt;/p&gt;

&lt;p&gt;Then you write your &lt;code&gt;Dockerfile&lt;/code&gt; as usual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:15

# Create app directory
WORKDIR /app

RUN npm install -g http-server

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "http-server", "-p", "8080" ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now for the &lt;code&gt;subproject1&lt;/code&gt; you should have the first text file exposed over the Web interface, and for the &lt;code&gt;subproject2&lt;/code&gt; the second text file.&lt;/p&gt;

&lt;p&gt;Yep, as I told you from the start this is rarely needed because you rarely have two (or more) subprojects built with exactly the same &lt;code&gt;Dockerfile&lt;/code&gt;. In the end it turned out I myself don't need this setup. But I spent surprisingly long time figuring (Googling) out the right config, so we all have it now laid out in the case we ever need it. 😃&lt;/p&gt;

</description>
      <category>docker</category>
      <category>compose</category>
    </item>
    <item>
      <title>An IDE for Data Science</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Sat, 17 Apr 2021 12:03:10 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/an-ide-for-data-science-mpi</link>
      <guid>https://dev.to/gabrielfallen/an-ide-for-data-science-mpi</guid>
      <description>&lt;p&gt;A little over a year ago &lt;a href="https://dev.to/gabrielfallen/what-s-wrong-with-computational-notebooks-44oi"&gt;I stated&lt;/a&gt; somewhat obvious hypothesis that JetBrains develops a specialized IDE for Data Science. Now it's &lt;a href="https://blog.jetbrains.com/blog/2021/03/30/announcing-the-eap-for-jetbrains-dataspell-our-new-data-science-ide/"&gt;official&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>ide</category>
      <category>python</category>
    </item>
    <item>
      <title>I've got a badge. Yeah...</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Sun, 13 Dec 2020 16:28:27 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/i-ve-got-a-badge-yeah-4p8o</link>
      <guid>https://dev.to/gabrielfallen/i-ve-got-a-badge-yeah-4p8o</guid>
      <description>&lt;p&gt;I've got a badge for "successfully" participating in the Hacktoberfest this year. Yeah, go check my profile. This means two things: not only I submitted at least four PR explicitly tagged for the Hacktoberfest, I also explicitly applied for the badge here on Dev. Double shame for me. Why?&lt;/p&gt;

&lt;p&gt;Well, pretty much everything there's to say about Hacktoberfest was &lt;a href="https://drewdevault.com/2020/10/01/Spamtoberfest.html"&gt;already said&lt;/a&gt; October 1st. And I agree with almost all of it. More than that, my own participation is an example of Hacktoberfest fraud.&lt;/p&gt;

&lt;p&gt;First and foremost, I'm not an Open Source contributor. By far the most of code I write I write for my job and it's closed and proprietary. Thus the best thing I can do for Open Source is to just change my job to writing Open Source code full time for another company that pays for it. And frankly speaking I can do that. But I don't. So my "contribution" in Hacktoberfest is a mockery from the beginning.&lt;/p&gt;

&lt;p&gt;Continuing the same reasoning the very idea underlining Hacktoberfest — the idea that four PRs you make over four weekends makes a difference for the Open Source — is kinda joke for the people writing Open Source full-time, 40 or more hours a week every week of every month. Especially the ones making a leaving out of it. Twice so for ones struggling to make a leaving out of Open Source.&lt;/p&gt;

&lt;p&gt;Speaking of my actual "contributions", only two of my PRs were to someone else's repository, and that were adding just two references to a sort of "awesome list" of technical books. Another four PRs were to my own repository I've made during Hacktoberfest adding four small features each with a separate PR. If that's not a fraud that's an embarrassment for sure.&lt;/p&gt;

&lt;p&gt;And now I'm waiting for my new shiny Hacktoberfest t-shirt, while actual Open Source contributors wait for nothing and just continue writing, testing, debugging and publishing their code as they did years before and going to do the years to come...&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>A tiny little bit about maintaining health</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Thu, 12 Mar 2020 12:57:26 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/a-tiny-little-bit-about-maintaining-health-3565</link>
      <guid>https://dev.to/gabrielfallen/a-tiny-little-bit-about-maintaining-health-3565</guid>
      <description>&lt;p&gt;As long as I'm a software developer working from home and thus sitting in front of a PC for most of the day and not walking too far, I'm rather interested in maintaining my health and shape. Not that I achieved staggering results at that but I still answered this question: &lt;a href="https://dev.to/shofol/what-kind-of-physical-exercises-do-you-maintain-to-be-fit-and-healthy-4ai6"&gt;https://dev.to/shofol/what-kind-of-physical-exercises-do-you-maintain-to-be-fit-and-healthy-4ai6&lt;/a&gt; 😊&lt;/p&gt;

&lt;p&gt;Below I reproduce my answer but I might add some more to the post later on.&lt;/p&gt;

&lt;p&gt;Bad news: to lose weight any sort of exercises is next to useless, the only thing that helps is &lt;em&gt;eat less&lt;/em&gt;. :(&lt;/p&gt;

&lt;p&gt;Good news: eating way less is surprisingly easier than you think! 😃&lt;/p&gt;

&lt;p&gt;Disclaimer: health and medicine related stuff is &lt;strong&gt;extremely&lt;/strong&gt; individual. I can and will tell what I do and what and how worked for me personally. It might not work or be harmful for other people depending on their individual physiology and health. Plus I'm very far from medical education and practice, you really should consult specialists and even after that proceed with extreme caution.&lt;/p&gt;

&lt;p&gt;OK, now to fun stuff. What if I told you you can eat &lt;em&gt;at least&lt;/em&gt; twice as little and lose weight without feeling hungry, weak or anything? 😃&lt;/p&gt;

&lt;p&gt;At least, that was the case for me. If anything I felt better and more energetic because I stopped overeating and feel too heavy and too sleepy. I discovered that I can literally eat twice as little as usual and not feel hungry or anything.&lt;/p&gt;

&lt;p&gt;Being frankly I felt some discomfort at first, some unclear feeling of something not being right, being unusual. But that was just mind tricks my brain played on me. The brain doesn't like changes, it doesn't like when things don't go as usual so it makes you feel like something's wrong and as if you have to make it as before. Thus I didn't have heavy feeling in my stomach and my brain was telling me it's not right and I &lt;em&gt;have to&lt;/em&gt; eat more to get this heavy feeling back! But assessing my actual physical state I found time and again I feel no hunger, no stomach ache, no weakness or anything. Quite contrary my actual physical state was better than usual after lunch. So I kept ignoring the signals my brain was sending and after some time I got used to eating less and it became my new norm.&lt;/p&gt;

&lt;p&gt;Even before that I read a long post on research regarding health benefits of &lt;strong&gt;intermittent fasting&lt;/strong&gt; (which are surprisingly many and proven for mice; for humans it less clear due to challenges in conducting direct experiments). So after I discovered it's so easy to eat that much less, I thought how hard can it be not to eat for a 24 hours? Apparently, again, &lt;strong&gt;much&lt;/strong&gt; easier than one might think! 😃&lt;/p&gt;

&lt;p&gt;A hint: to fast for 24 hours you need to skip &lt;strong&gt;just 2&lt;/strong&gt; meals in a row, not 3. ;) Consider this: say, you had a breakfast at 8 am. Now you skip lunch and dinner this day, sleep at night and by 8 am next morning 24 hours have passed at which point you can eat again. But I don't eat breakfast, so I just additionally skip lunch every other day or every two days, I'm not super strict about my diet. :)&lt;/p&gt;

&lt;p&gt;Yet another piece of a diet I'm not strict about but still keep in mind and try to aim for is a &lt;strong&gt;Keto diet&lt;/strong&gt;. Again you can read a lot about how it's beneficial all over the Internet. :) But as long as I'm not strict about it I'm not in ketosis, thus I'm just on a low-carb diet in the end. Still aiming at near zero carbs intake is a much more clear goal for me. Thus I always know how much carbs I should eat: exactly zero. And &lt;em&gt;all&lt;/em&gt; the carbs I do eat are too much and against my diet. Too bad but whatever. 😃&lt;/p&gt;

&lt;p&gt;In the end after some months past all these adjustments to my diet I lost about 10 kg. And I wasn't overweight before that either! Thus I didn't try to lose weight, it just happened. 😃&lt;/p&gt;

&lt;p&gt;I think these actually the most important factors that can protect you from getting diabetes, back pain, cancer or heart issues. But you asked about exercises, so I'll continue. :)&lt;/p&gt;

&lt;p&gt;First, why exercises won't really help you loose weight. Compare the numbers. In about 2 hours on a bicycle I spend about 500 kkal. I usually ride 2 to 4 times a week. Let's take maximum: 4 times a weak, thus loosing 2000 kkal per weak additionally. Now when I do literally nothing lying on a sofa all day long I spend about &lt;strong&gt;3000&lt;/strong&gt; kkal per 24 hours. That's &lt;em&gt;at least&lt;/em&gt; &lt;strong&gt;21000&lt;/strong&gt; per weak. 2000 more &lt;em&gt;at best&lt;/em&gt; change nothing for me. Most likely, I consume all the 500 kkal I spent on a bike immediately after that 'coz I feel hungry.&lt;/p&gt;

&lt;p&gt;Does that mean you shouldn't exercise? Absolutely not! 😃&lt;/p&gt;

&lt;p&gt;I like riding a bike very much I think it's a great activity for so many reasons and beneficial for both physical and mental health in so many ways, I can't recommend it enough! 😃&lt;/p&gt;

&lt;p&gt;But as long as I work from home and too lazy to go to gym and weather doesn't permit riding a bike, I exercise with a kettlebell. At home, right next to my desk. :)&lt;/p&gt;

&lt;p&gt;As for particular exercises with a kettlebell I don't think they matter much. I do whatever I feel like doing at the moment, from simple squats to swings to pushes to whatever.&lt;/p&gt;

&lt;p&gt;Additionally to that I do some common bodyweight exercises on the days I don't do kettlebell. Anyway I never perform heavy or very intensive training, just 30-40 minutes to stay somewhat in shape. :) Overtraining is a real thing, I'm just very far from it, but you might not be if you really serious about your training. Be careful.&lt;/p&gt;

&lt;p&gt;I hope these simple and not strict at all advice might be helpful and will encourage your curiosity and activity towards better health. 😊&lt;/p&gt;

&lt;p&gt;DISCLAIMER AGAIN: I'm mostly healthy person, I don't have severe preexisting conditions (though I have some chronic conditions it's almost nothing) and I haven't become much healthier. Thus what I described might only help relatively healthy person become a bit more healthier, that's it. You should always consult with health professional before experimenting on yourself!&lt;/p&gt;

</description>
      <category>health</category>
      <category>diet</category>
      <category>exerise</category>
    </item>
    <item>
      <title>What's wrong with computational notebooks?</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Thu, 13 Feb 2020 11:03:43 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/what-s-wrong-with-computational-notebooks-44oi</link>
      <guid>https://dev.to/gabrielfallen/what-s-wrong-with-computational-notebooks-44oi</guid>
      <description>&lt;p&gt;Maybe we still don't have a definitive answer, but at least we have an &lt;a href="http://web.eecs.utk.edu/~azh/blog/notebookpainpoints.html"&gt;observational study&lt;/a&gt;. The link points to a summary page that have a link to the paper. But I'll summarize the summary below. 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Main pain-points
&lt;/h2&gt;

&lt;p&gt;After observing 5 Data Scientists at work and interviewing 15 more the authors identified 9 major pain points with computational notebooks. But I'll list only a subset:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup of the notebook, libraries and data sets.&lt;/li&gt;
&lt;li&gt;Exploration and visualization.&lt;/li&gt;
&lt;li&gt;Writing code.&lt;/li&gt;
&lt;li&gt;Version management.&lt;/li&gt;
&lt;li&gt;Sharing and collaboration.&lt;/li&gt;
&lt;li&gt;Reproduction and reuse.&lt;/li&gt;
&lt;li&gt;Production deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're a versed Data Scientist you're probably already either giggling or facepalming. Because the list above basically enumerates all the steps in your usual workflow and we have issues with every single one of them!&lt;/p&gt;

&lt;p&gt;I now have a question "what's &lt;em&gt;right&lt;/em&gt; with computational notebooks?" 😄&lt;/p&gt;

&lt;p&gt;And yet the notebooks are indispensable for Data Analysis and present huge improvement upon traditional purely code-centric development. Still we have a lot to borrow from "the old ways" in particular advanced IDE features and integration with Version Control and Continuous Integration Systems.&lt;/p&gt;

&lt;p&gt;The paper authors say there's a huge demand for new advanced tools integrating both IDE features and Notebook features. And I have an impression JetBrains are evaluating such an opportunity and maybe even already designing or developing a Data Science tailored IDE with Notebook features and support for R language and major libraries. 😊&lt;/p&gt;

&lt;p&gt;UPDATE. Apparently there's already an R language plugin for JetBrains IDEs that JetBrains now &lt;a href="https://blog.jetbrains.com/blog/2020/02/13/update-on-r-language-support-in-intellij-based-ides/"&gt;officially support and improve&lt;/a&gt;. And it indeed brings some Notebook features into a full-featured IDE experience. Yet still I think they might go for a separate Data Science-oriented IDE product.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>notebooks</category>
      <category>jupyter</category>
      <category>paper</category>
    </item>
    <item>
      <title>Setting up a Swift Vapor development environment on Linux</title>
      <dc:creator>Alexander Chichigin</dc:creator>
      <pubDate>Mon, 06 Jan 2020 15:38:41 +0000</pubDate>
      <link>https://dev.to/gabrielfallen/setting-up-a-swift-vapor-development-environment-on-linux-d4n</link>
      <guid>https://dev.to/gabrielfallen/setting-up-a-swift-vapor-development-environment-on-linux-d4n</guid>
      <description>&lt;p&gt;... which is &lt;em&gt;not&lt;/em&gt; Ubuntu 14.04, 16.04, 16.10, 18.04 or 18.10.&lt;/p&gt;

&lt;p&gt;As you've certainly guessed these are officially supported ones. So if you're not happened to use one of them (I use Linux Mint 19.3) official install instructions will not work (I've tried).&lt;/p&gt;

&lt;p&gt;Luckily enough "manual" installation works pretty much automatically and out-of-the-box anyway. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Swift
&lt;/h2&gt;

&lt;p&gt;Apparently official latest &lt;a href="https://swift.org/builds/swift-5.1.3-release/ubuntu1804/swift-5.1.3-RELEASE/swift-5.1.3-RELEASE-ubuntu18.04.tar.gz"&gt;Ubuntu 18.04 toolchain&lt;/a&gt; works on my Linux Mint 19.3 just fine. I simply downloaded the archive, extracted it and added &lt;code&gt;usr/bin&lt;/code&gt; subdirectory to my &lt;code&gt;PATH&lt;/code&gt; and then &lt;code&gt;swift&lt;/code&gt; worked with no issues (so far :)).&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Vapor CLI
&lt;/h2&gt;

&lt;p&gt;As we already know we can't just install Vapor CLI (aka Vapor Toolbox) simply following official instructions. Luckily building from source works as automatic as it can. :)&lt;/p&gt;

&lt;p&gt;Step one: clone the toolbox repository into some directory and &lt;code&gt;cd&lt;/code&gt; there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/vapor/toolbox vapor-toolbox
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;vapor-toolbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step two: just build the thing with Swift! :D (Note: I copied the command from a &lt;a href="https://github.com/vapor/toolbox/blob/master/Dockerfile"&gt;Dockerfile&lt;/a&gt; in the repo).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;swift build &lt;span class="nt"&gt;-c&lt;/span&gt; release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that we have a self-contained executable file &lt;code&gt;vapor&lt;/code&gt; somewhere down the hidden &lt;code&gt;.build&lt;/code&gt; dir we can copy anywhere on our &lt;code&gt;PATH&lt;/code&gt; (I've copied it to my &lt;code&gt;$HOME/.local/bin&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .build/release/vapor ~/.local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can use it! :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
&lt;span class="nv"&gt;$ &lt;/span&gt;vapor new Hello
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after answering 2 questions (I agreed to use Fluent and choose PostgreSQL) we have our first Vapor project.&lt;/p&gt;

&lt;p&gt;Now we can build it!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ vapor build
Building project..
swift build
/tmp/VaporTest/Hello: error: manifest parse error(s):
Invalid semantic version string '-beta'
error:
Failed to build.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OK, just not yet.&lt;/p&gt;

&lt;p&gt;Apparently, the toolbox missed some template data for the &lt;code&gt;Package.swift&lt;/code&gt;. Particularly in the line 13:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"https://github.com/vapor/fluent--driver.git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"-beta"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That should be&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"https://github.com/vapor/fluent-postgres-driver.git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"1.0.0-beta"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At least that's what I've figured from the Github repo and that worked. :)&lt;/p&gt;

&lt;p&gt;Run build again, wait for ages... I had no nerve and time to wait till completion, I only waited for couple hours. The process is still flawed it seems... :'D&lt;/p&gt;

</description>
      <category>linux</category>
      <category>swift</category>
      <category>vapor</category>
    </item>
  </channel>
</rss>
