Jekyll2022-12-29T12:59:49+00:00https://qjuanp.dev/feed.xmllog.info(“…”)👨🏻💻 coding affairs public log
Juan P. (jp)hi@qjuanp.devRecommended podcasts2022-06-03T00:00:00+00:002022-06-03T00:00:00+00:00https://qjuanp.dev/post/recommended-podcasts-en<p>Here is the non-requested podcast lists around Software Development.</p>
<table>
<thead>
<tr>
<th>Podcast</th>
<th>Link</th>
<th>Review</th>
</tr>
</thead>
<tbody>
<tr>
<td>Maintainable</td>
<td><a href="https://www.maintainable.fm">maintainable.fm</a></td>
<td>Conversations with developers and engineers around maintain and evolve software. Important topic of you consider committed code as legacy code!</td>
</tr>
<tr>
<td>CaSE: Conversations about Software Engineering</td>
<td><a href="https://www.case-podcast.org">vase-podcast.org</a></td>
<td>Interviewing developers and architects about software engineering and development.</td>
</tr>
<tr>
<td>Software Engineering Radio</td>
<td><a href="https://www.se-radio.net">se-radio.net</a></td>
<td>Engineers talking about their experience around different topics around building software.</td>
</tr>
<tr>
<td>Soft Skills Engineering</td>
<td><a href="https://softskill%C3%B1s.audio">softskills.audio</a></td>
<td>Not everything is code and tools when we talk about software development.</td>
</tr>
<tr>
<td>Developer tea</td>
<td><a href="https://developertea.com">developertea.com</a></td>
<td>This podcast focus as well in the human part of develop software.</td>
</tr>
<tr>
<td>Dev Discussions</td>
<td><a href="https://podcasts.apple.com/ie/podcast/dev-discussions/id954824483">Apple podcast</a></td>
<td>Conversations around topics around software development, techniques and patterns.</td>
</tr>
</tbody>
</table>
<p>My DMs on twitter are open <a href="https://twitter.com/qjuanp">@qjuanp</a> feel free to recommend me more podcasts! I’m looking for comedy (international and local Irish comedy for foreigners) and interesting stories in this format. Thanks!</p>Juan P. (jp)hi@qjuanp.devHere is the non-requested podcast lists around Software Development.Podcast recomendados2022-06-02T00:00:00+00:002022-06-02T00:00:00+00:00https://qjuanp.dev/post/podcasts-recomendados<p>He aquí la lista <del><strong>no pedida</strong></del> definitiva de podcast para hacer oficio en la casa.</p>
<table>
<thead>
<tr>
<th>Podcast</th>
<th>Link</th>
<th>Categoría</th>
<th>Reseña</th>
</tr>
</thead>
<tbody>
<tr>
<td>Estupido nerd</td>
<td><a href="https://open.spotify.com/show/6d91Ne6hghZ1UMs5X1SQFN?si=r6N780z-QGWuMRsM8T5gMQ">Spotify</a></td>
<td>Cine/Series</td>
<td>Una perspectiva fresca de series,cine y cosas ñoñas</td>
</tr>
<tr>
<td>Hoy el tema es</td>
<td><a href="https://open.spotify.com/show/0TOFi85sHxRVoyIPYld2a4?si=X_8AiwmeQBmEu85Cz-TDxA">Spotify</a></td>
<td>Curiosidades</td>
<td>Datos y curiosidades a traves de la historia.</td>
</tr>
<tr>
<td>Postales</td>
<td><a href="https://open.spotify.com/show/55B8fJxP7izpuE9gnFUG1c?si=9VdLp0E2RxO2JFgsVwDiMw">Spotify</a></td>
<td>Documental</td>
<td>Los retos de vivir por fuera de la tierrita.</td>
</tr>
<tr>
<td>Historias de Inbox</td>
<td><a href="https://open.spotify.com/show/1p5GtTkRkOgedkK3Xdg8Oy?si=95CDdCWjSriLctkzH8v56w">Spotify</a></td>
<td>Documental</td>
<td>Historias de la vida.</td>
</tr>
<tr>
<td>Caso 63</td>
<td><a href="https://open.spotify.com/show/20ch3IIqtWSSM4nfy11ZzP?si=ggCuQrKDT1aP4jYEku2gnw">Spotify</a></td>
<td>Thriller</td>
<td>Thriller/Sci-if en formato podcast de viajeros en el tiempo.</td>
</tr>
<tr>
<td>Sospechosamente light</td>
<td><a href="https://open.spotify.com/show/1aYPBvV7AIilRkyORTD1X3?si=IuOmK9A7Rdy5iOjaFfOObg">Spotify</a></td>
<td>Comedia</td>
<td>Tres amigos echando parla de lo cotidiano.</td>
</tr>
<tr>
<td>Los impopulares</td>
<td><a href="https://open.spotify.com/show/428ZHHErBD6HCvIxAY1xKH?si=vjAKQYAOTVStGSlsjZA9tA">Spotify</a></td>
<td>Comedia</td>
<td>Un combo de comediantes alternativo para escuchar.</td>
</tr>
<tr>
<td>Dormicast</td>
<td><a href="https://open.spotify.com/show/4kC7b9omKVHMu6KPGd4sXV?si=_r2kYY2NTw2y3klgL5l1nA">Spotify</a></td>
<td>Relajacion/Meditacion</td>
<td>Meditación y relajación para conciliar el sueño.</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Casi todos estan en otras plataformas de podcast menos “Caso 63”, “Historias de Inbox” y “Dormicast” que son producciones originales de Spotify</p>
</blockquote>
<p>Recomiendenme podcast! Mis DMs estan abiertos en <a href="https://twitter.com/qjuanp">@qjuanp</a></p>Juan P. (jp)hi@qjuanp.devHe aquí la lista no pedida definitiva de podcast para hacer oficio en la casa.Methodology vs Framework2022-05-31T00:00:00+00:002022-05-31T00:00:00+00:00https://qjuanp.dev/post/methodology-vs-framework<p>Just trying to explain this two concepts that could help driving conversations at architecture level since there is always a situation in during the design where you will find using them.</p>
<p>So, first of all, they are not synonyms.</p>
<h2 id="methodology">Methodology</h2>
<p>This is a common used concepts among academics. For dissertations, the methodology explains how a particular conclusion was reached. A methodology express the procedures, methods, principles and rules under a particular discipline <a href="https://en.wikipedia.org/wiki/Methodology" title="Methodology - Wikipedia">[1]</a> that will lead you to an specific result, in terms of a thesis, the conclusion reached.</p>
<p>And moving that concept into the software development scope <a href="https://en.wikipedia.org/wiki/Software_development_process" title="Software Development Process - Wikipedia">[2]</a>, a methodology defines the process and the set of specific deliverables and artifacts that are needed to develop and maintain applications during its lifecycle.</p>
<h2 id="framework">Framework</h2>
<p>It’s basically a tool set or a set of methods that can be applied separately or all the same time, the process to apply each method might or might not defined, but, is not essential for the usage of each tool.</p>
<p>In software <a href="https://en.wikipedia.org/wiki/Software_framework" title="Software Framework - Wikipedia">[3]</a> we use the term frameworks as well, frameworks like .NET (yes, dotnet core is still a framework), Java EE, Spring, etc, define tools and components that can help you to build and deploy applications.</p>
<p>In Project Management for example, PM Book can be identified as framework, since it defines a set of methods to be used in projects, but it not defines the procedure to combine each method.</p>
<h2 id="core-differences">Core differences</h2>
<p>In conclusion, a methodology defines what to deliver, how to create those deliverables and the logical order to do so, meanwhile a framework only defines what you can do.</p>
<p>That is why you can use 2 different frameworks to produce something new, for example, in software you could use Spring of top of Java EE, or Scrum with a Critical Path Method from the PM BoK (r).</p>
<h2 id="some-examples">Some examples</h2>
<p>Now that we know the differences, we can categorize the following practices and software components under each category.</p>
<ul>
<li>Scrum is a framework</li>
<li>Agile is a framework</li>
<li>Angular is a framework</li>
<li>Ionic is a framework</li>
<li>react it’s not a framework nor a methodology…</li>
<li>Nodejs it’s not a framework nor a methodology…</li>
</ul>
<p>In software we use a lot frameworks, since we need to adapt the principles, deliverables, components to specific contexts.</p>
<p>You can <a href="https://www.projectmanagement.com/contentPages/article.cfm?ID=278600&thisPageURL=/articles/278600/why-you-re-confusing-frameworks-with-methodologies#_=_" title="Why You're Confusing Frameworks with Methodologies by Michael Wood">check the post</a> made by Michael Wood where he digs more in other Frameworks and methodologies used around technology projects and organizations.</p>Juan P. (jp)hi@qjuanp.devJust trying to explain this two concepts that could help driving conversations at architecture level since there is always a situation in during the design where you will find using them.VSCode-Java Maven configuration error2022-01-10T00:00:00+00:002022-01-10T00:00:00+00:00https://qjuanp.dev/post/vscode-java-maven-configuration-error<p>There is no day that I not face a “funny” error developing in Java, saying that, it’s not my intention generate drama nor a new whole discussion Java vs The world…. this error is merely product of my ignorance in java and the composability you could find in this development ecosystem (coff coff Msft!).</p>
<p>Joke aside, I found myself in a “particular” scenario:</p>
<blockquote>
<p>When I run the cli command <code class="language-plaintext highlighter-rouge">mvn clean compile</code> project simply compile perfectly!, even the tests were running without a problem. But, when I opened up the project in a VSCode, the compiler went crazy and it was just saying that the project has a ton or compilation errors, errors like:</p>
</blockquote>
<ul>
<li>“Failed to read artifact descriptor for…”</li>
<li>“Missing artifact…”</li>
</ul>
<p>VSCode-Java uses under the hood the same tools, java and maven, to verify the sources and bring us information during development, so, how can be possible get two different results if, under the hood, are basically the same tooling?</p>
<blockquote>
<p>This error can come up with certain packages available in <strong>private repositories</strong>.</p>
</blockquote>
<p>The problem is basically that VSCode-Java/Maven tool is not able to find the default settings that are commonly stored in <code class="language-plaintext highlighter-rouge">~/.m2/settings.xml</code> or <code class="language-plaintext highlighter-rouge">%USER_PROFILE%\.m2\settings.xml</code> where the private repositories for maven are configured.</p>
<p>This can be specified using the VSCode setting entry:</p>
<p><code class="language-plaintext highlighter-rouge">"java.configuration.maven.userSettings": "C:\\Users\\<UserName>\\.m2\\setttings.xml",</code></p>
<blockquote>
<p>Or pointing to the specific settings.xml location that you are using for private repos.</p>
</blockquote>
<p>Hope that it helps!</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/redhat-developer/vscode-java/issues/1232">redhat-developer/vscode-java#1232</a></li>
<li><a href="https://github.com/redhat-developer/vscode-java/issues/1365">redhat-developer/vscode-java#1365</a></li>
</ul>Juan P. (jp)hi@qjuanp.devThere is no day that I not face a “funny” error developing in Java, saying that, it’s not my intention generate drama nor a new whole discussion Java vs The world…. this error is merely product of my ignorance in java and the composability you could find in this development ecosystem (coff coff Msft!).Git - Deal with rejected changes over protected branches2021-09-27T00:00:00+00:002021-09-27T00:00:00+00:00https://qjuanp.dev/post/git-deal-with-rejected-changes-over-protected-branches<p><img src="https://qjuanp.dev/assets/2021-09-27-git-deal-with-rejected-changes-over-protected-branches/state.png" alt="This could be your state, having a commit out of sync because is rejected by git remote" /></p>
<p><strong>Scenario:</strong> main(<a href="https://github.com/github/renaming%20(Renaming%20the%20default%20branch%20from%20master%20-%20extended%20expkanation%20by%20Github%20about%20why%20rename%20master%20as%20main%20in%20all%20repos)">*</a>) integration branch rejects changes when try to pushing into remote repository. This is a common practice to follow Gitflow (or other branching strategies) to enforce merge reviews into the into the main branch.</p>
<p>So, how to push correctly your changes into main integration branch?</p>
<p>Summary:</p>
<ol>
<li><a href="#create-a-feature-branch">Create a feature branch</a></li>
<li><a href="#reset-main">Reset your local main integration branch and sync up with remote main branch</a></li>
<li><a href="#push-your-feature-branch-and-create-a-pr">Push your feature branch and create a Pull Request</a></li>
</ol>
<h2 id="create-a-feature-branch">Create a feature branch</h2>
<p><img src="https://qjuanp.dev/assets/2021-09-27-git-deal-with-rejected-changes-over-protected-branches/step-1-create-branch.png" alt="create a feature branch" /></p>
<p>Create a feature branch from your main integration branch, remember that branches are just named pointers to actual commits, so, new branch will be pointing out to your latest changes, which are the ones you’re trying to push correctly into the integration branch.</p>
<p><code class="language-plaintext highlighter-rouge">git checkout -b [feature-branch-name]</code></p>
<blockquote>
<p>Remember to follow your defined naming conventions to name the new feature branch.</p>
</blockquote>
<h2 id="reset-main">Reset main</h2>
<p><img src="https://qjuanp.dev/assets/2021-09-27-git-deal-with-rejected-changes-over-protected-branches/step-2-reset-main.png" alt="Reset main branch" /></p>
<p>Let’s move the local main branch pointer to the same commit that remote branch is referencing.</p>
<blockquote>
<p>In this example we assume that is just one commit behind the last commit, in that case we just need to run:</p>
</blockquote>
<p><code class="language-plaintext highlighter-rouge">git reset --hard HEAD~1</code></p>
<p>Where:</p>
<ul>
<li>Reset will move the pointer</li>
<li><code class="language-plaintext highlighter-rouge">--hard</code> just move the pointer, discard all the changes</li>
<li><code class="language-plaintext highlighter-rouge">HEAD~1</code> one commit before current HEAD pointer</li>
</ul>
<p>The result is something like this:</p>
<p><img src="https://qjuanp.dev/assets/2021-09-27-git-deal-with-rejected-changes-over-protected-branches/step-2-result.png" alt="Result of resetting main branch" /></p>
<h2 id="push-your-feature-branch-and-create-a-pr">Push your feature branch and create a PR</h2>
<p>Now you can push your changes under the new branch:</p>
<p><code class="language-plaintext highlighter-rouge">git push origin [feature-branch]</code></p>
<p>And after that you will be able to create a PR to merge your changes with the main integration branch.</p>Juan P. (jp)hi@qjuanp.devMacOS Big Sur - Apple M1 - Development Setup2021-05-20T00:00:00+00:002021-05-20T00:00:00+00:00https://qjuanp.dev/post/m1-development-setup<p>Dear reader, this is just a bunch of notes to configure my dev machinem, it’s an snapshot to configure my new macbook pro m1. enjoy!</p>
<p>Software:</p>
<ul>
<li><a href="#homegbrew">Homebrew</a></li>
<li><a href="#git">Git</a></li>
<li><a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh">SSH</a></li>
<li>GPG
<ul>
<li><a href="https://gist.github.com/troyfontaine/18c9146295168ee9ca2b30c00bd1b41e">Tools</a></li>
<li><a href="https://insight.o-o.studio/article/setting-up-gpg.html">Key management</a></li>
</ul>
</li>
<li>VSCode (nothing to say here, just install)</li>
<li>Nodejs
<ul>
<li><a href="https://github.com/nvm-sh/nvm#installing-and-updating">NVM</a></li>
</ul>
</li>
</ul>
<h2 id="homebrew">Homebrew</h2>
<p>Brew has support now for M1 chip, although, it introduce some changes on its structure.</p>
<p><code class="language-plaintext highlighter-rouge">HOMEBREW_PREFIX: /opt/homebrew</code></p>
<p>Over that new path Homebrew will install all apple silicon compatible packages, saying that, it is needed to add the following line to your <code class="language-plaintext highlighter-rouge">.zshrc</code></p>
<p><code class="language-plaintext highlighter-rouge">export PATH=/opt/homebrew/bin:$PATH</code></p>
<h2 id="git">Git</h2>
<p><code class="language-plaintext highlighter-rouge">brew install git</code></p>
<p>Use your own version rather than the one that comes with xcode tools, it’s always outdated and releases are less frequet.</p>Juan P. (jp)hi@qjuanp.devDear reader, this is just a bunch of notes to configure my dev machinem, it’s an snapshot to configure my new macbook pro m1. enjoy!Introduction to Sets in Rego2021-04-25T00:00:00+00:002021-04-25T00:00:00+00:00https://qjuanp.dev/post/introduction-sets-rego-open-policy-agent<p><a href="https://www.openpolicyagent.org/docs/latest/#rego" title="Rego">Rego</a> is a declarative language used to define policies in <a href="https://www.openpolicyagent.org/" title="Open Policy Agent">Open Policy Agent (OPA)</a>. This declarative language works defining queries that behaves like assertions over structured data stored in OPA.</p>
<p>In other words, we could said that OPA is the engine that interprets and evaluate policies written in Rego.</p>
<p>But, what is a Policy? an over-simplified analogy could be that a policy is a pre-condition: “a condition or predicate that must always be true prior the execution of something” <a href="https://en.wikipedia.org/wiki/Precondition" title="Precondition">#</a>.</p>
<p>An example of a policy could be:</p>
<blockquote>
<p>Users can only buy if its profile has an address and a phone number</p>
</blockquote>
<p>We could identify here a concrete action that is: “buy”, but before that action occurs the following pre-conditions should be meet:</p>
<ul>
<li>User profile must have an address</li>
<li>User profile must have a phone number</li>
</ul>
<p>In this particular case, rego assertions needs only to verify that a couple of fields contains some value, so, the final policy in rego looks like:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>default profile_completed = false
profile_completed {
count(input.phone) != 0
count(input.address) != 0
}
</code></pre></div></div>
<p><sup>see this example in action ▶️ <a href="https://play.openpolicyagent.org/p/4k0TZcT1hy">https://play.openpolicyagent.org/p/4k0TZcT1hy</a></sup></p>
<p>Nevertheless, there are cases where expressions get more interesting, one of those cases is when you have to compare data collections with rego assertions.</p>
<p>One example of this type of policies is:</p>
<blockquote>
<p>Only authorized roles assigned to an user can access the content</p>
</blockquote>
<h2 id="rego-collection-data-types">Rego collection data types</h2>
<p>Collections (<a href="https://www.openpolicyagent.org/docs/latest/policy-language/#composite-values" title="Composite Values">Composite values</a>) in rego come in different flavors, has different built-in functions and syntactic sugar.</p>
<ul>
<li>Object/Dictionary/Map: key-valued collections > we will talk in another post about particular data type.</li>
<li>Array: indexed collection</li>
<li>Set: non-indexed/unordered collections of unique values</li>
</ul>
<p>As you may noticed, there are substantial differences between Sets and Arrays, despite they use same representation when is serialized into JSON.</p>
<p>For the specific scenario that we are evaluating, values in the collection are the important ones, not so much where are they located at, which means, Sets will suit perfectly to write a policy and when you dig into built-in operations you will notice why too.</p>
<h2 id="sets-in-rego">Sets in Rego</h2>
<h3 id="declaring-sets">Declaring sets</h3>
<p>First thing first, how does it look a <a href="https://www.openpolicyagent.org/docs/latest/policy-language/#sets" title="Policy Language → Composite Values → Sets">set</a> in rego?</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// Set of primitive types
s := {"this", "is", "a", "set"}
s := {8,2,26}
// Set of complex types
s := {
{"country":"🇨🇴"},
{"country":"🇮🇪"}
}
</code></pre></div></div>
<p>Sets and arrays share a similar syntaxis, although Arrays use square brackets <code class="language-plaintext highlighter-rouge">[...]</code> and Sets use curly brackets <code class="language-plaintext highlighter-rouge">{...}</code>. Yes, objects in rego use curly brackets as well, but remember that objects are key-value collections.</p>
<h3 id="equality">Equality</h3>
<p>Here is where sets start to look interesting! since it contains only unique values the equality comparison is pretty simple</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{1,2,3} == {3,1,2} // -> true
</code></pre></div></div>
<p>[2] Example taken from official documentation.</p>
<p>And yes, when you declare a set it just store unique values</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s:= {1,1,2,2,3,3}
s == {3,2,1} // -> true
</code></pre></div></div>
<h3 id="projection">Projection</h3>
<p>You could create new sets based on subqueries using <a href="https://www.openpolicyagent.org/docs/latest/policy-language/#set-comprehensions" title="Policy Language → Comprehensions → Set Comprehension">“Comprehension”</a>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>comp := { head | body ; condition<optional> }
</code></pre></div></div>
<p>Tip: You could use comprehensions to create other Composite values like objects and arrays, structure is the same (head, body, condition), just take a look of specific syntaxis for each type.</p>
<ul>
<li>head → item to be taken for the new set.</li>
<li>body → expression indicating where to extract the item.</li>
<li>condition → if condition result is <code class="language-plaintext highlighter-rouge">true</code> the item will be added into the resulting set, otherwise is discarded.</li>
</ul>
<h2 id="intersection">Intersection</h2>
<p>When you have 2 sets, you could get the intersection from both sets using the binary operator <code class="language-plaintext highlighter-rouge">&</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>french := {
"🇳🇪 Niger",
"🇨🇲 Cameroon",
"🇬🇳 Guinea",
"🇨🇦 Canada"
}
english := {
"🇨🇲 Cameroon",
"🇮🇪 Ireland",
"🇳🇬 Nigeria",
"🇿🇦 South Africa",
"🇨🇦 Canada"
}
english_and_french := english & french ## --> { "🇨🇲 Cameroon", "🇨🇦 Canada" }
</code></pre></div></div>
<p>This intersection is precisely what we are looking to define a policy around the scenario proposed, let’s take a look</p>
<p><img src="https://qjuanp.dev/assets/2021-04-25-introduction-sets-rego-open-policy-agent/intersection.png" alt="Intersection between user assigned roles and allowed roles list - Venn Diagram" /></p>
<p>Let’s say for example that we have part of the content (what ever it is) and that content could be accessible for System Administrators and Publishers, so, the allowed set of roles could look like:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>allowed_roles := { "admin", "publisher" }
</code></pre></div></div>
<p>And we are getting from the actual system that is validating content access against OPA the list of roles assigned to the logged user, so, we receive the following JSON:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"username": "qjuanp",
"roles": ["writter", "publisher", "developer"]
}
</code></pre></div></div>
<p>Knowing what is a set and how to use the intersection operation we could define the policy in rego as:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>default allow = false # By default is not allowed
allow {
user_roles := { role | role := input.roles[_] } # user roles came as an array, so let's create a set version
user_allowed_roles := user_roles & allowed_roles
count(user_allowed_roles) > 0 # final result of the alternative rule set `allow`
}
allowed_roles := { "admin", "publisher" }
</code></pre></div></div>
<p><sup>see this example in action ▶️ <a href="https://play.openpolicyagent.org/p/gjMYmbDg4C">https://play.openpolicyagent.org/p/gjMYmbDg4C</a></sup></p>
<p>It’s important to transform arrays into sets to use properly sets operations, otherwise OPA won’t tell you that there is an error and instead is going to use the unique values present in the array → indexes, which is going to mislead the rego policy evaluation.</p>
<p>Alongside with intersection there are two more interesting <a href="https://www.openpolicyagent.org/docs/latest/policy-reference/#sets-2" title="Policy Reference → Built-in functions → Sets">bult-in operations</a> to work with sets: Minus (left join) and union, and other syntactic sugar “Rule Sets”, but I will write about them in future notes, stay tuned.</p>
<blockquote>
<p>if you want to learn more in general about Rego, I’d recommend start with <a href="https://blog.openpolicyagent.org/rego-design-principle-1-syntax-should-reflect-real-world-policies-e1a801ab8bfb" title="Rego design principle #1: Syntax should reflect real-world policies by Tim Hichrichs">this post</a>:</p>
</blockquote>
<hr />
<p><a href="https://github.com/qjuanp/qjuanp.github.io/issues/new?assignees=qjuanp&labels=review&template=post-feedback.md&title=%5Bpost+feedback%5D">👉 make a suggestion</a></p>
<blockquote>
<p>If you want to help me with this post redaction don’t hesitate on create an issue in the GitHub repo where it’s hosted, use this link to get you there, and thanks!</p>
</blockquote>
<hr />Juan P. (jp)hi@qjuanp.devRego is a declarative language used to define policies in Open Policy Agent (OPA). This declarative language works defining queries that behaves like assertions over structured data stored in OPA.Back to business2021-04-24T00:00:00+00:002021-04-24T00:00:00+00:00https://qjuanp.dev/post/back-to-business<h2 id="hi-there">Hi there!</h2>
<p>This is a note for my future-self…</p>
<p>One of the things that I’ve been trying through the past years is pushing myself to write more in this blog with terrible results as you can see, I barely notice the existence of this space, I recall its existence once I get the domain bill every year.</p>
<h2 id="what-have-changed">What have changed?</h2>
<p>How this time is going to be different than the past years?
I’ve changed my perspective of what should I being published into this space. In the past, I had thought on create content to be part of a community and create content based on tools that I had had not used in a daily basis, at least not more than on experimental environment. Now, the main propose of this space will share my notes around technology and human perspective of developing software. Content won’t be tech specific centric, it will be experience cantered, experience that I’ve been gained and learned in tech and practices.
To put it in other words, it will serve only one propose: organize notes archive that I (and maybe you) could revisit in a regular basis to refresh up concepts, how to use a particular component, product, library, methodology and frameworks and idea connections that I’ve been building during those years and new ones with the years and projects to come.
Think in this space like the organised version of my memo path.</p>
<h2 id="why">Why?</h2>
<p>There are a few things that I want to learn and reinforce through technical writing:</p>
<h3 id="fight-against-my-terrible-memory">Fight against my terrible memory</h3>
<p>This is the most important one, fight against my terrible memory: for many years I’ve struggled with my memory, it’s simple terrible (not medical terrible, just regular terrible). Writing helps you to retain more information, and more important, access that information; if you couldn’t remember something specific you will find it with in your notes, and if it’s well written it could bring back valuable information and make it ready to be used faster than the first time we faced that concept.</p>
<h3 id="practicing-my-english">Practicing my English</h3>
<p>You may noticed pretty weird sentences in this post, well, I’m still learning how to express complex ideas in a more natural non-foreign-english-robotic way; Saying that, I publish new content primarily in English so I could improve more my output english skills.
If you find valuable my notes and found ways to express better ideas, grammar errors or spelling words, you could help me a lot showing me the correct way to do so, for that, I will leave at the end of each post a link to report the issue back in the GitHub repo where this blog is hosted.</p>
<h3 id="problem-solving">Problem Solving</h3>
<p>This is huge! Understand the problem is even more important than solving it, why? how sure are you to be solving the correct problem? A common problem among developers is always talk in terms of solutions, we don’t event let someone to finish a sentence of the problem the are having for us starting. Writing will make it easy to synthesize and focus on the problem.</p>
<h3 id="express-comprehensive-ideas">Express comprehensive ideas</h3>
<p>One thing is what you have heard, another thing what you think about it, and another completely different how you express it (remember the “broken telephone game”?).
Writing helps you to align and tie with your own ideas and words all those things together through: Synthetization, Summarization and Abstraction.</p>
<h3 id="communicate-asynchronously">Communicate asynchronously</h3>
<p>Write it’s an important skill in highly location distributed teams. With highly I mean work with team mates in extreme time zones with 5+ difference hours.</p>
<h3 id="reduce-zoom-fatigue">Reduce Zoom fatigue</h3>
<p>Even with a couple of hours of difference, a well written technical document or email could save you of a Zoom call (or teams call to whoever use it)</p>
<h2 id="in-other-words">In other words…</h2>
<p>…from now on you will see a bunch of posts that are notes for my future self, hopefully it will be something useful for you too, that’d be even better! but, I will try to flight low and make this useful for me first.</p>
<hr />
<p><a href="https://github.com/qjuanp/qjuanp.github.io/issues/new?assignees=qjuanp&labels=review&template=post-feedback.md&title=%5Bpost+feedback%5D">👉 make a suggestion</a></p>
<blockquote>
<p>If you want to help me with this post redaction don’t hesitate on create an issue in the GitHub repo where it’s hosted, use this link to get you there, and thanks!</p>
</blockquote>
<hr />Juan P. (jp)hi@qjuanp.devHi there!Update project netcore version2020-06-23T00:00:00+00:002020-06-23T00:00:00+00:00https://qjuanp.dev/post/update-project-netcore-version<h1 id="update-project-netcore-version">Update project netcore version</h1>
<blockquote>
<p>These are just notes for my future-self</p>
</blockquote>
<p>Updating <code class="language-plaintext highlighter-rouge">Mde.Net.Reactive</code> project from dotnetcore 2.1 to latest dotnet core stable version (at this date: 3.1)</p>
<h2 id="install-dotnet-sdk">Install dotnet sdk</h2>
<p>You could use following ways to do so from cli:</p>
<ul>
<li><a href="https://chocolatey.org/packages/dotnetcore-sdk#versionhistory">Chocolatey</a>
<ul>
<li>Latest version <code class="language-plaintext highlighter-rouge">choco install dotnetcore-sdk</code></li>
<li>Specific version <code class="language-plaintext highlighter-rouge">choco install dotnetcore-sdk --version=2.1.807</code></li>
</ul>
</li>
<li><a href="https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script">dotnet-install scripts</a>
<ul>
<li>Latest version <code class="language-plaintext highlighter-rouge">dotnet-install.sh --channel Current</code></li>
<li>Specific version <code class="language-plaintext highlighter-rouge">dotnet-install.sh --channel 2.1</code></li>
</ul>
</li>
</ul>
<blockquote>
<p>👀 MacOS/Linux: You will need to validate if you have your dotnet sdk installation folder registered in the <code class="language-plaintext highlighter-rouge">PATH</code></p>
</blockquote>
<h2 id="update-targetframework">Update TargetFramework</h2>
<p>This is the simplest step: Change for the <code class="language-plaintext highlighter-rouge">*.csproj</code> files following parameter to <code class="language-plaintext highlighter-rouge">netcoreapp3.1</code></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><TargetFramework></span>netcoreapp3.1<span class="nt"></TargetFramework></span>
</code></pre></div></div>
<h2 id="upgrade-dependencies">Upgrade dependencies</h2>
<p>Unfortunately, dotnet cli doesn’t have an integrated tool to update all dependencies, so, in this case it’d be useful an external tool like <a href="https://nukeeper.com/"><code class="language-plaintext highlighter-rouge">Nukeeper</code></a></p>
<blockquote>
<p>Install <code class="language-plaintext highlighter-rouge">dotnet tool install nukeeper --global</code></p>
</blockquote>
<p>Update all packages <code class="language-plaintext highlighter-rouge">nukeeper update</code></p>
<h2 id="commit--push">commit & push!</h2>
<p>🙆♀️🎉 All set, project is already upgraded!</p>Juan P. (jp)hi@qjuanp.devUpdate project netcore versionReactive en C# - MDE.NET2018-11-29T00:00:00+00:002018-11-29T00:00:00+00:00https://qjuanp.dev/post/reactive-en-csharp-mde-net<p>Acá dejo los <strong><a href="https://slides.com/qjuanp/rx-csharp-mdenet">slides</a></strong> que usé el pasado <a href="https://www.meetup.com/es-ES/MDE-NET/events/256625082/">29 de Noviembre en el meetup de MDE.NET</a></p>
<iframe src="//slides.com/qjuanp/rx-csharp-mdenet/embed" width="740" height="450" scrolling="no" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="">
</iframe>
<p>El código que usé esta publicado en el repositorio <a href="https://github.com/qjuanp/reactive-markdown-exporter-mde">https://github.com/qjuanp/reactive-markdown-exporter-mde</a></p>
<h2 id="algunas-fotos-de-ese-día">Algunas fotos de ese día</h2>
<p>Todos los creditos a la comunidad <a href="http://mdedotnet.co">MDE.NET</a></p>
<p><img src="/assets/2018-11-29-reactive-en-csharp-mde-net/p1.jpg" alt="Reactive en C# - Foto por Comunidad MDE.NET" class="img-responsive" /></p>
<p><img src="/assets/2018-11-29-reactive-en-csharp-mde-net/p2.jpg" alt="Reactive en C# - Foto por Comunidad MDE.NET" class="img-responsive" /></p>
<p><img src="/assets/2018-11-29-reactive-en-csharp-mde-net/p3.jpg" alt="Reactive en C# - Foto por Comunidad MDE.NET" class="img-responsive" /></p>Juan P. (jp)hi@qjuanp.devAcá dejo los slides que usé el pasado 29 de Noviembre en el meetup de MDE.NET