<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel><title>Snippets | Hugo Ferreira</title>
    <link>https://hugo.ferreira.cc/snippets/</link>
    <description>Recent content in Snippets by Hugo Ferreira</description>
    <image>
      <title>Snippets | Hugo Ferreira</title>
      <url>https://hugo.ferreira.cc/hf-bw.jpg</url>
      <link>https://hugo.ferreira.cc/snippets/</link>
    </image>
    <generator>Hugo -- 0.124.1</generator>
    <language>en</language>
    <copyright>2000–2024 by Hugo Ferreira · CC BY 4.0</copyright>
    <lastBuildDate>Thu, 21 Sep 2023 01:04:35 +0000</lastBuildDate>
    <atom:link href="https://hugo.ferreira.cc/snippets/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>✂️ SQLite</title>
      <link>https://hugo.ferreira.cc/sqlite/</link>
      <pubDate>Thu, 21 Sep 2023 01:04:35 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/sqlite/</guid>
      <description>Small information nuggets and recipies about SQLite</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="quick-survival-guide-for-exploring-a-new-database">Quick survival guide for exploring a new database</h2>
<ul>
<li><a href="https://www.sqlite.org/cli.html#changing_output_formats">Command Line Shell For SQLite - 5. Changing Output Formats</a></li>
<li><a href="https://www.sqlite.org/cli.html#querying_the_database_schema">Command Line Shell For SQLite - 6. Querying the database schema</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="p">.</span><span class="n">headers</span><span class="w"> </span><span class="k">on</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">.</span><span class="k">mode</span><span class="w"> </span><span class="k">column</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">.</span><span class="n">tables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">.</span><span class="k">schema</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="k">limit</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="see-the-cli-command-history">See the CLI command history</h2>
<ul>
<li><a href="https://antonz.org/sqlite-history/">SQLite CLI command history</a>
<ul>
<li><code>↑</code> and <code>↓</code> — recall last commands</li>
<li><code>Ctrl+R</code> — search command history <mark>HF: Not working?</mark></li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat ~/.sqlite_history
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ IntelliJ</title>
      <link>https://hugo.ferreira.cc/intellij/</link>
      <pubDate>Fri, 06 May 2022 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/intellij/</guid>
      <description>Small information nuggets and recipies about IntelliJ</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="commit-message-margin-markers">Commit message margin markers</h2>
<ul>
<li><a href="https://stackoverflow.com/a/64709473">git - IntelliJ commit 50-character line length reminder - Stack Overflow</a></li>
</ul>
<p><strong>Preferences ➤ Version Control ➤ Commit</strong></p>
<blockquote>
<p>☑ Blank link between subject and body<br>
☑ Limit body line = 72   <strong>+</strong>   ☑ Show right margin<br>
☑ Limit subject line = 69</p>
</blockquote>
<ul>
<li><code>69</code> is the cutoff limit for message subject in GitHub</li>
<li><code>72</code> is the common convention for <a href="https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">good commit messages</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ Gradle</title>
      <link>https://hugo.ferreira.cc/gradle/</link>
      <pubDate>Fri, 17 Sep 2021 01:04:16 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/gradle/</guid>
      <description>Small information nuggets and recipies about Gradle</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="lifecycle-of-gradle-tasks">Lifecycle of Gradle tasks</h2>
<ul>
<li><a href="https://docs.gradle.org/7.2/userguide/java_plugin.html#lifecycle_tasks">The Java Plugin # Lifecycle Tasks</a></li>
</ul>
<p><img loading="lazy" src="java-plugin-tasks.png" alt="java-plugin-tasks"  />
</p>
<h2 id="log-summary-of-tests-skipped-or-passed">Log summary of tests skipped or passed</h2>
<ul>
<li><a href="https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.logging.TestLogging.html">TestLogging - Gradle DSL Version 6.7.1</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="n">tasks</span><span class="p">.</span><span class="n">withType</span><span class="p">&lt;</span><span class="n">test</span><span class="p">&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">testLogging</span> <span class="p">{</span> <span class="n">events</span><span class="p">(</span><span class="s2">&#34;passed&#34;</span><span class="p">,</span> <span class="s2">&#34;skipped&#34;</span><span class="p">,</span> <span class="s2">&#34;failed&#34;</span><span class="p">)</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="include-junit-5-tests-in-all-testing-tasks">Include JUnit 5 tests in all testing tasks</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="c1">// Affects both `gradlew test` and `gradlew customTestTask`
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">tasks</span><span class="p">.</span><span class="n">withType</span><span class="p">&lt;</span><span class="n">test</span><span class="p">&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">useJUnitPlatform</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="register-custom-test-tasks">Register custom test tasks</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="n">tasks</span><span class="p">.</span><span class="n">register</span><span class="p">&lt;</span><span class="n">Test</span><span class="p">&gt;(</span><span class="s2">&#34;customTestTask&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">environment</span><span class="p">(</span><span class="s2">&#34;ENV_VAR&#34;</span><span class="p">,</span> <span class="s2">&#34;value&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">include</span><span class="p">(</span><span class="s2">&#34;path/to/tests/**&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Kotlin</title>
      <link>https://hugo.ferreira.cc/kotlin/</link>
      <pubDate>Tue, 11 May 2021 01:05:26 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/kotlin/</guid>
      <description>Small information nuggets and recipies about Kotlin</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="data-class-with-a-missing-field-in-certain-contexts">Data class with a missing field in certain contexts</h2>
<ul>
<li><a href="http://oneeyedmen.com/nothing-can-save-us.html">Nothing? can save us · What I should have said</a></li>
</ul>
<p><em>… base structure</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">data</span> <span class="k">class</span> <span class="nc">CustomerData</span><span class="p">&lt;</span><span class="k">out</span> <span class="n">T</span> <span class="p">:</span> <span class="n">String</span><span class="p">?&gt;(</span>
</span></span><span class="line"><span class="cl">    <span class="k">val</span> <span class="py">id</span><span class="p">:</span> <span class="n">T</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="k">val</span> <span class="py">name</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p><em>… generalisation</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">typealias</span> <span class="n">AnyCustomer</span> <span class="p">=</span> <span class="n">CustomerData</span><span class="p">&lt;*&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="py">AnyCustomer</span><span class="p">.</span><span class="n">isSaved</span> <span class="k">get</span><span class="p">()</span> <span class="p">=</span> <span class="n">id</span> <span class="o">!=</span> <span class="k">null</span>
</span></span></code></pre></div><p><em>… specialisation</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">typealias</span> <span class="n">SavedCustomer</span> <span class="p">=</span> <span class="n">CustomerData</span><span class="p">&lt;</span><span class="n">String</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">typealias</span> <span class="n">UnsavedCustomer</span> <span class="p">=</span> <span class="n">CustomerData</span><span class="p">&lt;</span><span class="n">Nothing</span><span class="p">?&gt;</span>
</span></span></code></pre></div><p><em>… conversion</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="nd">@Suppress</span><span class="p">(</span><span class="s2">&#34;UNCHECKED_CAST&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">fun</span> <span class="nf">UnsavedCustomer</span><span class="p">.</span><span class="n">saved</span><span class="p">(</span><span class="n">id</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">=</span> <span class="p">(</span><span class="k">this</span> <span class="k">as</span> <span class="n">SavedCustomer</span><span class="p">).</span><span class="n">copy</span><span class="p">(</span><span class="n">id</span><span class="p">)</span>
</span></span></code></pre></div><p><em>… usage</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="c1">// Ok
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">saved</span> <span class="p">=</span> <span class="n">SavedCustomer</span><span class="p">(</span><span class="s2">&#34;123&#34;</span><span class="p">,</span> <span class="s2">&#34;Name&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="py">unsaved</span> <span class="p">=</span> <span class="n">UnsavedCustomer</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="s2">&#34;Fred&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Type mismatch
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">err1</span> <span class="p">=</span> <span class="n">SavedCustomer</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="s2">&#34;name&#34;</span><span class="p">)</span>    <span class="c1">// Null can not be a value of a non-null type String
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">err2</span> <span class="p">=</span> <span class="n">UnsavedCustomer</span><span class="p">(</span><span class="s2">&#34;123&#34;</span><span class="p">,</span> <span class="s2">&#34;Name&#34;</span><span class="p">)</span> <span class="c1">// inferred type is String but Nothing? was expected
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">err3</span><span class="p">:</span> <span class="n">String</span> <span class="p">=</span> <span class="n">unsaved</span><span class="p">.</span><span class="n">id</span>     <span class="c1">// inferred type is Nothing? but String was expected
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">err4</span><span class="p">:</span> <span class="n">SavedCustomer</span> <span class="p">=</span> <span class="n">unsaved</span> <span class="c1">// inferred type is UnsavedCustomer but SavedCustomer was expected
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">val</span> <span class="py">err5</span><span class="p">:</span> <span class="n">UnsavedCustomer</span> <span class="p">=</span> <span class="n">saved</span> <span class="c1">// inferred type is SavedCustomer but UnsavedCustomer was expected
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ GitHub</title>
      <link>https://hugo.ferreira.cc/github/</link>
      <pubDate>Tue, 11 May 2021 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/github/</guid>
      <description>Small information nuggets and recipies about GitHub</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="github-colors-used-in-the-repos-language-statistics-bar">GitHub colors used in the repo&rsquo;s language statistics bar</h2>
<table>
<thead>
<tr>
<th>Artefact</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/github-linguist/linguist">github-linguist/linguist</a></td>
<td>Library used on GitHub.com to detect blob languages</td>
</tr>
<tr>
<td><a href="https://github.com/github-linguist/linguist/blob/master/lib/linguist/languages.yml">linguist/lib/linguist/languages.yml</a></td>
<td>Definitions file of all Languages known to GitHub</td>
</tr>
<tr>
<td><a href="https://github.com/kujitegemea/language-colors">kujitegemea/language-colors</a></td>
<td>GitHub programming languages color codes in CSS, NodeJS and Javascript (automatically updated from Linguist)</td>
</tr>
</tbody>
</table>
<h2 id="multiple-authors-pairing">Multiple authors (pairing)</h2>
<ul>
<li><a href="https://docs.github.com/en/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors">Creating a commit with multiple authors - GitHub Docs</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Co-authored-by: FS &lt;first.last@example.com&gt;
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Markdown</title>
      <link>https://hugo.ferreira.cc/markdown/</link>
      <pubDate>Wed, 07 Apr 2021 21:02:50 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/markdown/</guid>
      <description>Small information nuggets and recipies about Markdown</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="blockquotes">Blockquotes</h2>
<ul>
<li>via <a href="https://stackoverflow.com/a/2002150">StackOverflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">&gt; </span><span class="ge">Quote with citation.
</span></span></span><span class="line"><span class="cl"><span class="ge"></span>&gt; 
</span></span><span class="line"><span class="cl"><span class="k">&gt; </span><span class="ge">— Author in &lt;cite&gt;[Source](http://example.com)&lt;/cite&gt;
</span></span></span></code></pre></div><h2 id="footnotes">Footnotes</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Lorem ipsum dolor sit amet[^fn-ref], consectetur adipisicing elit,  
</span></span><span class="line"><span class="cl">sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">[^fn-ref]: See more at https://lipsum.com
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Git</title>
      <link>https://hugo.ferreira.cc/git/</link>
      <pubDate>Mon, 12 Oct 2020 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/git/</guid>
      <description>Small information nuggets and recipies about Git</description>
      <content:encoded><![CDATA[<p>See also:</p>
<blockquote>
<p>So here are some bad situations I&rsquo;ve gotten myself into, and how I eventually got myself out of them <em>in plain english</em>.</p>
<p>— <a href="https://ohshitgit.com">Oh Shit, Git!?!</a></p>
</blockquote>
<hr>
<p><em>(most recent on top)</em></p>
<h2 id="search-for-commits-that-add-or-delete-a-string-pickaxe">Search for commits that add or delete a string (pickaxe)</h2>
<ul>
<li><a href="http://www.philandstuff.com/2014/02/09/git-pickaxe.html">The git pickaxe</a>
<ul>
<li>via <a href="https://springernature.slack.com/archives/C0R5SM347/p1711371850137259">Roman Seidelsohn</a></li>
<li>via <a href="https://springernature.slack.com/archives/C0R5SM347/p1711374365573009?thread_ts=1711371850.137259&amp;channel=C0R5SM347&amp;message_ts=1711374365.573009">Jim Kinsey</a></li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">git log -p -S example
</span></span></code></pre></div><pre tabindex="0"><code>-p
  Generate patch text

-S&lt;string&gt;
  Look for differences that change the number of occurrences of the specified
  string (i.e. addition/deletion) in a file.

-G&lt;regex&gt;
  Look for differences whose patch text contains added/removed lines that match &lt;regex&gt;.
</code></pre><h2 id="configure-separate-git-users-for-different-repos">Configure separate Git users for different repos</h2>
<ul>
<li>via <a href="https://app.slack.com/team/UMGKV4QKH">Aleksander Sumowski</a></li>
</ul>
<p><em>… <code>~/.gitconfig</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-properties" data-lang="properties"><span class="line"><span class="cl"><span class="err">[user]</span>
</span></span><span class="line"><span class="cl">  <span class="na">name</span> <span class="o">=</span> <span class="s">First Last</span>
</span></span><span class="line"><span class="cl">  <span class="na">email</span> <span class="o">=</span> <span class="s">personal@example.org</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">[includeIf</span> <span class="s">&#34;gitdir:~/work/&#34;]</span>
</span></span><span class="line"><span class="cl">  <span class="na">path</span> <span class="o">=</span> <span class="s">~/work/.gitconfig</span>
</span></span></code></pre></div><p><em>… <code>~/work/.gitconfig</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-properties" data-lang="properties"><span class="line"><span class="cl"><span class="err">[user]</span>
</span></span><span class="line"><span class="cl">  <span class="na">email</span> <span class="o">=</span> <span class="s">work@example.com</span>
</span></span></code></pre></div><h2 id="revert-changes-of-a-single-file-of-a-commit">Revert changes of a single file of a commit</h2>
<ul>
<li>via <a href="https://ios.slack.com/archives/C6DSYLCGZ/p1568122893055200">Michael Brown</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git show &lt;commit&gt; -- some_file.c <span class="p">|</span> git apply -R
</span></span></code></pre></div><h2 id="manually-ignore-changes-to-a-tracked-file-or-directory">Manually ignore changes to a tracked file or directory</h2>
<ul>
<li><a href="https://wildlyinaccurate.com/git-ignore-changes-in-already-tracked-files/">Git: Ignore changes to already-tracked files | Wildly Inaccurate</a></li>
</ul>
<p><em>… stop tracking</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git update-index --assume-unchanged &lt;file&gt;
</span></span></code></pre></div><p><em>… resume tracking</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git update-index --no-assume-unchanged &lt;file&gt;
</span></span></code></pre></div><h2 id="rebase-a-topic-branch-into-anywhere-you-want">Rebase a topic branch into anywhere you want</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/134882/undoing-a-git-rebase/137363#137363">Undoing a git rebase - Stack Overflow</a></li>
</ul>
<p><em>… <code>topic</code> info <code>master</code> (run from any branch)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git rebase master topic                     <span class="c1"># default is HEAD of master</span>
</span></span><span class="line"><span class="cl">git rebase master topic --onto commit
</span></span></code></pre></div><h2 id="change-the-committer-and-author-names">Change the committer and author names</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi/1320317#1320317">version control - How to change the author and committer name and e-mail of multiple commits in Git? - Stack Overflow</a></li>
</ul>
<p><em>… set default repo user</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config user.name <span class="s2">&#34;User Name&#34;</span>
</span></span><span class="line"><span class="cl">git config user.email user@example.com
</span></span></code></pre></div><p><em>… author = <strong>default</strong>, committer = <strong>default</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git commit --amend --no-edit --reset-author
</span></span></code></pre></div><p><em>… author = <strong>custom</strong>, committer = <strong>default</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git commit --amend --no-edit --author <span class="s2">&#34;Author Name &lt;author@example.com&gt;&#34;</span>
</span></span></code></pre></div><p><em>… author = same, committer = <strong>custom</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git -c user.name<span class="o">=</span><span class="s2">&#34;Committer Name&#34;</span> -c user.email<span class="o">=</span>committer@example.com commit --amend --no-edit
</span></span></code></pre></div><p><em>… in many commits</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git rebase -i -p
</span></span><span class="line"><span class="cl"><span class="c1"># mark as: edit</span>
</span></span><span class="line"><span class="cl"><span class="c1"># repeat as above</span>
</span></span></code></pre></div><h2 id="fixup-commits-and-autosquash-rebases">Fixup commits and autosquash rebases</h2>
<ul>
<li><a href="https://robots.thoughtbot.com/autosquashing-git-commits">Auto-squashing Git Commits</a></li>
</ul>
<p><em>… create</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># squash fixed commit; prefixes message with &#34;squash! &#34;</span>
</span></span><span class="line"><span class="cl">git commit --squash e37dc68
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># fixup relative commit; prefixes message with &#34;fixup! &#34;</span>
</span></span><span class="line"><span class="cl">git commit --fixup @~1
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># fixup commit with string; prefixes message with &#34;fixup! &#34;</span>
</span></span><span class="line"><span class="cl">git commit --fixup :/foobar
</span></span></code></pre></div><p><em>… apply</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># auto reorganises the squash/fixup and moves them to the right place</span>
</span></span><span class="line"><span class="cl">git rebase -i --autosquash
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># makes it the default for all rebases</span>
</span></span><span class="line"><span class="cl">git config --global rebase.autosquash <span class="nb">true</span>
</span></span></code></pre></div><h2 id="find-broken-commit">Find broken commit</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git bisect start &lt;bad&gt; &lt;good&gt;
</span></span></code></pre></div><p><em>… example</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git bisect start @ origin/master
</span></span><span class="line"><span class="cl">git bisect run bin/test.sh
</span></span></code></pre></div><h2 id="detect-which-folders-are-affected-by-the-latest-commits-monorepo">Detect which folders are affected by the latest commits (monorepo)</h2>
<ul>
<li>via <a href="https://github.com/EqualExperts/ee-budget-app/blob/master/Jenkinsfile#L12">Equal Experts</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git diff-tree --no-commit-id --name-only HEAD tag
</span></span></code></pre></div><h2 id="delete-remote-branch-or-tag">Delete remote branch or tag</h2>
<ul>
<li><a href="http://stackoverflow.com/a/2003515/1380781">How to delete a Git branch both locally and remotely? - Stack Overflow</a></li>
</ul>
<p><em>… as of v1.7</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git push origin --delete &lt;branch_name&gt;
</span></span><span class="line"><span class="cl">git push origin --delete &lt;tag_name&gt;
</span></span></code></pre></div><p><em>… before that</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git push origin :&lt;branch_name&gt;
</span></span></code></pre></div><h2 id="differences-between-local-and-upstream">Differences between local and upstream</h2>
<ul>
<li>via <a href="https://twitter.com/ajh_17/status/673000158573944832">Akshay on Twitter: &ldquo;@tpope It was released around git v2.0 I think. It’s been nice to use: git diff @..@{u} to diff the local and the upstream branches.&rdquo;</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git diff @<span class="o">{</span>u<span class="o">}</span>..@
</span></span></code></pre></div><h2 id="the--sign-is-an-alias-for-head">The <code>@</code> sign is an alias for <code>HEAD</code></h2>
<ul>
<li><a href="https://twitter.com/tpope/status/671724545125040128">Tim Pope on Twitter: &ldquo;whoa nice, @ is an alias for HEAD in git now git show @^&rdquo;</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git show @
</span></span><span class="line"><span class="cl">git show @~2
</span></span></code></pre></div><h2 id="change-a-commit-original-author-date">Change a commit original author date</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git">How can one change the timestamp of an old commit in Git? - Stack Overflow</a></li>
<li><a href="https://stackoverflow.com/questions/9110310/update-git-commit-author-date-when-amending">Update git commit author date when amending - Stack Overflow</a></li>
</ul>
<p><em>… set author date</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git commit --amend --no-edit --date<span class="o">=</span><span class="s2">&#34;Sun Dec 31 12:34:56 2017&#34;</span>
</span></span></code></pre></div><p><em>… set committer date + author date</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GIT_COMMITTER_DATE</span><span class="o">=</span><span class="s2">&#34;Sun Dec 31 23:45:00 2017&#34;</span> git commit --amend --no-edit --date<span class="o">=</span><span class="s2">&#34;Sun Dec 31 23:45:00 2017&#34;</span>
</span></span></code></pre></div><p><em>… set committer date = author date</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GIT_COMMITTER_DATE</span><span class="o">=</span><span class="s2">&#34;Mon May 7 23:54:</span><span class="k">$(</span><span class="nb">echo</span> <span class="k">$((</span>RANDOM <span class="o">%</span> <span class="m">50</span> <span class="o">+</span> <span class="m">10</span><span class="k">))</span> <span class="p">|</span> cut -c-2<span class="k">)</span><span class="s2"> 2018&#34;</span> bash -c <span class="s1">&#39;git commit --amend --no-edit --date=&#34;$GIT_COMMITTER_DATE&#34;&#39;</span>
</span></span></code></pre></div><p><em>… random seconds</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="k">$((</span>RANDOM <span class="o">%</span> <span class="m">50</span> <span class="o">+</span> <span class="m">10</span><span class="k">))</span> <span class="p">|</span> cut -c-2
</span></span></code></pre></div><p><em>… see also custom function shell <a href="https://github.com/hugocf/dotfiles/blob/a64f9b1/bash/bash_aliases#L55-L64"><code>git-commit-dates()</code></a></em></p>
<h2 id="rebase-commits-to-reset-commit-date-to-the-original-author-date">Rebase commits to reset commit date to the original author date</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/2973996/git-rebase-without-changing-commit-timestamps/2976598#2976598">git rebase without changing commit timestamps - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git rebase --committer-date-is-author-date @~3
</span></span></code></pre></div><h2 id="auto-stash-dirty-directory-on-pullrebase">Auto stash dirty directory on pull/rebase</h2>
<ul>
<li>via <a href="https://equalexperts.slack.com/archives/today-i-learned/p1466446425000002">Anil Wadghule</a></li>
</ul>
<p><em>… autostash is only available since git version 2.9</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git pull --rebase --autostash
</span></span></code></pre></div><p><em>… for earlier versions use:</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global rebase.autoStash <span class="nb">true</span>
</span></span></code></pre></div><h2 id="check-lightweight-vs-annotated-tags">Check lightweight vs. annotated tags</h2>
<ul>
<li><a href="http://git-scm.com/book/en/v2/Git-Basics-Tagging#Annotated-Tags">Git - Tagging#Annotated Tags</a></li>
</ul>
<p><em>… <strong>annotated</strong>: “You can see the tag data along with the commit that was tagged by using the</em> <em>git show</em> <em>command”</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git show annotated-tag
</span></span><span class="line"><span class="cl">tag annotated-tag
</span></span><span class="line"><span class="cl">Tagger: Hugo Ferreira &lt;hugo@ferreira.cc&gt;
</span></span><span class="line"><span class="cl">Date:   Thu Dec <span class="m">24</span> 10:54:15 <span class="m">2015</span> +0000
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">message text with details
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">commit 6ec10ad250c8bbbdc42dba51a09c02b456e02187 <span class="o">(</span>tag: annotated-tag<span class="o">)</span>
</span></span><span class="line"><span class="cl">Author: Hugo Ferreira &lt;hugo.ferreira@digital.hmrc.gov.uk&gt;
</span></span><span class="line"><span class="cl">Date:   Thu Dec <span class="m">24</span> 10:23:50 <span class="m">2015</span> +0000
</span></span></code></pre></div><p><em>… <strong>lightweight</strong>: “This time, if you run</em> <em>git show</em> <em>on the tag, you don’t see the extra tag information. The command just shows the commit”</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git show light-tag
</span></span><span class="line"><span class="cl">commit f5d32c57c9612c610dc0c45cc0ff3f0b1d21fd53 <span class="o">(</span>HEAD -&gt; master, tag: light-tag<span class="o">)</span>
</span></span><span class="line"><span class="cl">Author: Hugo Ferreira &lt;hugo@ferreira.cc&gt;
</span></span><span class="line"><span class="cl">Date:   Thu Dec <span class="m">24</span> 10:25:44 <span class="m">2015</span> +000
</span></span></code></pre></div><h2 id="set-user--email-info">Set user &amp; email info</h2>
<p><em>… current repo only <code>.git/config</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config user.name <span class="s2">&#34;Hugo Ferreira&#34;</span>
</span></span><span class="line"><span class="cl">git config user.email hugo.ferreira@example.com
</span></span></code></pre></div><p><em>… default for all repos <code>~/.gitconfig</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global user.name <span class="s2">&#34;Hugo Ferreira&#34;</span>
</span></span><span class="line"><span class="cl">git config --global user.email hugo.ferreira@example.com
</span></span></code></pre></div><h2 id="prepare-a-patch-formatted-for-email">Prepare a patch formatted for email</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git format-patch HEAD~1
</span></span><span class="line"><span class="cl">git format-patch &lt;sha&gt;..@
</span></span></code></pre></div><h2 id="apply-a-patch-received-as-file">Apply a patch received as file</h2>
<p><em>… dry-run</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git apply --check --stat 0001-file.patch
</span></span></code></pre></div><p><em>… apply and create commits</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git am 0001-file.patch
</span></span></code></pre></div><p><em>… apply patch to files</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># files only</span>
</span></span><span class="line"><span class="cl">git apply 0001-file.patch
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># files + index</span>
</span></span><span class="line"><span class="cl">git apply --index 0001-file.patch
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># index only</span>
</span></span><span class="line"><span class="cl">git apply --cached 0001-file.patch
</span></span></code></pre></div><h2 id="show-files-being-ignored">Show files being ignored</h2>
<ul>
<li><a href="http://stackoverflow.com/a/467053/1380781">Show ignored files in git - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clean --dry-run -dX
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clean -ndX
</span></span></code></pre></div><h2 id="choose-a-new-root-commit-for-the-repo">Choose a new root commit for the repo</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git/14629246#14629246">git rebase - Change first commit of project with Git? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git rebase -i --root
</span></span></code></pre></div><h2 id="visualise-the-entire-commit-graph">Visualise the entire commit graph</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git log --graph --oneline --all --color --decorate
</span></span></code></pre></div><h2 id="rollback-the-last-commit-for-good">Rollback the last commit for good</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git reset HEAD~1 --hard
</span></span></code></pre></div><h2 id="undo-a-rebase">Undo a rebase</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/41049711/git-how-to-rollback-a-rebase/41049867#41049867">Git how to rollback a rebase - Stack Overflow</a></li>
</ul>
<p><em>… show the history of operations (like an “undo” stack)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git reflog
</span></span><span class="line"><span class="cl">b710729 HEAD@<span class="o">{</span>0<span class="o">}</span>: rebase: some commit
</span></span><span class="line"><span class="cl">5ad7c1c HEAD@<span class="o">{</span>1<span class="o">}</span>: rebase: another commit
</span></span><span class="line"><span class="cl">deafcbf HEAD@<span class="o">{</span>2<span class="o">}</span>: checkout: moving from master to my-branch
</span></span></code></pre></div><p><em>… reset to the commit before the rebase</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git reset --hard deafcbf
</span></span></code></pre></div><h2 id="recover-lost-commits">Recover lost commits</h2>
<ul>
<li><a href="http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html">git ready » restoring lost commits</a></li>
</ul>
<p><em>… discover</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git fsck --lost-found
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git reflog
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git show &lt;sha1&gt;
</span></span></code></pre></div><p><em>… restore</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git cherry-pick &lt;sha1&gt;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git merge &lt;sha1&gt;
</span></span></code></pre></div><h2 id="show-outgoing-changes">Show outgoing changes</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git fetch <span class="o">&amp;&amp;</span> git whatchanged origin..
</span></span></code></pre></div><h2 id="show-incoming-changes">Show incoming changes</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git fetch <span class="o">&amp;&amp;</span> git whatchanged ..origin
</span></span></code></pre></div><h2 id="git-flow-rules-of-engagement-for-releases-merge-commit-messages"><code>git-flow</code> rules of engagement for releases (merge commit) messages</h2>
<p><em>… setup</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global merge.log <span class="nb">true</span>
</span></span></code></pre></div><p><em>… default message</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Merge branch <span class="s1">&#39;release/1.0.0&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">* develop:
</span></span><span class="line"><span class="cl">  One commit message
</span></span><span class="line"><span class="cl">  Another commit message
</span></span></code></pre></div><p><em>… edit: commit message (merge)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Merge branch <span class="s1">&#39;release/1.0.0&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- One commit message
</span></span><span class="line"><span class="cl">- Another commit message
</span></span></code></pre></div><p><em>… edit: tag message (releases)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">release/1.0.0
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">- One commit message
</span></span><span class="line"><span class="cl">- Another commit message
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ HTML</title>
      <link>https://hugo.ferreira.cc/html/</link>
      <pubDate>Tue, 22 Sep 2020 01:04:12 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/html/</guid>
      <description>Small information nuggets and recipies about HTML</description>
      <content:encoded><![CDATA[<p><em>(alphabetical order)</em></p>
<h2 id="templates">Templates</h2>
<h3 id="page-structure">Page structure</h3>
<ul>
<li><a href="https://www.w3schools.com/html/html5_semantic_elements.asp">HTML Semantic Elements</a></li>
<li><a href="http://dsheiko.github.io/h5i/#holy-grail-layout">Holy Grail Layout</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>header<span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">nav</span><span class="p">&gt;</span>nav<span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">section</span><span class="p">&gt;</span>section<span class="p">&lt;/</span><span class="nt">section</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>article<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">aside</span><span class="p">&gt;</span>aside<span class="p">&lt;/</span><span class="nt">aside</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span>footer<span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span></code></pre></div><p><img loading="lazy" src="semantic-elements.gif" alt="layout illustrating the relative page placement of the semantic tags: header, nav, section, article, aside, and footer"  />
</p>
<h3 id="other-idioms">Other idioms</h3>
<ul>
<li>
<p><a href="http://dsheiko.github.io/h5i/">HTML5 Idioms</a></p>
<blockquote>
<p><strong>Idioms of semantic HTML</strong><br>
Collection of templates and snippets of semantic HTML that can be used as boilerplate while working on markup</p>
<p> </p>
<p><a href="http://dsheiko.github.io/h5i/#article-details">Article details</a><br>
<a href="http://dsheiko.github.io/h5i/#article-list">Article list</a><br>
<a href="http://dsheiko.github.io/h5i/#bread-crumbs">Bread crumb navigation</a><br>
<a href="http://dsheiko.github.io/h5i/#company-info">Company info</a><br>
<a href="http://dsheiko.github.io/h5i/#conversations">Conversations</a><br>
<a href="http://dsheiko.github.io/h5i/#download-link">Download link</a><br>
<a href="http://dsheiko.github.io/h5i/#figure">Figure + WAI-ARIA</a><br>
<a href="http://dsheiko.github.io/h5i/#footnotes-annotations">Footnotes: annotations</a><br>
<a href="http://dsheiko.github.io/h5i/#footnotes-side-notes">Footnotes: side notes</a><br>
<a href="http://dsheiko.github.io/h5i/#form">Form</a><br>
<a href="http://dsheiko.github.io/h5i/#glossary">Glossary of terms</a><br>
<a href="http://dsheiko.github.io/h5i/#holy-grail-layout"><strong>Holy Grail Layout</strong></a><br>
<a href="http://dsheiko.github.io/h5i/#meta-data">Metadata</a><br>
<a href="http://dsheiko.github.io/h5i/#quotation">Quotation</a><br>
<a href="http://dsheiko.github.io/h5i/#subheadings">Subheadings, subtitles, alternative titles and taglines</a><br>
<a href="http://dsheiko.github.io/h5i/#tag-cloud">Tag clouds</a><br>
<a href="http://dsheiko.github.io/h5i/#video">Video</a></p>
</blockquote>
</li>
</ul>
<h2 id="elements">Elements</h2>
<h3 id="abbreviation">abbreviation</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">abbr</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;title&#34;</span><span class="p">&gt;</span>abbreviation<span class="p">&lt;/</span><span class="nt">abbr</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <abbr title="title">abbreviation</abbr></p>
<h3 id="anchor--link">anchor / link</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;&#34;</span><span class="p">&gt;</span>hyperlink<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <a href="">hyperlink</a></p>
<h3 id="blockquote">blockquote</h3>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q#specifications"><code>&lt;q&gt;</code>: The Inline Quotation element - HTML: HyperText Markup Language</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote#specifications"><code>&lt;blockquote&gt;</code>: The Block Quotation element - HTML: HyperText Markup Language</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite#specifications"><code>&lt;cite&gt;</code>: The Citation element - HTML: HyperText Markup Language</a><br>
<em>(useful for for screen readers)</em></li>
</ul>
<h4 id="-inline">… inline</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">Inline <span class="p">&lt;</span><span class="nt">q</span><span class="p">&gt;</span>simple quote<span class="p">&lt;/</span><span class="nt">q</span><span class="p">&gt;</span>.
</span></span><span class="line"><span class="cl">Inline <span class="p">&lt;</span><span class="nt">q</span> <span class="na">cite</span><span class="o">=</span><span class="s">&#34;http://example.com&#34;</span><span class="p">&gt;</span>quote with citation<span class="p">&lt;/</span><span class="nt">q</span><span class="p">&gt;</span>.
</span></span></code></pre></div><p>➔ Inline <q>simple quote</q>.<br>
➔ Inline <q cite="http://example.com">quote with citation</q>.</p>
<h4 id="-simple">… simple</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Simple quote.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span></code></pre></div><blockquote>
  <p>Simple quote.</p>
</blockquote>
<h4 id="-with-citation">… with citation</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Quote with citation.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span>— <span class="p">&lt;</span><span class="nt">cite</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;author&#34;</span><span class="p">&gt;</span>Author<span class="p">&lt;/</span><span class="nt">cite</span><span class="p">&gt;</span> (in <span class="p">&lt;</span><span class="nt">cite</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;title&#34;</span><span class="p">&gt;</span>Source<span class="p">&lt;/</span><span class="nt">cite</span><span class="p">&gt;</span>)<span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">blockquote</span><span class="p">&gt;</span>
</span></span></code></pre></div><blockquote>
  <p>Quote with citation.</p>
  <footer>— <cite class="author">Author</cite> (in <cite class="title">Source</cite>)</footer>
</blockquote>
<h3 id="citation">citation</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">cite</span><span class="p">&gt;</span>person or title<span class="p">&lt;/</span><span class="nt">cite</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <cite>person or title</cite></p>
<h3 id="code">code</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">code</span><span class="p">&gt;</span>computer code<span class="p">&lt;/</span><span class="nt">code</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <code>computer code</code></p>
<h3 id="definition">definition</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">dfn</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;explanation&#34;</span><span class="p">&gt;</span>term<span class="p">&lt;/</span><span class="nt">dfn</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <dfn title="explanation">term</dfn></p>
<h3 id="delete">delete</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">del</span><span class="p">&gt;</span>deleted text<span class="p">&lt;/</span><span class="nt">del</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <del>deleted text</del></p>
<h3 id="details">details</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">details</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">summary</span><span class="p">&gt;</span>Collapsed title<span class="p">&lt;/</span><span class="nt">summary</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Content<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">details</span><span class="p">&gt;</span>
</span></span></code></pre></div><details>
  <summary>Collapsed title</summary>
  <p>Content</p>
</details>
<h3 id="emphasis">emphasis</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">em</span><span class="p">&gt;</span>emphatic text<span class="p">&lt;/</span><span class="nt">em</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <em>emphatic text</em></p>
<h3 id="figure">figure</h3>
<blockquote>
<p>The <code>img</code> tag is used to embed the image in an HTML document whereas the <code>figure</code> tag is used to semantically organize the content of an image in the HTML document.</p>
<p>— <a href="https://www.learningjournal.guru/article/html5/html5-when-to-use-figure-tag/">HTML5 - When to use figure tag - Learning Journal</a></p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">figure</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;http://placehold.it/100x100.png&#34;</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Image alternate text&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">figcaption</span><span class="p">&gt;</span>Image caption<span class="p">&lt;/</span><span class="nt">figcaption</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">figure</span><span class="p">&gt;</span>
</span></span></code></pre></div><figure>
  <img src="http://placehold.it/100x100.png" alt="Image alternate text">
  <figcaption>Image caption</figcaption>
</figure>
<h3 id="footnote">footnote</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">text<span class="p">&lt;</span><span class="nt">sup</span><span class="p">&gt;</span>1<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">small</span><span class="p">&gt;&lt;</span><span class="nt">sup</span><span class="p">&gt;</span>1<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;</span> footnote<span class="p">&lt;/</span><span class="nt">small</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ text<sup>1</sup><br>
➔ <small><sup>1</sup> footnote</small></p>
<h3 id="heading--titles">heading / titles</h3>
<blockquote>
<p><code>h1</code>–<code>h6</code> elements <strong>must not</strong> be used to markup subheadings, subtitles, alternative titles and taglines unless intended to be the heading for a new section or subsection.</p>
<p>— <a href="http://html5doctor.com/howto-subheadings/">How to mark up subheadings, subtitles, alternative titles and taglines | HTML5 Doctor</a></p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h2</span><span class="p">&gt;</span>Title<span class="p">&lt;/</span><span class="nt">h2</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Tagline or subtitle<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Content<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span></code></pre></div><header>
  <strong style="font-size: 2em">Title</strong>
  <p>Tagline or subtitle</p>
</header>
<p>Content</p>
<h3 id="image">image</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;http://placehold.it/100x100.png&#34;</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Example alternate text&#34;</span><span class="p">&gt;</span>
</span></span></code></pre></div><img src="http://placehold.it/100x100.png" alt="Example alternate text">
<h3 id="insert">insert</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ins</span><span class="p">&gt;</span>inserted text<span class="p">&lt;/</span><span class="nt">ins</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <ins>inserted text</ins></p>
<h3 id="keyboard">keyboard</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">kbd</span><span class="p">&gt;</span>user keyboard input<span class="p">&lt;/</span><span class="nt">kbd</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <kbd>user keyboard input</kbd></p>
<h3 id="list">list</h3>
<h4 id="-ordered">… ordered</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ol</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ol</span><span class="p">&gt;</span>
</span></span></code></pre></div><ol>
  <li>item</li>
  <li>item</li>
  <li>item</li>
</ol>
<h4 id="-unordered">… unordered</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>item<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span></code></pre></div><ul>
  <li>item</li>
  <li>item</li>
  <li>item</li>
</ul>
<h3 id="main">main</h3>
<blockquote>
<p>There must not be more than one <code>&lt;main&gt;</code> element in a document.</p>
<p>— <a href="https://www.w3schools.com/tags/tag_main.asp">HTML main Tag</a></p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>content unique to the document<span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span></code></pre></div><main>content unique to the document</main>
<h3 id="mark--highlight">mark / highlight</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">mark</span><span class="p">&gt;</span>marked/highlighted text<span class="p">&lt;/</span><span class="nt">mark</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <mark>marked/highlighted text</mark></p>
<h3 id="sample-output">sample output</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">samp</span><span class="p">&gt;</span>sample output<span class="p">&lt;/</span><span class="nt">samp</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <samp>sample output</samp></p>
<h3 id="small-print">small print</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">small</span><span class="p">&gt;</span>copyright or side-comments<span class="p">&lt;/</span><span class="nt">small</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <small>copyright or side-comments</small></p>
<h3 id="strong">strong</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">strong</span><span class="p">&gt;</span>strong importance<span class="p">&lt;/</span><span class="nt">strong</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <strong>strong importance</strong></p>
<h3 id="subscript">subscript</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">sub</span><span class="p">&gt;</span>subscript<span class="p">&lt;/</span><span class="nt">sub</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <sub>subscript</sub></p>
<h3 id="superscript">superscript</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">sup</span><span class="p">&gt;</span>superscript<span class="p">&lt;/</span><span class="nt">sup</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <sup>superscript</sup></p>
<h3 id="table">table</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">table</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">tr</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>header cell<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>header cell<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">tr</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">tr</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">td</span><span class="p">&gt;</span>value cell<span class="p">&lt;/</span><span class="nt">td</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">td</span><span class="p">&gt;</span>value cell<span class="p">&lt;/</span><span class="nt">td</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">tr</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">table</span><span class="p">&gt;</span>
</span></span></code></pre></div><table>
  <tr>
    <th>header cell</th>
    <th>header cell</th>
  </tr>
  <tr>
    <td>value cell</td>
    <td>value cell</td>
  </tr>
</table>
<h3 id="time">time</h3>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time#Valid_datetime_Values"><code>&lt;time&gt;</code> - Valid <code>datetime</code>Values</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">Dinner at <span class="p">&lt;</span><span class="nt">time</span><span class="p">&gt;</span>20:00<span class="p">&lt;/</span><span class="nt">time</span><span class="p">&gt;</span> on <span class="p">&lt;</span><span class="nt">time</span> <span class="na">datetime</span><span class="o">=</span><span class="s">&#34;2020-12-31&#34;</span><span class="p">&gt;</span>New Year’s eve<span class="p">&lt;/</span><span class="nt">time</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ Dinner at <time>20:00</time> on <time datetime="2020-12-31">New Year’s eve</time></p>
<h3 id="variable">variable</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">var</span><span class="p">&gt;</span>code or math variable<span class="p">&lt;/</span><span class="nt">var</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>➔ <var>code or math variable</var></p>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ Spring Boot</title>
      <link>https://hugo.ferreira.cc/spring-boot/</link>
      <pubDate>Thu, 18 Jun 2020 01:04:38 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/spring-boot/</guid>
      <description>Small information nuggets and recipies about Spring Boot</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="actuator-application-management-endpoints">Actuator: Application Management Endpoints</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=XbknBOmMuPQ&amp;list=PLGDwUiT1wr6-Fn3N2oqJpTdhGjFHnIIKY">14. Production Monitoring and Management with Spring Boot Actuator - YouTube</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">curl http://localhost:8080/autoconfig
</span></span><span class="line"><span class="cl">curl http://localhost:8080/beans
</span></span><span class="line"><span class="cl">curl http://localhost:8080/configprops
</span></span><span class="line"><span class="cl">curl http://localhost:8080/dump
</span></span><span class="line"><span class="cl">curl http://localhost:8080/env
</span></span><span class="line"><span class="cl">curl http://localhost:8080/health
</span></span><span class="line"><span class="cl">curl http://localhost:8080/info
</span></span><span class="line"><span class="cl">curl http://localhost:8080/mappings
</span></span><span class="line"><span class="cl">curl http://localhost:8080/metrics
</span></span><span class="line"><span class="cl">curl http://localhost:8080/shutdown          <span class="c1"># disabled by default</span>
</span></span><span class="line"><span class="cl">curl http://localhost:8080/trace
</span></span></code></pre></div><p><em>… activate/deactivate configuration at <code>application.properties</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-properties" data-lang="properties"><span class="line"><span class="cl"><span class="na">endpoints.health.id</span><span class="o">=</span><span class="s">status          # rename endpoint</span>
</span></span><span class="line"><span class="cl"><span class="na">endpoints.health.sensitive</span><span class="o">=</span><span class="s">true     # security requirement</span>
</span></span><span class="line"><span class="cl"><span class="na">endpoints.shutdown.enabled</span><span class="o">=</span><span class="s">true     # shutdown endpoint [default false]</span>
</span></span><span class="line"><span class="cl"><span class="na">endpoints.shutdown.sensitive</span><span class="o">=</span><span class="s">false  # shutdown endpoint [default true]</span>
</span></span><span class="line"><span class="cl"><span class="na">management.context-path</span><span class="o">=</span><span class="s">admin       # all accessible only via `/admin/`</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ AWS</title>
      <link>https://hugo.ferreira.cc/aws/</link>
      <pubDate>Sat, 09 Nov 2019 01:01:26 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/aws/</guid>
      <description>Small information nuggets and recipies about AWS</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="create-kms-security-info-with-cloudformation">Create KMS security info with CloudFormation</h2>
<ul>
<li><a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html">AWS::KMS::Alias - AWS CloudFormation</a></li>
<li><a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html">AWS::KMS::Key - AWS CloudFormation</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">Resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">EncryptionKeyAlias</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::KMS::Alias</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">AliasName</span><span class="p">:</span><span class="w"> </span><span class="l">alias/my-aws-kms-encryption-key</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">TargetKeyId</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Ref</span><span class="p">:</span><span class="w"> </span><span class="l">EncryptionKey</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">EncryptionKey</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Type</span><span class="p">:</span><span class="w"> </span><span class="l">AWS::KMS::Key</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">Properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">Description</span><span class="p">:</span><span class="w"> </span><span class="l">My AWS KMS Encryption Key</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">KeyPolicy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2012-10-17&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Id</span><span class="p">:</span><span class="w"> </span><span class="l">my-aws-kms-encryption-key</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">Statement</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">Sid</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Enable IAM User Permissions&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Effect</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Principal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="nt">AWS</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;arn:aws:iam::123456789012:root&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Action</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;kms:*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Resource</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">Sid</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow access for Key Administrators&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Effect</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Principal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">AWS</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span>- <span class="s2">&#34;arn:aws:iam::123456789012:user/alice&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span>- <span class="s2">&#34;arn:aws:iam::123456789012:user/bob&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Create*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Describe*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Enable*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:List*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Put*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Update*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Revoke*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Disable*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Get*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Delete*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:TagResource&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:UntagResource&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:ScheduleKeyDeletion&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:CancelKeyDeletion&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Resource</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">Sid</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow use of the key&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Effect</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Principal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="nt">AWS</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                  </span><span class="nt">&#34;Fn::GetAtt&#34;: </span><span class="p">[</span><span class="w"> </span><span class="l">IamRoleLambdaExecution, Arn ]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Encrypt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:Decrypt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:ReEncrypt*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:GenerateDataKey*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:DescribeKey&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Resource</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">Sid</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow attachment of persistent resources&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Effect</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Allow&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Principal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">AWS</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">&#34;Fn::GetAtt&#34;: </span><span class="p">[</span><span class="w"> </span><span class="l">IamRoleLambdaExecution, Arn ]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:CreateGrant&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:ListGrants&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- <span class="s2">&#34;kms:RevokeGrant&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Resource</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">Condition</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">Bool</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">&#34;kms:GrantIsForAWSResource&#34;: </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div><h2 id="helpers-to-encryptdecrypt-via-aws-kms">Helpers to <code>encrypt</code>/<code>decrypt</code> via AWS KMS</h2>
<p><em>… decrypt contents of a file</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">decrypt <span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">local</span> <span class="nv">file_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  aws kms decrypt --ciphertext-blob fileb://<span class="nv">$file_name</span> --query Plaintext --output text <span class="p">|</span> base64 --decode
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p><em>… encrypt contents of text data</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">encrypt <span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">local</span> <span class="nv">key_name</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">local</span> <span class="nv">data</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$2</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  aws kms encrypt --key-id alias/<span class="nv">$key_name</span> --plaintext <span class="s2">&#34;</span><span class="nv">$data</span><span class="s2">&#34;</span> --query CiphertextBlob --output text <span class="p">|</span> base64 --encode
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="allow-url-parameters-on-aws-ssm">Allow url parameters on <code>aws ssm</code></h2>
<ul>
<li><a href="https://github.com/aws/aws-cli/issues/2507">aws ssm put-parameter performs an HTTP GET request when the value param is an url · Issue #2507 · aws/aws-cli</a> <em>(via <a href="https://equalexperts.slack.com/archives/C0KU4SA5N/p1550249921001800">Adam Hansrod</a>)</em></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat ~/.aws/config
</span></span><span class="line"><span class="cl"><span class="o">[</span>default<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">cli_follow_urlparam</span> <span class="o">=</span> <span class="nb">false</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Slack</title>
      <link>https://hugo.ferreira.cc/slack/</link>
      <pubDate>Tue, 21 May 2019 11:44:27 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/slack/</guid>
      <description>Small information nuggets and recipies about Slack</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="channel-urls">Channel URLs</h2>
<p>Template URL for browsers to navigate to a certain channel name:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">https://example.slack.com/archives/example-channel-name
</span></span></code></pre></div><style type="text/css">
    .notice {
        --root-color: #444;
        --root-background: #eff;
        --title-color: #fff;
        --title-background: #7bd;
        --warning-title: #c33;
        --warning-content: #fee;
        --info-title: #fb7;
        --info-content: #fec;
        --note-title: #6be;
        --note-content: #e7f2fa;
        --tip-title: #5a5;
        --tip-content: #efe;
    }

    @media (prefers-color-scheme:dark) {
        .notice {
            --root-color: #ddd;
            --root-background: #eff;
            --title-color: #fff;
            --title-background: #7bd;
            --warning-title: #800;
            --warning-content: #400;
            --info-title: #a50;
            --info-content: #420;
            --note-title: #069;
            --note-content: #023;
            --tip-title: #363;
            --tip-content: #121;
        }
    }

    body.dark .notice, [data-theme="dark"] .notice {
        --root-color: #ddd;
        --root-background: #eff;
        --title-color: #fff;
        --title-background: #7bd;
        --warning-title: #800;
        --warning-content: #400;
        --info-title: #a50;
        --info-content: #420;
        --note-title: #069;
        --note-content: #023;
        --tip-title: #363;
        --tip-content: #121;
    }

    .notice {
        padding: 18px;
        line-height: 24px;
        margin-bottom: 24px;
        border-radius: 4px;
        color: var(--root-color);
        background: var(--root-background);
    }

    .notice p:last-child {
        margin-bottom: 0;
    }

    .notice-title {
        margin: -18px -18px 12px;
        padding: 4px 18px;
        border-radius: 4px 4px 0 0;
        font-weight: 700;
        color: var(--title-color);
        background: var(--title-background);
    }

    .notice.warning .notice-title {
        background: var(--warning-title);
    }

    .notice.warning {
        background: var(--warning-content);
    }

    .notice.info .notice-title {
        background: var(--info-title);
    }

    .notice.info {
        background: var(--info-content);
    }

    .notice.note .notice-title {
        background: var(--note-title);
    }

    .notice.note {
        background: var(--note-content);
    }

    .notice.tip .notice-title {
        background: var(--tip-title);
    }

    .notice.tip {
        background: var(--tip-content);
    }

    .icon-notice {
        display: inline-flex;
        align-self: center;
        margin-right: 8px;
    }

    .icon-notice img, .icon-notice svg {
        height: 1em;
        width: 1em;
        fill: currentColor;
    }

    .icon-notice img, .icon-notice.baseline svg {
        top: .125em;
        position: relative;
    }
</style><div class="notice info" >
    <p class="notice-title">
        <span class="icon-notice baseline">
            <svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M444-288h72v-240h-72v240Zm35.789-312Q495-600 505.5-610.289q10.5-10.29 10.5-25.5Q516-651 505.711-661.5q-10.29-10.5-25.5-10.5Q465-672 454.5-661.711q-10.5 10.29-10.5 25.5Q444-621 454.289-610.5q10.29 10.5 25.5 10.5Zm.487 504Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30Z"/></svg>
        </span>Info</p><p>The above template might seem fragile in case the channel is renamed but Slack follows through and redirects to the new channel name.</p></div>

<p>Another way is create a link URL is to “Copy link” from a channel name in the Slack app sidebar, which will get you an URL similar to the following (independent from the channel name):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">https://example.slack.com/archives/C0123456789
</span></span></code></pre></div><h2 id="reminders-with-custom-frequency">Reminders with custom frequency</h2>
<p>Template for setting reminders that repeat with a custom frequency (example of a “fortnight meeting”):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/remind #channel &#34;Fortnight meeting starts in 10 min&#34; Jan 2 at 14:50 every 2 weeks
</span></span></code></pre></div><h2 id="giphy-captions">Giphy captions</h2>
<ul>
<li><a href="https://medium.com/@giphy/the-secret-giphy-slack-commands-9cb4693ca6bf">The Secret GIPHY Slack Commands – GIPHY – Medium</a> <em>(via <a href="https://equalexperts.slack.com/archives/C02QA1EC2/p1552584831088900">Alun Coppack</a>)</em></li>
</ul>
<p><em>… using caption as search terms</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/giphy #caption example text
</span></span></code></pre></div><p><em>… separate caption from search terms</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/giphy #caption &#34;example text&#34; search terms
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Scala</title>
      <link>https://hugo.ferreira.cc/scala/</link>
      <pubDate>Thu, 28 Feb 2019 01:04:49 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/scala/</guid>
      <description>Small information nuggets and recipies about Scala</description>
      <content:encoded><![CDATA[<ul>
<li><a href="http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf">The Scala Language Specification</a></li>
<li><a href="http://docs.scala-lang.org/style/">Scala Style Guide - Scala Documentation</a></li>
<li><a href="http://docs.scala-lang.org/cheatsheets/">Scalacheat - Scala Documentation</a></li>
</ul>
<hr>
<p><em>(most recent on top)</em></p>
<h2 id="run-a-single-scalatest-spec">Run a single ScalaTest spec</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> &#39;testOnly <span class="o">*</span><span class="nc">TestNameSpec</span> <span class="o">--</span> <span class="o">-</span><span class="n">z</span> <span class="s">&#34;The full name of the test to run&#34;</span><span class="err">&#39;</span>
</span></span></code></pre></div><h2 id="manually-request-from-plays-guice-an-injected-class-instance">Manually request from Play’s Guice an injected class instance</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">import</span> <span class="nn">play.api.inject.NewInstanceInjector</span>
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="n">obj</span> <span class="k">=</span> <span class="nc">NewInstanceInjector</span><span class="o">.</span><span class="n">instanceOf</span><span class="o">[</span><span class="kt">AllowedHostsFilter</span><span class="o">]</span>
</span></span></code></pre></div><h2 id="handle-spaces-correctly-in-test-files-paths">Handle spaces correctly in test files paths</h2>
<ul>
<li><a href="http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4466485">Bug ID: JDK-4466485 getClass().getResource().getFile() returns file name with %20</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="o">-</span> <span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="n">getClass</span><span class="o">.</span><span class="n">getResource</span><span class="o">(</span><span class="s">&#34;/testTheme.zip&#34;</span><span class="o">).</span><span class="n">getFile</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span> <span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="n">getClass</span><span class="o">.</span><span class="n">getResource</span><span class="o">(</span><span class="s">&#34;/testTheme.zip&#34;</span><span class="o">).</span><span class="n">toURI</span><span class="o">.</span><span class="n">getPath</span><span class="o">)</span>
</span></span></code></pre></div><h2 id="match-anyval-class-instances-with-mockito">Match <code>AnyVal</code> class instances with Mockito</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/27289757/mockito-matchers-scala-value-class-and-nullpointerexception">Mockito matchers, scala value class and NullPointerException - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Wrapper</span><span class="o">(</span><span class="n">value</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">AnyVal</span>
</span></span></code></pre></div><p><em>… set/check expectations</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">when</span><span class="o">(</span><span class="n">mock</span><span class="o">.</span><span class="n">method</span><span class="o">(</span><span class="nc">KubeName</span><span class="o">(</span><span class="n">anyString</span><span class="o">))</span> <span class="n">thenReturn</span> <span class="s">&#34;example&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">verify</span><span class="o">(</span><span class="n">mock</span><span class="o">).</span><span class="n">method</span><span class="o">(</span><span class="nc">KubeName</span><span class="o">(</span><span class="n">anyString</span><span class="o">))</span>
</span></span></code></pre></div><p><em>… capture arguments</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">val</span> <span class="n">wrapper</span><span class="k">:</span> <span class="kt">ArgumentCaptor</span><span class="o">[</span><span class="kt">String</span><span class="o">]</span> <span class="k">=</span> <span class="n">forClass</span><span class="o">(</span><span class="n">classOf</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span>
</span></span><span class="line"><span class="cl"><span class="n">verify</span><span class="o">(</span><span class="n">mock</span><span class="o">).</span><span class="n">method</span><span class="o">(</span><span class="n">wrapper</span><span class="o">.</span><span class="n">capture</span><span class="o">().</span><span class="n">asInstanceOf</span><span class="o">[</span><span class="kt">Wrapper</span><span class="o">])</span>
</span></span><span class="line"><span class="cl"><span class="n">wrapper</span><span class="o">.</span><span class="n">getValue</span> <span class="n">shouldBe</span> <span class="s">&#34;example&#34;</span>
</span></span></code></pre></div><h2 id="encode-domain-knowledge-with-value-classes">Encode domain knowledge with value classes</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Id</span><span class="o">(</span><span class="n">id</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">AnyVal</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Email</span><span class="o">(</span><span class="n">email</span><span class="k">:</span> <span class="kt">String</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">AnyVal</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Timestamp</span><span class="o">(</span><span class="n">ts</span><span class="k">:</span> <span class="kt">Long</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">AnyVal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="n">f</span><span class="o">(</span><span class="n">user</span><span class="k">:</span> <span class="kt">Id</span><span class="o">,</span> <span class="n">sender</span><span class="k">:</span> <span class="kt">Email</span><span class="o">,</span> <span class="n">when</span><span class="k">:</span> <span class="kt">Timestamp</span><span class="o">)</span> <span class="k">=</span> <span class="o">???</span>
</span></span></code></pre></div><h2 id="algebraic-data-types-adt">Algebraic Data Types (ADT)</h2>
<ul>
<li><a href="https://scalerablog.wordpress.com/2016/10/03/algrebraic-data-types-in-scala/">Algrebraic Data Types in Scala | Scalera</a></li>
</ul>
<p><em>… sum = <code>A</code> + <code>B</code> (meaning <code>A</code> or <code>B</code>; also called “co-product”)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">sealed</span> <span class="k">trait</span> <span class="nc">Sum</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">object</span> <span class="nc">A</span> <span class="k">extends</span> <span class="nc">Sum</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">object</span> <span class="nc">B</span> <span class="k">extends</span> <span class="nc">Sum</span>
</span></span></code></pre></div><p><em>… product = <code>A</code> * <code>B</code> (meaning <code>A</code> and <code>B</code>)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Product</span><span class="o">(</span><span class="n">foo</span><span class="k">:</span> <span class="kt">A</span><span class="o">,</span> <span class="n">bar</span><span class="k">:</span> <span class="kt">B</span><span class="o">)</span>
</span></span></code></pre></div><p><em>… example: <code>Something</code> + <code>AnotherThing</code> * <code>SomethingElse</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">sealed</span> <span class="k">trait</span> <span class="nc">Example</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">object</span> <span class="nc">Something</span> <span class="k">extends</span> <span class="nc">Example</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="k">class</span> <span class="nc">Other</span><span class="o">(</span><span class="n">a</span><span class="k">:</span> <span class="kt">AnotherThing</span><span class="o">,</span> <span class="n">e</span><span class="k">:</span> <span class="kt">SomethingElse</span><span class="o">)</span> <span class="k">extends</span> <span class="nc">Example</span>
</span></span></code></pre></div><h2 id="pre-and-post-conditions-in-scala">Pre and post conditions in Scala:</h2>
<ul>
<li>
<p><a href="http://www.scala-lang.org/api/current/scala/Predef$.html">Scala Standard Library 2.12.2 - scala.Predef</a></p>
</li>
<li>
<p><a href="https://maxondev.com/scala-preconditions-assert-assume-require-ensuring/">Scala preconditions (assert, assume, require, ensuring) | M@X on DEV</a></p>
<ul>
<li>Useful for dynamically checking invariants, documentation, static code analysis</li>
<li>The real difference is only in the intent expressed</li>
</ul>
</li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">assert</span> <span class="o">~&gt;</span> <span class="nc">AssertionError</span>
</span></span></code></pre></div><ul>
<li>predicate which needs to be proven and a static checker can prove at compile time</li>
<li>if the condition fails, then a logical error was made within the code</li>
<li>elidable via <code>-Xdisable-assertions</code></li>
</ul>
</li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">assume</span> <span class="o">~&gt;</span> <span class="nc">AssertionError</span>
</span></span></code></pre></div><ul>
<li>an axiom that a static checker can rely upon</li>
<li>elidable via <code>-Xdisable-assertions</code></li>
</ul>
</li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">require</span> <span class="o">~&gt;</span> <span class="nc">IllegalArgumentException</span>
</span></span></code></pre></div><ul>
<li>a formal pre-condition</li>
<li>if the condition fails, then the caller of the function is to blame</li>
</ul>
</li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">ensuring</span> <span class="o">~&gt;</span> <span class="nc">AssertionError</span>
</span></span></code></pre></div><ul>
<li>a formal post-condition</li>
<li>a guarantee the function is provide with regards to its return value</li>
</ul>
</li>
</ul>
<h2 id="dangers-of-catching-throwable-in-scala">Dangers of catching <code>Throwable</code> in Scala</h2>
<ul>
<li><em>aka “Pokemon exceptions” (Gotta Catch &lsquo;Em All)</em></li>
<li><a href="http://stackoverflow.com/a/21171104/1380781">Scala: Silently catch all exceptions - Stack Overflow</a></li>
<li><a href="https://maxondev.com/scala-preconditions-assert-assume-require-ensuring/">Catching Throwable in Scala | spiros.blog()</a></li>
</ul>
<p><em>… focus only on non fatal exceptions</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">import</span> <span class="nn">scala.util.control.NonFatal</span>
</span></span><span class="line"><span class="cl"><span class="k">try</span> <span class="o">{</span> <span class="n">f</span><span class="o">(</span><span class="n">x</span><span class="o">)</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="k">catch</span> <span class="o">{</span> <span class="k">case</span> <span class="nc">NonFatal</span><span class="o">(</span><span class="n">t</span><span class="o">)</span> <span class="k">=&gt;</span> <span class="o">}</span>
</span></span></code></pre></div><p><em>… if you really need it, at least propagate Scala’s usage of <code>Throwable</code> for control flow</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">import</span> <span class="nn">scala.util.control.ControlThrowable</span>
</span></span><span class="line"><span class="cl"><span class="k">try</span> <span class="o">{</span> <span class="n">codeThatMayThrowThrowable</span><span class="o">()</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="k">catch</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="n">e</span><span class="k">:</span> <span class="kt">ControlThrowable</span> <span class="o">=&gt;</span> <span class="k">throw</span> <span class="n">e</span>
</span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="n">e</span> <span class="k">=&gt;</span> <span class="n">handleThrowable</span><span class="o">(</span><span class="n">e</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><h2 id="using-execution-contexts-scala-vs-play">Using execution contexts: Scala vs Play</h2>
<ul>
<li><a href="http://stackoverflow.com/a/30806548/1380781">scala - Play&rsquo;s internal execution context - Stack Overflow</a></li>
</ul>
<p><em>… use this, which uses an <code>ActorSystem</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">play</span><span class="o">.</span><span class="n">api</span><span class="o">.</span><span class="n">libs</span><span class="o">.</span><span class="n">concurrent</span><span class="o">.</span><span class="nc">Execution</span><span class="o">.</span><span class="nc">Implicits</span><span class="o">.</span><span class="n">defaultContext</span> 
</span></span></code></pre></div><p><em>… don’t use the default, which is a special <code>ForkJoinPool</code> (uses the <code>blocking</code> method to spawn new threads in the pool for potentially blocking code)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">scala</span><span class="o">.</span><span class="n">concurrent</span><span class="o">.</span><span class="nc">ExecutionContext</span><span class="o">.</span><span class="nc">Implicits</span><span class="o">.</span><span class="n">global</span> 
</span></span></code></pre></div><h2 id="useful-compiler-options">Useful compiler options</h2>
<ul>
<li><a href="https://dzone.com/articles/useful-scala-compiler-options-for-better-scala-dev">Useful Scala Compiler Options for Better Scala Development - DZone Java</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">scalacOptions</span> <span class="o">++=</span> <span class="nc">Seq</span><span class="o">(</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-target:jvm-1.8&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-encoding&#34;</span><span class="o">,</span> <span class="s">&#34;UTF-8&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-unchecked&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-deprecation&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Xfuture&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Yno-adapted-args&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Ywarn-dead-code&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Ywarn-numeric-widen&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Ywarn-value-discard&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;-Ywarn-unused&#34;</span><span class="o">)</span>
</span></span></code></pre></div><h2 id="mockito-verify-says-no-interactions-but-debug-steps-just-fine-through-the-production-code">Mockito verify says “no interactions” but debug steps just fine through the production code</h2>
<ul>
<li>Check if you’re returning a <code>Future</code> and trying to verify before the <code>Future</code> completes</li>
<li>Try to verify only after an <code>Await</code>, or inside <code>whenReady</code> or <code>eventually</code></li>
</ul>
<h2 id="scalatest-pesky-parenthesis">ScalaTest pesky parenthesis</h2>
<ul>
<li><a href="http://www.scalatest.org/user_guide/using_matchers#thosePeskyParens">ScalaTest - Using matchers</a></li>
<li><a href="https://www.artima.com/weblogs/viewpost.jsp?thread=246279#:~:text=should%20be%20(%27defined)-,Those%20pesky%20parens,-You%20may%20have">ScalaTest Matchers Preview</a></li>
</ul>
<h2 id="scalatest-with-scalacheck-disable-shrinking-for-type">ScalaTest with ScalaCheck: Disable shrinking for type</h2>
<ul>
<li><a href="http://blog.knutwalker.de/2014/01/fun-with-scalatests-propertychecks.html">Fun with scalatests PropertyChecks</a></li>
<li><a href="https://github.com/scalatest/scalatest/issues/584#issuecomment-104003728">Add support for not shrinking values in GeneratorDrivenPropertyChecks · Issue #584 · scalatest/scalatest</a></li>
<li><a href="https://gist.github.com/davidallsopp/f65d73fea8b5e5165fc3">Solutions to the ScalaCheck problem that shrinking failing values may generate invalid values</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">implicit</span> <span class="k">def</span> <span class="n">noShrink</span><span class="o">[</span><span class="kt">T</span><span class="o">]</span><span class="k">:</span> <span class="kt">Shrink</span><span class="o">[</span><span class="kt">T</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Shrink</span><span class="o">.</span><span class="n">shrinkAny</span>
</span></span></code></pre></div><h2 id="convention-to-call-methods-or-functions-without-parameters">Convention to call methods or functions without parameters</h2>
<ul>
<li><a href="http://docs.scala-lang.org/style/method-invocation.html">Style Guide - Method Invocation - Scala Documentation</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">reply</span>       <span class="c1">// method has no side-effects (pure function)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">reply</span><span class="o">()</span>     <span class="c1">// ordinary method call which might also have side-effects
</span></span></span></code></pre></div><h2 id="desugar-scalas-syntax">Desugar Scala’s syntax</h2>
<ul>
<li><em>e.g. for comprehension</em></li>
<li><a href="http://tataryn.net/whats-in-a-scala-for-comprehension/">What’s in a Scala For Comprehension? | Craig Tataryn&rsquo;s .plan</a></li>
<li><a href="http://stackoverflow.com/a/9892350">syntactic sugar - Getting the desugared part of a Scala for/comprehension expression? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">scala</span> <span class="o">-</span><span class="n">print</span> <span class="n">file</span><span class="o">.</span><span class="n">scala</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">#</span> <span class="n">list</span> <span class="n">of</span> <span class="n">phases</span> <span class="n">to</span> <span class="n">use</span>
</span></span><span class="line"><span class="cl"><span class="n">scalac</span> <span class="o">-</span><span class="nc">Xshow</span><span class="o">-</span><span class="n">phases</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">#</span> <span class="n">use</span> <span class="n">`typer`</span> <span class="n">phase</span> <span class="n">to</span> <span class="n">remove</span> <span class="n">syntactic</span> <span class="n">sugar</span>
</span></span><span class="line"><span class="cl"><span class="n">scala</span> <span class="o">-</span><span class="nc">Xprint</span><span class="k">:type</span><span class="kt">r</span> <span class="kt">-e</span> <span class="err">&#34;</span><span class="kt">for</span> <span class="o">(</span><span class="kt">i</span> <span class="kt">&lt;-</span> <span class="err">0</span> <span class="kt">to</span> <span class="err">100</span><span class="o">)</span> <span class="kt">yield</span> <span class="kt">i</span><span class="err">&#34;</span>
</span></span></code></pre></div><h3 id="for-comprehension-desugared">for comprehension desugared</h3>
<ul>
<li><a href="http://stackoverflow.com/a/19046133/1380781">Scala&rsquo;s &ldquo;for comprehension&rdquo; with futures # Answer</a></li>
<li><a href="http://docs.scala-lang.org/tutorials/FAQ/yield.html">Faq - How does yield work? - Scala Documentation</a></li>
</ul>
<p><em>… <code>&lt;-</code> desugars to <code>flatMAp</code>, e.g.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">for</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">r1</span> <span class="k">&lt;-</span> <span class="n">result1</span>
</span></span><span class="line"><span class="cl">   <span class="n">r2</span> <span class="k">&lt;-</span> <span class="n">result2</span>
</span></span><span class="line"><span class="cl">   <span class="n">r3</span> <span class="k">&lt;-</span> <span class="n">result3</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span> <span class="k">yield</span> <span class="o">(</span><span class="n">r1</span><span class="o">+</span><span class="n">r2</span><span class="o">+</span><span class="n">r3</span><span class="o">)</span>
</span></span></code></pre></div><p><em>… converts into</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">result1</span><span class="o">.</span><span class="n">flatMap</span><span class="o">(</span><span class="n">r1</span> <span class="k">=&gt;</span> 
</span></span><span class="line"><span class="cl">    <span class="n">result2</span><span class="o">.</span><span class="n">flatMap</span><span class="o">(</span><span class="n">r2</span> <span class="k">=&gt;</span> 
</span></span><span class="line"><span class="cl">        <span class="n">result3</span><span class="o">.</span><span class="n">map</span><span class="o">(</span><span class="n">r3</span> <span class="k">=&gt;</span> <span class="n">r1</span> <span class="o">+</span> <span class="n">r2</span> <span class="o">+</span> <span class="n">r3</span><span class="o">)))</span>
</span></span></code></pre></div><h2 id="parallel-vs-sequential-computation-with-futures">Parallel vs sequential computation with Futures</h2>
<ul>
<li><a href="http://stackoverflow.com/a/19046133/1380781">Scala&rsquo;s &ldquo;for comprehension&rdquo; with futures # Answer</a></li>
</ul>
<p><em>… parallel computation before aggregation</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">val</span> <span class="n">result1</span> <span class="k">=</span> <span class="n">future</span><span class="o">(...)</span>
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="n">result2</span> <span class="k">=</span> <span class="n">future</span><span class="o">(...)</span>
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="n">res</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">r1</span> <span class="k">&lt;-</span> <span class="n">result1</span>
</span></span><span class="line"><span class="cl">   <span class="n">r2</span> <span class="k">&lt;-</span> <span class="n">result2</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span> <span class="k">yield</span> <span class="o">(</span><span class="n">r1</span><span class="o">+</span><span class="n">r2</span><span class="o">)</span>
</span></span></code></pre></div><p><em>… sequential computation and aggregation</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="k">val</span> <span class="n">res</span> <span class="k">=</span> <span class="k">for</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">r1</span> <span class="k">&lt;-</span> <span class="n">future</span><span class="o">(...)</span>
</span></span><span class="line"><span class="cl">   <span class="n">r2</span> <span class="k">&lt;-</span> <span class="n">future</span><span class="o">(...)</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span> <span class="k">yield</span> <span class="o">(</span><span class="n">r1</span><span class="o">+</span><span class="n">r2</span><span class="o">)</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Unix</title>
      <link>https://hugo.ferreira.cc/unix/</link>
      <pubDate>Thu, 28 Feb 2019 01:04:32 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/unix/</guid>
      <description>Small information nuggets and recipies about Unix</description>
      <content:encoded><![CDATA[<ul>
<li><a href="https://devhints.io/bash">bash cheatsheet</a></li>
<li><a href="https://devhints.io/zsh">zsh cheatsheet</a></li>
</ul>
<hr>
<p><em>(most recent on top)</em></p>
<h2 id="quick-curl-recipes">Quick <code>curl</code> recipes</h2>
<ul>
<li><a href="https://catonmat.net/cookbooks/curl">Curl Cookbook</a> <em>(with many other recipes)</em>
<ul>
<li><a href="https://catonmat.net/cookbooks/curl/debug-curl-requests">Debug Curl Requests (TLDR: Use -v or &ndash;trace arguments) – Curl Cookbook</a></li>
<li><a href="https://catonmat.net/cookbooks/curl/make-curl-slow">Make Curl Slow (TLDR: Use &ndash;limit-rate argument) – Curl Cookbook</a></li>
</ul>
</li>
</ul>
<h3 id="post-json-data">Post json data</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># `-d` implies `-X POST`</span>
</span></span><span class="line"><span class="cl">curl -H <span class="s1">&#39;Content-Type: application/json&#39;</span> -d <span class="s1">&#39;{&#34;key&#34;: &#34;value&#34;}&#39;</span> http://example.com
</span></span></code></pre></div><h3 id="curl-useful-options"><code>curl</code> useful options</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Silence the progress bar</span>
</span></span><span class="line"><span class="cl">curl -s http://example.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Show response headers</span>
</span></span><span class="line"><span class="cl">curl -i http://example.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Follow redirects</span>
</span></span><span class="line"><span class="cl">curl -L http://example.com
</span></span></code></pre></div><h2 id="check-and-make-sure-a-script-is-sourced">Check and make sure a script is sourced</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Exit if this script was not sourced as an import</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">0</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    &gt;<span class="p">&amp;</span><span class="m">2</span> <span class="nb">echo</span> <span class="s2">&#34;Error: Must run as an import source&#34;</span>    <span class="c1"># stderr</span>
</span></span><span class="line"><span class="cl">    &gt;<span class="p">&amp;</span><span class="m">2</span> <span class="nb">echo</span> <span class="s2">&#34;Try: source \&#34;</span><span class="si">${</span><span class="nv">BASH_SOURCE</span><span class="p">[0]</span><span class="si">}</span><span class="s2">\&#34;&#34;</span>      <span class="c1"># stderr</span>
</span></span><span class="line"><span class="cl">    <span class="nb">exit</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><h2 id="run-two-commands-in-parallel-and-wait-for-their-result">Run two commands in parallel and wait for their result</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">command1 <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl">command2 <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="nb">wait</span> %1 <span class="o">&amp;&amp;</span> <span class="nb">wait</span> %2
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$?</span>
</span></span></code></pre></div><h2 id="read-secret-into-a-variable">Read secret into a variable</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">read</span> -s TOKEN                     <span class="c1"># silent typing</span>
</span></span><span class="line"><span class="cl"><span class="nb">read</span> -s -p <span class="s2">&#34;Token?&#34;</span> TOKEN         <span class="c1"># … with prompt</span>
</span></span></code></pre></div><h2 id="increment-a-counter--calculate-expressions">Increment a counter / calculate expressions</h2>
<ul>
<li><a href="https://stackoverflow.com/questions/2552130/bash-evaluate-a-mathematical-term/2552184#2552184">math - Bash: evaluate a mathematical term? - Stack Overflow</a></li>
</ul>
<p><em>… count from 0</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">let</span> <span class="nv">count</span><span class="o">=</span><span class="nv">$count</span>+1                <span class="c1"># count = 1, 2, 3, ...</span>
</span></span><span class="line"><span class="cl"><span class="o">((</span><span class="nv">count</span><span class="o">=</span>count+1<span class="o">))</span>                 <span class="c1"># count = 1, 2, 3, ...</span>
</span></span><span class="line"><span class="cl"><span class="nv">value</span><span class="o">=</span><span class="k">$((</span>count-1<span class="k">))</span>                <span class="c1"># value = 0, 1, 2, ...</span>
</span></span></code></pre></div><p><em>… count from N = 10</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">let</span> <span class="nv">count</span><span class="o">=</span><span class="si">${</span><span class="nv">count</span><span class="k">:-</span><span class="nv">10</span><span class="si">}</span>+1          <span class="c1"># count = 11, 12, 13, ...</span>
</span></span></code></pre></div><h2 id="group-and-count-number-of-multiple-occurrences-of-the-same-line">Group and count number of multiple occurrences of the same line</h2>
<ul>
<li><a href="https://unix.stackexchange.com/a/170044">Sort and count number of occurrence of lines - Unix &amp; Linux Stack Exchange</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sort file <span class="p">|</span> uniq -c <span class="p">|</span> sort -r
</span></span><span class="line"><span class="cl"><span class="c1">#   3 foo</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   2 bar</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   1 baz</span>
</span></span></code></pre></div><h2 id="remove-path-and-extension-from-a-filename">Remove path and extension from a filename</h2>
<ul>
<li>See also <a href="https://github.com/hugocf/dotfiles/blob/main/Documents/C/Code/Shell/scripts/remove_path_extension.sh">remove_path_extension.sh</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">full_path</span><span class="o">=</span>/some/example/directories/some.example.name.txt
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">full_path</span><span class="p">##*/</span><span class="si">}</span>              <span class="c1"># =&gt; some.example.name.txt</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">full_path</span><span class="p">%.*</span><span class="si">}</span>               <span class="c1"># =&gt; /some/example/directories/some.example.name</span>
</span></span></code></pre></div><h2 id="default-missing-variable-to-a-value">Default missing variable to a value</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">set</span> -u                            <span class="c1"># treat unset variables as errors</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="si">}</span>                       <span class="c1"># =&gt; empty</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">0</span><span class="si">}</span>                      <span class="c1"># =&gt; 0</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">X</span><span class="si">}</span>                      <span class="c1"># =&gt; X</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">$var</span><span class="si">}</span>                   <span class="c1"># =&gt; example</span>
</span></span></code></pre></div><h2 id="use-multiline-heredoc-herestring-and-var-as-input">Use multiline heredoc, herestring, and var as input</h2>
<p><em>… same output</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">content
</span></span><span class="line"><span class="cl">string
</span></span></code></pre></div><p><em>… using heredoc</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat <span class="s">&lt;&lt;WORD
</span></span></span><span class="line"><span class="cl"><span class="s">content
</span></span></span><span class="line"><span class="cl"><span class="s">string
</span></span></span><span class="line"><span class="cl"><span class="s">WORD</span>
</span></span></code></pre></div><p><em>… using herestring</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;content
</span></span></span><span class="line"><span class="cl"><span class="s2">string&#34;</span>
</span></span></code></pre></div><p><em>… using var in herestring</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">text</span><span class="o">=</span><span class="s2">&#34;\
</span></span></span><span class="line"><span class="cl"><span class="s2">content
</span></span></span><span class="line"><span class="cl"><span class="s2">string&#34;</span>
</span></span><span class="line"><span class="cl">cat <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$text</span><span class="s2">&#34;</span>
</span></span></code></pre></div><h2 id="view-zip-or-jar-files">View zip or jar files</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">view some.jar
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">unzip -c some.jar path/to/file.txt
</span></span></code></pre></div><h2 id="transforming-and-parsing-json">Transforming and parsing JSON</h2>
<ul>
<li><a href="https://stedolan.github.io/jq/manual/">jq Manual (development version)</a></li>
</ul>
<h3 id="jq-useful-options"><code>jq</code> useful options</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">-c    --compact-output
</span></span><span class="line"><span class="cl">-r    --raw-output
</span></span><span class="line"><span class="cl">-S    --sort-keys
</span></span></code></pre></div><h3 id="feed-json-into-jq">Feed json into <code>jq</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;{&#34;example&#34;:&#34;value&#34;}&#39;</span>
</span></span></code></pre></div><p><em>… from a variable</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$json</span> <span class="p">|</span> jq .                 <span class="c1"># using pipe</span>
</span></span><span class="line"><span class="cl">jq . <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>                  <span class="c1"># using herestring</span>
</span></span></code></pre></div><p><em>… from a file</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span> &gt; /tmp/example.json
</span></span><span class="line"><span class="cl">jq . &lt; /tmp/example.json
</span></span></code></pre></div><h3 id="convert-to-new-array-with-a-subset-of-keys">Convert to new array with a subset of keys</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;[
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;a&#34;, &#34;id&#34;:1, &#34;extra&#34;:&#34;foo&#34;}, 
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;b&#34;, &#34;id&#34;:2, &#34;extra&#34;:&#34;bar&#34;}
</span></span></span><span class="line"><span class="cl"><span class="s1">]&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jq -c <span class="s1">&#39;[.[] | { id, name }]&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [{&#34;id&#34;:1,&#34;name&#34;:&#34;a&#34;},{&#34;id&#34;:2,&#34;name&#34;:&#34;b&#34;}]</span>
</span></span></code></pre></div><h3 id="select-array-elements">Select array elements</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;[{&#34;key&#34;:&#34;a&#34;}, {&#34;key&#34;:&#34;b&#34;}, {&#34;key&#34;:&#34;c&#34;}]&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$json</span> <span class="p">|</span> jq -c <span class="s1">&#39;.[0]&#39;</span>         <span class="c1"># =&gt; { &#34;key&#34;: &#34;a&#34; }</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$json</span> <span class="p">|</span> jq -c <span class="s1">&#39;first&#39;</span>        <span class="c1"># =&gt; { &#34;key&#34;: &#34;a&#34; }</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$json</span> <span class="p">|</span> jq -c <span class="s1">&#39;nth(1)&#39;</span>       <span class="c1"># =&gt; { &#34;key&#34;: &#34;b&#34; }</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$json</span> <span class="p">|</span> jq -c <span class="s1">&#39;last&#39;</span>         <span class="c1"># =&gt; { &#34;key&#34;: &#34;c&#34; }</span>
</span></span></code></pre></div><h3 id="array-elements-from-key-value-pairs">Array elements from key-value pairs</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;[{&#34;key&#34;:&#34;a&#34;, &#34;value&#34;:1}, {&#34;key&#34;:&#34;b&#34;, &#34;value&#34;:2}]&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jq -c <span class="s1">&#39;from_entries&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>  <span class="c1"># =&gt; { &#34;a&#34;: 1, &#34;b&#34;: 2 }</span>
</span></span></code></pre></div><h3 id="array-elements-from-custom-key-value-strings">Array elements from custom key-value strings</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;[
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;a&#34;, &#34;id&#34;:1, &#34;extra&#34;:&#34;foo&#34;},
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;b&#34;, &#34;id&#34;:2, &#34;extra&#34;:&#34;bar&#34;}
</span></span></span><span class="line"><span class="cl"><span class="s1">]&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jq -c <span class="s1">&#39;.[] | [{ &#34;key&#34;: .name, &#34;value&#34;: .id }] | from_entries&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># { &#34;a&#34;: 1, &#34;b&#34;: 2 }</span>
</span></span></code></pre></div><h3 id="default-null-to-empty-string">Default <code>null</code> to empty string</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;{&#34;example&#34;:&#34;value&#34;}&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jq -r <span class="s1">&#39;.path.to.attr&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>           <span class="c1"># =&gt; null</span>
</span></span><span class="line"><span class="cl">jq -r <span class="s1">&#39;.path.to.attr // empty&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>  <span class="c1"># =&gt; </span>
</span></span></code></pre></div><h3 id="convert-json-to-csv">Convert json to CSV</h3>
<ul>
<li><a href="https://stackoverflow.com/questions/32960857/how-to-convert-arbitrary-simple-json-to-csv-using-jq#32965227">How to convert arbitrary simple JSON to CSV using jq? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">json</span><span class="o">=</span><span class="s1">&#39;[
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;a&#34;, &#34;id&#34;:1, &#34;extra&#34;:&#34;foo&#34;}, 
</span></span></span><span class="line"><span class="cl"><span class="s1">  {&#34;name&#34;:&#34;b&#34;, &#34;id&#34;:2, &#34;extra&#34;:&#34;bar&#34;}
</span></span></span><span class="line"><span class="cl"><span class="s1">]&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jq -r <span class="s1">&#39;(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv&#39;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;</span><span class="nv">$json</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;extra&#34;,&#34;id&#34;,&#34;name&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;foo&#34;,1,&#34;a&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;bar&#34;,2,&#34;b&#34;</span>
</span></span></code></pre></div><h2 id="special-tips-about-sed">Special tips about <code>sed</code></h2>
<ul>
<li><a href="http://www.folkstalk.com/2012/01/sed-command-in-unix-examples.html">Sed Command in Unix and Linux Examples</a></li>
</ul>
<h3 id="sed-separators-are-configurable"><code>sed</code> separators are configurable</h3>
<p><em>… useful to avoid escaping <code>/</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sed <span class="s1">&#39;s_http://_www._&#39;</span> file.txt
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s#http://#www.#&#39;</span> file.txt
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s|http://|www.|&#39;</span> file.txt
</span></span><span class="line"><span class="cl"><span class="c1"># http://example.com =&gt; www.example.com</span>
</span></span></code></pre></div><h3 id="refer-to-the-matched-search-in-sed">Refer to the matched search in <code>sed</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sed <span class="s1">&#39;s/unix/&amp; or linux/&#39;</span> file.txt
</span></span><span class="line"><span class="cl"><span class="c1"># unix os =&gt; unix or linux os</span>
</span></span></code></pre></div><h2 id="bouncing-systemd-services">Bouncing <code>systemd</code> services</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> /etc/systemd/system            <span class="c1"># =&gt; servname.service</span>
</span></span><span class="line"><span class="cl">sudo systemctl stop servname      <span class="c1"># stop the service</span>
</span></span><span class="line"><span class="cl">sudo systemctl daemon-reload      <span class="c1"># reload changes from disk</span>
</span></span><span class="line"><span class="cl">sudo systemctl start servname     <span class="c1"># start the service</span>
</span></span><span class="line"><span class="cl">systemctl status ser*             <span class="c1"># what’s going on?</span>
</span></span></code></pre></div><h2 id="using-color-escape-sequences-with-echo">Using color escape sequences with <code>echo</code></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">$&#39;\e[1;34m&#39;</span><span class="s2">&#34;text&#34;</span><span class="s1">$&#39;\e[0m&#39;</span>
</span></span></code></pre></div><p><em>… using a variable instead of the escape sequence <strong>does no work!</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">FOO</span><span class="o">=</span><span class="s1">&#39;\e[1;34m&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$FOO</span><span class="s2">&#34;text&#34;</span><span class="s1">$&#39;\e[0m&#39;</span>           <span class="c1"># =&gt; \e[1;34mtext</span>
</span></span></code></pre></div><h2 id="bash-noop-command-colon">Bash noop command (colon)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="nv">$a</span> <span class="o">==</span> <span class="nv">$b</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    :                             <span class="c1"># noop</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><h2 id="list-wildcard-directories-without-showing-its-contents">List wildcard directories without showing its contents</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ls -d pattern*
</span></span><span class="line"><span class="cl"><span class="c1"># foo       bar       baz</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ls -1d pattern*
</span></span><span class="line"><span class="cl"><span class="c1"># foo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># bar</span>
</span></span><span class="line"><span class="cl"><span class="c1"># baz</span>
</span></span></code></pre></div><h2 id="continue-a-command-in-the-next-line">Continue a command in the next line</h2>
<ul>
<li><a href="http://www.cyberciti.biz/faq/howto-ask-bash-that-line-command-script-continues-next-line/">Bash Continue Command / Script On The Next Line</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">commannd1 -arg1 -arg2 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>          -arg3 -arg4 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>          -arg5 -arg6
</span></span></code></pre></div><h2 id="read-lines-from-a-file-one-at-a-time">Read lines from a file, one at a time</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash/1521498#1521498">linux - Looping through the content of a file in Bash? - Stack Overflow</a></li>
<li><a href="https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable/10929511#10929511">bash - Read a file line by line assigning the value to a variable - Stack Overflow</a></li>
</ul>
<p><em>… excludes the last line if it doesn’t end with a newline</em> ⚠️</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">while</span> <span class="nb">read</span> -r line<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="nv">$line</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; <span class="nv">$filename</span>
</span></span></code></pre></div><p><em>… does not stop to enter data manually if the loop is interactive (i.e. reads from stdin)</em> ⚠️</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">while</span> <span class="nv">IFS</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="nb">read</span> -r line <span class="o">||</span> <span class="o">[[</span> -n <span class="s2">&#34;</span><span class="nv">$line</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="nv">$line</span>
</span></span><span class="line"><span class="cl">    <span class="nb">read</span> -r input                 <span class="c1"># grabs line from file</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="nv">$input</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; <span class="nv">$filename</span>
</span></span></code></pre></div><h2 id="where-a-script-is-located-and-from-where-was-it-called">Where a script is located and from where was it called</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">readonly</span> <span class="nv">BASEDIR</span><span class="o">=</span><span class="k">$(</span><span class="nb">cd</span> <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="nv">$0</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span> <span class="o">&amp;&amp;</span> <span class="nb">pwd</span><span class="k">)</span> <span class="c1"># where the script is located</span>
</span></span><span class="line"><span class="cl"><span class="nb">readonly</span> <span class="nv">CALLDIR</span><span class="o">=</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>                         <span class="c1"># where it was called from</span>
</span></span></code></pre></div><h2 id="check-for-environment-variables">Check for environment variables</h2>
<p><em>… make sure var <strong>is defined</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> <span class="nv">$ISDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$?</span>         <span class="c1"># =&gt; 0 (success)</span>
</span></span><span class="line"><span class="cl"><span class="o">[[</span> <span class="nv">$UNDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$?</span>         <span class="c1"># =&gt; 1 (error)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> <span class="nv">$ISDEFINED</span> <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span>    <span class="c1"># =&gt; yes</span>
</span></span><span class="line"><span class="cl"><span class="o">[[</span> <span class="nv">$UNDEFINED</span> <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span>    <span class="c1"># =&gt; not</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="nv">$ISDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">else</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span><span class="p">;</span> <span class="k">fi</span>    <span class="c1"># =&gt; yes</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="nv">$UNDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">else</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span><span class="p">;</span> <span class="k">fi</span>    <span class="c1"># =&gt; not</span>
</span></span></code></pre></div><p><em>… make sure var <strong>is not defined</strong></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> -z <span class="nv">$ISDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$?</span>      <span class="c1"># =&gt; 1 (error)</span>
</span></span><span class="line"><span class="cl"><span class="o">[[</span> -z <span class="nv">$UNDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$?</span>      <span class="c1"># =&gt; 0 (success)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> -z <span class="nv">$ISDEFINED</span> <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span>    <span class="c1"># =&gt; yes</span>
</span></span><span class="line"><span class="cl"><span class="o">[[</span> -z <span class="nv">$UNDEFINED</span> <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span>    <span class="c1"># =&gt; not</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> -z <span class="nv">$ISDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span><span class="p">;</span> <span class="k">else</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">fi</span>  <span class="c1"># =&gt; yes</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> -z <span class="nv">$UNDEFINED</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;not&#34;</span><span class="p">;</span> <span class="k">else</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">fi</span>  <span class="c1"># =&gt; not</span>
</span></span></code></pre></div><h2 id="recursively-grep-files-with-specific-patterns">Recursively grep files with specific patterns</h2>
<p><em>… filter by file extensions</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -ri <span class="s2">&#34;pattern&#34;</span> . --include <span class="s2">&#34;*.txt&#34;</span> --include <span class="s2">&#34;*.text&#34;</span>
</span></span><span class="line"><span class="cl">grep -ri <span class="s2">&#34;pattern&#34;</span> . --include <span class="s2">&#34;*.md&#34;</span> --exclude <span class="s2">&#34;README.*&#34;</span>
</span></span></code></pre></div><p><em>… filter by directories</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep <span class="s2">&#34;pattern&#34;</span> filemask* --exclude-dir <span class="s2">&#34;test&#34;</span> --exclude-dir <span class="s2">&#34;target&#34;</span>
</span></span></code></pre></div><h2 id="remove-an-environment-variable">Remove an environment variable</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">unset</span> ENV_VAR
</span></span></code></pre></div><h2 id="pass-boolean-values-as-parameters-to-bash-functions">Pass boolean values as parameters to bash functions</h2>
<ul>
<li><a href="http://stackoverflow.com/a/21210966/1380781">bash - How to declare and use boolean variables in shell script? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">bool</span><span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$bool</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">fi</span>            <span class="c1"># =&gt; yes</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$bool</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="nb">true</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span> <span class="nb">echo</span> <span class="s2">&#34;yes&#34;</span><span class="p">;</span> <span class="k">fi</span>         <span class="c1"># =&gt; yes</span>
</span></span></code></pre></div><h2 id="return-values-from-bash-functions">Return values from bash functions</h2>
<ul>
<li><a href="http://nothingworks.donaitken.com/2012/04/returning-booleans-from-bash-functions">Returning booleans from Bash functions | // nothing works</a></li>
<li><a href="http://www.ibm.com/developerworks/library/l-bash-test/">Linux tip: Bash test and comparison functions</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">readonly</span> <span class="nv">SUCCESS</span><span class="o">=</span><span class="m">0</span>                <span class="c1"># exit status of bash commands</span>
</span></span></code></pre></div><p><em>… capture the return value of a function</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">get_value<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$variable</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nv">value</span><span class="o">=</span><span class="k">$(</span>get_value<span class="k">)</span>
</span></span></code></pre></div><p><em>… check if the last command executed with success</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">is_equal<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;</span><span class="nv">$2</span><span class="s2">&#34;</span> <span class="o">]]</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">is_equal <span class="o">&amp;&amp;</span> <span class="nb">echo</span> ok <span class="o">||</span> <span class="nb">echo</span> not ok          <span class="c1"># =&gt; ok</span>
</span></span><span class="line"><span class="cl">is_equal a b <span class="o">&amp;&amp;</span> <span class="nb">echo</span> ok <span class="o">||</span> <span class="nb">echo</span> not ok      <span class="c1"># =&gt; not ok</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">is_valid<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  grep -q <span class="s2">&#34;</span><span class="nv">$looking_for</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$file</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">is_valid <span class="o">&amp;&amp;</span> <span class="nb">echo</span> found <span class="o">||</span> <span class="nb">echo</span> not found
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; not found [shows stderr msg]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="nv">is_valid</span> <span class="o">==</span> <span class="m">0</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> found
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> not found
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; not found [no stderr msg]</span>
</span></span></code></pre></div><h2 id="dereference-bash-variable-param-substitutionexpansion">Dereference bash variable param substitution/expansion</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">TEST</span><span class="o">=</span>foobar
</span></span><span class="line"><span class="cl"><span class="nv">var</span><span class="o">=</span><span class="s2">&#34;TEST&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="p">!var</span><span class="si">}</span><span class="s2">&#34;</span>                    <span class="c1"># =&gt; foobar</span>
</span></span></code></pre></div><h2 id="check-if-a-directory-is-empty">Check if a directory is empty</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> <span class="k">$(</span>find /some/dir/ -maxdepth <span class="m">0</span> -type d -empty 2&gt; /dev/null<span class="k">)</span> <span class="o">]]</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;Empty&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;Not empty or missing&#34;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[[</span> <span class="s2">&#34;</span><span class="k">$(</span>ls -A /some/dir/ 2&gt; /dev/null<span class="k">)</span><span class="s2">&#34;</span> <span class="o">]]</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;Not empty&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;Empty or missing&#34;</span>
</span></span></code></pre></div><h2 id="look-for-empty-directories">Look for empty directories</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">find . -type d -empty
</span></span></code></pre></div><h2 id="exclude-hidden-dot-files-and-dirs-when-searching">Exclude hidden dot files and dirs when searching</h2>
<ul>
<li><a href="http://www.cyberciti.biz/faq/find-command-exclude-ignore-files/">Find command: Exclude or Ignore Files (e.g. Ignore All Hidden .dot Files )</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">find . -type file ! -name <span class="s2">&#34;.*&#34;</span>
</span></span><span class="line"><span class="cl">find . -type file ! <span class="se">\(</span> -name <span class="s2">&#34;.*&#34;</span> -or -path <span class="s2">&#34;*/.sync/*&#34;</span> <span class="se">\)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">find . -type file -not -name <span class="s2">&#34;.*&#34;</span>
</span></span><span class="line"><span class="cl">find . -type file -not -name <span class="s2">&#34;.*&#34;</span> -not -path <span class="s2">&#34;*/.sync/*&#34;</span>
</span></span><span class="line"><span class="cl">find . -type file -not <span class="se">\(</span> -name <span class="s2">&#34;.*&#34;</span> -or -path <span class="s2">&#34;*/.sync/*&#34;</span> <span class="se">\)</span>
</span></span></code></pre></div><h2 id="show-function-definition">Show function definition</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">declare</span> -f functionname
</span></span></code></pre></div><h2 id="check-open-files">Check open files</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">lsof <span class="p">|</span> grep file
</span></span></code></pre></div><h2 id="check-open-ports">Check open ports</h2>
<ul>
<li><a href="http://apple.stackexchange.com/a/117648/66527">terminal - How can I list my open network ports with netstat? - Ask Different</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo lsof -i -P <span class="p">|</span> grep :8080
</span></span></code></pre></div><h2 id="monitor-network-traffic">Monitor network traffic</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo tcpdump -ien1 -q
</span></span><span class="line"><span class="cl">sudo lsof -i:8080
</span></span></code></pre></div><h2 id="vi-survival-commands"><code>vi</code> survival commands</h2>
<h3 id="vi-exit"><code>vi</code> exit</h3>
<p><em>… exit and save</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">⇧-Z-Z
</span></span><span class="line"><span class="cl">:wq
</span></span><span class="line"><span class="cl">:x
</span></span></code></pre></div><p><em>… exit without saving</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">⇧-Z-Q
</span></span><span class="line"><span class="cl">:q!
</span></span></code></pre></div><h3 id="vi-settings"><code>vi</code> settings</h3>
<p><em>… in <code>~/.vimrc</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">:set <span class="nv">backupdir</span><span class="o">=</span>~/tmp              <span class="c1"># backup files</span>
</span></span><span class="line"><span class="cl">:set <span class="nv">background</span><span class="o">=</span>dark              <span class="c1"># use lighter colors</span>
</span></span><span class="line"><span class="cl">:set <span class="nv">ff</span><span class="o">=</span>unix<span class="p">|</span>dos                  <span class="c1"># unix or dos file format</span>
</span></span></code></pre></div><h2 id="remove-trailing-newlines">Remove trailing newlines</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;</span><span class="k">$(</span>cat file<span class="k">)</span><span class="s2">&#34;</span> &gt; file
</span></span></code></pre></div><h2 id="convert-date-toform-epoch">Convert date to/form epoch</h2>
<p><em>… from epoch</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">date -r <span class="m">1234567890</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; Fri Feb 13 23:31:30 WET 2009</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">date -r <span class="m">1294897379</span> +<span class="s2">&#34;%Y-%m-%d %H:%M:%S&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 2011-01-13 05:42:59</span>
</span></span></code></pre></div><p><em>… to epoch</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">date -jf <span class="s2">&#34;%Y-%m-%d %H:%M:%S&#34;</span> <span class="s2">&#34;2011-01-13 05:42:59&#34;</span> +%s
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 1294897379</span>
</span></span></code></pre></div><h2 id="difference-between-2-dates">Difference between 2 dates</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">ruby</span> <span class="o">-</span><span class="n">r</span> <span class="s1">&#39;date&#39;</span> <span class="o">-</span><span class="n">e</span> <span class="s1">&#39;puts &#34;#{(Date.today - Date.new(2007,11,30)).to_i} days&#34;&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">python</span> <span class="o">-</span><span class="n">c</span> <span class="s2">&#34;import datetime as d; print((d.date.today() - d.date(2007,11,30)).days)&#34;</span>
</span></span></code></pre></div><h2 id="subtract-days-to-a-date">Subtract days to a date</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">expr -1 <span class="se">\*</span> <span class="m">24</span> <span class="se">\*</span> <span class="m">60</span> <span class="se">\*</span> <span class="m">60</span> + <span class="sb">`</span>date +%s<span class="sb">`</span> <span class="p">|</span> xargs date -r
</span></span><span class="line"><span class="cl">expr -1 <span class="se">\*</span> <span class="m">24</span> <span class="se">\*</span> <span class="m">60</span> <span class="se">\*</span> <span class="m">60</span> + <span class="sb">`</span>date +%s<span class="sb">`</span> <span class="p">|</span> xargs -I<span class="o">{}</span> date -r <span class="o">{}</span> +<span class="s2">&#34;%Y-%m-%d&#34;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">ruby</span> <span class="o">-</span><span class="n">r</span> <span class="s1">&#39;date&#39;</span> <span class="o">-</span><span class="n">le</span> <span class="s1">&#39;puts &#34;#{Date.today - 1}&#34;&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">ruby</span> <span class="o">-</span><span class="n">r</span> <span class="s1">&#39;date&#39;</span> <span class="o">-</span><span class="n">le</span> <span class="s1">&#39;puts &#34;#{Date.today &lt;&lt; 1}&#34;&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">python</span> <span class="o">-</span><span class="n">c</span> <span class="s2">&#34;import datetime as d; print(d.date.today() - d.timedelta(days=1))&#34;</span>
</span></span></code></pre></div><h2 id="current-week-number">Current week number</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">man strftime                      <span class="c1"># list of formats</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">date +%V
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">ruby</span> <span class="o">-</span><span class="n">e</span> <span class="s1">&#39;puts (Time.now).strftime(&#34;%V&#34;)&#39;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">python</span> <span class="o">-</span><span class="n">c</span> <span class="s2">&#34;import time; print(time.strftime(&#39;%W&#39;))&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">python</span> <span class="o">-</span><span class="n">c</span> <span class="s2">&#34;import datetime as d; print(d.date(2009,9,1).strftime(&#39;%W&#39;))&#34;</span>
</span></span></code></pre></div><h2 id="files-paches">Files paches</h2>
<p><em>… generate</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">diff -uraN olddir newdir &gt; patch.diff
</span></span></code></pre></div><p><em>… apply</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">patch -p1 &lt; patch.diff
</span></span></code></pre></div><h2 id="dos--unix--dos">Dos ➔ Unix ➔ Dos</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># ^M = ctrl-V ctrl-M</span>
</span></span></code></pre></div><p><em>… unix ➔ dos</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"> sed -e <span class="s1">&#39;s/$/^M/&#39;</span> unix.file &gt; dos.file
</span></span></code></pre></div><p><em>… dos ➔ unix</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sed -e <span class="s1">&#39;s/^M//&#39;</span> dos.file &gt; unix.file
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">tr -d <span class="se">\\</span>r &lt; dos.file &gt; unix.newfile
</span></span></code></pre></div><h2 id="test-a-pop3-server">Test a POP3 server</h2>
<ul>
<li><a href="https://tools.ietf.org/html/rfc1939">RFC 1939 - Post Office Protocol - Version 3</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ telnet myserver <span class="m">110</span>
</span></span><span class="line"><span class="cl">user myusername
</span></span><span class="line"><span class="cl">pass mypassword
</span></span><span class="line"><span class="cl">stat <span class="p">|</span> list <span class="p">|</span> retr &lt;msgnbr&gt; <span class="p">|</span> dele &lt;msgnbr&gt;
</span></span><span class="line"><span class="cl">quit
</span></span></code></pre></div><h2 id="manage-postfix-mail-queues">Manage postfix mail queues</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo tail -f /var/log/postfix.log <span class="c1"># check what postfix is doing</span>
</span></span><span class="line"><span class="cl">mailq                             <span class="c1"># see what is in the queue (shows id)</span>
</span></span><span class="line"><span class="cl">postsuper -d id                   <span class="c1"># delete a mail from the queue</span>
</span></span><span class="line"><span class="cl">postsuper -d ALL                  <span class="c1"># delete all mail from the queue</span>
</span></span></code></pre></div><h2 id="unix-distribution-nameversion">Unix distribution name/version</h2>
<p><em>… depending on the distro</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">dmesg <span class="p">|</span> head -1
</span></span><span class="line"><span class="cl">cat /proc/version
</span></span><span class="line"><span class="cl">cat /etc/issue                    <span class="c1"># human-readable</span>
</span></span><span class="line"><span class="cl">uname -a                          <span class="c1"># full summary</span>
</span></span></code></pre></div><h2 id="shell-redirections">Shell redirections</h2>
<ul>
<li><a href="https://wiki.bash-hackers.org/howto/redirection_tutorial">Illustrated Redirection Tutorial [Bash Hackers Wiki]</a></li>
<li><a href="https://stackoverflow.com/questions/2990414/echo-that-outputs-to-stderr/23550347#23550347">bash - echo that outputs to stderr - Stack Overflow</a></li>
</ul>
<h3 id="redirect-stdout">Redirect <code>stdout</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cmd &gt; /dev/null                   <span class="c1"># stdout to file</span>
</span></span><span class="line"><span class="cl">cmd &gt;<span class="p">&amp;</span><span class="m">2</span>                           <span class="c1"># stdout to stderr</span>
</span></span></code></pre></div><h3 id="redirect-stderr">Redirect <code>stderr</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cmd 2&gt; /dev/null                  <span class="c1"># stderr to file</span>
</span></span><span class="line"><span class="cl">cmd 2&gt;<span class="p">&amp;</span><span class="m">1</span>                          <span class="c1"># stderr to stdout</span>
</span></span></code></pre></div><h3 id="redirect-stdout-and-stderr">Redirect <code>stdout</code> and <code>stderr</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cmd <span class="p">&amp;</span>&gt; /dev/null                  <span class="c1"># both to file</span>
</span></span><span class="line"><span class="cl">cmd &gt; /dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span>              <span class="c1"># both to file</span>
</span></span><span class="line"><span class="cl">cmd 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> cmd                    <span class="c1"># both to pipe</span>
</span></span><span class="line"><span class="cl">cmd 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> tee file.txt           <span class="c1"># both to console and file</span>
</span></span></code></pre></div><h3 id="redirect-stdout-and-stderr-bash-4">Redirect <code>stdout</code> and <code>stderr</code> (bash 4)</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cmd <span class="p">&amp;</span>&gt;&gt; /dev/null                 <span class="c1"># both to file</span>
</span></span><span class="line"><span class="cl">cmd <span class="p">|&amp;</span> cmd                        <span class="c1"># both to pipe</span>
</span></span></code></pre></div><h2 id="common-lines-between-two-files">Common lines between two files</h2>
<ul>
<li><a href="https://unix.stackexchange.com/a/398143">text processing - Common lines between two files - Unix &amp; Linux Stack Exchange</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">comm -12 <span class="nv">$file1</span> <span class="nv">$file2</span>            <span class="c1"># assumes files are sorted</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">grep -Fxf <span class="nv">$file1</span> <span class="nv">$file2</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="n">perl</span> <span class="o">-</span><span class="ow">ne</span> <span class="s">&#39;print if ($seen{$_} .= @ARGV) =~ /10$/&#39;</span> <span class="nv">$file1</span> <span class="nv">$file2</span>
</span></span></code></pre></div><h2 id="compile-po-message-files-into-mo-data-files">Compile <code>.po</code> message files into <code>.mo</code> data files</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">msgfmt -o filename.mo filename.po
</span></span></code></pre></div><h2 id="create-a-fake-blank-file-of-any-size">Create a fake blank file of any size</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span>myfile <span class="nv">bs</span><span class="o">=</span><span class="m">1024</span> <span class="nv">count</span><span class="o">=</span><span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 12+0 records in</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 12+0 records out</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 12288 bytes transferred in 0.000225 secs (54613333 bytes/sec)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ls -lh myfile 
</span></span><span class="line"><span class="cl"><span class="c1"># -rw-r--r--  1 hfr7756  staff    12K Sep 17 13:56 myfile</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">du -h myfile  
</span></span><span class="line"><span class="cl"><span class="c1"># 12K myfile</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">du --si myfile
</span></span><span class="line"><span class="cl"><span class="c1"># 12k myfile</span>
</span></span></code></pre></div><h2 id="split-very-long-xml-lines-in-tags">Split very long xml lines in tags</h2>
<p><em>… brute force format by inserting newlines</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># it&#39;s one single command line!</span>
</span></span><span class="line"><span class="cl">sed -e <span class="s1">&#39;s/\&gt;\&lt;/\&gt;\
</span></span></span><span class="line"><span class="cl"><span class="s1">\&lt;/g&#39;</span> input.xml &gt; output.xml
</span></span></code></pre></div><h2 id="port-forwarding-through-remote-host">Port forwarding through remote host</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh server -L 4321:servername:80
</span></span></code></pre></div><h2 id="encode-string-using-openssl">Encode string using openssl</h2>
<p><em>… from string</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;qwerty&#34;</span> <span class="p">|</span> openssl base64 <span class="c1"># =&gt; cXdlcnR5</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;qwerty&#34;</span> <span class="p">|</span> openssl md5    <span class="c1"># =&gt; d8578edf8458ce06fbc5bb76a58c5ca4</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -n <span class="s2">&#34;qwerty&#34;</span> <span class="p">|</span> openssl sha1   <span class="c1"># =&gt; b1b3773a05c0ed0176787a4f1574ff0075f7521e</span>
</span></span></code></pre></div><p><em>… from input</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">openssl base64
</span></span><span class="line"><span class="cl">^D
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">openssl md5
</span></span><span class="line"><span class="cl">^D
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">openssl sha1
</span></span><span class="line"><span class="cl">^D
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Splunk</title>
      <link>https://hugo.ferreira.cc/splunk/</link>
      <pubDate>Fri, 15 Feb 2019 01:04:41 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/splunk/</guid>
      <description>Small information nuggets and recipies about Splunk</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="exclude-lines-from-the-log">Exclude lines from the log</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">stream_name=&#34;*tax*&#34; stderr NOT TimeoutException
</span></span><span class="line"><span class="cl">| regex log!=&#34;\.\.\..*&#34;
</span></span><span class="line"><span class="cl">| regex log!=&#34;at .*&#34;
</span></span><span class="line"><span class="cl">| table _time log
</span></span></code></pre></div><h2 id="group-and-concatenate-messages-with-the-same-time">Group and concatenate messages with the same time</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">stream_name=&#34;*tax*&#34; stderr
</span></span><span class="line"><span class="cl">| concurrency duration=1
</span></span><span class="line"><span class="cl">| reverse
</span></span><span class="line"><span class="cl">| stats list(log) by _time
</span></span></code></pre></div><h2 id="aggregated-sum-of-numeric-fields">Aggregated sum of numeric fields</h2>
<p><em>… totals</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;payments.tax&#34; live &#34;rest client response&#34; &#34;/transactions}&#34;
</span></span><span class="line"><span class="cl">| spath input=log
</span></span><span class="line"><span class="cl">| rex field=message &#34;.*(?:} -&gt;)(?&lt;response&gt;.*)&#34; 
</span></span><span class="line"><span class="cl">| spath input=response
</span></span><span class="line"><span class="cl">| stats sum(transaction.tax_amount) as &#34;Total taxed amount&#34;
</span></span></code></pre></div><p><em>… partials</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;payments.tax&#34; live &#34;rest client response&#34; &#34;/transactions}&#34;
</span></span><span class="line"><span class="cl">| spath input=log
</span></span><span class="line"><span class="cl">| rex field=message &#34;.*(?:} -&gt;)(?&lt;response&gt;.*)&#34; 
</span></span><span class="line"><span class="cl">| spath input=response
</span></span><span class="line"><span class="cl">| search transaction.tax_amount &gt; 0
</span></span><span class="line"><span class="cl">| rename transaction.tax_country_code as Country
</span></span><span class="line"><span class="cl">| rename transaction.tax_entity_name as &#34;Tax Entity&#34;
</span></span><span class="line"><span class="cl">| stats sum(transaction.tax_amount) as &#34;Total taxed amount&#34; by Country, &#34;Tax Entity&#34;
</span></span><span class="line"><span class="cl">| sort by -Country
</span></span></code></pre></div><h2 id="search-query-with-json-parsing-spath">Search query with JSON parsing (spath)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;Generate Receipt request&#34;
</span></span><span class="line"><span class="cl">| spath input=log
</span></span><span class="line"><span class="cl">| rex field=message &#34;.*(?:Request Body = )(?&lt;request&gt;.*)&#34;
</span></span><span class="line"><span class="cl">| spath input=request
</span></span><span class="line"><span class="cl">| rename &#34;transaction.custom_fields{}.key&#34; as &#34;keys&#34;
</span></span><span class="line"><span class="cl">| rename &#34;transaction.custom_fields{}.value&#34; as &#34;values&#34;
</span></span><span class="line"><span class="cl">|  eval k=mvindex(keys,10)
</span></span><span class="line"><span class="cl">|  eval v=mvindex(values,10)
</span></span><span class="line"><span class="cl">| search v!=1 AND v!=6
</span></span></code></pre></div><h2 id="left-join-with-inner-query--loop-several-fields-into-a-single-string">Left join with inner query + Loop several fields into a single string</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">log=&#34;*com.meetup.payments.tax*&#34;
</span></span><span class="line"><span class="cl">| spath input=log
</span></span><span class="line"><span class="cl">| search mdc.run_mode!=&#34;Test&#34;
</span></span><span class="line"><span class="cl">| search exception.stacktrace!=&#34;&#34; OR level=&#34;ERROR&#34; 
</span></span><span class="line"><span class="cl">| eval time = strftime(_time,&#34;%Y-%m-%d %H:%M:%S&#34;) 
</span></span><span class="line"><span class="cl">| rename message as error_message 
</span></span><span class="line"><span class="cl">| join mdc.request_id type=left
</span></span><span class="line"><span class="cl">    [ search &#34;REST client response&#34; live 
</span></span><span class="line"><span class="cl">    | spath input=log 
</span></span><span class="line"><span class="cl">    | rex field=message &#34;.*(?:} -&gt;)(?&lt;response&gt;.*)&#34;]
</span></span><span class="line"><span class="cl">| spath output=taxamo_errors input=response path=errors{} 
</span></span><span class="line"><span class="cl">| join mdc.request_id type=left
</span></span><span class="line"><span class="cl">    [ search &#34;message received from SQS&#34; &#34;live&#34; 
</span></span><span class="line"><span class="cl">    | spath input=log 
</span></span><span class="line"><span class="cl">    | rex field=message &#34;.*(?:Body: )(?&lt;webhook_event&gt;.*)(?:,Attributes).*&#34; ] 
</span></span><span class="line"><span class="cl">| rex field=error_message &#34;.*(?:\&#34;:)(?&lt;error_description&gt;.*)&#34; 
</span></span><span class="line"><span class="cl">| rex field=error_message &#34;.*(?:MemberId\()(?&lt;member_id&gt;.*)(?:\))&#34; 
</span></span><span class="line"><span class="cl">| strcat &#34;http://api.meetup.com/members/&#34; member_id triage.url.member 
</span></span><span class="line"><span class="cl">| rename mdc.customer_id as customer_id 
</span></span><span class="line"><span class="cl">| rename webhook_event as triage.webhook_event 
</span></span><span class="line"><span class="cl">| spath input=triage.webhook_event 
</span></span><span class="line"><span class="cl">| strcat &#34;https://dashboard.stripe.com/events/&#34; id triage.url.stripe_event 
</span></span><span class="line"><span class="cl">| strcat &#34;https://dashboard.stripe.com/customers/&#34; data.object.customer triage.url.stripe_customer 
</span></span><span class="line"><span class="cl">| strcat &#34;https://dashboard.stripe.com/payments/&#34; data.object.charge triage.url.stripe_charge 
</span></span><span class="line"><span class="cl">| strcat &#34;https://dashboard.stripe.com/invoices/&#34; data.object.id triage.url.stripe_invoice 
</span></span><span class="line"><span class="cl">| strcat &#34;https://dashboard.stripe.com/subscriptions/&#34; data.object.subscription triage.url.stripe_subscription 
</span></span><span class="line"><span class="cl">| strcat &#34;https://manage.taxamo.com/dashboard.html#/live/transactions?key_or_custom_id=&#34; data.object.number triage.url.taxamo_transaction 
</span></span><span class="line"><span class="cl">| rename data.object.total as total 
</span></span><span class="line"><span class="cl">| eval triage.data.total_amount_in_dollars=total/100 
</span></span><span class="line"><span class="cl">| rename type as triage.data.event_type 
</span></span><span class="line"><span class="cl">| rename data.object.number as triage.data.invoice_number 
</span></span><span class="line"><span class="cl">| rename data.object.lines.data{}.metadata.* as triage.metadata.* 
</span></span><span class="line"><span class="cl">| rename data.object.lines.data{}.plan.* as plan.* 
</span></span><span class="line"><span class="cl">| strcat plan.interval_count &#34; &#34; plan.interval triage.data.plan_period 
</span></span><span class="line"><span class="cl">| foreach triage.* 
</span></span><span class="line"><span class="cl">    [| strcat &#34;:  &#34; &lt;&lt;FIELD&gt;&gt; f 
</span></span><span class="line"><span class="cl">    | eval fields=mvappend(fields,f) 
</span></span><span class="line"><span class="cl">    | eval cols=mvappend(cols,&#34;&lt;&lt;FIELD&gt;&gt;&#34;)] 
</span></span><span class="line"><span class="cl">| eval triage=mvzip(cols, fields,&#34;&#34;) 
</span></span><span class="line"><span class="cl">| table time,customer_id,error_description,taxamo_errors,triage
</span></span><span class="line"><span class="cl">| reverse
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ sbt</title>
      <link>https://hugo.ferreira.cc/sbt/</link>
      <pubDate>Thu, 31 Jan 2019 01:04:52 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/sbt/</guid>
      <description>Small information nuggets and recipies about sbt</description>
      <content:encoded><![CDATA[<ul>
<li><code>commandName</code> == <code>command-name</code></li>
</ul>
<hr>
<p><em>(most recent on top)</em></p>
<h2 id="cross-compile-and-publish-local-library">Cross compile and publish local library</h2>
<ul>
<li><a href="https://github.com/rubendg/sbt-docker-label-schema/issues/2#issuecomment-369343643">Label &ldquo;org.label-schema.vcs-url&rdquo; is missing · Issue #2 · rubendg/sbt-docker-label-schema</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">^</span><span class="n">publishLocal</span>
</span></span></code></pre></div><h2 id="download-sbt-sources">Download SBT sources</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/17127367/sbt-sources-in-idea/17127380#17127380">scala - SBT sources in IDEA - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">updateClassifiers</span>         <span class="c1">// download sources and docs for all libs
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">sbt</span> <span class="n">updateSbtClassifiers</span>      <span class="c1">// downloads sources and docs for sbt
</span></span></span></code></pre></div><h2 id="run-console-with-test-libraries-loaded">Run console with test libraries loaded</h2>
<ul>
<li><a href="http://stackoverflow.com/a/17031710">Importing test classes into Scala console in sbt? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">run</span> <span class="n">test</span><span class="k">:</span><span class="kt">console</span>
</span></span></code></pre></div><h2 id="run-sbt-in-debug-mode">Run sbt in debug mode</h2>
<ul>
<li><a href="http://stackoverflow.com/a/20745802/1380781">scala - Can log level be changed from command line? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">--</span><span class="n">debug</span>
</span></span></code></pre></div><h2 id="using-sbt-offline-to-avoid-dependency-resolution-failure">Using sbt offline, to avoid dependency resolution failure</h2>
<ul>
<li><a href="https://twitter.com/mgladdish/status/717749165757972480">Martin Gladdish on Twitter #scala #sbt #toptip&quot;</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">set</span> <span class="n">offline</span> <span class="k">:</span><span class="o">=</span> <span class="kc">true</span>
</span></span></code></pre></div><h2 id="run-tests-with-coverage">Run tests with coverage</h2>
<p><em>&hellip; there is also a separate &ldquo;Run with Coverage&rdquo; button in IntelliJ IDEA</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">coverage</span> <span class="n">test</span>
</span></span></code></pre></div><h2 id="visualize-library-dependencies">Visualize library dependencies</h2>
<ul>
<li><a href="https://github.com/jrudolph/sbt-dependency-graph">GitHub - jrudolph/sbt-dependency-graph: sbt plugin to create a dependency graph for your project</a></li>
</ul>
<p><em>&hellip; <code>~/.sbt/0.13/plugins/plugins.sbt</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">addSbtPlugin</span><span class="o">(</span><span class="s">&#34;net.virtual-void&#34;</span> <span class="o">%</span> <span class="s">&#34;sbt-dependency-graph&#34;</span> <span class="o">%</span> <span class="s">&#34;0.9.1&#34;</span><span class="o">)</span>
</span></span></code></pre></div><p><em>&hellip; commands</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">dependencyTree</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">dependencyBrowseGraph</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="s">&#34;whatDependsOn com.example library-name 0.0.0&#34;</span>
</span></span></code></pre></div><h2 id="publish-library-changes-locally">Publish library changes locally</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">publishLocal</span>
</span></span></code></pre></div><h2 id="run-command-via-proxy">Run command via proxy</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">-</span><span class="nc">Dhttp</span><span class="o">.</span><span class="n">proxyHost</span><span class="k">=</span><span class="n">localhost</span> <span class="o">-</span><span class="nc">Dhttp</span><span class="o">.</span><span class="n">proxyPort</span><span class="k">=</span><span class="mi">8888</span> <span class="s">&#34;~run 9000&#34;</span>
</span></span></code></pre></div><h2 id="run-command-opening-a-port-to-debug">Run command opening a port to debug</h2>
<p><em>&hellip; from the command line</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">-</span><span class="n">jvm</span><span class="o">-</span><span class="n">debug</span> <span class="mi">5005</span> <span class="s">&#34;~run 9400&#34;</span>
</span></span></code></pre></div><p><em>&hellip; form IntelliJ IDEA (Run/Debug Configuration)</em></p>
<ul>
<li>Edit Configurations&hellip; ➤ Remote ➤ Port = 5005</li>
</ul>
<h2 id="run-command-continually">Run command continually</h2>
<p><em>&hellip; put a tilde in front of it</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">~</span><span class="n">compile</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">~</span><span class="n">test</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="o">~</span><span class="n">testQuick</span>
</span></span></code></pre></div><h2 id="run-only-the-tests-that-have-failed">Run only the tests that have failed</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> <span class="n">testQuick</span>
</span></span></code></pre></div><h2 id="run-only-a-single-test">Run only a single test</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-scala" data-lang="scala"><span class="line"><span class="cl"><span class="n">sbt</span> &#39;testOnly <span class="o">*</span><span class="nc">TestSpec</span> <span class="o">--</span> <span class="o">-</span><span class="n">z</span> <span class="s">&#34;name of the spec&#34;</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="s">&#34;testOnly name.spaced.TestSpec -- pattern&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">sbt</span> <span class="s">&#34;it:testOnly name.spaced.TestSpec -- pattern&#34;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ VirtualBox</title>
      <link>https://hugo.ferreira.cc/virtualbox/</link>
      <pubDate>Fri, 23 Feb 2018 01:04:29 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/virtualbox/</guid>
      <description>Small information nuggets and recipies about VirtualBox</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="resize-disk-files">Resize disk files</h2>
<p><em><code>.vmdk</code> = VMWare disk</em></p>
<ol>
<li><a href="https://stackoverflow.com/questions/11659005/how-to-resize-a-virtualbox-vmdk-file/12456219#12456219">How to resize a VirtualBox vmdk file - Stack Overflow</a></li>
<li><a href="https://tvi.al/resize-sda1-disk-of-your-vagrant-virtualbox-vm/">Resize /dev/sda1 disk of your Vagrant / VirtualBox VM</a></li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> ~/.minikube/machines/minikube/
</span></span></code></pre></div><p><em>… from 1.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">VBoxManage clonehd <span class="s2">&#34;disk.vmdk&#34;</span> <span class="s2">&#34;cloned.vdi&#34;</span> --format vdi
</span></span><span class="line"><span class="cl">VBoxManage modifyhd <span class="s2">&#34;cloned.vdi&#34;</span> --resize <span class="m">15360</span> <span class="c1"># = 15 * 1024</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. open VirtualBox</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2. detach old `disk.vmdk`</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3. delete old `disk.vmdk`</span>
</span></span><span class="line"><span class="cl">VBoxManage clonehd <span class="s2">&#34;cloned.vdi&#34;</span> <span class="s2">&#34;disk.vmdk&#34;</span> --format vmdk
</span></span></code></pre></div><p><em>… from 2.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Follow the tutorial on how to use `gparted` to extend the </span>
</span></span><span class="line"><span class="cl"><span class="c1"># partition inside the disk and use the new unallocated space</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Colors</title>
      <link>https://hugo.ferreira.cc/colours/</link>
      <pubDate>Sun, 02 Apr 2017 01:01:46 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/colours/</guid>
      <description>Small information nuggets and recipies about Colors</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="hsl-color">HSL Color</h2>
<ul>
<li><a href="http://thenewcode.com/61/An-Easy-Guide-To-HSL-Color-In-CSS3">the new code &ndash; An Easy Guide To HSL Color</a></li>
<li><a href="https://thenewcode.com/576/Three-Ways-You-Should-Be-Using-HSL-Color-In-Your-Site-Today">the new code &ndash; Three Ways You Should Be Using HSL Color In Your Site Today</a></li>
<li><a href="http://articles.dappergentlemen.com/2015/01/22/hsl/">Designing with Hue Saturation and Lightness</a></li>
</ul>
<blockquote>
<p>Tip: In Chrome, holding down the SHIFT key while clicking on a color in
Inspect Element will switch it between displaying in equivalent CSS
color systems (hexadecimal, HSL, RGB, etc): very useful for converting
colors between different systems.</p>
<p>— <a href="https://thenewcode.com/982/Learning-Sass-With-CodePen-Part-Four-Color">the new code &ndash; Learning Sass With CodePen, Part Four: Color</a></p>
</blockquote>
<h2 id="traffic-lights-standard-colors">Traffic lights standard colors</h2>
<ul>
<li><a href="http://www.e-paint.co.uk/Lab_values.asp">Lab, RGB, CYMK and HLC Values</a> (RAL Classic)</li>
</ul>
<blockquote>
<p>The L* a* b* (together with the corresponding HLC, RGB and CYMK) values are based on various measurements using D65 light with a standard observer according to CIE 1964. They are not necessarily the L* a* b* figures intended by any standard and should therefore only be used as a guide.</p>
</blockquote>
<p><em>… RAL 6024 - Traffic green</em> <span style="color: #008450">●</span></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HLC:  157; 48; 48
</span></span><span class="line"><span class="cl">CMYK: 100; 0; 39; 48
</span></span><span class="line"><span class="cl">sRGB: 0; 132; 80
</span></span><span class="line"><span class="cl">Hex:  #008450
</span></span></code></pre></div><p><em>… RAL 1023 - Traffic yellow</em> <span style="color: #EFB700">●</span></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HLC:  83; 78; 95
</span></span><span class="line"><span class="cl">CMYK: 0; 23; 100; 6
</span></span><span class="line"><span class="cl">sRGB: 239; 183; 0
</span></span><span class="line"><span class="cl">Hex:  #EFB700
</span></span></code></pre></div><p><em>… RAL 3020 - Traffic red</em> <span style="color: #B81D13">●</span></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HLC:  39; 41; 76
</span></span><span class="line"><span class="cl">CMYK: 0; 84; 90; 28
</span></span><span class="line"><span class="cl">sRGB: 184; 29; 19
</span></span><span class="line"><span class="cl">Hex:  #B81D13
</span></span></code></pre></div><h2 id="github-colors-used-in-the-repos-language-statistics-bar">GitHub colors used in the repo&rsquo;s language statistics bar</h2>
<p>Moved to <a href="/github#github-colors-used-in-the-repos-language-statistics-bar">GitHub</a> snippets.</p>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ REST</title>
      <link>https://hugo.ferreira.cc/rest/</link>
      <pubDate>Mon, 26 Sep 2016 01:04:56 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/rest/</guid>
      <description>Small information nuggets and recipies about REST</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="response-codes-and-bodies">Response codes and bodies</h2>
<blockquote>
<p>204s are mostly for deletes. since posts usually return 201s and both puts and gets return bodies on the responses</p>
<p>— <a href="https://equalexperts.slack.com/team/nmarques">Nuno Marques</a></p>
</blockquote>
<h2 id="verbs-their-meaning-and-usage">Verbs, their meaning and usage</h2>
<ul>
<li><a href="http://www.restapitutorial.com/lessons/httpmethods.html">HTTP Methods for RESTful Services</a></li>
<li><a href="https://en.wikipedia.org/wiki/Representational_state_transfer#Example">Representational state transfer - Wikipedia</a></li>
<li><a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">HTTP/1.1: Method Definitions</a></li>
<li>REST ≈ CRUD</li>
</ul>
<p><em>… POST = Create</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Entire Collection e.g. /customers</span>
</span></span><span class="line"><span class="cl"><span class="m">201</span> Created
</span></span><span class="line"><span class="cl"><span class="s1">&#39;Location&#39;</span> header with link to /customers/<span class="o">{</span>id<span class="o">}</span> containing the new ID
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Specific Item e.g. /customers/{id}</span>
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found
</span></span><span class="line"><span class="cl"><span class="m">409</span> Conflict — <span class="k">if</span> resource already exists
</span></span></code></pre></div><p><em>… GET = Read</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Entire Collection e.g. /customers</span>
</span></span><span class="line"><span class="cl"><span class="m">200</span> OK
</span></span><span class="line"><span class="cl">List of customers <span class="o">(</span>use pagination, sorting and filtering on big lists<span class="o">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Specific Item e.g. /customers/{id}</span>
</span></span><span class="line"><span class="cl"><span class="m">200</span> OK — single customer
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — <span class="k">if</span> ID not found or invalid
</span></span></code></pre></div><p><em>… PUT = Update / Replace</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Entire Collection e.g. /customers</span>
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — unless you want to update/replace every resource in the entire collection
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Specific Item e.g. /customers/{id}</span>
</span></span><span class="line"><span class="cl"><span class="m">200</span> OK
</span></span><span class="line"><span class="cl"><span class="m">201</span> Created — <span class="k">if</span> using PUT <span class="k">for</span> create, no need <span class="k">for</span> a Location header
</span></span><span class="line"><span class="cl"><span class="m">204</span> No Content
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — <span class="k">if</span> ID not found or invalid
</span></span></code></pre></div><p><em>… PATCH = Update / Modify</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Entire Collection e.g. /customers</span>
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — unless you want to modify the collection itself
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Specific Item e.g. /customers/{id}</span>
</span></span><span class="line"><span class="cl"><span class="m">200</span> OK
</span></span><span class="line"><span class="cl"><span class="m">204</span> No Content
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — <span class="k">if</span> ID not found or invalid
</span></span></code></pre></div><p><em>… DELETE = Delete</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Entire Collection e.g. /customers</span>
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — unless you want to delete the whole collection
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Specific Item e.g. /customers/{id}</span>
</span></span><span class="line"><span class="cl"><span class="m">200</span> OK — maybe along with a response body <span class="k">if</span> describing the status
</span></span><span class="line"><span class="cl"><span class="m">202</span> Accepted — <span class="k">if</span> the action has not yet been enacted
</span></span><span class="line"><span class="cl"><span class="m">204</span> No Content — with no response body
</span></span><span class="line"><span class="cl"><span class="m">404</span> Not Found — <span class="k">if</span> ID not found or invalid
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ MySQL</title>
      <link>https://hugo.ferreira.cc/mysql/</link>
      <pubDate>Tue, 05 Apr 2016 01:05:15 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/mysql/</guid>
      <description>Small information nuggets and recipies about MySQL</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="show-storage-engine-information-per-table">Show storage engine information (per table)</h2>
<ul>
<li><a href="http://stackoverflow.com/a/4225613/1380781">innodb - How can I check MySQL engine type for a specific table? - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="n">engines</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="k">table_name</span><span class="p">,</span><span class="w"> </span><span class="n">engine</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">information_schema</span><span class="p">.</span><span class="n">tables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">table_schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;dbname&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="drop-all-tables">Drop all tables</h2>
<p><em>… execute the command below and then run the generated statements</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">concat</span><span class="p">(</span><span class="s1">&#39;drop table if exists &#39;</span><span class="p">,</span><span class="w"> </span><span class="k">table_name</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39; cascade;&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">information_schema</span><span class="p">.</span><span class="n">tables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">table_schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;database_name&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="recreate-a-blank-database">Recreate a blank database</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">drop</span><span class="w"> </span><span class="k">schema</span><span class="w"> </span><span class="n">dbname</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">create</span><span class="w"> </span><span class="k">database</span><span class="w"> </span><span class="n">dbname</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">default</span><span class="w"> </span><span class="nb">character</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">utf8</span><span class="w"> </span><span class="k">collate</span><span class="w"> </span><span class="n">utf8_general_ci</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="show-default-character-set">Show default character set</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="n">variables</span><span class="w"> </span><span class="k">like</span><span class="w"> </span><span class="s1">&#39;char%&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">show</span><span class="w"> </span><span class="n">variables</span><span class="w"> </span><span class="k">like</span><span class="w"> </span><span class="s1">&#39;coll%&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="change-the-database-default-character-set">Change the database default character set</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">alter</span><span class="w"> </span><span class="k">database</span><span class="w"> </span><span class="n">dbname</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">default</span><span class="w"> </span><span class="nb">character</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">utf8</span><span class="w"> </span><span class="k">collate</span><span class="w"> </span><span class="n">utf8_general_ci</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="change-table-character-set">Change table character set</h2>
<p><em>… for each table</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">alter</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="n">tablename</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">convert</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nb">character</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">utf8</span><span class="w"> </span><span class="k">collate</span><span class="w"> </span><span class="n">utf8_general_ci</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="show-permissions-for-a-user">Show permissions for a user</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="n">grants</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">username</span><span class="o">@</span><span class="n">localhost</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="show-list-of-databases-in-server">Show list of databases in server</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="n">databases</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="change-permissions-on-a-database">Change permissions on a database</h2>
<ul>
<li><a href="http://dbahire.com/stop-using-flush-privileges/">Stop using FLUSH PRIVILEGES – I used to be a MySQL DBA for Hire</a>
<ul>
<li>No need for doing flush privileges when using “higher level” commands</li>
<li>Only when directly manipulating the permissions tables with “low level” commands (insert, update, delete) does the flush privileges command need to be done to reload the permissions copy MySQL keeps cached in memory</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">grant</span><span class="w"> </span><span class="k">all</span><span class="w"> </span><span class="k">privileges</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="o">`</span><span class="n">dbname</span><span class="o">`</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s1">&#39;username&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">revoke</span><span class="w"> </span><span class="k">all</span><span class="w"> </span><span class="k">privileges</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="o">`</span><span class="n">dbname</span><span class="o">`</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="s1">&#39;username&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="list-users-in-the-database">List users in the database</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="k">user</span><span class="p">,</span><span class="w"> </span><span class="k">host</span><span class="p">,</span><span class="w"> </span><span class="n">password</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">mysql</span><span class="p">.</span><span class="k">user</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="rename-a-user">Rename a user</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">rename</span><span class="w"> </span><span class="k">user</span><span class="w"> </span><span class="s1">&#39;oldname&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="s1">&#39;newname&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ CSS</title>
      <link>https://hugo.ferreira.cc/css/</link>
      <pubDate>Sun, 10 Jan 2016 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/css/</guid>
      <description>Small information nuggets and recipies about CSS</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="show-link-address-when-printing">Show link address when printing</h2>
<ul>
<li><a href="http://css-tricks.com/css-content/">CSS Content | CSS-Tricks</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">@</span><span class="k">media</span> <span class="nt">print</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">a</span><span class="p">:</span><span class="nd">after</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">content</span><span class="p">:</span> <span class="s2">&#34; (&#34;</span> <span class="nb">attr</span><span class="p">(</span><span class="n">href</span><span class="p">)</span> <span class="s2">&#34;) &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Skype</title>
      <link>https://hugo.ferreira.cc/skype/</link>
      <pubDate>Thu, 10 Dec 2015 01:04:46 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/skype/</guid>
      <description>Small information nuggets and recipies about Skype</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="full-list-of-emoticons">Full list of emoticons</h2>
<ul>
<li><a href="https://support.skype.com/en/faq/FA12330/what-is-the-full-list-of-emoticons">What is the full list of emoticons?</a> — includes “invisibles”</li>
</ul>
<h2 id="basic-text-formatting">Basic text formatting</h2>
<ul>
<li><a href="https://www.nesono.com/node/450">Formatting Text in Skype | nesono</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">*bold*
</span></span><span class="line"><span class="cl">_italic_
</span></span><span class="line"><span class="cl">~delete~
</span></span><span class="line"><span class="cl">```code```
</span></span><span class="line"><span class="cl">normal text
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ MongoDB</title>
      <link>https://hugo.ferreira.cc/mongodb/</link>
      <pubDate>Tue, 17 Nov 2015 01:05:18 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/mongodb/</guid>
      <description>Small information nuggets and recipies about MongoDB</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="cleanup-a-single-collection">Cleanup a single collection</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mongo <span class="s1">&#39;dbname&#39;</span> --eval <span class="s1">&#39;db.collectionName.remove({})&#39;</span>
</span></span></code></pre></div><p><em>… example</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mongo <span class="s1">&#39;agent-paye&#39;</span> --eval <span class="s1">&#39;db.optedInUsers.remove({}); db.termsAndConditions.remove({})&#39;</span>
</span></span></code></pre></div><h2 id="drop-all-databases--collections">Drop all databases / collections</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mongo --quiet --eval <span class="s1">&#39;db.getMongo().getDBNames().forEach(
</span></span></span><span class="line"><span class="cl"><span class="s1">    function(i) { db.getSiblingDB(i).dropDatabase() }
</span></span></span><span class="line"><span class="cl"><span class="s1">)&#39;</span>
</span></span></code></pre></div><h2 id="launch-mongodb-on-demand">Launch MongoDB on demand</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mongod --config /usr/local/etc/mongod.conf <span class="p">&amp;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Java</title>
      <link>https://hugo.ferreira.cc/java/</link>
      <pubDate>Mon, 02 Nov 2015 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/java/</guid>
      <description>Small information nuggets and recipies about Java</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="os-x-installation-of-multiple-java-versions">OS X Installation of multiple Java versions</h2>
<ul>
<li><a href="http://kevinallenrodriguez.com/blog/properly-installing-managing-multiple-java-versions-on-os-x/">Running Multiple Java &amp; JDKs on OS X | Technical Series</a></li>
<li><a href="https://github.com/gcuisinier/jenv/issues/44">Jenv not setting JAVA_HOME · Issue #44 · gcuisinier/jenv · GitHub</a></li>
</ul>
<p><em>&hellip; basic installation</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew tap caskroom/cask
</span></span><span class="line"><span class="cl">brew install Caskroom/cask/java
</span></span></code></pre></div><p><em>&hellip; environment management</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew install jenv
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># .bash_profile</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">JENV_ROOT</span><span class="o">=</span>/usr/local/var/jenv
</span></span><span class="line"><span class="cl"><span class="k">if</span> which jenv &gt; /dev/null<span class="p">;</span> <span class="k">then</span> <span class="nb">eval</span> <span class="s2">&#34;</span><span class="k">$(</span>jenv init -<span class="k">)</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">fi</span>
</span></span></code></pre></div><p><em>&hellip; add installed versions</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/
</span></span><span class="line"><span class="cl">jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/
</span></span></code></pre></div><p><em>&hellip; no <code>JAVA_HOME</code> with <code>jenv</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">jenv enable-plugin sbt
</span></span></code></pre></div><h2 id="java-8-new-language-features">Java 8 new language features</h2>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html"><strong>What&rsquo;s New in JDK 8</strong></a></li>
<li><a href="http://winterbe.com/posts/2014/03/16/java-8-tutorial/">Java 8 Tutorial</a></li>
</ul>
<blockquote>
<ul>
<li>Default Methods for theerfaces</li>
<li>Lambda expressions</li>
<li>Functional Interfaces</li>
<li>Method and Constructor References</li>
<li>Lambda Scopes</li>
<li>Built-in Functional Interfaces</li>
<li>Streams</li>
<li>Parallel Streams</li>
<li>Map</li>
<li>Date API</li>
<li>Annotations</li>
</ul>
</blockquote>
<h2 id="java-7-new-language-features">Java 7 new language features</h2>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html"><strong>Java SE 7 Features and Enhancements</strong></a></li>
<li><a href="http://radar.oreilly.com/2011/09/java7-features.html">A look at Java 7&rsquo;s new features - O&rsquo;Reilly Radar</a></li>
<li><a href="http://java.dzone.com/articles/new-java-7-language-features">New Java 7 Language Features | Javalobby</a></li>
</ul>
<blockquote>
<ul>
<li>Diamond Operator</li>
<li>Using strings in switch statements</li>
<li>Automatic resource management</li>
<li>Numeric literals with underscores</li>
<li>Improved exception handling</li>
<li>Working with Path</li>
<li>File change notifications</li>
</ul>
</blockquote>
<h2 id="java-6-new-language-features">Java 6 new language features</h2>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/features-141434.html"><strong>Java SE 6 Features and Enhancements</strong></a></li>
<li><a href="http://www.javabeat.net/introduction-to-java-6-0-new-features-part-i/">Java 6.0 New Features, Part 1 : Introduction[ ]{.Apple-converted-space}</a></li>
<li><a href="http://www.javabeat.net/java-6-0-features-part-2-pluggable-annotation-processing-api/">Java 6.0 New Features, Part 2 : Pluggable Annotation Processing API</a></li>
<li><a href="http://www.javabeat.net/the-java-6-0-compiler-api/">The Java 6.0 Compiler API</a></li>
</ul>
<blockquote>
<ul>
<li>Common Annotations</li>
<li>Scripting Language for the Java Platform</li>
<li>Pluggable Annotation Processing API</li>
<li>Streaming API for XML</li>
<li>Compiler API</li>
</ul>
</blockquote>
<h2 id="java-5-new-language-features">Java 5 new language features</h2>
<ul>
<li><a href="http://docs.oracle.com/javase/1.5.0/docs/relnotes/features.html"><strong>J2SE(TM) 5.0 New Features</strong></a></li>
<li><a href="http://www.cs.indiana.edu/classes/jett/sstamm/">What&rsquo;s New in Java 1.5?</a></li>
</ul>
<blockquote>
<ul>
<li>Generics</li>
<li>For/in loop</li>
<li>Autoboxing/Unboxing</li>
<li>Typesafe Enums</li>
<li>Varargs</li>
<li>Static Import</li>
<li>Annotations (Metadata)</li>
</ul>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ OutSystems</title>
      <link>https://hugo.ferreira.cc/outsystems/</link>
      <pubDate>Thu, 15 Oct 2015 01:05:04 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/outsystems/</guid>
      <description>Small information nuggets and recipies about OutSystems</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="meaning-of-entity-icons--service-studio">Meaning of Entity Icons @ Service Studio</h2>
<ul>
<li>Different icons usually indicate “multi-tenant” support</li>
<li>Online Help: <a href="http://www.outsystems.com/help/servicestudio/9.0/default.htm#Multi-tenant_eSpaces/tenant_specific_elements.htm">OutSystems Platform 9 Help - Tenant-Specific Elements</a></li>
<li>Forum Post: <a href="https://www.outsystems.com/forums/discussion/15470/icons-of-entities/">Icons of entities - OutSystems</a></li>
</ul>
<h2 id="bind-javascript-code-to-run-after-an-ajax-refresh">Bind JavaScript code to run after an Ajax Refresh</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">osAjaxBackend</span><span class="p">.</span><span class="nx">BindAfterAjaxRequest</span><span class="p">(</span><span class="nx">myCustomFunction</span><span class="p">);</span>
</span></span></code></pre></div><p><em>… example</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">function</span><span class="w"> </span><span class="nf">metricsEvents</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// hook the code here!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">function</span><span class="w"> </span><span class="nf">addMetricsEvents</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">$</span><span class="p">(</span><span class="s">&#34;[data-action-type]&#34;</span><span class="p">).</span><span class="na">unbind</span><span class="p">(</span><span class="w"> </span><span class="s">&#34;click&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">metricsEvents</span><span class="w"> </span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">$</span><span class="p">(</span><span class="s">&#34;[data-action-type]&#34;</span><span class="p">).</span><span class="na">bind</span><span class="p">(</span><span class="w"> </span><span class="s">&#34;click&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">metricsEvents</span><span class="w"> </span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">osAjaxBackend</span><span class="p">.</span><span class="na">BindAfterAjaxRequest</span><span class="p">(</span><span class="n">addMetricsEvents</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><h2 id="unlock-stuck-deployment-from-lifetime">Unlock stuck deployment from LifeTime</h2>
<ul>
<li>Email “Case [#1021105] was updated - How to abort a LifeTime migration plan that is hanging?”</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">update</span><span class="w"> </span><span class="n">osltm_staging</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">finishedon</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">137</span><span class="w">
</span></span></span></code></pre></div><h2 id="outsystems-9-css-optimization">OutSystems 9 CSS Optimization</h2>
<ul>
<li><a href="http://www.outsystems.com/forums/discussion/14708/amsterdam-css-optimization/">Amsterdam: CSS optimization | OutSystems</a></li>
</ul>
<h2 id="check-the-deployment-time-sql-scripts-generated-to-change-the-database">Check the deployment-time SQL scripts generated to change the database</h2>
<p><em>… overridden every time there is a new publish/deploy</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ls -l <span class="nv">$OUTSYSTEMS_HOME</span>/share/&lt;eSpaceName&gt;/full/*.sql
</span></span></code></pre></div><h2 id="using-table-alias-in-advanced-queries">Using table alias in Advanced Queries</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">update</span><span class="w"> </span><span class="err">{</span><span class="n">Entity</span><span class="err">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">set</span><span class="w"> </span><span class="err">{</span><span class="n">Entity</span><span class="err">}</span><span class="p">.[</span><span class="n">ParentId</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">select</span><span class="w"> </span><span class="n">tbl</span><span class="p">.[</span><span class="n">Id</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">from</span><span class="w"> </span><span class="err">{</span><span class="n">Entity</span><span class="err">}</span><span class="w"> </span><span class="n">tbl</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">where</span><span class="w"> </span><span class="n">tbl</span><span class="p">.[</span><span class="n">Name</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">{</span><span class="n">Entity</span><span class="err">}</span><span class="p">.[</span><span class="n">ParentName</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h2 id="figure-out-in-which-table-a-constraint-violation-refers-to">Figure out in which table a constraint violation refers to</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">PHYSICAL_TABLE_NAME</span><span class="p">,</span><span class="w"> </span><span class="n">NAME</span><span class="p">,</span><span class="w"> </span><span class="n">DESCRIPTION</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">OSSYS_ENTITY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">PHYSICAL_TABLE_NAME</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">select</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">from</span><span class="w"> </span><span class="n">all_constraints</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">where</span><span class="w"> </span><span class="k">constraint_name</span><span class="w"> </span><span class="o">=</span><span class="s1">&#39;OSFRK_OSUSR_CONSTRAINT_NAME&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">ALL_CONS_COLUMNS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="k">constraint_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;&lt;name&gt;&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="k">position</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h2 id="results-of-the-support-collect_statssh-script">Results of the support <code>collect_stats.sh</code> script</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nv">$OUTSYSTEMS_HOME</span>/outsystems_data_<span class="nv">$TIMESTAMP</span>.tgz
</span></span></code></pre></div><p><em>… actions that the script does for requiring root access:</em></p>
<ul>
<li><strong>Software configuration</strong>
<ul>
<li>Java version, paths and preferences, e.g.<br>
<code>/etc/.java/.systemPrefs/outsystems/prefs.xml</code></li>
<li>JBoss version, paths and configs, e.g.<br>
<code>$JBOSS_HOME/standalone/configuration/</code></li>
<li>OutSystems version, paths and configs, e.g.<br>
<code>$OUTSYSTEMS_HOME/version.txt</code>, <code>/etc/</code></li>
</ul>
</li>
<li><strong>Server log files</strong>
<ul>
<li><code>$JBOSS_HOME/standalone/log/</code></li>
<li><code>$JBOSS_HOME/standalone/log-mq/</code></li>
<li><code>$OUTSYSTEMS_HOME/logs/</code></li>
</ul>
</li>
<li><strong>Machine information</strong>
<ul>
<li><code>/var/log/messages*</code></li>
<li><code>/proc/cpuinfo</code></li>
<li><code>/proc/meminfo</code></li>
<li>disk space usage</li>
<li>iptables</li>
<li>running processes</li>
<li>cpu status and statistics</li>
<li>java thread stacks, counters, heap diagnostics, memory dumps, etc.</li>
</ul>
</li>
</ul>
<h2 id="typical-jboss-directories-in-an-outsystems-installation">Typical JBoss directories in an OutSystems installation</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ cat /etc/sysconfig/outsystems
</span></span><span class="line"><span class="cl"><span class="nv">JAVA_HOME</span><span class="o">=</span>/etc/alternatives/java_sdk_1.6.0
</span></span><span class="line"><span class="cl"><span class="nv">ANT_HOME</span><span class="o">=</span>/usr/share/ant
</span></span><span class="line"><span class="cl"><span class="nv">OUTSYSTEMS_HOME</span><span class="o">=</span>/opt/outsystems/platform
</span></span></code></pre></div><h2 id="restart-jboss-server-and-the-outsystems-platform">Restart JBoss server and the OutSystems platform</h2>
<p><em>… as outsystems user?</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">service outsystems stop
</span></span><span class="line"><span class="cl">service jboss-outsystems restart
</span></span><span class="line"><span class="cl">service outsystems start
</span></span></code></pre></div><h2 id="service-studio-command-line-options">Service Studio command line options</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\Program Files\OutSystems\Development Environment 8.0&gt;ServiceStudio -help
</span></span><span class="line"><span class="cl">[&lt;eSpace.oml&gt;]
</span></span><span class="line"><span class="cl">-create NewApplication|NewMobileApplication|&lt;templateKey&gt; [-url &lt;hostName&gt;] [-userName &lt;userName&gt;] [-password|-encryptedPassword &lt;password&gt;]
</span></span><span class="line"><span class="cl">-d &lt;localESpace.oml&gt; &lt;foreignESpace.oml&gt; &lt;diffTextFile.txt&gt;
</span></span><span class="line"><span class="cl">-demoMode [&lt;eSpace.oml&gt;] [&lt;hostName&gt; &lt;userName&gt; &lt;password&gt;]
</span></span><span class="line"><span class="cl">-diff &lt;localESpace.oml&gt; &lt;foreignESpace.oml&gt;
</span></span><span class="line"><span class="cl">-downloadAndOpen -eSpaceKey &lt;eSpaceKey&gt; [-elementKey &lt;elementKey&gt;] [-url &lt;hostName&gt;] [-userName &lt;userName&gt;] [-password|-encryptedPassword &lt;password&gt;]
</span></span><span class="line"><span class="cl">-export &lt;eSpace.oml&gt; &lt;directory&gt; xls|xlsx|resX [&lt;output&gt;]
</span></span><span class="line"><span class="cl">-exportSettings settings.xml
</span></span><span class="line"><span class="cl">-import &lt;eSpace.oml&gt; &lt;resources.xls&gt;|&lt;resources.xlsx&gt;|&lt;resources.resX&gt; [&lt;output&gt;]
</span></span><span class="line"><span class="cl">-importResource &lt;eSpace.oml&gt; &lt;resource file&gt; [&lt;target directory&gt;]
</span></span><span class="line"><span class="cl">-importSettings settings.xml
</span></span><span class="line"><span class="cl">-merge &lt;localESpace.oml&gt; &lt;foreignESpace.oml&gt;
</span></span><span class="line"><span class="cl">-mergeModules &lt;PlatformServicesHost&gt; &lt;Authtoken&gt; &lt;LocalEnvironmentHostname&gt; &lt;LocalModuleVersionId&gt; &lt;LocalEnvironmentId&gt; &lt;ForeignEnvironmentHostname&gt; &lt;ForeignModuleVersionId&gt; &lt;ForeignEnvironmentId&gt; &lt;LocalEnvironmentName&gt; &lt;ForeignEnvironmentName&gt;
</span></span><span class="line"><span class="cl">-openApp &lt;appId&gt; &lt;appName&gt; &lt;packageUrl&gt;
</span></span><span class="line"><span class="cl">-openFromUrl (&lt;.oml url&gt; -connect)|(&lt;.osp url&gt; &lt;eSpaceName&gt; -connect) &lt;hostName&gt; &lt;userName&gt; &lt;password&gt;
</span></span><span class="line"><span class="cl">-recover &lt;espace.oml&gt; [&lt;lastSavePath&gt;]
</span></span><span class="line"><span class="cl">-refresh &lt;eSpace.oml&gt; &lt;verify.xml&gt; &lt;hostName&gt; &lt;userName&gt; &lt;password&gt; [&lt;productKey&gt;]
</span></span><span class="line"><span class="cl">-removeChangeTracking &lt;eSpace.oml&gt; [&lt;productKey&gt;]
</span></span><span class="line"><span class="cl">-resetSettings
</span></span><span class="line"><span class="cl">-runTests &lt;eSpace.oml&gt;|&lt;eSpaceKey&gt; &lt;output.xml&gt; &lt;hostName&gt; &lt;userName&gt; &lt;password&gt; &lt;tests&gt;
</span></span><span class="line"><span class="cl">-showApp &lt;applicationKey&gt; &lt;applicationName&gt; &lt;hostName&gt;
</span></span><span class="line"><span class="cl">-structuralDiff &lt;localESpace.oml&gt; &lt;foreignESpace.oml&gt;
</span></span><span class="line"><span class="cl">-structuralMerge &lt;localESpace.oml&gt; &lt;foreignESpace.oml&gt;
</span></span><span class="line"><span class="cl">-support [password [&lt;espace.oml&gt;]]
</span></span><span class="line"><span class="cl">-u &lt;eSpace.oml&gt; [&lt;verify.xml&gt;] [&lt;staticEntities.xml&gt;] [&lt;productKey&gt;]
</span></span><span class="line"><span class="cl">-uu &lt;eSpace.oml&gt; [&lt;productKey&gt;]
</span></span></code></pre></div><h2 id="clear-the-mru-servers-list-in-service-studio">Clear the MRU servers list in Service Studio</h2>
<ol>
<li>Delete settings file; it will be regenerated automatically</li>
<li>Edit keys <code>&lt;MruServers&gt;...&lt;/MruServers&gt;</code> in …</li>
</ol>
<p><em>… Windows XP</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\Documents and Settings\&lt;username&gt;\Local Settings\Application Data\OutSystems\ServiceStudio 8.0.1\Settings.xml
</span></span></code></pre></div><p><em>… Windows 7</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">C:\Users\&lt;username&gt;\AppData\Local\OutSystems\ServiceStudio 8.0.1\Settings.xml
</span></span></code></pre></div><h2 id="workaround-to-osusr-is-a-reserved-prefix">Workaround to “OSUSR is a reserved prefix”</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># @table = &#34;USR_OSUSR_e8b_File1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Data Type = Text</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Expand Inline = Yes</span>
</span></span><span class="line"><span class="cl">begin
</span></span><span class="line"><span class="cl">delete from OS@table<span class="p">;</span>
</span></span><span class="line"><span class="cl">commit<span class="p">;</span>
</span></span><span class="line"><span class="cl">end<span class="p">;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Fonts</title>
      <link>https://hugo.ferreira.cc/fonts/</link>
      <pubDate>Sun, 23 Aug 2015 01:03:51 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/fonts/</guid>
      <description>Small information nuggets and recipies about Fonts</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="decent-programming-fonts">Decent programming fonts</h2>
<ul>
<li>Adobe&rsquo;s <a href="http://adobe-fonts.github.io/source-code-pro/">Source Code Pro</a></li>
<li><a href="https://www.jetbrains.com/lp/mono/">JetBrains Mono: A free and open source typeface for developers | JetBrains</a></li>
<li><a href="https://github.com/tonsky/FiraCode">tonsky/FiraCode: Free monospaced font with programming ligatures</a></li>
</ul>
<h2 id="decent-cross-platform-fonts">Decent cross platform fonts</h2>
<ul>
<li><a href="http://www.ampsoft.net/webdesign-l/WindowsMacFonts.html">Common fonts to all versions of Windows &amp; Mac equivalents (Browser safe fonts) - Web design tips &amp; tricks</a></li>
<li><a href="http://www.macworld.com/article/1144660/xplatype.html">Safe fonts: Conquering the cross-platform divide | Macworld</a></li>
<li><a href="http://templates.mailchimp.com/design/typography">Typography | MailChimp Email Template Reference</a></li>
<li><a href="http://www.64notes.com/design/stop-helvetica-arial/">Stop Using Arial &amp; Helvetica</a></li>
</ul>
<blockquote>
<p><span style="font-family: Courier New">Monospace: Courier New</span></p>
<p><span style="font-family: Trebuchet MS">Sans-serif: <strong>Trebuchet MS</strong></span></p>
<p><span style="font-family: Georgia">Serif: <strong>Georgia</strong></span></p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ PHP</title>
      <link>https://hugo.ferreira.cc/php/</link>
      <pubDate>Wed, 17 Jun 2015 01:05:01 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/php/</guid>
      <description>Small information nuggets and recipies about PHP</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="which-url-requested-this-file">Which url requested this file?</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">echo</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s2">&#34;HTTP_HOST&#34;</span><span class="p">]</span> <span class="o">.</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s2">&#34;REQUEST_URI&#34;</span><span class="p">];</span>
</span></span></code></pre></div><h2 id="command-line-scripts">Command line scripts</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">php</span> <span class="o">-</span><span class="nx">r</span> <span class="s1">&#39;$var = value&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">php</span> <span class="o">-</span><span class="nx">a</span>                            <span class="c1"># interactive (needs readline)
</span></span></span></code></pre></div><h2 id="show-all-defined-constants">Show all defined constants</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">print_r</span><span class="p">(</span><span class="o">@</span><span class="nx">get_defined_constants</span><span class="p">());</span>
</span></span></code></pre></div><h2 id="default-values-for-contents">Default values for contents</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">defined</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">)</span><span class="o">?</span> <span class="o">:</span> <span class="nx">define</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">defined</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="nx">define</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">defined</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">)</span> <span class="k">or</span> <span class="nx">define</span><span class="p">(</span><span class="s1">&#39;CONSTANT&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="default-values-for-variables">Default values for variables</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">isset</span><span class="p">(</span><span class="nv">$var</span><span class="p">)</span><span class="o">?</span> <span class="o">:</span> <span class="nv">$var</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">isset</span><span class="p">(</span><span class="nv">$var</span><span class="p">)</span> <span class="o">||</span> <span class="nv">$var</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">isset</span><span class="p">(</span><span class="nv">$var</span><span class="p">)</span> <span class="k">or</span> <span class="nv">$var</span> <span class="o">=</span> <span class="s1">&#39;value&#39;</span><span class="p">;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Windows</title>
      <link>https://hugo.ferreira.cc/windows/</link>
      <pubDate>Wed, 17 Jun 2015 01:04:22 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/windows/</guid>
      <description>Small information nuggets and recipies about Windows</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="list-mapped-drives-from-command-line">List mapped drives from command line</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">net use
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ WordPress</title>
      <link>https://hugo.ferreira.cc/wordpress/</link>
      <pubDate>Wed, 17 Jun 2015 01:04:19 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/wordpress/</guid>
      <description>Small information nuggets and recipies about WordPress</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="dequeue-scripts-and-styles-from-the-parent-theme">Dequeue scripts and styles from the parent theme</h2>
<ul>
<li><a href="http://wordpress.stackexchange.com/questions/65523/how-do-i-dequeue-a-parent-theme-css-file/65526#65526">How do I dequeue a parent theme css file? - WordPress Answers</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="c1">// Dequeue styles &amp; scripts from the parent theme
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">wp_dequeue_style</span><span class="p">(</span> <span class="s1">&#39;parenttheme-style&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">wp_dequeue_script</span><span class="p">(</span> <span class="s1">&#39;parenttheme-script&#39;</span> <span class="p">);</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="c1">// Deregister handles to reuse them when enqueuing your own stuff
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">wp_deregister_style</span><span class="p">(</span> <span class="s1">&#39;parenttheme-style&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">wp_deregister_script</span><span class="p">(</span> <span class="s1">&#39;parenttheme-script&#39;</span> <span class="p">);</span>
</span></span></code></pre></div><h2 id="create-custom-post-types-in-code">Create custom post types (in code)</h2>
<ul>
<li><a href="http://codex.wordpress.org/Function_Reference/register_post_type">Function Reference/register post type « WordPress Codex</a></li>
<li><a href="http://justintadlock.com/archives/2013/09/13/register-post-type-cheat-sheet">register_post_type() cheat sheet</a></li>
<li><a href="https://yoast.com/custom-post-type-snippets/">Custom Post Type Snippets to make you smile • Yoast</a></li>
<li><a href="http://melchoyce.github.io/dashicons/">Dashicons icon font</a></li>
</ul>
<h2 id="code-conventions">Code conventions</h2>
<ul>
<li><a href="http://make.wordpress.org/core/handbook/coding-standards/"><strong>WordPress Coding Standards « Make WordPress Core</strong></a></li>
<li><a href="http://make.wordpress.org/core/handbook/coding-standards/php/">PHP Coding Standards</a></li>
<li><a href="http://make.wordpress.org/core/handbook/coding-standards/html/">HTML Coding Standards</a></li>
<li><a href="http://make.wordpress.org/core/handbook/coding-standards/css/">CSS Coding Standards</a></li>
<li><a href="http://make.wordpress.org/core/handbook/coding-standards/javascript/">JavaScript Coding Standards</a></li>
</ul>
<h2 id="string-translation-i18n-and-l10n">String translation, i18n and l10n</h2>
<ul>
<li><a href="http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/">Internationalization: You&rsquo;re probably doing it wrong » Otto on WordPress</a></li>
<li><a href="http://markjaquith.wordpress.com/2011/10/06/translating-wordpress-plugins-and-themes-dont-get-clever/">Translating WordPress Plugins and Themes: Don&rsquo;t Get Clever | Mark on WordPress</a></li>
</ul>
<p><em>… returns the translated string</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">__</span><span class="p">(</span> <span class="s1">&#39;Phrase to translate&#39;</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">_x</span><span class="p">(</span> <span class="s1">&#39;Phrase to translate&#39;</span><span class="p">,</span> <span class="s1">&#39;context comment for translators&#39;</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">_n</span><span class="p">(</span> <span class="s1">&#39;1 singular&#39;</span><span class="p">,</span> <span class="s1">&#39;%s plural&#39;</span><span class="p">,</span> <span class="nv">$the</span><span class="o">-</span><span class="nx">number</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">_nx</span><span class="p">(</span> <span class="s1">&#39;1 singular&#39;</span><span class="p">,</span> <span class="s1">&#39;%s plural&#39;</span><span class="p">,</span> <span class="nv">$the</span><span class="o">-</span><span class="nx">number</span><span class="p">,</span> <span class="s1">&#39;context comment for translators&#39;</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span></code></pre></div><p><em>… echoes the translated string</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">_e</span><span class="p">(</span> <span class="s1">&#39;Phrase to translate&#39;</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">_ex</span><span class="p">(</span> <span class="s1">&#39;Phrase to translate&#39;</span><span class="p">,</span> <span class="s1">&#39;comment context for translators&#39;</span><span class="p">,</span> <span class="s1">&#39;text-domain&#39;</span> <span class="p">);</span>
</span></span></code></pre></div><h2 id="manually-activate-as-user">Manually activate as user</h2>
<ol>
<li>Get the activation key for the user from table <code>wp-signup</code></li>
<li>Go to url: <code>/wp-activate.php?key=...</code></li>
</ol>
<h2 id="wordpress-installation-url">Wordpress installation url</h2>
<p><em>… HF: Always use this first one</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">bloginfo</span><span class="p">(</span><span class="nx">‘wpurl’</span><span class="p">)</span>       <span class="c1">// same as setting &#34;WordPress address (URL)&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">bloginfo</span><span class="p">(</span><span class="nx">‘url’</span><span class="p">)</span>         <span class="c1">// same as setting &#34;Site address (URL)&#34;
</span></span></span></code></pre></div><h2 id="wp-config-settings"><code>wp-config</code> settings</h2>
<h3 id="auth-keys">Auth keys</h3>
<ul>
<li>Generator: <a href="https://api.wordpress.org/secret-key/1.1/salt/">https://api.wordpress.org/secret-key/1.1/salt/</a></li>
</ul>
<h3 id="override-domain-dev">Override domain (dev)</h3>
<ul>
<li><a href="https://developer.wordpress.org/apis/wp-config-php/#advanced-options">wp-config.php | Common APIs Handbook | WordPress Developer Resources</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;WP_SITEURL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://&#39;</span> <span class="o">.</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;SERVER_NAME&#39;</span><span class="p">]</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;WP_HOME&#39;</span><span class="p">,</span>    <span class="s1">&#39;http://&#39;</span> <span class="o">.</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;SERVER_NAME&#39;</span><span class="p">]</span> <span class="p">);</span>
</span></span></code></pre></div><h3 id="debug-settings-dev">Debug settings (dev)</h3>
<ul>
<li><a href="http://andrewnacin.com/2010/04/23/5-ways-to-debug-wordpress/">5 Ways to Debug WordPress – Nacin</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;WP_DEBUG&#39;</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;WP_DEBUG_LOG&#39;</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>         <span class="c1"># error_log( &#34;debug message&#34; );
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;WP_DEBUG_DISPLAY&#39;</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;SCRIPT_DEBUG&#39;</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;SAVEQUERIES&#39;</span><span class="p">,</span> <span class="k">true</span> <span class="p">);</span>
</span></span></code></pre></div><h2 id="plugins">Plugins</h2>
<h3 id="global-paths">Global paths</h3>
<ul>
<li><a href="http://wp.smashingmagazine.com/2011/03/08/ten-things-every-wordpress-plugin-developer-should-know">10 Things Every WordPress Plugin Developer Should Know — Smashing Magazine</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="nx">defined</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_XXXXX&#39;</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_MYPLUGIN_XXXXX&#39;</span><span class="p">,</span> <span class="nx">ABSPATH</span> <span class="o">.</span> <span class="nx">_____</span> <span class="p">);</span>
</span></span></code></pre></div><p><mark>HF: Best way to retrieve <code>THEME_DIR</code>, <code>PLUGIN_NAME</code>, <code>PLUGIN_DIR</code>, <code>PLUGIN_URL</code>?</mark></p>
<h3 id="define-version">Define version</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="nx">defined</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_VERSION_KEY&#39;</span> <span class="p">))</span> <span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_VERSION_KEY&#39;</span><span class="p">,</span> <span class="s1">&#39;myplugin_version&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="nx">defined</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_VERSION_NUM&#39;</span> <span class="p">))</span> <span class="nx">define</span><span class="p">(</span> <span class="s1">&#39;MYPLUGIN_VERSION_NUM&#39;</span><span class="p">,</span> <span class="s1">&#39;1.0.0&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">add_option</span><span class="p">(</span> <span class="nx">MYPLUGIN_VERSION_KEY</span><span class="p">,</span> <span class="nx">MYPLUGIN_VERSION</span> <span class="p">);</span>
</span></span></code></pre></div><p><mark>HF: Does this need to be duplicated somewhere in the plugin &ldquo;metadata&rdquo;?</mark></p>
<h3 id="version-upgrades">Version upgrades</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nv">$new_version</span> <span class="o">=</span> <span class="s1">&#39;2.0.0&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span> <span class="nx">get_option</span><span class="p">(</span> <span class="nx">MYPLUGIN_VERSION_KEY</span> <span class="p">)</span> <span class="o">!=</span> <span class="nv">$new_version</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Execute your upgrade logic here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nx">update_option</span><span class="p">(</span> <span class="nx">MYPLUGIN_VERSION_KEY</span><span class="p">,</span> <span class="nv">$new_version</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Objective-C</title>
      <link>https://hugo.ferreira.cc/objective-c/</link>
      <pubDate>Sat, 01 Mar 2014 01:05:12 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/objective-c/</guid>
      <description>Small information nuggets and recipies about Objective-C</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="dont-refer-to-your-own-class-by-name">Don’t refer to your own class by name</h2>
<ul>
<li><em>… because you don’t know what the concrete class will be</em></li>
<li><a href="http://qualitycoding.org/factory-method/">How to Botch Your Objective-C Factory Method - Quality Coding</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="nb">self</span>                              <span class="c1">// From a class method
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">[</span><span class="nb">self</span> <span class="k">class</span><span class="p">]</span>                      <span class="c1">// From an instance method
</span></span></span></code></pre></div><h2 id="method--description-is-normally-used-as-an-internal-text-representation">Method <code>-description</code> is normally used as an internal text representation</h2>
<ul>
<li><em>i.e. for debugging</em></li>
<li><a href="http://www.johnwordsworth.com/2011/01/overriding-nsobjects-description/">Overriding NSObject’s description | Dr John Wordsworth</a></li>
<li><a href="http://atkit.com/dev/objective-c/auto-description-category-nsobject-object/">Auto Description Category for NSObject (any object) | At Kit</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nf">description</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">[</span><span class="n">NSString</span> <span class="nl">stringWithFormat</span><span class="p">:</span><span class="s">@&#34;&lt;GameObject: %@, Position: %f, %f&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                 <span class="p">[</span><span class="nb">self</span> <span class="n">objectID</span><span class="p">],</span> <span class="p">[</span><span class="nb">self</span> <span class="n">position</span><span class="p">].</span><span class="n">x</span><span class="p">,</span> <span class="p">[</span><span class="nb">self</span> <span class="n">position</span><span class="p">].</span><span class="n">y</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="enable-test-feature-from-a-command-line-argument">Enable test feature from a command line argument</h2>
<ul>
<li><a href="http://nshipster.com/new-years-2014/">Reader Submissions - New Year&rsquo;s 2014 : NSHipster</a></li>
</ul>
<p><em>… this is useful for debugging development builds with the command line argument</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-</span><span class="nf">TestFeatureEnabled</span> <span class="nb">YES</span>
</span></span><span class="line"><span class="cl"><span class="p">[[</span><span class="n">NSUserDefaults</span> <span class="n">standardUserDefaults</span><span class="p">]</span> <span class="nl">boolForKey</span><span class="p">:</span><span class="s">@&#34;TestFeatureEnabled&#34;</span><span class="p">]</span>
</span></span></code></pre></div><h2 id="default-values-with-gnu-style-ternary-operator">Default values with GNU-style ternary operator</h2>
<ul>
<li><a href="http://nshipster.com/new-years-2014/">Reader Submissions - New Year&rsquo;s 2014 : NSHipster</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%@&#34;</span><span class="p">,</span> <span class="s">@&#34;a&#34;</span> <span class="o">?:</span> <span class="s">@&#34;b&#34;</span><span class="p">);</span>       <span class="c1">// =&gt; @&#34;a&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%@&#34;</span><span class="p">,</span> <span class="nb">nil</span> <span class="o">?:</span> <span class="s">@&#34;b&#34;</span><span class="p">);</span>        <span class="c1">// =&gt; @&#34;b&#34;
</span></span></span></code></pre></div><h2 id="manipulating-collections-using-blocks">Manipulating collections using blocks</h2>
<ul>
<li><a href="https://github.com/BlocksKit/BlocksKit/blob/5267135/BlocksKit/Core/NSArray%2BBlocksKit.m#L4">BlocksKit/BlocksKit/Core/NSArray+BlocksKit.m at master · BlocksKit/BlocksKit</a></li>
<li><a href="http://www.linkedin.com/groups/BlocksKit-1-is-framework-OS-3724464%2ES%2E266743053">[BlocksKit][1] is a framework for OS X Lion and newer and a static library for iOS 5 and newer. | LinkedIn</a></li>
</ul>
<h2 id="declaring-instance-variables-ivars">Declaring instance variables (ivars)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="k">@interface</span> <span class="nc">ClassName</span> : <span class="nc">NSObject</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ivar1</span><span class="p">;</span>  <span class="c1">// @protected by default; could use @private (legacy) or @public (bad practice)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">@end</span>
</span></span><span class="line"><span class="cl"><span class="k">@implementation</span> <span class="nc">ClassName</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ivar2</span><span class="p">;</span>  <span class="c1">// @private by default; can change to @protected
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">@end</span>
</span></span><span class="line"><span class="cl"><span class="k">@implementation</span> <span class="nc">ClassName</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ivar3</span><span class="p">;</span>  <span class="c1">// @private by definition; other visibility keywords are ignored
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">@end</span>
</span></span></code></pre></div><h2 id="assertions--release-builds">Assertions &amp; Release builds</h2>
<ul>
<li><a href="http://nshipster.com/nsassertionhandler/">NSAssertionHandler : NSHipster</a></li>
<li><a href="http://www.merowing.info/2013/07/expanded-use-of-asserts/">Expanded use of Asserts - Krzysztof Zabłocki</a></li>
<li><a href="http://www.learn-cocos2d.com/2010/11/art-assertion-pertains-xcode/">The Art of Assertion (as it pertains to Xcode) | Learn &amp; Master Cocos2D Game Development</a></li>
</ul>
<p><code>NSAssert()</code> is disabled if the preprocessor macro<br>
<code>NS_BLOCK_ASSERTIONS</code> is defined for Release builds (<a href="http://stackoverflow.com/a/6445429">defaults change per Xcode version</a>)</p>
<h2 id="naming-private--addition-methods-to-avoid-naming-conflicts">Naming private &amp; addition methods to avoid naming conflicts</h2>
<ul>
<li><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-1003829-BCIBDJCA">Coding Guidelines for Cocoa: Naming Methods</a></li>
<li><a href="https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW4">Programming with Objective-C: Customizing Existing Classes</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">pfx_myMethodName</span><span class="p">;</span>
</span></span></code></pre></div><h2 id="check-if-running-under-unit-tests">Check if running under unit tests</h2>
<ul>
<li><a href="http://blog.nicolai86.eu/posts/2012-12-01/check-for-unit-tests-in-obj-c/">Check for Unit-Tests in Objective-C</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="kt">BOOL</span> <span class="n">runningTests</span> <span class="o">=</span> <span class="n">NSClassFromString</span><span class="p">(</span><span class="s">@&#34;XCTest&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">nil</span><span class="p">;</span>
</span></span></code></pre></div><h2 id="annotate-intentional-fall-through-between-switch-labels">Annotate intentional fall-through between switch labels</h2>
<ul>
<li><em>aka “follow-through”</em></li>
<li><a href="http://clang.llvm.org/docs/LanguageExtensions.html#non-standard-c-11-attributes">Clang Language Extensions — Clang 3.4 documentation</a></li>
<li><a href="http://blog.llvm.org/2013/09/clang-warnings.html">LLVM Project Blog: Clang Warnings</a>
<ul>
<li><code>-Wimplicit-fallthrough</code> — Enabling this warning will cause a diagnostic to be emitted for all fallthroughs in switch statements that have not been annotated. Requires compilation in C++11 mode. Clang-specific warning, available in the 3.2 release.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">[[</span><span class="n">clang</span><span class="o">::</span><span class="n">fallthrough</span><span class="p">]]</span>
</span></span></code></pre></div><h2 id="using-meta-information-in-nslog">Using meta information in NSLog</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/969130/how-to-print-out-the-method-name-and-line-number-and-conditionally-disable-nslog">objective c - How to print out the method name and line number and conditionally disable NSLog? - Stack Overflow</a></li>
<li><a href="https://developer.apple.com/library/ios/qa/qa1669/_index.html">Technical Q&amp;A QA1669: Improved logging in Objective-C</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%d&#34;</span><span class="p">,</span> <span class="p">...)</span>
</span></span><span class="line"><span class="cl"><span class="n">__LINE__</span>             <span class="c1">// Current line number in the source code file
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%s&#34;</span><span class="p">,</span> <span class="p">...)</span>
</span></span><span class="line"><span class="cl"><span class="n">__func__</span>             <span class="c1">// Current function signature
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">__PRETTY_FUNCTION__</span>  <span class="c1">// Like __func__, but includes verbose type information in C++ code
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">__FILE__</span>             <span class="c1">// Full path to the source code file
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%@&#34;</span><span class="p">,</span> <span class="p">...)</span>
</span></span><span class="line"><span class="cl"><span class="n">NSStringFromSelector</span><span class="p">(</span><span class="n">_cmd</span><span class="p">)</span>      <span class="c1">// Name of the current selector
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">NSStringFromClass</span><span class="p">([</span><span class="nb">self</span> <span class="k">class</span><span class="p">])</span> <span class="c1">// Name of the current object&#39;s class
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">[</span><span class="n">NSThread</span> <span class="n">callStackSymbols</span><span class="p">]</span>     <span class="c1">// NSArray of the current stack trace as programmer-readable strings
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">[[</span><span class="n">NSString</span> <span class="nl">stringWithUTF8String</span><span class="p">:</span><span class="n">__FILE__</span><span class="p">]</span> <span class="n">lastPathComponent</span><span class="p">]</span> <span class="c1">// Name of the source code file
</span></span></span></code></pre></div><h2 id="return-values-from-code-blocks">Return values from code blocks</h2>
<ul>
<li><a href="http://cocoa-dom.tumblr.com/post/56517731293/new-thing-i-do-in-code">cocoa-dom - New thing I do in code</a></li>
<li><a href="http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html">Statement Exprs - Using the GNU Compiler Collection (GCC)</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="nb">self</span><span class="p">.</span><span class="n">bounds</span> <span class="o">=</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">	<span class="n">CGRect</span> <span class="n">bounds</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">bounds</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">bounds</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">currentYPosition</span> <span class="o">+</span> <span class="n">SHEETINSETY</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">bounds</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><ul>
<li><a href="http://macoscope.com/blog/calling-blocks-inline/">Macoscope Blog | Calling Blocks Inline</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="k">const</span> <span class="kt">BOOL</span> <span class="n">anyValueIsXyz</span> <span class="o">=</span> <span class="p">(</span><span class="o">^</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="n">QwertyValue</span> <span class="o">*</span><span class="n">value</span> <span class="k">in</span> <span class="n">values</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">value</span><span class="p">.</span><span class="n">isXyz</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="nb">YES</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nb">NO</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}());</span>
</span></span></code></pre></div><h2 id="define-enums-and-bitmasks">Define enums and bitmasks</h2>
<ul>
<li><a href="http://iamthewalr.us/blog/2012/11/ns_enum-and-ns_options/#comment-44164">iamthewalr.us : NS_ENUM and NS_OPTIONS</a></li>
<li><a href="http://nshipster.com/ns_enum-ns_options/">NS_ENUM &amp; NS_OPTIONS : NSHipster</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="k">typedef</span> <span class="nf">NS_ENUM</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">,</span> <span class="n">PFXEnumName</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueA</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueB</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="nf">NS_OPTIONS</span><span class="p">(</span><span class="n">NSUInteger</span><span class="p">,</span> <span class="n">PFXEnumName</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueA</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueB</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueC</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueD</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p><em>… usage</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">PFXEnumNameValueA</span> <span class="o">|</span> <span class="n">PFXEnumNameValueC</span>
</span></span></code></pre></div><h2 id="boxed-enums-converting-a-standard-enum-to-an-integer-type-and-boxing-the-value-accordingly">Boxed enums: converting a standard enum to an integer type, and boxing the value accordingly.</h2>
<ul>
<li><a href="http://clang.llvm.org/docs/ObjectiveCLiterals.html#boxed-enums">Objective-C Literals — Clang 3.4 documentation</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="l">@(</span><span class="n">SomeStandardEnumValue</span><span class="l">)</span>          <span class="c1">// boxing
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">[</span><span class="n">boxedNum</span> <span class="n">nativeTypeValue</span><span class="p">]</span>        <span class="c1">// unboxing
</span></span></span></code></pre></div><h2 id="iterate-through-an-enum">Iterate through an enum…</h2>
<p><em>… fragile pattern; assumes too much: incremental values only, no gaps numeric order, count must be the last element, etc.</em> ⚠️</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="k">typedef</span> <span class="nf">NS_ENUM</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">,</span> <span class="n">PFXEnumName</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueA</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFXEnumNameValueB</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">PFX_ENUM_NAME_COUNT</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">PFX_ENUM_NAME_COUNT</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&#34;%@&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">PFXEnumNameValueA</span><span class="p">)</span><span class="o">?</span> <span class="s">@&#34;got the element&#34;</span> <span class="o">:</span> <span class="s">@&#34;nope, not yet&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="random-number-generator">Random number generator</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="c1">// random int between [0..upper_bound[
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">arc4random_uniform</span><span class="p">(</span><span class="n">upper_bound</span><span class="p">);</span>
</span></span></code></pre></div><h2 id="constants-declaration">Constants declaration</h2>
<ul>
<li><a href="http://nshipster.com/c-storage-classes/">C Storage Classes : NSHipster</a></li>
<li><a href="http://stackoverflow.com/a/7642561/1380781">Objective-C static, extern, public variables - Stack Overflow</a></li>
<li><a href="http://stackoverflow.com/a/8832880/1380781">Difference between external variable of some sort and static variable - Stack Overflow</a></li>
</ul>
<p><em>… within the same translation unit (i.e. current source being compiled + all the included headers)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="c1">// file.m
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">static</span> <span class="n">NSString</span> <span class="o">*</span> <span class="k">const</span> <span class="n">PFXExampleConstantA</span> <span class="o">=</span> <span class="s">@&#34;value&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">PFXExampleConstantB</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span></code></pre></div><p><em>… globally available to all</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="c1">// file.h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">extern</span> <span class="n">NSString</span> <span class="o">*</span> <span class="k">const</span> <span class="n">PFXExampleConstantA</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// file.m
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">NSString</span> <span class="o">*</span> <span class="k">const</span> <span class="n">PFXExampleConstantA</span> <span class="o">=</span> <span class="s">@&#34;value&#34;</span><span class="p">;</span>
</span></span></code></pre></div><ul>
<li><a href="http://www.mikeash.com/pyblog/friday-qa-2011-08-19-namespaced-constants-and-functions.html">mikeash.com: Friday Q&amp;A 2011-08-19: Namespaced Constants and Functions</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="c1">// file.h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">extern</span> <span class="k">const</span> <span class="k">struct</span> <span class="n">PFXExampleConstantsStruct</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSString</span> <span class="o">*</span><span class="n">constantA</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">constantB</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">NSString</span> <span class="o">*</span><span class="n">constantC</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">NSString</span> <span class="o">*</span><span class="n">constantD</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="n">scope</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="n">PFXExampleConstants</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// file.m
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">const</span> <span class="k">struct</span> <span class="n">PFXExampleConstantsStruct</span> <span class="n">PFXExampleConstants</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">constantA</span> <span class="o">=</span> <span class="s">@&#34;value&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">constantB</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">scope</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">constantC</span> <span class="o">=</span> <span class="s">@&#34;valueC&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="n">constantD</span> <span class="o">=</span> <span class="s">@&#34;valueD&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="c1">// usage
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">PFXExampleConstants</span><span class="p">.</span><span class="n">scope</span><span class="p">.</span><span class="n">constantC</span>
</span></span></code></pre></div><h2 id="singletons-with-a-thread-safe-pattern">Singletons with a thread-safe pattern</h2>
<ul>
<li><a href="http://cocoasamurai.blogspot.pt/2011/04/singletons-your-doing-them-wrong.html">Cocoa Samurai: Singletons: You&rsquo;re doing them wrong</a></li>
<li><a href="http://www.daveoncode.com/2011/12/19/fundamental-ios-design-patterns-sharedinstance-singleton-objective-c/">Fundamental iOS design patterns: SharedInstance (Singleton in Objective C) | DaveOnCode</a></li>
<li><a href="http://www.galloway.me.uk/tutorials/singleton-classes/">Singletons in Objective-C - Matt Galloway</a></li>
</ul>
<p><em>… using Grand Central Dispatch</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">+</span> <span class="p">(</span><span class="kt">instancetype</span><span class="p">)</span><span class="nf">shared</span><span class="o">&lt;</span><span class="err">#</span><span class="n">ClassName</span><span class="err">#</span><span class="o">&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="k">static</span> <span class="kt">id</span> <span class="n">sharedInstance</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">   <span class="k">static</span> <span class="n">dispatch_once_t</span> <span class="n">token</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">   <span class="n">dispatch_once</span><span class="p">(</span><span class="o">&amp;</span><span class="n">token</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">sharedInstance</span> <span class="o">=</span> <span class="p">[[</span><span class="nb">self</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">   <span class="p">});</span>
</span></span><span class="line"><span class="cl">   <span class="k">return</span> <span class="n">sharedInstance</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="custom-warning-and-error-directives">Custom warning and error directives</h2>
<ul>
<li><a href="http://boredzo.org/blog/archives/2009-11-07/warnings">Idle Time » Blog Archive » Warnings I turn on, and why</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="cp">#warning pay attention to this
</span></span></span><span class="line"><span class="cl"><span class="cp">#error continue here…
</span></span></span></code></pre></div><h2 id="suppress-specific-warnings-in-code">Suppress specific warnings in code</h2>
<ul>
<li><a href="http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas">Clang Compiler User’s Manual — Clang 3.4 documentation</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objective-c" data-lang="objective-c"><span class="line"><span class="cl"><span class="cp">#pragma clang diagnostic push
</span></span></span><span class="line"><span class="cl"><span class="cp">#pragma clang diagnostic ignored &#34;-Wwarning-type&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp">#pragma clang diagnostic ignored &#34;-Wanother-warning&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">// …
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#pragma clang diagnostic pop
</span></span></span></code></pre></div><h2 id="temporarily-silence-unused-variables-warning">Temporarily silence unused variables warning</h2>
<ul>
<li><a href="http://stackoverflow.com/questions/17622237/which-is-the-best-way-to-suppress-unused-variable-warning">Which is the best way to suppress &ldquo;unused variable&rdquo; warning - Stack Overflow</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">__unused</span> <span class="kt">int</span> <span class="n">someVar</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">someVar</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="cp">#pragma unused (someVar, anotherVar)
</span></span></span></code></pre></div><h2 id="xcode-custom-build-phases">Xcode custom build phases</h2>
<ul>
<li><a href="http://deallocatedobjects.com/posts/show-todos-and-fixmes-as-warnings-in-xcode-4">Deallocated Objects - Show TODO&rsquo;s And FIXME&rsquo;s As Warnings In Xcode 4</a></li>
</ul>
<p><em>… TODO &amp; FIXME comments as warnings</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">KEYWORDS</span><span class="o">=</span><span class="s">&#34;TODO:|FIXME:|\?\?\?:|\!\!\!:&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">find</span> <span class="s">&#34;${SRCROOT}&#34;</span> <span class="err">\</span><span class="p">(</span> <span class="o">-</span><span class="n">name</span> <span class="s">&#34;*.h&#34;</span> <span class="o">-</span><span class="n">or</span> <span class="o">-</span><span class="n">name</span> <span class="s">&#34;*.m&#34;</span> <span class="err">\</span><span class="p">)</span> <span class="o">-</span><span class="n">print0</span> <span class="o">|</span> <span class="n">xargs</span> <span class="o">-</span><span class="mi">0</span> <span class="n">egrep</span> <span class="o">--</span><span class="n">with</span><span class="o">-</span><span class="n">filename</span> <span class="o">--</span><span class="n">line</span><span class="o">-</span><span class="n">number</span> <span class="o">--</span><span class="n">only</span><span class="o">-</span><span class="n">matching</span> <span class="s">&#34;($KEYWORDS).*\$&#34;</span> <span class="o">|</span> <span class="n">perl</span> <span class="o">-</span><span class="n">p</span> <span class="o">-</span><span class="n">e</span> <span class="s">&#34;s/($KEYWORDS)/ warning: \$1/&#34;</span>
</span></span></code></pre></div><p>… show test coverage report</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">open</span> <span class="o">-</span><span class="n">g</span> <span class="o">-</span><span class="n">a</span> <span class="n">Xcoverage</span><span class="p">.</span><span class="n">app</span> <span class="s">&#34;$OBJECT_FILE_DIR-normal/$CURRENT_ARCH&#34;</span> <span class="o">&gt;/</span><span class="n">dev</span><span class="o">/</span><span class="n">null</span> <span class="mi">2</span><span class="o">&gt;&amp;</span><span class="mi">1</span> <span class="o">||</span> <span class="nb">true</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ OpenSolaris</title>
      <link>https://hugo.ferreira.cc/opensolaris/</link>
      <pubDate>Fri, 15 Jul 2011 01:05:09 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/opensolaris/</guid>
      <description>Small information nuggets and recipies about OpenSolaris</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="joyent-quick-guide">Joyent quick guide</h2>
<ul>
<li><a href="http://wiki.joyent.com/accelerators:kb:shell-cheatsheet">Cheat-sheet: Useful Shell Commands [Joyent Wiki]</a></li>
</ul>
<blockquote>
<ul>
<li>Disk free, listed in Gig <code>df -ht</code></li>
<li>Good view of both processor and memory statistics <code>prstat -Z -s cpu</code></li>
<li>Processes currently running <code>ps -elf</code></li>
<li>Admin user processes <code>ps -uadmin -o pcpu,user,pid,args,comm,s</code></li>
<li>Another Admin user process list <code>ps -uadmin -o user,args,pcpu,pmem,vsz,time,comm</code></li>
<li>Mysql user processes <code>ps -umysql -o pcpu,vsz,osz,args,comm,s</code></li>
<li>True Virtual memory usage on <a href="https://web.archive.org/web/20100115191521/http://discuss.joyent.com/viewtopic.php?pid=146936#p146936">S or M size</a> <code>prstat -Z</code></li>
<li>True Virtual memory usage on <a href="https://web.archive.org/web/20100115191521/http://discuss.joyent.com/viewtopic.php?pid=146936#p146936">Shared Solaris Hosting</a> <code>prstat -J</code></li>
<li>Virtual memory statistics <code>vmstat 5 5</code></li>
<li>Swap disk status (Solaris) <code>swap -l</code></li>
<li>Report per processor statistics <code>mpstat 5 5 or psrinfo</code></li>
<li>A site with some useful commands: <a href="http://www.rocket99.com/unix/unix1.html">http://www.rocket99.com/unix/unix1.html</a></li>
</ul>
</blockquote>
<h2 id="show-accelerator-id">Show accelerator id</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zonename
</span></span></code></pre></div><h2 id="show-cpu-info">Show cpu info</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">psrinfo -v
</span></span></code></pre></div><h2 id="info-about-processes-and-zones">Info about processes and zones</h2>
<p><em>… column RSS = memory</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">prstat -Z
</span></span></code></pre></div><h2 id="service-management">Service management</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">svcs -a                     <span class="c1"># status of all the services</span>
</span></span><span class="line"><span class="cl">svcs -vx                    <span class="c1"># what is not running but should</span>
</span></span><span class="line"><span class="cl">svcs -x name                <span class="c1"># details on a specific service name</span>
</span></span><span class="line"><span class="cl">svcadm action name          <span class="c1"># enable|disable|restart a service by name</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ Apple</title>
      <link>https://hugo.ferreira.cc/apple/</link>
      <pubDate>Tue, 01 Jan 2008 12:07:52 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/apple/</guid>
      <description>Small information nuggets and recipies about Apple OS’s</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="list-all-registered-url-schemes">List all registered url schemes</h2>
<ul>
<li><a href="https://apple.stackexchange.com/a/397188">applications - What are all of the URI Schemes Available on macOS - Ask Different</a></li>
</ul>
<pre tabindex="0"><code>/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump URLSchemeBinding
</code></pre><p>or, to make it more readily available:</p>
<pre tabindex="0"><code>alias lsregister=&#39;/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister&#39;
lsregister -dump URLSchemeBinding
</code></pre><h2 id="access-unicode-characters-for-keyboard-symbols">Access unicode characters for keyboard symbols</h2>
<ul>
<li>
<p><a href="https://apple.stackexchange.com/a/293486">keyboard - Where can I find the unicode symbols for Mac functional keys? (Command, Shift, etc.) - Ask Different</a></p>
<blockquote>
<p>You can click the ⚙️ or (•••) button &gt; <strong>Customize List</strong> and enable additional unicode characters groups, including <strong>Code Tables &gt; Unicode</strong> which will show the full unicode table grouped by categories.</p>
<p>The ⌘ ⇪⌥ ⏎ symbols are grouped under the <strong>Symbols &gt; Technical Symbols</strong> category which you can enable for quick access</p>
</blockquote>
</li>
<li>
<p>Interesting categories to enable:</p>
<ul>
<li>Symbols &gt; Musical Symbols</li>
<li>Symbols &gt; Signs and Standard Symbols</li>
<li>Symbols &gt; Technical Symbol</li>
</ul>
</li>
</ul>
<h2 id="link-to-notes">Link to Notes</h2>
<style type="text/css">
    .notice {
        --root-color: #444;
        --root-background: #eff;
        --title-color: #fff;
        --title-background: #7bd;
        --warning-title: #c33;
        --warning-content: #fee;
        --info-title: #fb7;
        --info-content: #fec;
        --note-title: #6be;
        --note-content: #e7f2fa;
        --tip-title: #5a5;
        --tip-content: #efe;
    }

    @media (prefers-color-scheme:dark) {
        .notice {
            --root-color: #ddd;
            --root-background: #eff;
            --title-color: #fff;
            --title-background: #7bd;
            --warning-title: #800;
            --warning-content: #400;
            --info-title: #a50;
            --info-content: #420;
            --note-title: #069;
            --note-content: #023;
            --tip-title: #363;
            --tip-content: #121;
        }
    }

    body.dark .notice, [data-theme="dark"] .notice {
        --root-color: #ddd;
        --root-background: #eff;
        --title-color: #fff;
        --title-background: #7bd;
        --warning-title: #800;
        --warning-content: #400;
        --info-title: #a50;
        --info-content: #420;
        --note-title: #069;
        --note-content: #023;
        --tip-title: #363;
        --tip-content: #121;
    }

    .notice {
        padding: 18px;
        line-height: 24px;
        margin-bottom: 24px;
        border-radius: 4px;
        color: var(--root-color);
        background: var(--root-background);
    }

    .notice p:last-child {
        margin-bottom: 0;
    }

    .notice-title {
        margin: -18px -18px 12px;
        padding: 4px 18px;
        border-radius: 4px 4px 0 0;
        font-weight: 700;
        color: var(--title-color);
        background: var(--title-background);
    }

    .notice.warning .notice-title {
        background: var(--warning-title);
    }

    .notice.warning {
        background: var(--warning-content);
    }

    .notice.info .notice-title {
        background: var(--info-title);
    }

    .notice.info {
        background: var(--info-content);
    }

    .notice.note .notice-title {
        background: var(--note-title);
    }

    .notice.note {
        background: var(--note-content);
    }

    .notice.tip .notice-title {
        background: var(--tip-title);
    }

    .notice.tip {
        background: var(--tip-content);
    }

    .icon-notice {
        display: inline-flex;
        align-self: center;
        margin-right: 8px;
    }

    .icon-notice img, .icon-notice svg {
        height: 1em;
        width: 1em;
        fill: currentColor;
    }

    .icon-notice img, .icon-notice.baseline svg {
        top: .125em;
        position: relative;
    }
</style><div class="notice tip" >
    <p class="notice-title">
        <span class="icon-notice baseline">
            <svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="m429-336 238-237-51-51-187 186-85-84-51 51 136 135Zm51 240q-79 0-149-30t-122.5-82.5Q156-261 126-331T96-480q0-80 30-149.5t82.5-122Q261-804 331-834t149-30q80 0 149.5 30t122 82.5Q804-699 834-629.5T864-480q0 79-30 149t-82.5 122.5Q699-156 629.5-126T480-96Z"/></svg>
        </span>Tip</p><p><strong>Apple Notes</strong> now allows crating links to notes from any text, which exposes the note url via an easy “<strong>Copy link</strong>” action:</p>
<ul>
<li><a href="https://support.apple.com/guide/notes/add-links-apde615d29c2/mac#apd01aa2d97c">Add links in Notes on Mac # Link to another note - Apple Support</a></li>
<li><a href="https://support.apple.com/guide/iphone/add-links-iph908d1558b/ios#iph311d60862">Add links in Notes on iPhone # Link to another note using custom link text - Apple Support</a></li>
</ul></div>

<ul>
<li>To find out the id of a Note use shortcut <a href="https://showcuts.app/share/view/e370c4eacc7441a18e7ec95667b2e32f">Get URL of Note</a> (via <a href="https://www.reddit.com/r/shortcuts/comments/aot272/get_url_of_note_copy_note_url_to_clipboard">iBanks3</a>)</li>
</ul>
<ol>
<li>
<p>Run shortcut <strong>Get URL of Note</strong></p>
</li>
<li>
<p>Enter node <code>Note</code> and check the <code>LNEntity</code> Supported Type to get the UUID, e.g.:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;LNEntity:</span> <span class="err">0x123456789,</span> <span class="err">identifier:</span> <span class="err">NoteEntity/applenotes:note/12345678-abcd-bcde-cdef-123456789012,</span> <span class="err">...</span>
</span></span></code></pre></div><p>➔<code>12345678-abcd-bcde-cdef-123456789012</code></p>
</li>
<li>
<p>Convert the UUID to ALL CAPS (<em>for example, using <a href="https://convertcase.net/">Convert Case</a> or the <strong>Pages</strong> app</em>):</p>
<p>➔<code>12345678-ABCD-BCDE-CDEF-123456789012</code></p>
</li>
<li>
<p>Append it to the url sheme to open Notes:</p>
<p><mark>➔<code>applenotes://showNote?identifier=12345678-ABCD-BCDE-CDEF-123456789012</code></mark></p>
</li>
</ol>
<p><em>Note</em>: Sometimes you might get the following error:</p>
<blockquote>
<p><strong>An error occurred while running Get URL of Note</strong><br>
Couldn&rsquo;t communicate with a helper application.</p>
</blockquote>
<p>I haven’t found any way around it other than trying again some other time 🤷‍♂️ — restarts haven’t helped at all.</p>
<h2 id="enable-touch-id-for-sudo">Enable Touch ID for sudo</h2>
<ul>
<li><a href="https://sixcolors.com/post/2020/11/quick-tip-enable-touch-id-for-sudo/">Quick Tip: Enable Touch ID for sudo – Six Colors</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> /etc/pam.d/ <span class="o">&amp;&amp;</span> sudo chmod a+w sudo <span class="o">&amp;&amp;</span> vi sudo <span class="o">&amp;&amp;</span> sudo chmod a-w sudo <span class="o">&amp;&amp;</span> <span class="nb">cd</span> -
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># sudo: auth account password session</span>
</span></span><span class="line"><span class="cl">auth       sufficient     pam_tid.so        <span class="c1"># &lt;= add this line here</span>
</span></span><span class="line"><span class="cl">auth       sufficient     pam_smartcard.so
</span></span><span class="line"><span class="cl">auth       required       pam_opendirectory.so
</span></span><span class="line"><span class="cl">account    required       pam_permit.so
</span></span><span class="line"><span class="cl">password   required       pam_deny.so
</span></span><span class="line"><span class="cl">session    required       pam_permit.so
</span></span></code></pre></div><h2 id="remove-quarantine">Remove quarantine</h2>
<p><em>… “‘command’ cannot be opened because the developer cannot be verified.”</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">xattr -d com.apple.quarantine /usr/local/bin/cmd
</span></span></code></pre></div><h2 id="file-extended-attributes">File extended attributes</h2>
<p><em>… list attributes</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ls -l -@ file
</span></span><span class="line"><span class="cl">xattr file
</span></span></code></pre></div><p><em>… show values</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">xattr -l file
</span></span><span class="line"><span class="cl">xattr -p attribute file
</span></span></code></pre></div><h2 id="add-to-sudoers-without-needing-a-restart">Add to sudoers without needing a restart</h2>
<ul>
<li><a href="https://apple.stackexchange.com/questions/76088/how-do-i-give-a-user-sudo-permissions/76096#76096">macos - How do I give a user sudo permissions? - Ask Different</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">su - admin
</span></span></code></pre></div><p><em>… add</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo dseditgroup -o edit -a hugo -t user admin
</span></span><span class="line"><span class="cl">sudo dseditgroup -o edit -a hugo -t user wheel
</span></span></code></pre></div><p><em>… delete</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo dseditgroup -o edit -d hugo -t user admin
</span></span><span class="line"><span class="cl">sudo dseditgroup -o edit -d hugo -t user wheel
</span></span></code></pre></div><h2 id="create-encrypted-zip-file">Create encrypted zip file</h2>
<ul>
<li><a href="http://www.koozie.org/blog/2014/08/creating-aes256-encrypted-zip-archive-files-mac-command-line/">Creating AES256 encrypted Zip Archive Files on a Mac from the Command Line</a></li>
<li><a href="https://security.stackexchange.com/questions/186128/what-encryption-method-is-used-by-the-zip-program-in-macos/186132#186132">macosx - What encryption method is used by the zip program in macOS? - Information Security Stack Exchange</a></li>
</ul>
<p><em>… install</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew install p7zip
</span></span></code></pre></div><p><em>… create</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">7za a -tzip -mem<span class="o">=</span>AES256 -p secrets-encrypted.zip secrets/
</span></span><span class="line"><span class="cl">7za x secrets-encrypted.zip
</span></span></code></pre></div><h2 id="view-and-change-file-flags">View and change file flags</h2>
<p><em>… invisible = <code>hidden</code>; visible = <code>nohidden</code></em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ touch seeme hideme
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ chflags hidden hideme
</span></span><span class="line"><span class="cl">$ chflags nohidden seeme
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ls -lO *me  <span class="c1"># -O is an “oh” not a “zero”</span>
</span></span><span class="line"><span class="cl">-rw-r--r--  <span class="m">1</span> hugo  staff  hidden <span class="m">0</span> Mar <span class="m">12</span> 11:28 hideme
</span></span><span class="line"><span class="cl">-rw-r--r--  <span class="m">1</span> hugo  staff  -      <span class="m">0</span> Mar <span class="m">12</span> 11:28 seeme
</span></span></code></pre></div><h2 id="reset-unlocking-macbook-by-apple-watch">Reset unlocking MacBook by Apple Watch</h2>
<ul>
<li>In <strong>Messages</strong>
<ul>
<li>Preferences ➤ Accounts</li>
<li>Sign Out</li>
<li>Sign In</li>
</ul>
</li>
<li>In <strong>System Preferences</strong>
<ul>
<li>Security &amp; Privacy</li>
<li>Check “Allow your Apple Watch to unlock you Mac”</li>
</ul>
</li>
</ul>
<h2 id="why-does-it-keep-waking-from-sleep">Why does it keep waking from sleep?</h2>
<ul>
<li><a href="https://support.apple.com/en-us/HT204760">If your Mac doesn&rsquo;t sleep or wake when expected - Apple Support</a></li>
<li><a href="http://osxdaily.com/2010/07/17/why-mac-wakes-from-sleep/">Determine Why Your Mac Wakes Up From Sleep</a></li>
</ul>
<p><em>… definition of log terms</em></p>
<ul>
<li><strong>OHC</strong> (Open Host Controller) is usually USB or Firewire. OHC1 or OHC2 is almost certainly an <strong>external USB keyboard or mouse</strong></li>
<li><strong>EHC</strong> (Enhanced Host Controller) is another USB interface, but can also be <strong>wireless devices and bluetooth</strong></li>
<li><strong>USB</strong> when a USB device woke the machine up</li>
<li><strong>LID0</strong> when you open the lid the machine wakes up from sleep</li>
<li><strong>PWRB</strong> (Power Button) which is the <strong>physical power button</strong> on your Mac</li>
<li><strong>RTC</strong> (Real Time Clock Alarm) is generally from <strong>wake-on-demand services</strong>
<ul>
<li>Schedule sleep and wake via the Energy Saver control panel</li>
<li><code>launchd</code> setting</li>
<li>User applications</li>
<li>Backups</li>
<li>Other scheduled events</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">log show --last 1d --predicate <span class="s1">&#39;eventMessage contains &#34;Wake reason&#34;&#39;</span>
</span></span><span class="line"><span class="cl">log show --last 1d <span class="p">|</span> grep -C15 -i <span class="s2">&#34;wake reason&#34;</span>
</span></span></code></pre></div><h2 id="delete-old-time-machine-backups">Delete old Time Machine backups</h2>
<ul>
<li><a href="https://apple.stackexchange.com/questions/39287/how-can-i-manually-delete-old-backups-to-free-space-for-time-machine/55646#55646">macos - How can I manually delete old backups to free space for Time Machine? - Ask Different</a></li>
<li><a href="https://apple.stackexchange.com/a/404761">time machine - Remove unnecessary backups from TimeMachine to get space - Ask Different</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">tmutil listbackups
</span></span><span class="line"><span class="cl">sudo tmutil delete /Volumes/<span class="o">[</span>Disk<span class="o">]</span>/Backups.backupdb/<span class="o">[</span>Name<span class="o">]</span>/2000-00-00-000000
</span></span><span class="line"><span class="cl">sudo tmutil delete /Volumes/<span class="o">[</span>Disk<span class="o">]</span>/Backups.backupdb/<span class="o">[</span>Name<span class="o">]</span>/2000-*
</span></span></code></pre></div><h2 id="use-keychain-for-unlocking-ssh-private-key">Use Keychain for unlocking SSH private key</h2>
<ul>
<li><a href="http://apple.stackexchange.com/questions/254468/macos-sierra-doesn-t-seem-to-remember-ssh-keys-between-reboots/264974#264974">terminal - macOS Sierra doesn’t seem to remember SSH keys between reboots - Ask Different</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">Host *
</span></span><span class="line"><span class="cl">   AddKeysToAgent yes
</span></span><span class="line"><span class="cl">   UseKeychain yes
</span></span><span class="line"><span class="cl">   IdentityFile ~/.ssh/id_rsa
</span></span></code></pre></div><h2 id="spoof-mac-address">Spoof MAC address</h2>
<ul>
<li><a href="http://osxdaily.com/2012/03/01/change-mac-address-os-x/">Change (Spoof) a MAC Address in OS X Mountain Lion &amp; Mavericks</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">openssl rand -hex <span class="m">6</span> <span class="p">|</span> sed <span class="s1">&#39;s/\(..\)/\1:/g; s/.$//&#39;</span>  <span class="c1"># make</span>
</span></span><span class="line"><span class="cl">sudo ifconfig en0 ether xx:xx:xx:xx:xx:xx  <span class="c1"># set</span>
</span></span><span class="line"><span class="cl">ifconfig en0 <span class="p">|</span>grep ether  <span class="c1"># check</span>
</span></span></code></pre></div><h2 id="consult-timestamps-on-safari-history">Consult timestamps on Safari history</h2>
<ul>
<li><a href="http://stackoverflow.com/a/34546556/1380781">sqlite - What format is the Safari History.db history_visits.visit_time in? - Stack Overflow</a></li>
<li><a href="https://apple.stackexchange.com/a/313670/66527">See website visit time in Safari history - Ask Different</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sqlite3 ~/Library/Safari/History.db
</span></span><span class="line"><span class="cl">sqlite&gt; .headers on
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">datetime</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">visit_time</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">978307200</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;unixepoch&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;localtime&#39;</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nb">date</span><span class="p">,</span><span class="w"> </span><span class="n">v</span><span class="p">.</span><span class="n">visit_time</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">978307200</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">epoch</span><span class="p">,</span><span class="w"> </span><span class="n">v</span><span class="p">.</span><span class="n">visit_time</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">.</span><span class="n">domain_expansion</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">.</span><span class="n">url</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">history_items</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">left</span><span class="w"> </span><span class="k">join</span><span class="w"> </span><span class="n">history_visits</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">i</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v</span><span class="p">.</span><span class="n">history_item</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">i</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="k">desc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">limit</span><span class="w"> </span><span class="mi">100</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>Quick one-liner to paste into the Terminal:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sqlite3 ~/Library/Safari/History.db <span class="s2">&#34;select datetime(v.visit_time + 978307200, &#39;unixepoch&#39;, &#39;localtime&#39;) as date, v.title, i.url from history_items i left join history_visits v on i.id = v.history_item order by v.visit_time desc;&#34;</span> <span class="p">|</span> less
</span></span></code></pre></div><h2 id="homebrew-remove-formula-and-its-dependencies-if-not-in-use">Homebrew: Remove formula and its dependencies, if not in use</h2>
<ul>
<li><a href="https://github.com/Homebrew/homebrew/issues/7465#issuecomment-49252187">Add an option to <code>brew rm</code> to uninstall / remove a package, including all it&rsquo;s dependencies. · Issue #7465 · Homebrew/homebrew</a></li>
<li><a href="https://github.com/beeftornado/homebrew-rmtree">beeftornado/homebrew-rmtree - Ruby</a></li>
</ul>
<p><em>… installing command</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew tap beeftornado/rmtree <span class="o">&amp;&amp;</span> brew install brew-rmtree
</span></span></code></pre></div><p><em>… removing a formula</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew rmtree --dry-run formula
</span></span></code></pre></div><h2 id="homebrew-show-installed-formulae-and-dependencies">Homebrew: Show installed formulae and dependencies</h2>
<p><em>… top-level only</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew leaves
</span></span></code></pre></div><p><em>… all dependencies</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew deps --installed <span class="o">[</span>--tree<span class="o">]</span>
</span></span></code></pre></div><p><em>… what uses a dependency</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew uses --installed --recursive formula
</span></span></code></pre></div><h2 id="homebrew-quick-guide">Homebrew quick guide</h2>
<ul>
<li><a href="https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/FAQ.md#faq">homebrew/FAQ.md at master · Homebrew/homebrew · GitHub</a></li>
</ul>
<p><em>… installed things</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew list
</span></span></code></pre></div><p><em>… bumping version</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew update                       <span class="c1"># Homebrew itself</span>
</span></span><span class="line"><span class="cl">brew outdated                     <span class="c1"># Formulas</span>
</span></span><span class="line"><span class="cl">brew upgrade <span class="o">[</span><span class="nv">$FORMULA</span><span class="o">]</span>           <span class="c1"># Formulas</span>
</span></span></code></pre></div><p><em>… clearing things</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew list --versions --multiple
</span></span><span class="line"><span class="cl">brew cleanup -n                   <span class="c1"># dry run</span>
</span></span><span class="line"><span class="cl">brew cleanup <span class="o">[</span><span class="nv">$FORMULA</span><span class="o">]</span>
</span></span></code></pre></div><h2 id="homebrew-using-caskroom-sources">Homebrew: Using Caskroom sources</h2>
<ul>
<li><a href="http://caskroom.io/">Homebrew Cask</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew tap caskroom/cask
</span></span><span class="line"><span class="cl">brew cask info Caskroom/cask/rowanj-gitx
</span></span></code></pre></div><h2 id="test-and-debug-launchagents-and-launchdaemons">Test and debug LaunchAgents and LaunchDaemons</h2>
<ul>
<li><a href="http://tim.vanwerkhoven.org/post/2011/11/17/OSX-launchd-and-launchctl-issues">OSX launchd and launchctl issues - Tim&rsquo;s blag</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo launchctl log level debug
</span></span><span class="line"><span class="cl">tail -f /var/log/system.log
</span></span><span class="line"><span class="cl">sudo launchctl log level error
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">launchctl list <span class="o">[</span>cc.ferreira.backlog.daily<span class="o">]</span>
</span></span><span class="line"><span class="cl">launchctl start cc.ferreira.backlog.daily
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">launchctl unload -w ~/Library/LaunchAgents/cc.ferreira.backlog.daily.plist 
</span></span><span class="line"><span class="cl">launchctl load -w ~/Library/LaunchAgents/cc.ferreira.backlog.daily.plist 
</span></span></code></pre></div><h2 id="resolve-host-from-ip">Resolve host from IP</h2>
<ul>
<li><em>with zeroconf / Multicast DNS / mDNS</em></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">dig +short -x 192.168.1.65 -p <span class="m">5353</span> @224.0.0.251
</span></span></code></pre></div><h2 id="disablerevoke-disk-decryption-from-a-user">Disable/revoke disk decryption from a user</h2>
<ul>
<li><em>for FileVault 2</em></li>
<li><a href="http://apple.stackexchange.com/questions/18358/disable-a-users-ability-to-unlock-a-filevault-2-volume-at-startup-login-time/53803#53803">osx - Disable a user&rsquo;s ability to unlock a FileVault 2 volume at startup/login time - Ask Different</a></li>
<li><a href="http://www.tuaw.com/2011/12/12/prevent-certain-accounts-from-unlocking-filevault-2/">Prevent certain accounts from unlocking FileVault 2 | TUAW - The Unofficial Apple Weblog</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo su - testing  
</span></span><span class="line"><span class="cl">$ passwd 
</span></span><span class="line"><span class="cl">Changing password <span class="k">for</span> charlie.
</span></span><span class="line"><span class="cl">Old Password:                     <span class="c1"># [enter old password here]</span>
</span></span><span class="line"><span class="cl">New Password:                     <span class="c1"># [press enter]</span>
</span></span><span class="line"><span class="cl">Retype New Password:              <span class="c1"># [press enter]</span>
</span></span></code></pre></div><ul>
<li>System Preferences ➤ Security &amp; Privacy ➤ FileVault
<ul>
<li>Enable Users …</li>
<li>Set Password …</li>
</ul>
</li>
</ul>
<h2 id="create-user-manually-without-disk-encryption-rights">Create user manually without disk encryption rights</h2>
<ul>
<li><em>for FileVault 2</em></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing
</span></span><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing UserShell /bin/bash
</span></span><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing RealName <span class="s2">&#34;Testing&#34;</span>
</span></span><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing UniqueID <span class="m">503</span>
</span></span><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing PrimaryGroupID <span class="m">1000</span>
</span></span><span class="line"><span class="cl">sudo dscl /Local/Default -create /Users/testing NFSHomeDirectory /Users/testing
</span></span><span class="line"><span class="cl">sudo passwd testing
</span></span></code></pre></div><h2 id="check-user-definitions">Check user definitions</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo dscl /Local/Default -read /Users/testing
</span></span></code></pre></div><h2 id="where-the-modem-passwords-are-stored">Where the modem passwords are stored</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat /Library/Preferences/SystemConfiguration/preferences.plist
</span></span></code></pre></div><h2 id="where-the-dhcp-leases-are-stored">Where the dhcp leases are stored</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cat /var/db/dhcpd_leases
</span></span></code></pre></div><h2 id="flush-dns-cache">Flush DNS cache</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo dscacheutil -flushcache
</span></span></code></pre></div><h2 id="force-spotlight-to-re-index">Force Spotlight to re-index</h2>
<ul>
<li><a href="http://support.apple.com/kb/HT2409">Spotlight: How to re-index folders or volumes</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo mdutil -E /
</span></span></code></pre></div><h2 id="remove-duplicates-in-the-open-with-menu">Remove duplicates in the &ldquo;Open With&rdquo; menu</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> /System/Library/Frameworks/ApplicationServices.framework/<span class="se">\F</span>rameworks/LaunchServices.framework/Support/
</span></span><span class="line"><span class="cl">lsregister -kill -r -domain <span class="nb">local</span> -domain system -domain user
</span></span></code></pre></div><h2 id="view-resource-forks"><del>View resource forks</del></h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># DEPRECATED: ls -l path/to/file/rsrc</span>
</span></span></code></pre></div><h2 id="mysql-server">MySQL server</h2>
<p><em>… MacPorts</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">su - admin -c <span class="s2">&#34;sudo mysql.server start | stop | …&#34;</span>
</span></span></code></pre></div><p><em>… Homebrew</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">su - admin<span class="p">;</span> mysql.server start <span class="p">|</span> stop <span class="p">|</span> …
</span></span></code></pre></div><h2 id="iphoto-speedup">iPhoto speedup</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> Pictures/iPhoto<span class="se">\ </span>Library/
</span></span><span class="line"><span class="cl"><span class="k">for</span> db in *.db<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    sqlite3 <span class="nv">$db</span> <span class="s2">&#34;vacuum;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span></code></pre></div><h2 id="stop-nmbd">Stop nmbd</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo launchctl unload /System/Library/LaunchDaemons/nmbd.plist
</span></span></code></pre></div><h2 id="quit-application">Quit application</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">osascript -e <span class="s1">&#39;tell app &#34;iCal&#34; to quit&#39;</span>
</span></span></code></pre></div><h2 id="old-style-sleep-mode">“Old” style sleep mode</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pmset -g <span class="p">|</span> grep hibernatemode
</span></span><span class="line"><span class="cl">sudo pmset -a hibernatemode <span class="m">0</span>
</span></span></code></pre></div><h2 id="eject-cd">Eject cd</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">drutil tray eject
</span></span></code></pre></div><h2 id="text-styles-and-substitutions">Text styles and substitutions</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">open ~/Library/Preferences/.GlobalPreferences.plist
</span></span><span class="line"><span class="cl"><span class="c1"># See `NSFavoriteStyles`</span>
</span></span><span class="line"><span class="cl"><span class="c1"># See `NSUserReplacementItems`</span>
</span></span></code></pre></div><h2 id="open-man-pages-in-pdf">Open man pages in PDF</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">man -t opensnoop <span class="p">|</span> open -f -a /Applications/Preview.app
</span></span></code></pre></div><h2 id="startstop-local-ftp-server">Start/Stop local FTP Server</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>✂️ webMethods</title>
      <link>https://hugo.ferreira.cc/webmethods/</link>
      <pubDate>Mon, 26 Feb 2007 01:04:25 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/webmethods/</guid>
      <description>Small information nuggets and recipies about webMethods</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="installer">Installer</h2>
<p><em>… running installer from a jar</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">java</span><span class="w"> </span><span class="o">-</span><span class="n">Xmx1024m</span><span class="w"> </span><span class="o">-</span><span class="n">Xincgc</span><span class="w"> </span><span class="o">-</span><span class="n">jar</span><span class="w"> </span><span class="n">webMethodsInstaller71</span><span class="p">.</span><span class="na">jar</span><span class="w">
</span></span></span></code></pre></div><h2 id="diagnostics-info">Diagnostics info</h2>
<p><em>… Integration Server</em></p>
<ul>
<li>
<p>Thread Dump (&ldquo;Administering Integration Server&rdquo;, section &ldquo;Generating Thread Dumps&rdquo;):</p>
<ol>
<li>&ldquo;Server&rdquo; ➤ &ldquo;Statistics page&rdquo;</li>
<li>Under &ldquo;Usage&rdquo;, click the &ldquo;Current number of System Threads&rdquo;</li>
<li>Click &ldquo;Generate JVM Thread Dump&rdquo;</li>
</ol>
</li>
<li>
<p>Diagnostic Data (&ldquo;Administering Integration Server&rdquo;, section &ldquo;Using the Diagnostic Utility&rdquo;):</p>
<ul>
<li>svc: <code>wm.server.admin:getDiagnosticData</code></li>
<li>url: <code>http://localhost:5555/invoke/wm.server.admin/getDiagnosticData</code></li>
<li>out: <code>C:\SoftwareAG\IntegrationServer\logs\diagnostic_data.zip</code></li>
</ul>
</li>
</ul>
<p><em>… Mediator</em></p>
<ul>
<li>svc: <code>mediator.util:mediatorDiagnosticZip</code></li>
<li>url: <code>http://localhost:5555/invoke/mediator.util:mediatorDiagnosticZip</code></li>
<li>out: <code>&lt;download&gt;</code></li>
</ul>
<p><em>… My webMethods Server</em></p>
<ul>
<li>See &ldquo;Diagnosing My webMethods Server&rdquo; PDF document
<ul>
<li>cmd:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl"><span class="k">copy</span> C:\SoftwareAG\MWS\components\extras\analysis\wm_eventscollector.pdp C:\SoftwareAG\MWS\server\default\deploy
</span></span><span class="line"><span class="cl"><span class="k">cd</span> SoftwareAG\MWS\tools\env_capture
</span></span><span class="line"><span class="cl">run -s default
</span></span></code></pre></div></li>
<li>out: <code>C:\SoftwareAG\MWS\tools\env_capture\portal-env.zip</code></li>
</ul>
</li>
</ul>
<p><em>… Optimize</em></p>
<ul>
<li>cmd: Navigate ➤ Applications ➤ Administration ➤ Analytics ➤ Diagnostics</li>
<li>out: <code>export.csv</code></li>
</ul>
<h2 id="broker-setup">Broker setup</h2>
<p><em>… see &ldquo;webMethods Broker Administrators Guide.pdf&rdquo;</em></p>
<ul>
<li>
<p>Create shared broker with more storage</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">-session_config qs
</span></span><span class="line"><span class="cl">-qs_log_file &lt;datadir&gt;/Broker.qs.log 128M            #   8  [32]  128
</span></span><span class="line"><span class="cl">-qs_storage_file &lt;datadir&gt;/Broker.qs.stor 2048M 256M # 256 [512] 1024
</span></span><span class="line"><span class="cl">                                                        #   ?  [64]    ?
</span></span></code></pre></div></li>
<li>
<p>Increase storage cache size (&ldquo;should at least be the size of the log file&rdquo;)</p>
<ol>
<li>Edit: <code>awbroker.cfg</code></li>
<li>Add: <code>storage-max-cache-size=512 # [128]</code></li>
</ol>
</li>
</ul>
<h2 id="broker-install-problems">Broker install problems</h2>
<p><em>… aborted or interrupted installation</em></p>
<ol>
<li>
<p>Delete directories:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\WINDOWS\activesw</span>
</span></span><span class="line"><span class="cl">{WM_HOME}\Broker\data\awbrokers61 (?)
</span></span></code></pre></div></li>
<li>
<p>Delete services from registry:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ActiveWorksBrokerMonitor_3.0
</span></span><span class="line"><span class="cl">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\webMethodsBroker_6.1_6849
</span></span></code></pre></div></li>
</ol>
<h2 id="integration-server">Integration Server</h2>
<p><em>… see &ldquo;webMethods Integration Server Administrators Guide.pdf&rdquo;</em></p>
<ul>
<li>url: <a href="http://localhost:5555">http://localhost:5555</a></li>
<li>url: <a href="http://localhost:9999">http://localhost:9999</a> (diagnostics port with a dedicated thread)</li>
</ul>
<p><em>… default users</em></p>
<ul>
<li>file: <code>{WM_HOME}/IntegrationServer/config/users.cnf</code>
<ul>
<li>user: <code>Administrator</code> / <code>manage</code>
<ul>
<li>hash: <code>vI5TC3V31VdoYdyukqpb7AYXHXQ</code></li>
</ul>
</li>
<li>user: <code>Developer</code> / <code>isdev</code></li>
<li>user: <code>Replicator</code> / <code>iscopy</code></li>
</ul>
</li>
</ul>
<p>… <em>starting up</em></p>
<ol>
<li>
<p>Debug/Safe mode:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\bin\server.bat -debug 4 -log none
</span></span><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\bin\server.bat -safeboot
</span></span></code></pre></div></li>
<li>
<p>If it fails to run after improper shutdown, delete file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\LOCKFILE
</span></span></code></pre></div></li>
<li>
<p>To run as a service, use installation file:</p>
<ul>
<li><a href="http://www.wmusers.com/wmusers/messages/1825/36646.shtml">http://www.wmusers.com/wmusers/messages/1825/36646.shtml</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\support\win32\installSvc.bat
</span></span></code></pre></div></li>
<li>
<p>When running multiple instances on the same machine, tweak:</p>
<ul>
<li><a href="http://www.wmusers.com/wmusers/messages/1825/1045.shtml">http://www.wmusers.com/wmusers/messages/1825/1045.shtml</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\bin\ini.cnf
</span></span><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\bin\jcode.bat
</span></span></code></pre></div></li>
<li>
<p>Setup X-Referencing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\config\server.cnf
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-properties" data-lang="properties"><span class="line"><span class="cl"><span class="na">watt.server.xref.type</span><span class="o">=</span><span class="s">jdbc</span>
</span></span><span class="line"><span class="cl"><span class="c1"># jdbc - use connection pool</span>
</span></span><span class="line"><span class="cl"><span class="c1"># repo - use repository (see clustering) [default]</span>
</span></span></code></pre></div></li>
</ol>
<p><em>… extended settings</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">watt.server.ns.hideWmRoot=false
</span></span></code></pre></div><h2 id="repo-server">Repo Server</h2>
<p>To be able to start it after the initial setup:</p>
<ol>
<li>
<p>Manually create logs directory:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\reposerver\log directory
</span></span></code></pre></div></li>
<li>
<p>Create lib directory and put there the JDBC Driver jar:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WM_HOME}\IntegrationServer\reposerver\lib
</span></span></code></pre></div><p>or else you&rsquo;ll get the error:</p>
<blockquote>
<p>[ISC.0067.0099C] Repository Server initialization failed</p>
</blockquote>
</li>
<li>
<p>Install fix <code>IS_6-1_Fix14</code> to run as a service or else it aborts starting up:</p>
<ul>
<li><a href="http://www.wmusers.com/wmusers/messages/1825/36668.shtml">http://www.wmusers.com/wmusers/messages/1825/36668.shtml</a></li>
</ul>
<blockquote>
<p>System error 1067 has occurred.</p>
</blockquote>
</li>
</ol>
<h2 id="jdbc-adapter">Jdbc adapter</h2>
<ul>
<li>URL format, see &ldquo;IntegrationServerAdminGuide.pdf&rdquo; (pag. 86)</li>
</ul>
<p><em>… Oracle</em>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">jdbc:wm:oracle://host_or_IPaddress:1521;SID=database_name
</span></span></code></pre></div><p><em>… SQL Server</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">jdbc:wm:sqlserver://host_or_IPaddress:1433
</span></span><span class="line"><span class="cl">    ;databaseName=database_name
</span></span><span class="line"><span class="cl">    ;SelectMethod=cursor
</span></span></code></pre></div><p><em>… DB2 UDB</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">jdbc:wm:db2://host_or_IPaddress:50000
</span></span><span class="line"><span class="cl">    ;databaseName=database_name
</span></span><span class="line"><span class="cl">    ;PackageName=package_name
</span></span><span class="line"><span class="cl">    ;CreateDefaultPackage=true
</span></span><span class="line"><span class="cl">    ;ReplacePackage=true
</span></span></code></pre></div><p><em>… DB2 (AS/400)</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">jdbc:wm:db2://host_or_IPaddress:446
</span></span><span class="line"><span class="cl">    ;LocationName=location_to_access
</span></span><span class="line"><span class="cl">    ;PackageName=package_name
</span></span><span class="line"><span class="cl">    ;AlternateId=schema_to_use
</span></span><span class="line"><span class="cl">    ;CollectionId=package_collection
</span></span></code></pre></div><p><em>… driver classes</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// DataDirect Connect</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">com</span><span class="p">.</span><span class="na">wm</span><span class="p">.</span><span class="na">dd</span><span class="p">.</span><span class="na">jdbc</span><span class="p">.</span><span class="na">oracle</span><span class="p">.</span><span class="na">OracleDriver</span><span class="w">       </span><span class="c1">// JDBC Oracle Driver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">com</span><span class="p">.</span><span class="na">wm</span><span class="p">.</span><span class="na">dd</span><span class="p">.</span><span class="na">jdbc</span><span class="p">.</span><span class="na">sqlserver</span><span class="p">.</span><span class="na">SQLServerDriver</span><span class="w"> </span><span class="c1">// JDBC SQL Server Driver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">com</span><span class="p">.</span><span class="na">wm</span><span class="p">.</span><span class="na">dd</span><span class="p">.</span><span class="na">jdbc</span><span class="p">.</span><span class="na">db2</span><span class="p">.</span><span class="na">DB2Driver</span><span class="w">             </span><span class="c1">// JDBC DB2 Driver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">com</span><span class="p">.</span><span class="na">wm</span><span class="p">.</span><span class="na">dd</span><span class="p">.</span><span class="na">jdbc</span><span class="p">.</span><span class="na">sybase</span><span class="p">.</span><span class="na">SybaseDriver</span><span class="w">       </span><span class="c1">// JDBC Sybase Driver: TN Only</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// DataDirect SequeLink</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">com</span><span class="p">.</span><span class="na">merant</span><span class="p">.</span><span class="na">sequelink</span><span class="p">.</span><span class="na">jdbc</span><span class="p">.</span><span class="na">SequeLinkDriver</span><span class="w"> </span><span class="c1">// JDBC Driver: TN Only</span><span class="w">
</span></span></span></code></pre></div><p><em>… adapter services</em></p>
<ol>
<li>Copy an existing connection in the admin pages</li>
<li>Find dependents on the old connection</li>
<li>For each service, call the <code>WmART</code> package service <code>pub.art.service:setAdapterServiceNodeConnection</code> using the service name and the new connection alias</li>
<li>For each notification, call the <code>WmART</code> package service <code>pub.art.notification:setPollingNotificationNodeConnection</code> instead</li>
</ol>
<ul>
<li><em>NOTE: use different connections for adapter services and adapter notifications <mark>(HF: why?)</mark></em></li>
</ul>
<h2 id="debug-from-java-or-jsp-to-serverlog">Debug from Java or JSP to <code>server.log</code></h2>
<p><em>… send <code>DEBUG</code> messages directly to the <code>server.log</code> from inside an IS java service</em></p>
<ul>
<li>
<p>Used in the implementation of the <code>pub.flow.debugLog</code> service:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">com</span><span class="p">.</span><span class="na">wm</span><span class="p">.</span><span class="na">util</span><span class="p">.</span><span class="na">JournalLogger</span><span class="p">.</span><span class="na">log</span><span class="p">(</span><span class="n">3</span><span class="p">,</span><span class="w"> </span><span class="n">90</span><span class="p">,</span><span class="w"> </span><span class="n">4</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;message&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">//  3 ... param = &#34;code&#34;    , value = ?!?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// 90 ... param = &#34;facility&#34;, value = FAC_FLOW_SVC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">//  4 ... param = &#34;severity&#34;, value = DEBUG</span><span class="w">
</span></span></span></code></pre></div></li>
</ul>
<h2 id="my-webmethods-server-mws">My webMethods Server (MWS)</h2>
<p><em>… configure database access without using the installer</em></p>
<ul>
<li>Edit file: <code>webMethods7\MWS\server\default\config\db.xml</code></li>
</ul>
<p><em>… example connection block, using a local Oracle 10g XE</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;CONNECTION</span> <span class="na">default=</span><span class="s">&#34;true&#34;</span> <span class="na">displayname=</span><span class="s">&#34;Default&#34;</span> <span class="na">id=</span><span class="s">&#34;1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">name=</span><span class="s">&#34;default&#34;</span> <span class="na">type=</span><span class="s">&#34;oracle&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;SQLWORKERCLASS&gt;</span>com.webmethods.portal.service.sql.core.BaseSqlWorker<span class="nt">&lt;/SQLWORKERCLASS&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;CONNPROVIDERCLASS&gt;</span>com.webmethods.portal.service.sql.core.provider.pool.PooledConnectionProvider<span class="nt">&lt;/CONNPROVIDERCLASS&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;PARAMS&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;DRIVER&gt;</span>com.wm.dd.jdbc.oracle.OracleDriver<span class="nt">&lt;/DRIVER&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;URL&gt;</span>jdbc:wm:oracle://localhost:1521;serviceName=XE<span class="nt">&lt;/URL&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;USER&gt;</span>wm<span class="nt">&lt;/USER&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;PASSWORD&gt;</span>{DES}MddXF68fUu0=<span class="nt">&lt;/PASSWORD&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;MAXCONNECTIONS&gt;</span>100<span class="nt">&lt;/MAXCONNECTIONS&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;CACHESTATEMENTS&gt;</span>false<span class="nt">&lt;/CACHESTATEMENTS&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;TESTSQL&gt;</span>SELECT 1 FROM DUAL<span class="nt">&lt;/TESTSQL&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/PARAMS&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/CONNECTION&gt;</span>
</span></span></code></pre></div><p><em>… change web service timeout for a CAF application</em></p>
<ul>
<li>url: <a href="http://localhost:8585">http://localhost:8585</a></li>
<li>user: <code>sysadmin</code></li>
<li>pass: <code>manage</code></li>
<li>path: Folders ➤ Administrative Folders ➤ Administration Dashboard ➤ Configuration ➤ CAF Application Runtime Configuration</li>
</ul>
<h2 id="designer">Designer</h2>
<h3 id="preferences-to-prevent-slow-background-operations">Preferences to prevent slow background operations</h3>
<ul>
<li>Open menu &ldquo;Windows&rdquo; ➤ &ldquo;Preferences&hellip;&rdquo; and, on the left side panel, select:
<ul>
<li><em>Version 7.x</em>
<ol>
<li>Server
<ul>
<li>Uncheck &ldquo;Automatically publish to local servers&rdquo;</li>
<li>Uncheck &ldquo;Automatically publish to remote servers&rdquo;</li>
</ul>
</li>
<li>Validation
<ul>
<li>Check &ldquo;Suspend all validators&rdquo;</li>
</ul>
</li>
<li>webMethods ➤ Metadata Library
<ul>
<li>Check &ldquo;Disable Workspace Asset Indexing (takes effect on next restart)&rdquo;</li>
</ul>
</li>
</ol>
</li>
<li><em>Version 8.x</em>
<ol>
<li>Open each MwS on the server panel (right-click)
<ul>
<li>Check &ldquo;Never publish automatically&rdquo;</li>
</ul>
</li>
<li>Validation
<ul>
<li>Check &ldquo;Suspend all validators&rdquo;</li>
</ul>
</li>
<li>Software AG ➤ Workspace Index
<ul>
<li>Check &ldquo;Disable Workspace Indexing&rdquo;</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<h3 id="setup-problems-with-cafdefaultruntime">Setup problems with <code>caf.default.runtime</code></h3>
<ul>
<li>
<p>Eclipse workspace default runtime settings file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{WORKSPACE_HOME}\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.wst.server.core.prefs
</span></span><span class="line"><span class="cl">{WORKSPACE_HOME}\.metadata\.plugins\org.eclipse.jst.j2ee.ui\dialog_settings.xml
</span></span><span class="line"><span class="cl">{WORKSPACE_HOME}\.metadata\.plugins\org.eclipse.wst.server.core\servers.xml
</span></span></code></pre></div></li>
<li>
<p>In each portlet project:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">{PORTLET_HOME}\.classpath
</span></span><span class="line"><span class="cl">{PORTLET_HOME}\.settings\org.eclipse.jst.common.project.facet.core.prefs
</span></span><span class="line"><span class="cl">{PORTLET_HOME}\.settings\org.eclipse.wst.common.project.facet.core.xml
</span></span></code></pre></div></li>
</ul>
<h3 id="cag-project-not-compiling-andor-not-showing-portlets-in-the-solutions">CAG: Project not compiling and/or not showing portlets in the solutions</h3>
<p><em>NOTE: If on Windows, make sure there are no &ldquo;hidden&rdquo; or &ldquo;read-only&rdquo; files in the portlet project.</em></p>
<p>In the &ldquo;Navigator&rdquo; tab, the project folder needs to have a &ldquo;world&rdquo; icon to be considered a CAF project. If not</p>
<ol>
<li>Select &ldquo;Project&rdquo; ➤ &ldquo;Properties&rdquo;</li>
<li>Select &ldquo;Project Facets&rdquo; (on the left side panel)
<ul>
<li>Press &ldquo;Modify Project&hellip;&rdquo;</li>
<li>Select in the Configurations: &ldquo;CAF Portlet Application&rdquo;</li>
<li>Press &ldquo;Finish&rdquo;</li>
</ul>
</li>
<li>Select &ldquo;Java Build Path&rdquo; (on the left side panel)
<ul>
<li>Remove duplicates ➤ Ok ➤ Add single again</li>
</ul>
</li>
</ol>
<h3 id="caf-object-ids-formats">CAF: Object ids formats</h3>
<ul>
<li><a href="http://ajax-softwareag.com/articles/N7M0TP/DesignerOnlineHelp/caf_controls_id_ref.html">http://ajax-softwareag.com/articles/N7M0TP/DesignerOnlineHelp/caf_controls_id_ref.html</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">:myForm:myObject                  // absolute
</span></span><span class="line"><span class="cl">myForm:myObject                   // relative
</span></span><span class="line"><span class="cl">myPortleAlias#myForm:myObject     // external
</span></span><span class="line"><span class="cl">$myObject                         // raw html
</span></span></code></pre></div><h3 id="caf-get-object-by-id">CAF: Get object by id</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">CAF</span><span class="p">.</span><span class="na">model</span><span class="p">(</span><span class="s">&#34;#{activePageBean.clientIds[&#39;objectId&#39;]}&#34;</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h3 id="caf-soap-monitor">CAF: SOAP monitor</h3>
<ul>
<li>
<p>install:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl"><span class="k">copy</span> {WM_HOME}\MWS\components\development\tools\wm_soapmonitor.pdp {WM_HOME}\MWS\server\default\deploy
</span></span></code></pre></div></li>
<li>
<p>execute: <a href="http://server:8585/portlet/wm_soapmonitor">http://server:8585/portlet/wm_soapmonitor</a></p>
</li>
</ul>
<h3 id="caf-client-side-logger">CAF: Client side logger</h3>
<ul>
<li><a href="http://ajax-softwareag.com/articles/N7M0TP/DesignerOnlineHelp/caf_cls_logger.html">http://ajax-softwareag.com/articles/N7M0TP/DesignerOnlineHelp/caf_cls_logger.html</a></li>
</ul>
<p><em>… bookmarklet</em></p>
<ul>
<li>install: <a href="http://server:port/wm_cafshared/ui/js/bookmarklet/">http://server:port/wm_cafshared/ui/js/bookmarklet/</a></li>
<li>execute: <code>CAF Logger; List Scripts</code></li>
</ul>
<p><em>… Firebug</em></p>
<ul>
<li>
<p>You can direct CAF Logger messages to the Firebug console with the following Javascript:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Logger</span><span class="p">.</span><span class="nx">appendToFirebug</span><span class="p">();</span>
</span></span></code></pre></div></li>
<li>
<p>Alternately, you could start a <code>Logger.FirebugAppender</code> instance that listens to a custom log level and/or category (so as to avoid all the CAF debug messages):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Logger</span><span class="p">.</span><span class="nx">history</span><span class="p">.</span><span class="nx">replay</span><span class="p">(</span><span class="k">new</span> <span class="nx">Logger</span><span class="p">.</span><span class="nx">FirebugAppender</span><span class="p">(</span><span class="nx">Logger</span><span class="p">.</span><span class="nx">INFO</span><span class="p">,</span> <span class="s2">&#34;my-category&#34;</span><span class="p">).</span><span class="nx">start</span><span class="p">().</span><span class="nx">append</span><span class="p">);</span>
</span></span></code></pre></div></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>✂️ Oracle</title>
      <link>https://hugo.ferreira.cc/oracle/</link>
      <pubDate>Sat, 15 Jan 2005 01:05:07 +0000</pubDate>
      <guid>https://hugo.ferreira.cc/oracle/</guid>
      <description>Small information nuggets and recipies about Oracle</description>
      <content:encoded><![CDATA[<p><em>(most recent on top)</em></p>
<h2 id="database-defaults">Database defaults</h2>
<ul>
<li>DBNAME: <code>ORCL</code></li>
<li>SID: <code>ORCL</code></li>
<li>Users
<ul>
<li>user/pass: <code>scott</code>  / <code>tiger</code></li>
<li>user/pass: <code>SYSTEM</code> / <code>oracle</code></li>
<li>user/pass: <code>SYS</code> / <code>oracle</code></li>
</ul>
</li>
</ul>
<h2 id="services">Services</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-batch" data-lang="batch"><span class="line"><span class="cl">net start OracleOraHome92TNSListener
</span></span><span class="line"><span class="cl">net start OracleServiceORCL
</span></span></code></pre></div><h2 id="oracle-sqlplus">Oracle SQL*Plus</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="k">all</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">set</span><span class="w"> </span><span class="n">sqlprompt</span><span class="w"> </span><span class="s1">&#39;&amp;_user@&amp;_connect_identifier &gt; &#39;</span><span class="w">
</span></span></span></code></pre></div><p><em>… output config</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">set</span><span class="w"> </span><span class="n">pagesize</span><span class="w"> </span><span class="mi">50000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">set</span><span class="w"> </span><span class="n">linesize</span><span class="w"> </span><span class="mi">120</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">set</span><span class="w"> </span><span class="n">wrap</span><span class="w"> </span><span class="k">off</span><span class="w">
</span></span></span></code></pre></div><p><em>… limit  rows</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">dual</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">rownum</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><em>… table info</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="k">owner</span><span class="p">,</span><span class="w"> </span><span class="k">table_name</span><span class="p">,</span><span class="w"> </span><span class="n">num_rows</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">all_tables</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">desc</span><span class="w"> </span><span class="o">&lt;</span><span class="n">tablename</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></div><h2 id="oracle-sql-developer">Oracle SQL Developer</h2>
<p><em>… easier navigation via “Schema Browser”</em></p>
<blockquote>
<ol>
<li>Right-click on a connection name</li>
<li>Select “Schema Browser”</li>
<li>Filter the list in the bottom search box</li>
</ol>
</blockquote>
<h2 id="sql-queries">SQL queries</h2>
<h3 id="describe-constraint">Describe constraint</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">ALL_CONS_COLUMNS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="k">constraint_name</span><span class="o">=</span><span class="s1">&#39;&lt;name&gt;&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="k">position</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="turn-constraints-onoff">Turn constraints on/off</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">alter</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="o">&lt;</span><span class="n">tbl_name</span><span class="o">&gt;</span><span class="w"> </span><span class="n">disable</span><span class="w"> </span><span class="k">constraint</span><span class="w"> </span><span class="o">&lt;</span><span class="n">cons_name</span><span class="o">&gt;</span><span class="w"> </span><span class="p">[</span><span class="k">cascade</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">alter</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="o">&lt;</span><span class="n">tbl_name</span><span class="o">&gt;</span><span class="w"> </span><span class="n">enable</span><span class="w"> </span><span class="k">constraint</span><span class="w"> </span><span class="o">&lt;</span><span class="n">cons_name</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></div><h3 id="parentchild-hierarchical-relationship">Parent/child hierarchical relationship</h3>
<ul>
<li>table: <code>entity</code></li>
<li>key: <code>id</code></li>
<li>field: <code>parentId</code></li>
</ul>
<h4 id="filter-over-the-results">Filter over the results</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="o">&lt;</span><span class="n">condition</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></div><h4 id="get-children-of--all-below-including-root">Get children of <code>?</code> (all below, including root)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="o">&lt;</span><span class="n">stop_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">nocycle</span><span class="w"> </span><span class="k">prior</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentId</span><span class="w">
</span></span></span></code></pre></div><h4 id="get-children-of--all-below-excluding-root">Get children of <code>?</code> (all below, excluding root)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="o">&lt;</span><span class="n">stop_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">parentId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">nocycle</span><span class="w"> </span><span class="k">prior</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parentId</span><span class="w">
</span></span></span></code></pre></div><h4 id="get-parents-of--all-above-including-self">Get parents of <code>?</code> (all above, including self)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="o">&lt;</span><span class="n">stop_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">nocycle</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">prior</span><span class="w"> </span><span class="n">parentId</span><span class="w">
</span></span></span></code></pre></div><h4 id="get-siblings-of--same-parent">Get siblings of <code>?</code> (same parent)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">join</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e2</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">parentId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- same behaviour with sub query (`e1` and `e2` added for clarity)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">select</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">parentId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e2</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h4 id="get-far-away-from--above-and-others">Get far away from <code>?</code> (above and others)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">join</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e2</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">nocycle</span><span class="w"> </span><span class="k">prior</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- same behaviour with sub query (`e1` and `e2` added for clarity)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">select</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">e1</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">select</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">from</span><span class="w"> </span><span class="n">entity</span><span class="w"> </span><span class="n">e2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">start</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">connect</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">nocycle</span><span class="w"> </span><span class="k">prior</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">e2</span><span class="p">.</span><span class="n">parentId</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><mark><em>👆 HF: Not tested, needs validation!</em></mark></p>
<h2 id="support">Support</h2>
<h3 id="show-database-version">Show database version</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">v$version</span><span class="w">
</span></span></span></code></pre></div><h3 id="list-database-sessions">List database sessions</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">v$session</span><span class="w">
</span></span></span></code></pre></div><h3 id="kill-a-session">Kill a session</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">alter</span><span class="w"> </span><span class="k">system</span><span class="w"> </span><span class="n">kill</span><span class="w"> </span><span class="k">session</span><span class="w"> </span><span class="s1">&#39;35, 5842&#39;</span><span class="w">        </span><span class="c1">-- &#39;sid, serial&#39;
</span></span></span></code></pre></div><h3 id="what-is-a-database-process-doing">What is a database process doing?</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">hash_value</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">piece</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">sql_text</span><span class="p">,</span><span class="w"> </span><span class="n">se</span><span class="p">.</span><span class="o">*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">v$session</span><span class="w"> </span><span class="n">se</span><span class="p">,</span><span class="w"> </span><span class="n">v$sqltext_with_newlines</span><span class="w"> </span><span class="n">s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">hash_value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">se</span><span class="p">.</span><span class="n">sql_hash_value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">se</span><span class="p">.</span><span class="n">sql_hash_value</span><span class="p">,</span><span class="w"> </span><span class="n">sid</span><span class="p">,</span><span class="w"> </span><span class="n">piece</span><span class="w">
</span></span></span></code></pre></div><h3 id="which-tables-are-locked">Which tables are locked?</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">object_name</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">object_type</span><span class="p">,</span><span class="w"> </span><span class="n">o</span><span class="p">.</span><span class="n">session_id</span><span class="p">,</span><span class="w"> </span><span class="n">o</span><span class="p">.</span><span class="n">oracle_username</span><span class="p">,</span><span class="w"> </span><span class="n">o</span><span class="p">.</span><span class="n">os_user_name</span><span class="p">,</span><span class="w"> </span><span class="n">o</span><span class="p">.</span><span class="n">locked_mode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">v$locked_object</span><span class="w"> </span><span class="n">o</span><span class="p">,</span><span class="w"> </span><span class="n">all_objects</span><span class="w"> </span><span class="n">a</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">object_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">o</span><span class="p">.</span><span class="n">object_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">object_name</span><span class="w">
</span></span></span></code></pre></div><h3 id="increase-number-of-processes-sessions-connections-in-oracle-xe">Increase number of processes, sessions, connections in Oracle XE</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">C</span><span class="p">:</span><span class="err">\</span><span class="o">&gt;</span><span class="n">sqlplus</span><span class="w"> </span><span class="o">/</span><span class="n">nolog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="k">connect</span><span class="w"> </span><span class="n">sys</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">sysdba</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="k">connect</span><span class="w"> </span><span class="n">sys</span><span class="o">/</span><span class="k">admin</span><span class="o">@</span><span class="n">localhost</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">sysdba</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="k">parameter</span><span class="w"> </span><span class="n">processes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="k">alter</span><span class="w"> </span><span class="k">system</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">processes</span><span class="o">=</span><span class="mi">150</span><span class="w"> </span><span class="k">scope</span><span class="o">=</span><span class="n">spfile</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="n">shutdown</span><span class="w"> </span><span class="k">immediate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="n">startup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SQL</span><span class="o">&gt;</span><span class="w"> </span><span class="n">exit</span><span class="w">
</span></span></span></code></pre></div><h2 id="tunning">Tunning</h2>
<h3 id="check-dbms_monitor-since-oracle-database-10g">Check DBMS_MONITOR, since Oracle Database 10g</h3>
<ul>
<li><a href="http://www.oracle.com/technology/oramag/oracle/04-sep/o54talking.html">http://www.oracle.com/technology/oramag/oracle/04-sep/o54talking.html</a></li>
</ul>
<h3 id="check-statistics-for-tables">Check statistics for tables</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="k">table_name</span><span class="p">,</span><span class="w"> </span><span class="n">last_analyzed</span><span class="p">,</span><span class="w"> </span><span class="n">num_rows</span><span class="p">,</span><span class="w"> </span><span class="n">blocks</span><span class="p">,</span><span class="w"> </span><span class="n">empty_blocks</span><span class="p">,</span><span class="w"> </span><span class="n">avg_row_len</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">dba_tables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="k">owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;SCHEMA_NAME&#39;</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;TABLE_NAME&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="k">table_name</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="check-statistics-for-indexes">Check statistics for indexes</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="k">table_name</span><span class="p">,</span><span class="w"> </span><span class="n">index_name</span><span class="p">,</span><span class="w"> </span><span class="n">last_analyzed</span><span class="p">,</span><span class="w"> </span><span class="n">num_rows</span><span class="p">,</span><span class="w"> </span><span class="n">leaf_blocks</span><span class="p">,</span><span class="w"> </span><span class="n">blevel</span><span class="p">,</span><span class="w"> </span><span class="n">clustering_factor</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">dba_indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="k">owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;SCHEMA_NAME&#39;</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;TABLE_NAME&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="k">table_name</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="view-long-operations">View long operations</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">v$session_longops</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">target</span><span class="w"> </span><span class="k">like</span><span class="w"> </span><span class="s1">&#39;SCHEMA_NAME.%&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">start_time</span><span class="w"> </span><span class="k">desc</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="what-is-doing-full-table-scans">What is doing full table scans?</h3>
<ul>
<li><em>FTS = Full Table Scans</em></li>
<li><a href="http://www.dba-oracle.com/art_otn_cbo_p8.htm">http://www.dba-oracle.com/art_otn_cbo_p8.htm</a></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="k">owner</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">num_rows</span><span class="p">,</span><span class="w"> </span><span class="n">ltrim</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="k">cache</span><span class="p">)</span><span class="w"> </span><span class="n">ch</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">decode</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">buffer_pool</span><span class="p">,</span><span class="s1">&#39;KEEP&#39;</span><span class="p">,</span><span class="s1">&#39;Y&#39;</span><span class="p">,</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">,</span><span class="s1">&#39;N&#39;</span><span class="p">)</span><span class="w"> </span><span class="n">K</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">s</span><span class="p">.</span><span class="n">blocks</span><span class="w"> </span><span class="n">blocks</span><span class="p">,</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">executions</span><span class="p">)</span><span class="w"> </span><span class="n">nbr_FTS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w"> </span><span class="n">dba_tables</span><span class="w"> </span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="n">dba_segments</span><span class="w"> </span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">v$sqlarea</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">select</span><span class="w"> </span><span class="k">distinct</span><span class="w"> </span><span class="n">address</span><span class="p">,</span><span class="w"> </span><span class="n">object_owner</span><span class="w"> </span><span class="k">owner</span><span class="p">,</span><span class="w"> </span><span class="n">object_name</span><span class="w"> </span><span class="n">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">from</span><span class="w"> </span><span class="n">v$sql_plan</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">where</span><span class="w"> </span><span class="k">operation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;TABLE ACCESS&#39;</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="k">options</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;FULL&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">)</span><span class="w"> </span><span class="n">p</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">address</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">and</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="k">owner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">and</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">table_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">segment_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">and</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">table_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">and</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="k">owner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">and</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">owner</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;SYS&#39;</span><span class="p">,</span><span class="s1">&#39;SYSTEM&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">having</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">executions</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">group</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="k">owner</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">num_rows</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="k">cache</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">buffer_pool</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">blocks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="k">sum</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">executions</span><span class="p">)</span><span class="w"> </span><span class="k">desc</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded>
    </item>
  </channel>
</rss>
