<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss">
  <channel>
    <title>MR70</title>
    <link>https://www.mr70.eu/</link>
    <description>Recent content on MR70</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>MR70 - [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/).</copyright>
    <lastBuildDate>Tue, 26 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.mr70.eu/index.xml" rel="self" type="application/rss+xml" /><icon>https://www.mr70.eu/logo.svg</icon>
    
    
    <item>
      <title>Connecting Microsoft Copilot Studio to an AWS Bedrock AgentCore Gateway</title>
      <link>https://www.mr70.eu/posts/copilot-studio-aws-agentcore-gateway-cognito/</link>
      <pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/copilot-studio-aws-agentcore-gateway-cognito/</guid>
      <description><![CDATA[<h2 id="overview">Overview</h2>
<p>Microsoft Copilot Studio supports the <strong>Model Context Protocol (MCP)</strong> to invoke external tools. AWS Bedrock AgentCore Gateway exposes MCP servers behind a JWT authentication layer. Connecting the two requires:</p>
<ol>
<li>A <strong>Cognito User Pool</strong> with an app client configured for the Authorization Code flow</li>
<li>An <strong>AgentCore Gateway</strong> with a CUSTOM_JWT authorizer that accepts the Copilot Studio client</li>
<li>A <strong>Gateway Target</strong> pointing to the MCP runtime</li>
</ol>
<p>The resulting architecture:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Copilot Studio → (OAuth2 Authorization Code) → Cognito → JWT
</span></span><span style="display:flex;"><span>     ↓
</span></span><span style="display:flex;"><span>AgentCore Gateway (validates JWT) → MCP Runtime → Tool
</span></span></code></pre></div><h2 id="prerequisites">Prerequisites</h2>
<ul>
<li>An AgentCore Gateway with a target configured to an MCP runtime</li>
<li>An Amazon Cognito User Pool with an active hosted UI domain</li>
<li>Admin access to the Copilot Studio portal</li>
</ul>
<h2 id="step-1--configure-the-cognito-app-client">Step 1 — Configure the Cognito app client</h2>
<p>The app client must support the <code>code</code> (Authorization Code) flow with a client secret:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>aws cognito-idp create-user-pool-client <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --region eu-west-1 <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --user-pool-id &lt;USER_POOL_ID&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --client-name <span style="color:#f1fa8c">&#34;copilot-studio-mcp&#34;</span> <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --generate-secret <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-flows code <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-scopes openid email profile mcp/invoke <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-flows-user-pool-client <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --supported-identity-providers COGNITO <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --callback-urls <span style="color:#f1fa8c">&#34;https://placeholder.example.com&#34;</span>
</span></span></code></pre></div><blockquote>
<p>The custom scope <code>mcp/invoke</code> must exist on a resource server in the User Pool. Create it if it doesn&rsquo;t exist:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>aws cognito-idp create-resource-server <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --region eu-west-1 <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --user-pool-id &lt;USER_POOL_ID&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --identifier mcp <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --name <span style="color:#f1fa8c">&#34;MCP Server Access&#34;</span> <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --scopes <span style="color:#f1fa8c">&#39;[{&#34;ScopeName&#34;:&#34;invoke&#34;,&#34;ScopeDescription&#34;:&#34;Invoke MCP server tools&#34;}]&#39;</span>
</span></span></code></pre></div></blockquote>
<h2 id="step-2--authorize-the-client-on-the-gateway">Step 2 — Authorize the client on the Gateway</h2>
<p>The Gateway must accept the new app client&rsquo;s <code>client_id</code> in its <code>allowedClients</code> list:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>aws bedrock-agentcore-control update-gateway <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --region eu-west-1 <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --gateway-id &lt;GATEWAY_ID&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --name &lt;GATEWAY_NAME&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --role-arn &lt;GATEWAY_ROLE_ARN&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --authorizer-type CUSTOM_JWT <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --protocol-configuration <span style="color:#f1fa8c">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;mcp&#34;: {
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;supportedVersions&#34;: [&#34;2025-03-26&#34;],
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;streamingConfiguration&#34;: {&#34;enableResponseStreaming&#34;: false}
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    }
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  }&#39;</span> <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --authorizer-configuration <span style="color:#f1fa8c">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;customJWTAuthorizer&#34;: {
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;discoveryUrl&#34;: &#34;https://cognito-idp.eu-west-1.amazonaws.com/&lt;USER_POOL_ID&gt;/.well-known/openid-configuration&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;allowedClients&#34;: [&#34;&lt;EXISTING_CLIENT_1&gt;&#34;, &#34;&lt;COPILOT_CLIENT_ID&gt;&#34;],
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;allowedScopes&#34;: [&#34;mcp/invoke&#34;, &#34;profile&#34;, &#34;openid&#34;, &#34;email&#34;]
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    }
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  }&#39;</span>
</span></span></code></pre></div><h2 id="step-3--configure-copilot-studio">Step 3 — Configure Copilot Studio</h2>
<p>In Copilot Studio: <strong>Agent → Tools → Add a tool → Add a Model Context Protocol server</strong>.</p>
<p>Select <strong>Manual</strong> as the OAuth type and fill in:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Client ID</td>
<td>The <code>client_id</code> created in Step 1</td>
</tr>
<tr>
<td>Client secret</td>
<td>The client&rsquo;s <code>client_secret</code></td>
</tr>
<tr>
<td>Authorization URL</td>
<td><code>https://&lt;DOMAIN&gt;.auth.eu-west-1.amazoncognito.com/oauth2/authorize</code></td>
</tr>
<tr>
<td>Token URL</td>
<td><code>https://&lt;DOMAIN&gt;.auth.eu-west-1.amazoncognito.com/oauth2/token</code></td>
</tr>
<tr>
<td>Refresh URL</td>
<td>(same as Token URL)</td>
</tr>
<tr>
<td>Scopes</td>
<td><code>openid email profile mcp/invoke</code></td>
</tr>
</tbody>
</table>
<p>After clicking <strong>Create</strong>, Copilot Studio generates a <strong>Redirect URL</strong>.</p>
<h2 id="step-4--register-the-redirect-url-in-cognito">Step 4 — Register the Redirect URL in Cognito</h2>
<p>Add the Copilot Studio redirect URL to the client&rsquo;s allowed callbacks:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>aws cognito-idp update-user-pool-client <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --region eu-west-1 <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --user-pool-id &lt;USER_POOL_ID&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --client-id &lt;COPILOT_CLIENT_ID&gt; <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --callback-urls <span style="color:#f1fa8c">&#34;https://global.consent.azure-apim.net/redirect/&lt;YOUR_COPILOT_CALLBACK&gt;&#34;</span> <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --supported-identity-providers COGNITO <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-flows code <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-scopes openid email profile mcp/invoke <span style="color:#f1fa8c">\
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span>  --allowed-o-auth-flows-user-pool-client
</span></span></code></pre></div><h2 id="step-5--test-the-connection">Step 5 — Test the connection</h2>
<p>Back in Copilot Studio, click <strong>Next → Create a new connection</strong> and authenticate with a Cognito user. If everything is configured correctly, Copilot Studio obtains an access token and starts invoking MCP tools.</p>
<h2 id="troubleshooting">Troubleshooting</h2>
<table>
<thead>
<tr>
<th>Error</th>
<th>Cause</th>
<th>Fix</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>insufficient_scope</code></td>
<td>The <code>client_id</code> is not in the Gateway&rsquo;s <code>allowedClients</code></td>
<td>Add it via <code>update-gateway</code> (Step 2)</td>
</tr>
<tr>
<td><code>invalid_scope</code></td>
<td>The scope doesn&rsquo;t exist on the resource server or isn&rsquo;t enabled on the client</td>
<td>Verify resource server and <code>AllowedOAuthScopes</code></td>
</tr>
<tr>
<td><code>redirect_uri mismatch</code></td>
<td>The Copilot redirect URL is not in the client&rsquo;s callbacks</td>
<td>Run Step 4</td>
</tr>
<tr>
<td><code>unsupported_grant_type</code></td>
<td>The client doesn&rsquo;t have the <code>code</code> flow enabled</td>
<td>Add <code>code</code> to <code>AllowedOAuthFlows</code></td>
</tr>
<tr>
<td><code>Failed to fetch outbound oauth token</code></td>
<td>The target&rsquo;s credential provider requests scopes invalid for <code>client_credentials</code></td>
<td>Use only custom scopes (e.g. <code>mcp/invoke</code>), not OIDC scopes</td>
</tr>
</tbody>
</table>
<h2 id="mcp-protocol-version">MCP protocol version</h2>
<p>Copilot Studio currently supports MCP protocol version <code>2025-03-26</code>. Make sure the Gateway is configured with this version in <code>supportedVersions</code>, otherwise the connection will fail silently.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Installing Ubuntu (and valetudo app) on my old Xiaomi Vacuum cleaner gen 1</title>
      <link>https://www.mr70.eu/posts/xiaomi-robot-vacum-cleaner-into-ubuntu/</link>
      <pubDate>Wed, 06 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/xiaomi-robot-vacum-cleaner-into-ubuntu/</guid>
      <description><![CDATA[<h2 id="installing-ubuntu-and-valetudo-app-on-my-xiaomi-vacuum-cleaner-gen-1">Installing Ubuntu (and valetudo app) on my Xiaomi Vacuum cleaner gen 1</h2>
<p>I have installed ubuntu on my old Xiaomi Vacuum cleaner gen 1 (&lt; year 2000) using OTA update. Now it cleans and speaks Italian funny messages with the voice of my children.</p>
<p>I just followed the suggestions from</p>
<ul>
<li>official valetudo website (<a href="https://builder.dontvacuum.me/index_xiaomi.html">https://builder.dontvacuum.me/index_xiaomi.html</a>) and</li>
<li><a href="https://www.ajfriesen.com/cloud-free-robot-vacuum/">https://www.ajfriesen.com/cloud-free-robot-vacuum/</a></li>
<li><a href="https://github.com/dgiese/dustcloud/tree/master/devices/xiaomi.vacuum/audio_generator">https://github.com/dgiese/dustcloud/tree/master/devices/xiaomi.vacuum/audio_generator</a> (/opt/rockrobo/resources/sounds/PRT)</li>
</ul>
<p>Before I had to hard reset it (pressing &ldquo;reset button&rdquo; with both buttons, after some seconds I released &ldquo;reset button&rdquo; and kept pressed the 2 buttons until I listened a chinese voice)</p>
<h2 id="system-info">System info</h2>
<p>Linux rockrobo 3.4.39 #1 SMP PREEMPT Sat Jan 9 09:34:52 UTC 2021 armv7l armv7l armv7l GNU/Linux</p>
<h2 id="disks">Disks</h2>
<p>Filesystem       Size  Used Avail Use% Mounted on
/dev/root        494M  390M   79M  84% /
devtmpfs         202M  4.0K  202M   1% /dev
none             4.0K     0  4.0K   0% /sys/fs/cgroup
tmpfs             30M  1.7M   29M   6% /tmp
none              50M  236K   50M   1% /run
none             5.0M     0  5.0M   0% /run/lock
tmpfs            100M  1.7M   99M   2% /run/shm
none             100M     0  100M   0% /run/user
/dev/mmcblk0p11   16M  1.6M   14M  11% /mnt/reserve
/dev/mmcblk0p6    16M  1.2M   14M   8% /mnt/default
/dev/mmcblk0p10  494M  261M  208M  56% /mnt/updbuf
/dev/mmcblk0p1   1.6G  176M  1.4G  12% /mnt/data</p>
<h2 id="cpus">CPUs</h2>
<p>Processor       : ARMv7 Processor rev 5 (v7l)
processor       : 0
BogoMIPS        : 3428.56</p>
<p>processor       : 1
BogoMIPS        : 3428.56</p>
<p>processor       : 2
BogoMIPS        : 3428.56</p>
<p>processor       : 3
BogoMIPS        : 3428.56</p>
<p>Features        : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5</p>
<p>Hardware        : sun8i
Revision        : 0000</p>
<h2 id="memory">Memory</h2>
<p>MemTotal:         510548 kB</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>msad - a cli for microsoft active directory</title>
      <link>https://www.mr70.eu/posts/msad-cli-active-directory/</link>
      <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/msad-cli-active-directory/</guid>
      <description><![CDATA[<h2 id="msad">msAD</h2>
<p><a href="https://github.com/matteoredaelli/msad">msad</a> is a library and command line tool for working with an Active Directory / LDAP server from Unix, Linux and MacOs systems.</p>
<p>It supports authentication with user/pwd and kerberos</p>
<p>It supports paginations: it can retreive more than 2000 objects (a limit of AD)</p>
<p>Features:</p>
<ul>
<li>search objects (users, groups, computers,..)</li>
<li>search (recursively) group memberships and all user&rsquo;s groups</li>
<li>add/remove members to/from AD groups using DN or sAMaccoutName</li>
<li>change AD passwords</li>
</ul>
<h2 id="usage">Usage</h2>
<p>msad search &ldquo;(samaccountname=matteo)&rdquo;  &ndash;out-format=json # show all attributes</p>
<p>msad search &ldquo;(cn=redaelli*)&rdquo; &ndash;attributes mail &ndash;attributes samaccountname &ndash;out-format=json</p>
<p>msad group-members qlik_analyzer_users &ndash;nested</p>
<p>msad group-add-member qlik_analyzer_users matteo</p>
<p>msad group-remove-member qlik_analyzer_users matteo</p>
<p>msad user-groups matteo &ndash;nested</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Camel K: howto deploy Apache Camel integrations in Kubernetes</title>
      <link>https://www.mr70.eu/posts/camel-kamel-k8s/</link>
      <pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/camel-kamel-k8s/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>In this article I&rsquo;ll show how to</p>
<ul>
<li>create a <a href="https://camel.apache.org">Apache Camel</a> integration (read data from a database Aws Redshift, processing each row calling a rest service and finally saving the output to aws S3 files).</li>
<li>deploy the integration to a Kubernetes (k8s) cluster using the command line tool <a href="https://camel.apache.org/camel-k/">Kamel</a>.
I&rsquo;ll use <a href="https://minikube.sigs.k8s.io/">Minikube</a> as a local Kubernetes cluster. Read the official documentation for installing it.</li>
</ul>
<h2 id="setup-kamel">Setup kamel</h2>
<p>As suggested by <a href="https://camel.apache.org/camel-k/2.6.x/installation/installation.html">Camel-k installation</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>minikube start
</span></span><span style="display:flex;"><span>minikube addons <span style="color:#8be9fd;font-style:italic">enable</span> registry
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>kubectl create ns camel-k
</span></span><span style="display:flex;"><span>kubectl config set-context --current --namespace<span style="color:#ff79c6">=</span>camel-k
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>kubectl apply -k github.com/apache/camel-k/install/overlays/kubernetes/descoped?ref<span style="color:#ff79c6">=</span>v2.6.0 --server-side
</span></span></code></pre></div><p>Create a file itp.yaml like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">apiVersion</span>: camel.apache.org/v1
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">kind</span>: IntegrationPlatform
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">labels</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">app</span>: camel-k
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">name</span>: camel-k
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">namespace</span>: camel-k
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">build</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">registry</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">address</span>: registry.io
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">organization</span>: camel-k
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">insecure</span>: <span style="color:#ff79c6">true</span>
</span></span></code></pre></div><p>And update the &ldquo;address&rdquo; with the ip shown by</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl -n kube-system get service registry -o <span style="color:#8be9fd;font-style:italic">jsonpath</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;{.spec.clusterIP}&#39;</span>
</span></span></code></pre></div><p>Then run</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl apply -f itp.yaml -n camel-k
</span></span><span style="display:flex;"><span>kubectl <span style="color:#8be9fd;font-style:italic">wait</span> --for <span style="color:#8be9fd;font-style:italic">jsonpath</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;{.status.phase}&#39;</span><span style="color:#ff79c6">=</span>Ready IntegrationPlatform camel-k --timeout 30s
</span></span></code></pre></div><h2 id="creating-an-integration-with-camel">Creating an integration with Camel</h2>
<p>File dbToRestToS3.yaml</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>- <span style="color:#ff79c6">from</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;direct:process_record&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">log</span>: <span style="color:#f1fa8c">&#34;${body}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">log</span>: <span style="color:#f1fa8c">&#34;${body[&#39;col1&#39;]}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">setHeader</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">name</span>: <span style="color:#f1fa8c">&#34;S3Filename&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">expression</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">simple</span>: <span style="color:#f1fa8c">&#34;testCanBeDelete/${body[&#39;col1&#39;]}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">setHeader</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">name</span>: <span style="color:#f1fa8c">&#34;CamelHttpUri&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">expression</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">simple</span>: <span style="color:#f1fa8c">&#34;https://api.restful-api.dev/objects?id=${body[&#39;col1&#39;]}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">setHeader</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">name</span>: <span style="color:#f1fa8c">&#34;CamelHttpMethod&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">constant</span>: <span style="color:#f1fa8c">&#34;GET&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">to</span>: <span style="color:#f1fa8c">&#34;http://RESTSERVICE&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">log</span>: <span style="color:#f1fa8c">&#34;${body}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">log</span>: <span style="color:#f1fa8c">&#34;${in.headers}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">to</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;kamelet:aws-s3-sink/myconfig&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">parameters</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">keyName</span>: <span style="color:#f1fa8c">&#34;${in.headers[&#39;S3Filename&#39;]}&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">from</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;direct:start&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">setBody</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">constant</span>: <span style="color:#f1fa8c">&#34;{}&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">to</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;kamelet:aws-redshift-sink&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">parameters</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">query</span>: select &#39;3&#39; as col1 union select &#39;4&#39; as col1
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">split</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">expression</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">simple</span>: <span style="color:#f1fa8c">&#34;${body}&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">steps</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ff79c6">to</span>:
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;direct:process_record&#34;</span>
</span></span><span style="display:flex;"><span>      
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">from</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;timer:tick?period=30000&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ff79c6">to</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#ff79c6">uri</span>: <span style="color:#f1fa8c">&#34;direct:start&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># - from:</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#     uri: &#34;cron:tab?schedule=*+*+*+*+?&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#     steps:</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#       - to: &#34;direct:start&#34;</span>
</span></span></code></pre></div><p>File redshift-sink.properties:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>camel.kamelet.aws-redshift-sink.serverPort: 5439
</span></span><span style="display:flex;"><span>camel.kamelet.aws-redshift-sink.username=myuser
</span></span><span style="display:flex;"><span>camel.kamelet.aws-redshift-sink.password=myprd
</span></span><span style="display:flex;"><span>camel.kamelet.aws-redshift-sink.query=select user
</span></span><span style="display:flex;"><span>camel.kamelet.aws-redshift-sink.databaseName=mydb
</span></span></code></pre></div><p>File aws-sink.properties:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>camel.kamelet.aws-s3-sink.myconfig.bucketNameOrArn=mybucket
</span></span><span style="display:flex;"><span>camel.kamelet.aws-s3-sink.myconfig.region=eu-west-1
</span></span><span style="display:flex;"><span>camel.kamelet.aws-s3-sink.myconfig.keyName=testCanBeDelete/replaceme
</span></span><span style="display:flex;"><span>camel.kamelet.aws-s3-sink.myconfig.accessKey=myaccessKey
</span></span><span style="display:flex;"><span>camel.kamelet.aws-s3-sink.myconfig.secretKey=mysecretKey
</span></span></code></pre></div><h2 id="deployment">Deployment</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kamel run dbToRestToS3.yaml --property file:redshift-sink.properties --property file:aws-sink.properties --dev
</span></span></code></pre></div><p>Or using secrets</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl create secret generic aws-sink-secret --from-file<span style="color:#ff79c6">=</span>aws-sink.properties
</span></span><span style="display:flex;"><span>kubectl create secret generic redshift-sink-secret --from-file<span style="color:#ff79c6">=</span>redshift-sink.properties
</span></span><span style="display:flex;"><span>kamel run --dev --config secret:redshift-sink-secret --config secret:aws-sink-secret dbToRestToS3.yaml
</span></span></code></pre></div><h2 id="logging">Logging</h2>
<p>In production you need to omit the option &ldquo;&ndash;dev&rdquo; and see logs with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>kubectl get pods -n 
</span></span><span style="display:flex;"><span>kubectl logs camel-k-operator-XXXX
</span></span><span style="display:flex;"><span>kamel get
</span></span><span style="display:flex;"><span>kamel logs db-to-rest-to-s3
</span></span></code></pre></div><h2 id="references">References</h2>
<ul>
<li><a href="https://camel.apache.org">Apache Camel</a></li>
<li><a href="https://camel.apache.org/camel-k/2.6.x/">Camel K</a></li>
<li><a href="https://minikube.sigs.k8s.io/">Minikube</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Mr Bates vs The Post Office</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-feb-2025/</link>
      <pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-feb-2025/</guid>
      <description><![CDATA[<p>Below my #prolog solution for <a href="https://dmcommunity.org/challenge/challenge-feb-2025/">Mr Bates vs The Post Office</a>.</p>
<p>The Post Office in DS City has come up with a new measure to limit packages that can be sent under a new flat rate, regardless of weight or volume. The &ldquo;strap measure&rdquo; of a box is the length of the longest side plus two times the sum of the two shorter sides. For the new flat rate for sending a packet, the strap measure may not exceed 100 inches.</p>
<p>Your e-commerce client Mr. Bates sells large comforters of 9,000 cubic inches in volume and wants to make use of this new flat rate if possible. What should the measurements of the packaging box be to maximize the volume of the package? Can you design a box that will be large enough to hold these comforters and that can be sent at the flat rate price?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>swipl dm-commumity-2025-02.pl
</span></span><span style="display:flex;"><span>?- findall<span style="color:#ff79c6">([</span>X,Y,Z<span style="color:#ff79c6">]</span>, sol<span style="color:#ff79c6">(</span>X,Y,Z<span style="color:#ff79c6">)</span>, Sol<span style="color:#ff79c6">)</span>.
</span></span><span style="display:flex;"><span>   <span style="color:#8be9fd;font-style:italic">Sol</span> <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">[[</span>30, 20, 15<span style="color:#ff79c6">]</span>, <span style="color:#ff79c6">[</span>40, 15, 15<span style="color:#ff79c6">]]</span>.
</span></span></code></pre></div><p>Below the Prolog code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:-<span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#8be9fd;font-style:italic">Y</span>,<span style="color:#8be9fd;font-style:italic">Z</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">X</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Y</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Z</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#bd93f9">9000</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">X</span> <span style="color:#ff79c6">*</span> <span style="color:#8be9fd;font-style:italic">Y</span> <span style="color:#ff79c6">*</span> <span style="color:#8be9fd;font-style:italic">Z</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">X</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#8be9fd;font-style:italic">Y</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Y</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#8be9fd;font-style:italic">Z</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#bd93f9">100</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#8be9fd;font-style:italic">X</span> <span style="color:#ff79c6">+</span> <span style="color:#bd93f9">2</span> <span style="color:#ff79c6">*</span> (<span style="color:#8be9fd;font-style:italic">Y</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Z</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">label</span>([<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#8be9fd;font-style:italic">Y</span>,<span style="color:#8be9fd;font-style:italic">Z</span>]).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Setting up a workstation/server and managing dotfiles centrally using Ansible and GNU Stow</title>
      <link>https://www.mr70.eu/posts/ansible_stow_dotfiles/</link>
      <pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ansible_stow_dotfiles/</guid>
      <description><![CDATA[<h2 id="about">About</h2>
<p>In the world of software development, maintaining a consistent and efficient development environment across multiple machines can be challenging. This blog post explores how to leverage two powerful tools, Ansible and GNU Stow, to automate the setup of your development environment and manage your dotfiles effectively.</p>
<h2 id="the-power-of-automation-with-ansible">The Power of Automation with Ansible</h2>
<p>Ansible is an open-source automation tool that excels in configuration management, application deployment, and task automation. Its key advantages include:</p>
<ol>
<li><strong>Agentless architecture</strong>: Ansible doesn&rsquo;t require any agents to be installed on managed nodes, making it lightweight and easy to set up.</li>
<li><strong>YAML-based playbooks</strong>: Ansible uses human-readable YAML files to describe automation jobs, making it easy to write and understand.</li>
<li><strong>Idempotency</strong>: Ansible ensures that running the same playbook multiple times produces the same result, making it safe to re-run automation scripts.</li>
<li><strong>Extensibility</strong>: With a vast collection of modules, Ansible can automate almost any IT task.</li>
</ol>
<h2 id="simplifying-dotfile-management-with-gnu-stow">Simplifying Dotfile Management with GNU Stow</h2>
<p>GNU Stow is a symlink farm manager that takes a different approach to managing dotfiles:</p>
<ol>
<li><strong>Symlink-based</strong>: Stow creates symlinks from your home directory to your actual dotfiles, keeping them organized in a separate directory.</li>
<li><strong>Package-oriented</strong>: It allows you to group related dotfiles into &ldquo;packages,&rdquo; making it easy to manage configurations for different tools.</li>
<li><strong>Non-intrusive</strong>: Stow doesn&rsquo;t overwrite existing files, ensuring the safety of your current configurations.</li>
<li><strong>Version control friendly</strong>: By keeping your dotfiles in a separate directory, it&rsquo;s easy to version control them with Git or other VCS tools.</li>
</ol>
<h2 id="putting-it-all-together">Putting It All Together</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir <span style="color:#8be9fd;font-style:italic">$HOME</span>/ansible_dotfile <span style="color:#6272a4"># should be in the $HOME</span>
</span></span><span style="display:flex;"><span>mkdir <span style="color:#8be9fd;font-style:italic">$HOME</span>/ansible_dotfile/dotfiles
</span></span><span style="display:flex;"><span>mkdir <span style="color:#8be9fd;font-style:italic">$HOME</span>/ansible_dotfile/dotfiles_work
</span></span></code></pre></div><p>Now put your configuration files (like .bash_profile, .config/emacs/init.el, .ssh/config in the &ldquo;dofiles&rdquo; subfolder (like $HOME/ansible_dotfile/dotfiles/.config/emacs/init.el)</p>
<p>Let&rsquo;s look at how we can combine Ansible and GNU Stow to set up a development environment and manage dotfiles. Here&rsquo;s a breakdown of the sample Ansible playbook bootstrap.yml:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#6272a4">## Run with ansible-playbook bootstrap.yml</span>
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">name</span>: Bootstrap environment for Matteo laptop
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">hosts</span>: localhost
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">tasks</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Update homebrew and upgrade all packages
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">community.general.homebrew</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">update_homebrew</span>: <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">upgrade_all</span>: <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Install packages with brew
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">community.general.homebrew</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">name</span>:
</span></span><span style="display:flex;"><span>          - awscli
</span></span><span style="display:flex;"><span>          - dbeaver-community
</span></span><span style="display:flex;"><span>          - devtunnel
</span></span><span style="display:flex;"><span>          - emacs
</span></span><span style="display:flex;"><span>          - firefox
</span></span><span style="display:flex;"><span>          - google-chrome
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">state</span>: present
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">when</span>: ansible_distribution == &#34;MacOSX&#34;
</span></span><span style="display:flex;"><span>      
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Install languages packages with brew
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">community.general.homebrew</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">name</span>:
</span></span><span style="display:flex;"><span>          - clojure
</span></span><span style="display:flex;"><span>          - erlang
</span></span><span style="display:flex;"><span>          - jq
</span></span><span style="display:flex;"><span>          - python@3.12
</span></span><span style="display:flex;"><span>          - swi-prolog
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">state</span>: present
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">when</span>: ansible_distribution == &#34;MacOSX&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Run stow
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">shell</span>: <span style="color:#f1fa8c">&#34;stow dotfiles  --verbose=2 --no-folding -R&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">register</span>: result
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">changed_when</span>: <span style="color:#f1fa8c">&#39;result.stderr is search(&#34;LINK: &#34;)&#39;</span>  
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Run stow for my job config files
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">shell</span>: <span style="color:#f1fa8c">&#34;stow dotfiles_work  --verbose=2 --no-folding -R&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">register</span>: result
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">changed_when</span>: <span style="color:#f1fa8c">&#39;result.stderr is search(&#34;LINK: &#34;)&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Steampipe plugins
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">shell</span>: <span style="color:#f1fa8c">&#34;steampipe plugin install jira whois aws ldap net rss&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">register</span>: result
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">changed_when</span>: <span style="color:#f1fa8c">&#39;result.stderr is search(&#34;Installed plugin&#34;)&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ff79c6">name</span>: Steampipe plugins
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">shell</span>: <span style="color:#f1fa8c">&#34;steampipe plugin update --all&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">register</span>: result
</span></span></code></pre></div><p>This playbook does the following:</p>
<ol>
<li>Updates Homebrew and all installed packages.</li>
<li>Installs a set of common development tools and applications using Homebrew.</li>
<li>Installs programming languages and related tools.</li>
<li>Uses GNU Stow to manage dotfiles for both personal and work environments.</li>
<li>Installs and updates Steampipe plugins for various services.</li>
</ol>
<h2 id="benefits-of-this-approach">Benefits of This Approach</h2>
<ol>
<li><strong>Reproducibility</strong>: Your entire development environment can be recreated with a single command.</li>
<li><strong>Version Control</strong>: Both your Ansible playbook and dotfiles can be version-controlled, allowing for easy tracking of changes and rollbacks if needed.</li>
<li><strong>Flexibility</strong>: The playbook can be easily modified to add or remove packages as your needs change.</li>
<li><strong>Cross-platform</strong>: With proper conditionals, you can use the same playbook across different operating systems.</li>
<li><strong>Separation of Concerns</strong>: Personal and work-related dotfiles are managed separately, allowing for easy context switching.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>By combining Ansible&rsquo;s powerful automation capabilities with GNU Stow&rsquo;s elegant dotfile management, you can create a robust, version-controlled, and easily reproducible development environment. This approach not only saves time in setting up new machines but also ensures consistency across all your development environments.</p>
<p>Remember to keep your Ansible playbook and dotfiles in a version control system like Git, and consider hosting them on a platform like GitHub for easy access across different machines. Happy coding!</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>This blog post provides an overview of using Ansible and GNU Stow for development environment setup and dotfile management, explains the advantages of both tools, and breaks down the sample configuration file you provided. It should give readers a good understanding of how to implement this approach in their own workflows.
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Smart investment Problem with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-jul-2024/</link>
      <pubDate>Sun, 14 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-jul-2024/</guid>
      <description><![CDATA[<p>Below my #prolog solution for <a href="https://dmcommunity.org/challenge/challenge-july-2024/">Smart investment problem</a>.</p>
<p>It is a sample of <a href="https://en.wikipedia.org/wiki/Linear_programming">Linear Programming</a> using Prolog.</p>
<p>A client of an investment firm has $10000 available for investment. He has instructed that his money be invested in particular stocks, so that no more than $5000 is invested in any one stock but at least $1000 be invested in each stock. He has further instructed the firm to use its current data and invest in the manner that maximizes his overall gain during a one-year period.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">S</span>), <span style="color:#50fa7b">variable_value</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#f1fa8c">x1</span>, <span style="color:#8be9fd;font-style:italic">QuantityABC</span>), <span style="color:#50fa7b">variable_value</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#f1fa8c">x2</span>, <span style="color:#8be9fd;font-style:italic">QuantityXYZ</span>), <span style="color:#50fa7b">variable_value</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#f1fa8c">x3</span>, <span style="color:#8be9fd;font-style:italic">QuantityTTT</span>), <span style="color:#50fa7b">variable_value</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#f1fa8c">x4</span>, <span style="color:#8be9fd;font-style:italic">QuantityLMN</span>).
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>QuantityABC = 120,
</span></span><span style="display:flex;"><span>QuantityXYZ = 20,
</span></span><span style="display:flex;"><span>QuantityTTT = 10,
</span></span><span style="display:flex;"><span>QuantityLMN = 200.
</span></span></code></pre></div><p>Below the Prolog code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:- <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">simplex</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">S</span>) :-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">gen_state</span>(<span style="color:#8be9fd;font-style:italic">S0</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">my_constraints</span>(<span style="color:#8be9fd;font-style:italic">S0</span>, <span style="color:#8be9fd;font-style:italic">S1</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">maximize</span>([<span style="color:#bd93f9">35</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x1</span>, <span style="color:#bd93f9">60</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x2</span>, <span style="color:#bd93f9">125</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x3</span>, <span style="color:#bd93f9">40</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x4</span>], <span style="color:#8be9fd;font-style:italic">S1</span>, <span style="color:#8be9fd;font-style:italic">S</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">my_constraints</span> <span style="color:#ff79c6">--&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x1</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">1000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x1</span>] <span style="color:#ff79c6">=&lt;</span> <span style="color:#bd93f9">5000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">50</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x2</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">1000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">50</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x2</span>] <span style="color:#ff79c6">=&lt;</span> <span style="color:#bd93f9">5000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">100</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x3</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">1000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">100</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x3</span>] <span style="color:#ff79c6">=&lt;</span> <span style="color:#bd93f9">5000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x4</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">1000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x4</span>] <span style="color:#ff79c6">=&lt;</span> <span style="color:#bd93f9">5000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x1</span>, <span style="color:#bd93f9">50</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x2</span>, <span style="color:#bd93f9">100</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x3</span>, <span style="color:#bd93f9">25</span><span style="color:#ff79c6">*</span><span style="color:#f1fa8c">x4</span>] <span style="color:#ff79c6">=&lt;</span> <span style="color:#bd93f9">10000</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#f1fa8c">x1</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">0</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#f1fa8c">x2</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">0</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#f1fa8c">x3</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">0</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraint</span>([<span style="color:#f1fa8c">x4</span>] <span style="color:#ff79c6">&gt;=</span> <span style="color:#bd93f9">0</span>).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>DevOps Tableau Cloud - managing tableau cloud resources with OpenTofu / Terraform</title>
      <link>https://www.mr70.eu/posts/open-tofu-terraform-tableau-cloud/</link>
      <pubDate>Wed, 26 Jun 2024 09:14:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/open-tofu-terraform-tableau-cloud/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p><a href="https://opentofu.org/">OpenTofu</a> (a Terraform fork, community-driven and managed by the Linux Foundation) is an open-source infrastructure as code (IaC) tool that allows you to define, provision, and manage infrastructure as code. Terraform can be used to manage a wide range of infrastructure resources, including Tableau Cloud resources.</p>
<p>Here are some of the benefits of using OpenTofu/Terraform to manage <a href="https://www.tableau.com/">Tableau Cloud</a> resources:</p>
<p>Consistency: Terraform allows you to define your infrastructure in a consistent and repeatable way. This can help to reduce errors and improve the overall quality of your infrastructure.</p>
<pre><code>Automation: Terraform can be used to automate the deployment and management of your Tableau Cloud resources. This can save you time and effort, and it can also help to improve the reliability of your infrastructure.

Version control: Terraform allows you to version control your infrastructure configuration. This means that you can track changes to your infrastructure over time and easily roll back to previous versions if necessary.
</code></pre>
<p>To get started with OpenTofu/Terraform, you will need to install the OpenTofu/Terraform CLI tool. Once you have installed the OpenTofu/Terraform CLI, you can create a new Terraform configuration file. Terraform configuration files are written in a language called HashiCorp Configuration Language (HCL).</p>
<h2 id="usage">Usage</h2>
<p>Below I&rsquo;ll show how to create some Tableau groups, users and projects.</p>
<p>Create a folder and inside the following files:</p>
<p>File versions.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span>terraform {
</span></span><span style="display:flex;"><span>    required_providers {
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">tableau</span> = {
</span></span><span style="display:flex;"><span>	    <span style="color:#50fa7b">source</span> = <span style="color:#f1fa8c">&#34;GtheSheep/tableau&#34;</span>
</span></span><span style="display:flex;"><span>	    <span style="color:#50fa7b">version</span> = <span style="color:#f1fa8c">&#34;0.0.17&#34;</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File providers.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">provider</span> <span style="color:#f1fa8c">&#34;tableau&#34;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">server_url</span> = <span style="color:#f1fa8c">&#34;https://eu-west-1a.online.tableau.com&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">server_version</span> = <span style="color:#f1fa8c">&#34;3.13&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">site</span>           = <span style="color:#f1fa8c">&#34;redaelli&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File tableau_groups.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;tableau_group&#34;</span> <span style="color:#f1fa8c">&#34;group_developer&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> tableau
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">name</span>     = <span style="color:#f1fa8c">&#34;developer&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">minimum_site_role</span> = <span style="color:#f1fa8c">&#34;Creator&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File tableau_users.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;tableau_user&#34;</span> <span style="color:#f1fa8c">&#34;matteo-redaelli&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> tableau
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">auth_setting</span> = <span style="color:#f1fa8c">&#34;ServerDefault&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">name</span>  = <span style="color:#f1fa8c">&#34;matteo@redaelli.org&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">email</span> = <span style="color:#f1fa8c">&#34;matteo@redaelli.org&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">full_name</span> = <span style="color:#f1fa8c">&#34;matteo@redaelli.org&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">site_role</span> = <span style="color:#f1fa8c">&#34;Viewer&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;tableau_group_user&#34;</span> <span style="color:#f1fa8c">&#34;group_developer_user_matteo-redaelli&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> tableau
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">group_id</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>resource.tableau_group.group_developer.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">user_id</span>  = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>resource.tableau_user.user_matteo<span style="color:#ff79c6">-</span>redaelli.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File tableau_projects.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;tableau_project&#34;</span> <span style="color:#f1fa8c">&#34;project_crm&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> tableau
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">name</span>     = <span style="color:#f1fa8c">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">description</span> = <span style="color:#f1fa8c">&#34;CRM projects&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">parent_project_id</span> = <span style="color:#f1fa8c">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">content_permissions</span> = <span style="color:#f1fa8c">&#34;ManagedByOwner&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;tableau_project&#34;</span> <span style="color:#f1fa8c">&#34;project_crm_sales&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> tableau
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">name</span>     = <span style="color:#f1fa8c">&#34;CRM Sales&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">description</span> = <span style="color:#f1fa8c">&#34;CRM Sales&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">parent_project_id</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>resource.tableau_project.project_crm.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">content_permissions</span> = <span style="color:#f1fa8c">&#34;ManagedByOwner&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Now you can create your resources with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>tofu init
</span></span><span style="display:flex;"><span>tofu plan -out myplan
</span></span><span style="display:flex;"><span>tofu apply myplan
</span></span></code></pre></div><h2 id="references">References:</h2>
<ul>
<li><a href="https://opentofu.org/">OpenTofu</a> is a fork of Terraform under the Linux Foundation unbrella.</li>
<li><a href="https://github.com/GtheSheep/terraform-provider-tableau">GtheSheep/terraform-provider-tableau</a></li>
<li><a href="https://www.tableau.com/">Tableau</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Stable Marriage Problem with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-jun-2024/</link>
      <pubDate>Fri, 07 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-jun-2024/</guid>
      <description><![CDATA[<p><img src="https://dmcommunity.org/wp-content/uploads/2024/06/stablemarriageproblem.png" alt="stable marriage problem" title="stable marriage problem"> My #prolog solution for <a href="https://en.wikipedia.org/wiki/Stable_marriage_problem">Stable Marriage Problem</a> proposed by <a href="https://dmcommunity.org/challenge/challenge-june-2024/">dmcommunity.org challenge Jun 2024</a>.</p>
<p>Given n men and n women, where each person has ranked all members of the opposite sex in order of preference, marry the men and women together such that there are no two people of opposite sex who would both rather have each other than their current partners. When there are no such pairs of people, the set of marriages is deemed stable.</p>
<p>Algorithms for finding solutions to the stable marriage problem have applications in a variety of real-world situations, perhaps the best known of these being in the assignment of graduating medical students to their first hospital appointments</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">findall</span>(<span style="color:#8be9fd;font-style:italic">M</span>, (<span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">S</span>), <span style="color:#50fa7b">marriages</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#8be9fd;font-style:italic">M</span>)), <span style="color:#8be9fd;font-style:italic">L</span>), <span style="color:#50fa7b">maplist</span>(<span style="color:#f1fa8c">writeln</span>, <span style="color:#8be9fd;font-style:italic">L</span>).
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[Adam-Claire,Bob-Barbara,Charlie-Alice,Dave-Elsie,Edgar-Doris]
</span></span><span style="display:flex;"><span>[Adam-Claire,Bob-Doris,Charlie-Alice,Dave-Elsie,Edgar-Barbara]
</span></span><span style="display:flex;"><span>[Adam-Doris,Bob-Elsie,Charlie-Alice,Dave-Claire,Edgar-Barbara]
</span></span><span style="display:flex;"><span>[Adam-Elsie,Bob-Claire,Charlie-Alice,Dave-Doris,Edgar-Barbara]
</span></span><span style="display:flex;"><span>[Adam-Elsie,Bob-Claire,Charlie-Doris,Dave-Barbara,Edgar-Alice]
</span></span></code></pre></div><p>Below the code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:-<span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">dim</span>(<span style="color:#bd93f9">5</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">husbands_ranks</span>([[<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>],
</span></span><span style="display:flex;"><span>		[<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">5</span>],
</span></span><span style="display:flex;"><span>		[<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">1</span>],
</span></span><span style="display:flex;"><span>		[<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>],
</span></span><span style="display:flex;"><span>		[<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">5</span>]
</span></span><span style="display:flex;"><span>	       ]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">wifes_ranks</span>([[<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>],
</span></span><span style="display:flex;"><span>	     [<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">5</span>],
</span></span><span style="display:flex;"><span>	     [<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">1</span>],
</span></span><span style="display:flex;"><span>	     [<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">5</span>,<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>],
</span></span><span style="display:flex;"><span>	     [<span style="color:#bd93f9">4</span>,<span style="color:#bd93f9">3</span>,<span style="color:#bd93f9">2</span>,<span style="color:#bd93f9">1</span>,<span style="color:#bd93f9">5</span>]
</span></span><span style="display:flex;"><span>	    ]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">rank</span>(<span style="color:#8be9fd;font-style:italic">Person1</span>, <span style="color:#8be9fd;font-style:italic">Person2</span>, <span style="color:#8be9fd;font-style:italic">Ranks</span>, <span style="color:#8be9fd;font-style:italic">Rank</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">nth1</span>(<span style="color:#8be9fd;font-style:italic">Person1</span>, <span style="color:#8be9fd;font-style:italic">Ranks</span>, <span style="color:#8be9fd;font-style:italic">PersonRanks</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">nth1</span>(<span style="color:#8be9fd;font-style:italic">Person2</span>, <span style="color:#8be9fd;font-style:italic">PersonRanks</span>, <span style="color:#8be9fd;font-style:italic">Rank</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">/*
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">Wifes is a list of integer
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">First element is the wife of men 1
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">Second element is the wife of men 2
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">...
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">dim</span>(<span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">husbands_ranks</span>(<span style="color:#8be9fd;font-style:italic">HusbandRanks</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">wifes_ranks</span>(<span style="color:#8be9fd;font-style:italic">WifeRanks</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% Wifes is a list of N elements</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% Each element is a wige (1=Alice)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Wifes</span> <span style="color:#f1fa8c">ins</span> <span style="color:#bd93f9">1.</span>.<span style="color:#8be9fd;font-style:italic">N</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">all_distinct</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">label</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">stable_marriages</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">HusbandRanks</span>, <span style="color:#8be9fd;font-style:italic">WifeRanks</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">instable_marriages</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">HusbandRanks</span>, <span style="color:#8be9fd;font-style:italic">WifeRanks</span>, [<span style="color:#8be9fd;font-style:italic">Husband1</span><span style="color:#ff79c6">-</span><span style="color:#8be9fd;font-style:italic">Wife1</span>, <span style="color:#8be9fd;font-style:italic">Husband2</span><span style="color:#ff79c6">-</span><span style="color:#8be9fd;font-style:italic">Wife2</span>]):-
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% Husband1 is the index of an element of the list</span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% Wife1 is a element of teh list of </span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">nth1</span>(<span style="color:#8be9fd;font-style:italic">Husband1</span>, <span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">Wife1</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">rank</span>(<span style="color:#8be9fd;font-style:italic">Husband1</span>, <span style="color:#8be9fd;font-style:italic">Wife1</span>, <span style="color:#8be9fd;font-style:italic">HusbandRanks</span>, <span style="color:#8be9fd;font-style:italic">MRank11</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">nth1</span>(<span style="color:#8be9fd;font-style:italic">Husband2</span>, <span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">Wife2</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Husband1</span> <span style="color:#f1fa8c">#\=</span> <span style="color:#8be9fd;font-style:italic">Husband2</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Wife1</span> <span style="color:#f1fa8c">#\=</span> <span style="color:#8be9fd;font-style:italic">Wife2</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">rank</span>(<span style="color:#8be9fd;font-style:italic">Wife2</span>, <span style="color:#8be9fd;font-style:italic">Husband2</span>, <span style="color:#8be9fd;font-style:italic">WifeRanks</span>, <span style="color:#8be9fd;font-style:italic">FRank22</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">rank</span>(<span style="color:#8be9fd;font-style:italic">Husband1</span>, <span style="color:#8be9fd;font-style:italic">Wife2</span>, <span style="color:#8be9fd;font-style:italic">HusbandRanks</span>, <span style="color:#8be9fd;font-style:italic">MRank12</span>),   
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">rank</span>(<span style="color:#8be9fd;font-style:italic">Wife2</span>, <span style="color:#8be9fd;font-style:italic">Husband1</span>, <span style="color:#8be9fd;font-style:italic">WifeRanks</span>, <span style="color:#8be9fd;font-style:italic">FRank21</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">MRank12</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">MRank11</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">FRank21</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">FRank22</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">stable_marriages</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">HusbandsRanks</span>, <span style="color:#8be9fd;font-style:italic">WifesRanks</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">instable_marriages</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">HusbandsRanks</span>, <span style="color:#8be9fd;font-style:italic">WifesRanks</span>, <span style="color:#ff79c6">_</span>) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">false</span> ; <span style="color:#f1fa8c">true</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% needed to convert numbers to first names</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">husbands_names</span>([<span style="color:#f1fa8c">&#39;Adam&#39;</span>,<span style="color:#f1fa8c">&#39;Bob&#39;</span>,<span style="color:#f1fa8c">&#39;Charlie&#39;</span>,<span style="color:#f1fa8c">&#39;Dave&#39;</span>,<span style="color:#f1fa8c">&#39;Edgar&#39;</span>]).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">wifes_names</span>([<span style="color:#f1fa8c">&#39;Alice&#39;</span>,<span style="color:#f1fa8c">&#39;Barbara&#39;</span>,<span style="color:#f1fa8c">&#39;Claire&#39;</span>,<span style="color:#f1fa8c">&#39;Doris&#39;</span>,<span style="color:#f1fa8c">&#39;Elsie&#39;</span>]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">wife_index_name</span>(<span style="color:#8be9fd;font-style:italic">Index</span>, <span style="color:#8be9fd;font-style:italic">Name</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">wifes_names</span>(<span style="color:#8be9fd;font-style:italic">WifesNames</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">nth1</span>(<span style="color:#8be9fd;font-style:italic">Index</span>, <span style="color:#8be9fd;font-style:italic">WifesNames</span>, <span style="color:#8be9fd;font-style:italic">Name</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">wifes_index_name</span>([], []).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">wifes_index_name</span>([<span style="color:#8be9fd;font-style:italic">Index</span>|<span style="color:#8be9fd;font-style:italic">Indexes</span>], [<span style="color:#8be9fd;font-style:italic">Name</span>|<span style="color:#8be9fd;font-style:italic">Names</span>]):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">wife_index_name</span>(<span style="color:#8be9fd;font-style:italic">Index</span>, <span style="color:#8be9fd;font-style:italic">Name</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">wifes_index_name</span>(<span style="color:#8be9fd;font-style:italic">Indexes</span>, <span style="color:#8be9fd;font-style:italic">Names</span>).
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">marriages</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">Marriagies</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">husbands_names</span>(<span style="color:#8be9fd;font-style:italic">HusbandsNames</span>), 
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">wifes_index_name</span>(<span style="color:#8be9fd;font-style:italic">Wifes</span>, <span style="color:#8be9fd;font-style:italic">WifesNames</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">pairs_keys_values</span>(<span style="color:#8be9fd;font-style:italic">Marriagies</span>, <span style="color:#8be9fd;font-style:italic">HusbandsNames</span>, <span style="color:#8be9fd;font-style:italic">WifesNames</span>).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>DM Community - challenge March 2024 - generative ai</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-march-2024/</link>
      <pubDate>Thu, 28 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-march-2024/</guid>
      <description><![CDATA[<p>Usually I solve DM Community challenges using the Prolog language. Regarding <a href="https://dmcommunity.org/challenge/challenge-march-2024/">https://dmcommunity.org/challenge/challenge-march-2024/</a> I used the generative AI.</p>
<p>Below the prompt I used but the results are not always good!
What&rsquo;s wrong? How could I change my prompt in order to get better results?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Hello. 
</span></span><span style="display:flex;"><span>Act as developer. 
</span></span><span style="display:flex;"><span>Given a list of &#34;employees&#34; in the following json format: &#39;{
</span></span><span style="display:flex;"><span>  &#34;company&#34; : {
</span></span><span style="display:flex;"><span>    &#34;companyName&#34; : &#34;ABC&#34;,
</span></span><span style="display:flex;"><span>    &#34;employees&#34; : [ {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Robinson&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 25,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Female&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;RobinsonLoc1&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Main Str&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;08831&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;NJ&#34;
</span></span><span style="display:flex;"><span>      }, {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;RobinsonLoc2&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Ocean Drive&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 2,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 220000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Warner&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 45,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;WarnerLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Maple Street&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;08817&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;NJ&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 0,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 150000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Stevens&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 24,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Single&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;StevensLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Regency Drive&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;08817&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;NJ&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 0,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 135000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;White&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 32,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Female&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;WhiteLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 2,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 195000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Smith&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 46,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Single&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;SmithLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Maple Street&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;90027&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;CA&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 1,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 120000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Green&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 28,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Female&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;GreenLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 3,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 140000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Brown&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 32,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;BrownLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 2,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 65000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Klaus&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 54,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;KlausLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 1,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 85000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Houston&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 47,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Female&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Single&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;HoustonLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 2,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 135000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Long&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 29,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Married&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;LongLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 3,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 40000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Short&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 22,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Male&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Single&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;ShortLoc&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 0,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 120000.0
</span></span><span style="display:flex;"><span>    }, {
</span></span><span style="display:flex;"><span>      &#34;name&#34; : &#34;Doe&#34;,
</span></span><span style="display:flex;"><span>      &#34;age&#34; : 21,
</span></span><span style="display:flex;"><span>      &#34;gender&#34; : &#34;Female&#34;,
</span></span><span style="display:flex;"><span>      &#34;maritalStatus&#34; : &#34;Single&#34;,
</span></span><span style="display:flex;"><span>      &#34;minor&#34; : false,
</span></span><span style="display:flex;"><span>      &#34;locations&#34; : [ {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;DoeLoc1&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Green Road&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33019&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      }, {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;DoeLoc2&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Morgan Street&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;33020&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;FL&#34;
</span></span><span style="display:flex;"><span>      }, {
</span></span><span style="display:flex;"><span>        &#34;id&#34; : &#34;DoeLoc3&#34;,
</span></span><span style="display:flex;"><span>        &#34;street&#34; : &#34;Lyric Ave&#34;,
</span></span><span style="display:flex;"><span>        &#34;zipCode&#34; : &#34;90027&#34;,
</span></span><span style="display:flex;"><span>        &#34;state&#34; : &#34;CA&#34;
</span></span><span style="display:flex;"><span>      } ],
</span></span><span style="display:flex;"><span>      &#34;children&#34; : 1,
</span></span><span style="display:flex;"><span>      &#34;salary&#34; : 210000.0
</span></span><span style="display:flex;"><span>    } ],
</span></span><span style="display:flex;"><span>    &#34;selectedZipCode&#34; : &#34;08817&#34;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}&#39;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>please answer to the following questions:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>1) What is the current total number of employees?
</span></span><span style="display:flex;"><span>2a) How many children all employees have? 
</span></span><span style="display:flex;"><span>2b) How many children does the average employee have?
</span></span><span style="display:flex;"><span>3a) What is an average salary? 
</span></span><span style="display:flex;"><span>3b) What is the maximal and minimal salaries?
</span></span><span style="display:flex;"><span>4) How many employees are single?
</span></span><span style="display:flex;"><span>5) In which states do the employee with &#34;name&#34; &#34;Warner&#34; have residences?
</span></span><span style="display:flex;"><span>6a) How many people are inside 20% of highest paid employees? 
</span></span><span style="display:flex;"><span>6b) Who are these high-paid employees?
</span></span><span style="display:flex;"><span>7) List employees living in zipCode &#34;33019&#34;.
</span></span></code></pre></div><h2 id="claude-httpsclaudeai">Claude (<a href="https://claude.ai/">https://claude.ai/</a>)</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>1) The current total number of employees is 12.
</span></span><span style="display:flex;"><span>2a) All employees have a total of 16 children
</span></span><span style="display:flex;"><span>2b) The average employee has 1.33 children
</span></span><span style="display:flex;"><span>3a) The average salary is $135416.67
</span></span><span style="display:flex;"><span>3b) The maximum salary is $220,000.0 and the minimum salary is $40,000.0.
</span></span><span style="display:flex;"><span>4) There are 4 single employees
</span></span><span style="display:flex;"><span>5)The employee &#39;Warner&#39; has residences in the following states: NJ
</span></span><span style="display:flex;"><span>6a) There are 2 people in the top 20% of salaries
</span></span><span style="display:flex;"><span>6b)The highest paid employees are:
</span></span><span style="display:flex;"><span> - Robinson ($220000.00)
</span></span><span style="display:flex;"><span> - Doe ($210000.00)
</span></span><span style="display:flex;"><span>7) Employees living in zipcode 33019:
</span></span><span style="display:flex;"><span> - Robinson
</span></span><span style="display:flex;"><span> - White
</span></span><span style="display:flex;"><span> - Green
</span></span><span style="display:flex;"><span> - Brown
</span></span><span style="display:flex;"><span> - Klaus
</span></span><span style="display:flex;"><span> - Houston
</span></span><span style="display:flex;"><span> - Long
</span></span><span style="display:flex;"><span> - Short
</span></span><span style="display:flex;"><span> - Doe
</span></span></code></pre></div><h2 id="chatgpt-httpschatopenaicom">ChatGPT (<a href="https://chat.openai.com/">https://chat.openai.com/</a>)</h2>
<p>From the previous prompt I removed &ldquo;without giving the source code&rdquo;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>1) Total number of employees: 12
</span></span><span style="display:flex;"><span>2a) Total number of children all employees have: 16
</span></span><span style="display:flex;"><span>2b) Average number of children per employee: 1.3333333333333333
</span></span><span style="display:flex;"><span>3a) Average salary: 140416.66666666666
</span></span><span style="display:flex;"><span>3b) Maximal salary: 220000.0
</span></span><span style="display:flex;"><span>    Minimal salary: 40000.0
</span></span><span style="display:flex;"><span>4) Number of single employees: 4
</span></span><span style="display:flex;"><span>5) States where Warner has residences: [&#39;NJ&#39;]
</span></span><span style="display:flex;"><span>6a) Number of people inside 20% of highest-paid employees: 5
</span></span><span style="display:flex;"><span>6b) High-paid employees: [&#39;Robinson&#39;, &#39;Doe&#39;, &#39;White&#39;, &#39;Warner&#39;, &#39;Houston&#39;]
</span></span><span style="display:flex;"><span>7) Employees living in zipCode 33019: [&#39;Robinson&#39;, &#39;White&#39;, &#39;Green&#39;, &#39;Brown&#39;, &#39;Klaus&#39;, &#39;Houston&#39;, &#39;Long&#39;, &#39;Short&#39;, &#39;Doe&#39;]
</span></span></code></pre></div><h2 id="gemini-httpsgeminigooglecom">Gemini (<a href="https://gemini.google.com">https://gemini.google.com</a>)</h2>
<p>From the previous prompt I removed &ldquo;without giving the source code&rdquo;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>1) Total Employees:  There are 12 employees in the company.
</span></span><span style="display:flex;"><span>2a) Total Children:  All employees have a total of 18 children (2+0+0+2+1+3+2+1+2+3+0+1).
</span></span><span style="display:flex;"><span>2b) Average Children:  There&#39;s an average of 1.5 children per employee (18 children / 12 employees).
</span></span><span style="display:flex;"><span>3a) Average Salary:  The average salary is $141,666.67 (sum of all salaries / number of employees).
</span></span><span style="display:flex;"><span>3b) Min &amp; Max Salary:  The maximum salary is $220,000 (Robinson) and the minimum salary is $40,000 (Long).
</span></span><span style="display:flex;"><span>4) There are 4 single employees (Stevens, Smith, Houston, Short).
</span></span><span style="display:flex;"><span>5) Warner has a residence only in New Jersey (NJ) based on the &#34;state&#34; field in his location details.
</span></span><span style="display:flex;"><span>6a) Number:  The top 2 employees (20% of 12) are in the highest salary range.
</span></span><span style="display:flex;"><span>6b) Employees: The highest-paid employees are Robinson ($220,000) and Doe ($210,000).
</span></span><span style="display:flex;"><span>7) Employees in Zip Code &#34;33019&#34;:  These employees live in zip code &#34;33019&#34;:
</span></span><span style="display:flex;"><span>    White
</span></span><span style="display:flex;"><span>    Green
</span></span><span style="display:flex;"><span>    Brown
</span></span><span style="display:flex;"><span>    Klaus
</span></span><span style="display:flex;"><span>    Houston
</span></span><span style="display:flex;"><span>    Long
</span></span><span style="display:flex;"><span>    Doe (one of their residences)
</span></span></code></pre></div><h2 id="my-python-code">My python code</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>emps <span style="color:#ff79c6">=</span> json_data[<span style="color:#f1fa8c">&#39;company&#39;</span>][<span style="color:#f1fa8c">&#39;employees&#39;</span>]
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 1) </span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">len</span>(emps)  <span style="color:#bd93f9">12</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 2a</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">sum</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;children&#39;</span>], emps)) <span style="color:#6272a4"># 17</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 2b)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">sum</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;children&#39;</span>], emps)) <span style="color:#ff79c6">/</span> <span style="color:#bd93f9">12</span> <span style="color:#6272a4"># 1.416</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 3a)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">sum</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;salary&#39;</span>], emps)) <span style="color:#ff79c6">/</span> <span style="color:#bd93f9">12.0</span> <span style="color:#6272a4"># 134583.3</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 3b)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">max</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;salary&#39;</span>], emps)) <span style="color:#6272a4"># 220000.0</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">min</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;salary&#39;</span>], emps)) <span style="color:#6272a4"># 40000.0</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 4)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">len</span>(<span style="color:#8be9fd;font-style:italic">list</span>(<span style="color:#8be9fd;font-style:italic">filter</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;maritalStatus&#39;</span>] <span style="color:#ff79c6">==</span> <span style="color:#f1fa8c">&#39;Single&#39;</span>, emps)))
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 5)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">list</span>(<span style="color:#8be9fd;font-style:italic">filter</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;name&#39;</span>] <span style="color:#ff79c6">==</span> <span style="color:#f1fa8c">&#39;Warner&#39;</span>, emps))[<span style="color:#bd93f9">0</span>][<span style="color:#f1fa8c">&#39;locations&#39;</span>] <span style="color:#6272a4"># [{&#39;id&#39;: &#39;WarnerLoc&#39;, &#39;street&#39;: &#39;Maple Street&#39;, &#39;zipCode&#39;: &#39;08817&#39;, &#39;state&#39;: &#39;NJ&#39;}]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 6b)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">list</span>(<span style="color:#8be9fd;font-style:italic">map</span>(<span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;name&#39;</span>], <span style="color:#8be9fd;font-style:italic">sorted</span>(emps, key<span style="color:#ff79c6">=</span><span style="color:#ff79c6">lambda</span> x: x[<span style="color:#f1fa8c">&#39;salary&#39;</span>], reverse<span style="color:#ff79c6">=</span><span style="color:#ff79c6">True</span>)[<span style="color:#bd93f9">0</span>:<span style="color:#bd93f9">3</span>])) <span style="color:#6272a4"># [&#39;Robinson&#39;, &#39;Doe&#39;, &#39;White&#39;]</span>
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calling http rest API and parsing json response with (scryer) #Prolog</title>
      <link>https://www.mr70.eu/posts/prolog-parsing-json/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/prolog-parsing-json/</guid>
      <description><![CDATA[<p>In this simple code I&rsquo;ll show how you can call a rest api (qliksense saas rest api) and parse its json response</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">dcgs</span>)).
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">pairs</span>)).
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">serialization</span><span style="color:#ff79c6">/</span><span style="color:#f1fa8c">json</span>)).
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">http</span><span style="color:#ff79c6">/</span><span style="color:#f1fa8c">http_open</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">set_prolog_flag</span>(<span style="color:#f1fa8c">answer_write_options</span>, [<span style="color:#50fa7b">max_depth</span>(<span style="color:#bd93f9">1000</span>)]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">http_open</span>(<span style="color:#f1fa8c">&#34;https://mytenant.eu.qlikcloud.com/api/v1/tenants/me&#34;</span>, <span style="color:#8be9fd;font-style:italic">S</span>, [<span style="color:#50fa7b">request_headers</span>([<span style="color:#f1fa8c">&#39;Authorization&#39;</span>(<span style="color:#f1fa8c">&#34;Bearer MYKEY&#34;</span>)])]), 
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">get_n_chars</span>(<span style="color:#8be9fd;font-style:italic">S</span>, <span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">N</span>, <span style="color:#8be9fd;font-style:italic">HTML</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">phrase</span>(<span style="color:#50fa7b">json_chars</span>(<span style="color:#50fa7b">pairs</span>(<span style="color:#8be9fd;font-style:italic">J</span>)), <span style="color:#8be9fd;font-style:italic">HTML</span>), 
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">member</span>(<span style="color:#50fa7b">string</span>(<span style="color:#f1fa8c">&#34;id&#34;</span>)<span style="color:#ff79c6">-</span><span style="color:#50fa7b">string</span>(<span style="color:#8be9fd;font-style:italic">ID</span>), <span style="color:#8be9fd;font-style:italic">J</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#8be9fd;font-style:italic">HTML</span> <span style="color:#ff79c6">=</span> <span style="color:#f1fa8c">&#34;{\&#34;id\&#34;:\&#34;myid\&#34;,\&#34;hostnames\&#34;:[\&#34;mytenant.eu.qlikcloud.com\&#34;]}&#34;</span>, <span style="color:#8be9fd;font-style:italic">J</span> <span style="color:#ff79c6">=</span> [<span style="color:#50fa7b">string</span>(<span style="color:#f1fa8c">&#34;id&#34;</span>)<span style="color:#ff79c6">-</span><span style="color:#50fa7b">string</span>(<span style="color:#f1fa8c">&#34;myid&#34;</span>),<span style="color:#50fa7b">string</span>(<span style="color:#f1fa8c">&#34;hostnames&#34;</span>)<span style="color:#ff79c6">-</span><span style="color:#50fa7b">list</span>([<span style="color:#50fa7b">string</span>(<span style="color:#f1fa8c">&#34;mytenant.eu.qlikcloud.com)])], ID = &#34;</span><span style="color:#f1fa8c">myid</span>&#34;
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Ragno: Top Websites Ranking</title>
      <link>https://www.mr70.eu/ragno/top-websites-ranking/</link>
      <pubDate>Sat, 10 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/ragno/top-websites-ranking/</guid>
      <description><![CDATA[<p>Ragno is a new web crawler! It is still in alpha version.
Below its top website ranking</p>
<ol>
<li>60490 facebook.com</li>
<li>52334 twitter.com</li>
<li>45800 instagram.com</li>
<li>37198 youtube.com</li>
<li>28622 linkedin.com</li>
<li>10613 t.me</li>
<li>9388 github.com</li>
<li>6891 wordpress.org</li>
<li>5211 vk.com</li>
<li>5134 pinterest.com</li>
<li>4702 google.com</li>
<li>3959 tiktok.com</li>
<li>3573 play.google.com</li>
<li>2972 bit.ly</li>
<li>2868 wordpress.com</li>
<li>2572 apps.apple.com</li>
<li>2476 goo.gl</li>
<li>2467 youtu.be</li>
<li>2439 wa.me</li>
<li>2426 en.wikipedia.org</li>
<li>2388 subscribe.wordpress.com</li>
<li>2384 en.wordpress.com</li>
<li>2177 discord.gg</li>
<li>2133 vimeo.com</li>
<li>2050 amazon.com</li>
<li>2033 open.spotify.com</li>
<li>1986 reddit.com</li>
<li>1949 creativecommons.org</li>
<li>1916 api.whatsapp.com</li>
<li>1862 beian.miit.gov.cn</li>
</ol>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Httpd server</title>
      <link>https://www.mr70.eu/ragno/apache_httpd/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/ragno/apache_httpd/</guid>
      <description><![CDATA[<p><a href="https://httpd.apache.org">Apache Httpd</a> The Apache HTTP Server is a free and open-source cross-platform web server software, released under the terms of Apache License 2.0. It is developed and maintained by a community of developers under the auspices of the Apache Software Foundation.</p>
<p>Some web sites using the opensource software Apache httpd are:</p>
<ul>
<li><a href="https://040.se">https://040.se</a></li>
<li><a href="https://101.at">https://101.at</a></li>
<li><a href="https://12bytes.org">https://12bytes.org</a></li>
<li><a href="https://13f0.net">https://13f0.net</a></li>
<li><a href="https://1ppm.de">https://1ppm.de</a></li>
<li><a href="https://20k.me">https://20k.me</a></li>
<li><a href="https://216digital.com">https://216digital.com</a></li>
<li><a href="https://2pac.com">https://2pac.com</a></li>
<li><a href="https://3glitch.com">https://3glitch.com</a></li>
<li><a href="https://3to.moe">https://3to.moe</a></li>
<li><a href="https://4iiii.com">https://4iiii.com</a></li>
<li><a href="https://700nburdick.com">https://700nburdick.com</a></li>
<li><a href="https://757colorcoded.org">https://757colorcoded.org</a></li>
<li><a href="https://7drl.com">https://7drl.com</a></li>
<li><a href="https://aaaaa-atelier.org">https://aaaaa-atelier.org</a></li>
<li><a href="https://aaig.info">https://aaig.info</a></li>
<li><a href="https://aaronshaw.org">https://aaronshaw.org</a></li>
<li><a href="https://abalone-fondation.org">https://abalone-fondation.org</a></li>
<li><a href="https://aba.nyc">https://aba.nyc</a></li>
<li><a href="https://abhealthshop.com">https://abhealthshop.com</a></li>
<li><a href="https://abHealthShop.com">https://abHealthShop.com</a></li>
<li><a href="https://abi88-ueberruhr.de">https://abi88-ueberruhr.de</a></li>
<li><a href="https://abilityexperience.org">https://abilityexperience.org</a></li>
<li><a href="https://aboutlifemg.ru">https://aboutlifemg.ru</a></li>
<li><a href="https://ac6v.com">https://ac6v.com</a></li>
<li><a href="https://acme-journal.org">https://acme-journal.org</a></li>
<li><a href="https://acrofinder.net">https://acrofinder.net</a></li>
<li><a href="https://acrossaisle.com">https://acrossaisle.com</a></li>
<li><a href="https://adamloving.com">https://adamloving.com</a></li>
<li><a href="https://adamwulf.me">https://adamwulf.me</a></li>
<li><a href="https://adevinta.com">https://adevinta.com</a></li>
<li><a href="https://adlounge.ca">https://adlounge.ca</a></li>
<li><a href="https://adr-enaline.com">https://adr-enaline.com</a></li>
<li><a href="https://aequalis.cl">https://aequalis.cl</a></li>
<li><a href="https://aerosairship.com">https://aerosairship.com</a></li>
<li><a href="https://afit.store">https://afit.store</a></li>
<li><a href="https://aftershockmedia.com">https://aftershockmedia.com</a></li>
<li><a href="https://agilein3minut.es">https://agilein3minut.es</a></li>
<li><a href="https://agostini.tech">https://agostini.tech</a></li>
<li><a href="https://ahmedghazi.com">https://ahmedghazi.com</a></li>
<li><a href="https://airmailapp.com">https://airmailapp.com</a></li>
<li><a href="https://akse.li">https://akse.li</a></li>
<li><a href="https://aku.co">https://aku.co</a></li>
<li><a href="https://alakajam.com">https://alakajam.com</a></li>
<li><a href="https://alber.to">https://alber.to</a></li>
<li><a href="https://alexabrahams.com">https://alexabrahams.com</a></li>
<li><a href="https://alexanderchristiaanjacob.com">https://alexanderchristiaanjacob.com</a></li>
<li><a href="https://alexanderstreet.com">https://alexanderstreet.com</a></li>
<li><a href="https://alexfirs.com">https://alexfirs.com</a></li>
<li><a href="https://alexroidl.de">https://alexroidl.de</a></li>
<li><a href="https://alexschroeder.ch">https://alexschroeder.ch</a></li>
<li><a href="https://alfonsopara.info">https://alfonsopara.info</a></li>
<li><a href="https://alicecph.com">https://alicecph.com</a></li>
<li><a href="https://alien-magazine.com">https://alien-magazine.com</a></li>
<li><a href="https://AloEssence.com">https://AloEssence.com</a></li>
<li><a href="https://alt.org">https://alt.org</a></li>
<li><a href="https://alunaria.net">https://alunaria.net</a></li>
<li><a href="https://amassment.org">https://amassment.org</a></li>
<li><a href="https://amastyleinsider.com">https://amastyleinsider.com</a></li>
<li><a href="https://ambiancejeune.com">https://ambiancejeune.com</a></li>
<li><a href="https://ameliezhao.com">https://ameliezhao.com</a></li>
<li><a href="https://amiantos.net">https://amiantos.net</a></li>
<li><a href="https://amourchips.com">https://amourchips.com</a></li>
<li><a href="https://ampersandsoftworks.com">https://ampersandsoftworks.com</a></li>
<li><a href="https://amyria.jp">https://amyria.jp</a></li>
<li><a href="https://analisateachworth.net">https://analisateachworth.net</a></li>
<li><a href="https://analogrevolution.com">https://analogrevolution.com</a></li>
<li><a href="https://anarchistnews.org">https://anarchistnews.org</a></li>
<li><a href="https://anatom5.de">https://anatom5.de</a></li>
<li><a href="https://andou.art">https://andou.art</a></li>
<li><a href="https://andouilles.com">https://andouilles.com</a></li>
<li><a href="https://andreaslydemann.com">https://andreaslydemann.com</a></li>
<li><a href="https://andreasmurkudis.com">https://andreasmurkudis.com</a></li>
<li><a href="https://andrewking.ca">https://andrewking.ca</a></li>
<li><a href="https://andrewroach.net">https://andrewroach.net</a></li>
<li><a href="https://andrewseid.com">https://andrewseid.com</a></li>
<li><a href="https://andybargh.com">https://andybargh.com</a></li>
<li><a href="https://angusnicneven.com">https://angusnicneven.com</a></li>
<li><a href="https://animefanlistings.com">https://animefanlistings.com</a></li>
<li><a href="https://annerallen.com">https://annerallen.com</a></li>
<li><a href="https://anomalyresponse.com">https://anomalyresponse.com</a></li>
<li><a href="https://anthonyjcoleman.com">https://anthonyjcoleman.com</a></li>
<li><a href="https://antiplagiat.ru">https://antiplagiat.ru</a></li>
<li><a href="https://antixlinux.com">https://antixlinux.com</a></li>
<li><a href="https://anton.io">https://anton.io</a></li>
<li><a href="https://apidock.com">https://apidock.com</a></li>
<li><a href="https://apiscp.com">https://apiscp.com</a></li>
<li><a href="https://aplus.rs">https://aplus.rs</a></li>
<li><a href="https://appmakers.dev">https://appmakers.dev</a></li>
<li><a href="https://appracatappra.com">https://appracatappra.com</a></li>
<li><a href="https://appstore-tagebuch.de">https://appstore-tagebuch.de</a></li>
<li><a href="https://aprilbell.com">https://aprilbell.com</a></li>
<li><a href="https://apt-get.xyz">https://apt-get.xyz</a></li>
<li><a href="https://arabicacoffee.hk">https://arabicacoffee.hk</a></li>
<li><a href="https://areweinarecession.com">https://areweinarecession.com</a></li>
<li><a href="https://areyoueatingdinnerwithyourfather.com">https://areyoueatingdinnerwithyourfather.com</a></li>
<li><a href="https://arfy.fr">https://arfy.fr</a></li>
<li><a href="https://arlenetaylor.org">https://arlenetaylor.org</a></li>
<li><a href="https://arminunruh.com">https://arminunruh.com</a></li>
<li><a href="https://armswiki.org">https://armswiki.org</a></li>
<li><a href="https://arnehendriksen.nl">https://arnehendriksen.nl</a></li>
<li><a href="https://arn.ie">https://arn.ie</a></li>
<li><a href="https://arrc.site">https://arrc.site</a></li>
<li><a href="https://artandscienceofcoding.com">https://artandscienceofcoding.com</a></li>
<li><a href="https://artifex.com">https://artifex.com</a></li>
<li><a href="https://artificialworlds.net">https://artificialworlds.net</a></li>
<li><a href="https://arunraghavan.net">https://arunraghavan.net</a></li>
<li><a href="https://a-school-a-park.ca">https://a-school-a-park.ca</a></li>
<li><a href="https://ashellinthepit.com">https://ashellinthepit.com</a></li>
<li><a href="https://askelpalautin.fi">https://askelpalautin.fi</a></li>
<li><a href="https://astronomicalpark.cl">https://astronomicalpark.cl</a></li>
<li><a href="https://asuk.work">https://asuk.work</a></li>
<li><a href="https://atnfriends.com">https://atnfriends.com</a></li>
<li><a href="https://atomicarchive.com">https://atomicarchive.com</a></li>
<li><a href="https://atomicbird.com">https://atomicbird.com</a></li>
<li><a href="https://audio.dev">https://audio.dev</a></li>
<li><a href="https://audiodramareviews.com">https://audiodramareviews.com</a></li>
<li><a href="https://augmatic.org">https://augmatic.org</a></li>
<li><a href="https://autismacceptance.com">https://autismacceptance.com</a></li>
<li><a href="https://autisticadvocacy.org">https://autisticadvocacy.org</a></li>
<li><a href="https://automatorplugin.com">https://automatorplugin.com</a></li>
<li><a href="https://automatorworld.com">https://automatorworld.com</a></li>
<li><a href="https://averyreview.com">https://averyreview.com</a></li>
<li><a href="https://avisdexperts.ch">https://avisdexperts.ch</a></li>
<li><a href="https://avvr.nl">https://avvr.nl</a></li>
<li><a href="https://awakenyourmyth.com">https://awakenyourmyth.com</a></li>
<li><a href="https://axiom.ai">https://axiom.ai</a></li>
<li><a href="https://aygwriting.com">https://aygwriting.com</a></li>
<li><a href="https://baechlemeid.de">https://baechlemeid.de</a></li>
<li><a href="https://baensbar.net">https://baensbar.net</a></li>
<li><a href="https://bagandboots.com">https://bagandboots.com</a></li>
<li><a href="https://balkhifoundation.com">https://balkhifoundation.com</a></li>
<li><a href="https://balthaz.ar">https://balthaz.ar</a></li>
<li><a href="https://bane.work">https://bane.work</a></li>
<li><a href="https://bannedbooksweek.org">https://bannedbooksweek.org</a></li>
<li><a href="https://barnarts.org">https://barnarts.org</a></li>
<li><a href="https://barto.li">https://barto.li</a></li>
<li><a href="https://basvangeuns.nl">https://basvangeuns.nl</a></li>
<li><a href="https://battleofolustee.org">https://battleofolustee.org</a></li>
<li><a href="https://bd-event.ru">https://bd-event.ru</a></li>
<li><a href="https://bduvall.com">https://bduvall.com</a></li>
<li><a href="https://bearmccreary.com">https://bearmccreary.com</a></li>
<li><a href="https://beautiful-company.com">https://beautiful-company.com</a></li>
<li><a href="https://bedeutungslabor.com">https://bedeutungslabor.com</a></li>
<li><a href="https://bee-interactive.ch">https://bee-interactive.ch</a></li>
<li><a href="https://bellard.org">https://bellard.org</a></li>
<li><a href="https://bencikculinary.sk">https://bencikculinary.sk</a></li>
<li><a href="https://bendodson.com">https://bendodson.com</a></li>
<li><a href="https://benfry.com">https://benfry.com</a></li>
<li><a href="https://benschwartz.co">https://benschwartz.co</a></li>
<li><a href="https://benslaney.com">https://benslaney.com</a></li>
<li><a href="https://berlin-gegen-nazis.de">https://berlin-gegen-nazis.de</a></li>
<li><a href="https://bffbtc.org">https://bffbtc.org</a></li>
<li><a href="https://bhyve.org">https://bhyve.org</a></li>
<li><a href="https://bigbluebutton.org">https://bigbluebutton.org</a></li>
<li><a href="https://bitsplitting.org">https://bitsplitting.org</a></li>
<li><a href="https://bittersmann.de">https://bittersmann.de</a></li>
<li><a href="https://bizgaz.ru">https://bizgaz.ru</a></li>
<li><a href="https://bizit.rs">https://bizit.rs</a></li>
<li><a href="https://blackandwhitecontractors.com">https://blackandwhitecontractors.com</a></li>
<li><a href="https://black.design">https://black.design</a></li>
<li><a href="https://blinkmicroscope.com">https://blinkmicroscope.com</a></li>
<li><a href="https://blogbuzzter.de">https://blogbuzzter.de</a></li>
<li><a href="https://bo-en.info">https://bo-en.info</a></li>
<li><a href="https://bonifii.com">https://bonifii.com</a></li>
<li><a href="https://bookalyser.com">https://bookalyser.com</a></li>
<li><a href="https://bookplaces.blog">https://bookplaces.blog</a></li>
<li><a href="https://boook.land">https://boook.land</a></li>
<li><a href="https://bpcp.org">https://bpcp.org</a></li>
<li><a href="https://bradcolbroock.com">https://bradcolbroock.com</a></li>
<li><a href="https://bradshawfamily.net">https://bradshawfamily.net</a></li>
<li><a href="https://brainthrive.co">https://brainthrive.co</a></li>
<li><a href="https://brandthrive.co">https://brandthrive.co</a></li>
<li><a href="https://bravozoulou.fr">https://bravozoulou.fr</a></li>
<li><a href="https://breakingmuscle.com">https://breakingmuscle.com</a></li>
<li><a href="https://brevans.io">https://brevans.io</a></li>
<li><a href="https://briantomasik.com">https://briantomasik.com</a></li>
<li><a href="https://brokenlifts.org">https://brokenlifts.org</a></li>
<li><a href="https://brownfield101.com">https://brownfield101.com</a></li>
<li><a href="https://bruno-simon.com">https://bruno-simon.com</a></li>
<li><a href="https://brutalist.design">https://brutalist.design</a></li>
<li><a href="https://brutalistframework.com">https://brutalistframework.com</a></li>
<li><a href="https://bumpyskies.com">https://bumpyskies.com</a></li>
<li><a href="https://bundesverband-gwb.de">https://bundesverband-gwb.de</a></li>
<li><a href="https://buruma.net">https://buruma.net</a></li>
<li><a href="https://buymynotebook.com">https://buymynotebook.com</a></li>
<li><a href="https://bystronom.ru">https://bystronom.ru</a></li>
<li><a href="https://caesuras.net">https://caesuras.net</a></li>
<li><a href="https://calderastudios.me">https://calderastudios.me</a></li>
<li><a href="https://caloriesproper.com">https://caloriesproper.com</a></li>
<li><a href="https://cambodianvillagefund.org">https://cambodianvillagefund.org</a></li>
<li><a href="https://canadianmarketer.ca">https://canadianmarketer.ca</a></li>
<li><a href="https://cancertree.org">https://cancertree.org</a></li>
<li><a href="https://candoella.com">https://candoella.com</a></li>
<li><a href="https://cantwaitforchristmaspod.com">https://cantwaitforchristmaspod.com</a></li>
<li><a href="https://capejeer.com">https://capejeer.com</a></li>
<li><a href="https://carbonengineering.com">https://carbonengineering.com</a></li>
<li><a href="https://cardiffcyclecity.org">https://cardiffcyclecity.org</a></li>
<li><a href="https://caricaturestl.com">https://caricaturestl.com</a></li>
<li><a href="https://carla-karlis.ch">https://carla-karlis.ch</a></li>
<li><a href="https://carleighbaker.com">https://carleighbaker.com</a></li>
<li><a href="https://carnstone.com">https://carnstone.com</a></li>
<li><a href="https://caru.so">https://caru.so</a></li>
<li><a href="https://carymillsap.com">https://carymillsap.com</a></li>
<li><a href="https://cascable.se">https://cascable.se</a></li>
<li><a href="https://cassavafilms.com">https://cassavafilms.com</a></li>
<li><a href="https://catdrinkingsongs.com">https://catdrinkingsongs.com</a></li>
<li><a href="https://celticdownload.com">https://celticdownload.com</a></li>
<li><a href="https://celticmusic.org">https://celticmusic.org</a></li>
<li><a href="https://cenexelresearch.com">https://cenexelresearch.com</a></li>
<li><a href="https://cens.cl">https://cens.cl</a></li>
<li><a href="https://cesardebargue.club">https://cesardebargue.club</a></li>
<li><a href="https://cgru.net">https://cgru.net</a></li>
<li><a href="https://chalk-dog.com">https://chalk-dog.com</a></li>
<li><a href="https://change2change.me">https://change2change.me</a></li>
<li><a href="https://chargueraud.org">https://chargueraud.org</a></li>
<li><a href="https://charlesvilla.fr">https://charlesvilla.fr</a></li>
<li><a href="https://charlottebroccard.ch">https://charlottebroccard.ch</a></li>
<li><a href="https://chasenelson.com">https://chasenelson.com</a></li>
<li><a href="https://checkmatechamp.net">https://checkmatechamp.net</a></li>
<li><a href="https://chicagoseedsandclones.com">https://chicagoseedsandclones.com</a></li>
<li><a href="https://choregraphy.co">https://choregraphy.co</a></li>
<li><a href="https://chrisandriessen.nl">https://chrisandriessen.nl</a></li>
<li><a href="https://chrisrypkema.com">https://chrisrypkema.com</a></li>
<li><a href="https://chrissutevski.com">https://chrissutevski.com</a></li>
<li><a href="https://christiantiefenau.de">https://christiantiefenau.de</a></li>
<li><a href="https://christmaspastpodcast.com">https://christmaspastpodcast.com</a></li>
<li><a href="https://christophhauf.com">https://christophhauf.com</a></li>
<li><a href="https://christoph-knoth.com">https://christoph-knoth.com</a></li>
<li><a href="https://cinch.io">https://cinch.io</a></li>
<li><a href="https://citizensciencefoundation.org">https://citizensciencefoundation.org</a></li>
<li><a href="https://clarity.flowers">https://clarity.flowers</a></li>
<li><a href="https://clasebcn.com">https://clasebcn.com</a></li>
<li><a href="https://classtechtips.com">https://classtechtips.com</a></li>
<li><a href="https://clouddevs.com">https://clouddevs.com</a></li>
<li><a href="https://cloverlabs.io">https://cloverlabs.io</a></li>
<li><a href="https://clusterduck.space">https://clusterduck.space</a></li>
<li><a href="https://cmsrun.org">https://cmsrun.org</a></li>
<li><a href="https://coalsupper.com">https://coalsupper.com</a></li>
<li><a href="https://codeastudio.com">https://codeastudio.com</a></li>
<li><a href="https://codeat.it">https://codeat.it</a></li>
<li><a href="https://codenamecrud.ru">https://codenamecrud.ru</a></li>
<li><a href="https://codesorcery.net">https://codesorcery.net</a></li>
<li><a href="https://coffeeandpens.com">https://coffeeandpens.com</a></li>
<li><a href="https://cointhrill.com">https://cointhrill.com</a></li>
<li><a href="https://coling2018.org">https://coling2018.org</a></li>
<li><a href="https://colinjamesbelyea.com">https://colinjamesbelyea.com</a></li>
<li><a href="https://colohouse.com">https://colohouse.com</a></li>
<li><a href="https://colorbot.rocks">https://colorbot.rocks</a></li>
<li><a href="https://colorcube.io">https://colorcube.io</a></li>
<li><a href="https://commentics.com">https://commentics.com</a></li>
<li><a href="https://condatis.com">https://condatis.com</a></li>
<li><a href="https://conlang.org">https://conlang.org</a></li>
<li><a href="https://consejoctci.cl">https://consejoctci.cl</a></li>
<li><a href="https://contabo-status.com">https://contabo-status.com</a></li>
<li><a href="https://contactpointnano.ch">https://contactpointnano.ch</a></li>
<li><a href="https://contagious.dev">https://contagious.dev</a></li>
<li><a href="https://contemporaryhaibunonline.com">https://contemporaryhaibunonline.com</a></li>
<li><a href="https://content.industries">https://content.industries</a></li>
<li><a href="https://cookieinformation.com">https://cookieinformation.com</a></li>
<li><a href="https://coolbirdchie.com">https://coolbirdchie.com</a></li>
<li><a href="https://coopertype.org">https://coopertype.org</a></li>
<li><a href="https://corporateclub.ru">https://corporateclub.ru</a></li>
<li><a href="https://creativeleadershipsalon.com">https://creativeleadershipsalon.com</a></li>
<li><a href="https://criticalmediartstudio.com">https://criticalmediartstudio.com</a></li>
<li><a href="https://crystallizedskins.com">https://crystallizedskins.com</a></li>
<li><a href="https://crytch.com">https://crytch.com</a></li>
<li><a href="https://danieldittmar.net">https://danieldittmar.net</a></li>
<li><a href="https://danielmoldoveanu.com">https://danielmoldoveanu.com</a></li>
<li><a href="https://danielschwarz.cc">https://danielschwarz.cc</a></li>
<li><a href="https://datastori.es">https://datastori.es</a></li>
<li><a href="https://davidgomezmaestre.com">https://davidgomezmaestre.com</a></li>
<li><a href="https://dazzle.studio">https://dazzle.studio</a></li>
<li><a href="https://decorativearchitecturalproducts.com">https://decorativearchitecturalproducts.com</a></li>
<li><a href="https://deerme.net">https://deerme.net</a></li>
<li><a href="https://dennishatwieger.de">https://dennishatwieger.de</a></li>
<li><a href="https://desformesdecompensation.com">https://desformesdecompensation.com</a></li>
<li><a href="https://dia.tv">https://dia.tv</a></li>
<li><a href="https://diaxa.com">https://diaxa.com</a></li>
<li><a href="https://dictionaryofonlinebehavior.com">https://dictionaryofonlinebehavior.com</a></li>
<li><a href="https://didiva.com">https://didiva.com</a></li>
<li><a href="https://diesonnenstube.ch">https://diesonnenstube.ch</a></li>
<li><a href="https://digitalhumanism.org">https://digitalhumanism.org</a></li>
<li><a href="https://disorganising.co">https://disorganising.co</a></li>
<li><a href="https://dk3cw.com">https://dk3cw.com</a></li>
<li><a href="https://dobbstown.org">https://dobbstown.org</a></li>
<li><a href="https://dobrado.net">https://dobrado.net</a></li>
<li><a href="https://dogwellnet.com">https://dogwellnet.com</a></li>
<li><a href="https://dollarsandsense.org">https://dollarsandsense.org</a></li>
<li><a href="https://dominikpodsiadly.com">https://dominikpodsiadly.com</a></li>
<li><a href="https://dossierindustries.co">https://dossierindustries.co</a></li>
<li><a href="https://doubleincision.com">https://doubleincision.com</a></li>
<li><a href="https://duskmann.com">https://duskmann.com</a></li>
<li><a href="https://e-act.info">https://e-act.info</a></li>
<li><a href="https://eatock.com">https://eatock.com</a></li>
<li><a href="https://ebb.org">https://ebb.org</a></li>
<li><a href="https://eelslap.com">https://eelslap.com</a></li>
<li><a href="https://effecava.xyz">https://effecava.xyz</a></li>
<li><a href="https://ellenallien.de">https://ellenallien.de</a></li>
<li><a href="https://emergencycompliment.com">https://emergencycompliment.com</a></li>
<li><a href="https://e-m-m-a.org">https://e-m-m-a.org</a></li>
<li><a href="https://entreprogrammers.com">https://entreprogrammers.com</a></li>
<li><a href="https://erfoundation.org">https://erfoundation.org</a></li>
<li><a href="https://ertdfgcvb.xyz">https://ertdfgcvb.xyz</a></li>
<li><a href="https://essentialscrap.com">https://essentialscrap.com</a></li>
<li><a href="https://ethanbond.com">https://ethanbond.com</a></li>
<li><a href="https://ethicsfordesign.com">https://ethicsfordesign.com</a></li>
<li><a href="https://eyeofestival.com">https://eyeofestival.com</a></li>
<li><a href="https://fabianfohrer.com">https://fabianfohrer.com</a></li>
<li><a href="https://famosapublications.com">https://famosapublications.com</a></li>
<li><a href="https://fanfarefanfare.nl">https://fanfarefanfare.nl</a></li>
<li><a href="https://fayer.dev">https://fayer.dev</a></li>
<li><a href="https://fb4k.org">https://fb4k.org</a></li>
<li><a href="https://fdiv.net">https://fdiv.net</a></li>
<li><a href="https://fearthewalkingdead.net">https://fearthewalkingdead.net</a></li>
<li><a href="https://feeltrain.com">https://feeltrain.com</a></li>
<li><a href="https://felixj.me">https://felixj.me</a></li>
<li><a href="https://flarerpg.org">https://flarerpg.org</a></li>
<li><a href="https://fogknife.com">https://fogknife.com</a></li>
<li><a href="https://for-the-first-time-2.com">https://for-the-first-time-2.com</a></li>
<li><a href="https://forward-festival.com">https://forward-festival.com</a></li>
<li><a href="https://frame-optik.de">https://frame-optik.de</a></li>
<li><a href="https://francescocortese.it">https://francescocortese.it</a></li>
<li><a href="https://franklinstreetcreative.org">https://franklinstreetcreative.org</a></li>
<li><a href="https://freakanimes.com">https://freakanimes.com</a></li>
<li><a href="https://freedomdefined.org">https://freedomdefined.org</a></li>
<li><a href="https://freedompodcasting.com">https://freedompodcasting.com</a></li>
<li><a href="https://frontierimaginaries.org">https://frontierimaginaries.org</a></li>
<li><a href="https://frozentime.se">https://frozentime.se</a></li>
<li><a href="https://gailepranckunaite.com">https://gailepranckunaite.com</a></li>
<li><a href="https://garytaubes.com">https://garytaubes.com</a></li>
<li><a href="https://get.moe">https://get.moe</a></li>
<li><a href="https://girlgeniusonline.com">https://girlgeniusonline.com</a></li>
<li><a href="https://goodtypefoundry.com">https://goodtypefoundry.com</a></li>
<li><a href="https://gothenburgdesignfestival.se">https://gothenburgdesignfestival.se</a></li>
<li><a href="https://great.design">https://great.design</a></li>
<li><a href="https://gsap.com">https://gsap.com</a></li>
<li><a href="https://guillaumeruiz.com">https://guillaumeruiz.com</a></li>
<li><a href="https://gzet.net">https://gzet.net</a></li>
<li><a href="https://halfstackconf.com">https://halfstackconf.com</a></li>
<li><a href="https://harpe45.ch">https://harpe45.ch</a></li>
<li><a href="https://healthtalkforhorses.com">https://healthtalkforhorses.com</a></li>
<li><a href="https://heel.zone">https://heel.zone</a></li>
<li><a href="https://henri.ee">https://henri.ee</a></li>
<li><a href="https://hervethomas.com">https://hervethomas.com</a></li>
<li><a href="https://hidden-mountain.com">https://hidden-mountain.com</a></li>
<li><a href="https://hijinksensue.com">https://hijinksensue.com</a></li>
<li><a href="https://hiveworkscomics.com">https://hiveworkscomics.com</a></li>
<li><a href="https://hmwt.com">https://hmwt.com</a></li>
<li><a href="https://hotelradioparis.com">https://hotelradioparis.com</a></li>
<li><a href="https://hotelshanghai.de">https://hotelshanghai.de</a></li>
<li><a href="https://howbabycomic.com">https://howbabycomic.com</a></li>
<li><a href="https://howgameschangetheworld.com">https://howgameschangetheworld.com</a></li>
<li><a href="https://hubsfestival.com">https://hubsfestival.com</a></li>
<li><a href="https://hup.hu">https://hup.hu</a></li>
<li><a href="https://i2pforum.net">https://i2pforum.net</a></li>
<li><a href="https://iasculture.org">https://iasculture.org</a></li>
<li><a href="https://ideasillustrated.com">https://ideasillustrated.com</a></li>
<li><a href="https://ifcomp.org">https://ifcomp.org</a></li>
<li><a href="https://iftechfoundation.org">https://iftechfoundation.org</a></li>
<li><a href="https://ikob.be">https://ikob.be</a></li>
<li><a href="https://illinois.edu">https://illinois.edu</a></li>
<li><a href="https://increpare.com">https://increpare.com</a></li>
<li><a href="https://independentspaceindex.at">https://independentspaceindex.at</a></li>
<li><a href="https://indieoutpost.org">https://indieoutpost.org</a></li>
<li><a href="https://innermostparts.org">https://innermostparts.org</a></li>
<li><a href="https://inria.cl">https://inria.cl</a></li>
<li><a href="https://instant-horoscopes.com">https://instant-horoscopes.com</a></li>
<li><a href="https://isittimeforanap.com">https://isittimeforanap.com</a></li>
<li><a href="https://jacksonlibrary.org">https://jacksonlibrary.org</a></li>
<li><a href="https://jamez.it">https://jamez.it</a></li>
<li><a href="https://janchipchase.com">https://janchipchase.com</a></li>
<li><a href="https://janwong.ca">https://janwong.ca</a></li>
<li><a href="https://jazzfluteweinstein.com">https://jazzfluteweinstein.com</a></li>
<li><a href="https://jenniverse.com">https://jenniverse.com</a></li>
<li><a href="https://jeron.org">https://jeron.org</a></li>
<li><a href="https://jer.wtf">https://jer.wtf</a></li>
<li><a href="https://joejenett.com">https://joejenett.com</a></li>
<li><a href="https://journalofdigitalhumanities.org">https://journalofdigitalhumanities.org</a></li>
<li><a href="https://judascompanion.com">https://judascompanion.com</a></li>
<li><a href="https://julia.agency">https://julia.agency</a></li>
<li><a href="https://juliusasling.se">https://juliusasling.se</a></li>
<li><a href="https://justinjay.wang">https://justinjay.wang</a></li>
<li><a href="https://justinscordianos.com">https://justinscordianos.com</a></li>
<li><a href="https://justzine.com">https://justzine.com</a></li>
<li><a href="https://kakusei.org">https://kakusei.org</a></li>
<li><a href="https://kallaur.com">https://kallaur.com</a></li>
<li><a href="https://katrinemehl.com">https://katrinemehl.com</a></li>
<li><a href="https://kayschuttel.com">https://kayschuttel.com</a></li>
<li><a href="https://klavierduo-eckerle.de">https://klavierduo-eckerle.de</a></li>
<li><a href="https://knapsacknews.com">https://knapsacknews.com</a></li>
<li><a href="https://kniebes.com">https://kniebes.com</a></li>
<li><a href="https://k-t-l-g.com">https://k-t-l-g.com</a></li>
<li><a href="https://kunsthausbaselland.ch">https://kunsthausbaselland.ch</a></li>
<li><a href="https://kuthijinani.com">https://kuthijinani.com</a></li>
<li><a href="https://kyuhashim.com">https://kyuhashim.com</a></li>
<li><a href="https://lailagohar.com">https://lailagohar.com</a></li>
<li><a href="https://lapcatsoftware.com">https://lapcatsoftware.com</a></li>
<li><a href="https://laytheme.com">https://laytheme.com</a></li>
<li><a href="https://lazyeyes.cool">https://lazyeyes.cool</a></li>
<li><a href="https://leeeeza.com">https://leeeeza.com</a></li>
<li><a href="https://leiningen.org">https://leiningen.org</a></li>
<li><a href="https://lenybernay.com">https://lenybernay.com</a></li>
<li><a href="https://leppert.me">https://leppert.me</a></li>
<li><a href="https://letsmuseeum.com">https://letsmuseeum.com</a></li>
<li><a href="https://lifeactionrevival.org">https://lifeactionrevival.org</a></li>
<li><a href="https://lifeathome.ch">https://lifeathome.ch</a></li>
<li><a href="https://likelike.org">https://likelike.org</a></li>
<li><a href="https://lindahintz.com">https://lindahintz.com</a></li>
<li><a href="https://listography.com">https://listography.com</a></li>
<li><a href="https://littlefragments.com">https://littlefragments.com</a></li>
<li><a href="https://livefromearth.de">https://livefromearth.de</a></li>
<li><a href="https://liviasatriano.com">https://liviasatriano.com</a></li>
<li><a href="https://loicdupasquier.com">https://loicdupasquier.com</a></li>
<li><a href="https://lovedrop.org">https://lovedrop.org</a></li>
<li><a href="https://lowcarbconferences.com">https://lowcarbconferences.com</a></li>
<li><a href="https://luckysoap.com">https://luckysoap.com</a></li>
<li><a href="https://lucy-ives.com">https://lucy-ives.com</a></li>
<li><a href="https://lutopiquant.fr">https://lutopiquant.fr</a></li>
<li><a href="https://mad-love-records.com">https://mad-love-records.com</a></li>
<li><a href="https://magpie-lang.org">https://magpie-lang.org</a></li>
<li><a href="https://maltemueller.com">https://maltemueller.com</a></li>
<li><a href="https://margauxlallart.com">https://margauxlallart.com</a></li>
<li><a href="https://mariamindbodyhealth.com">https://mariamindbodyhealth.com</a></li>
<li><a href="https://marianalobao.com">https://marianalobao.com</a></li>
<li><a href="https://marianopascual.me">https://marianopascual.me</a></li>
<li><a href="https://marilynliew.com">https://marilynliew.com</a></li>
<li><a href="https://marinarachello.com">https://marinarachello.com</a></li>
<li><a href="https://mariuswatz.com">https://mariuswatz.com</a></li>
<li><a href="https://markuskreutzer.com">https://markuskreutzer.com</a></li>
<li><a href="https://martinfowler.com">https://martinfowler.com</a></li>
<li><a href="https://matadornetwork.com">https://matadornetwork.com</a></li>
<li><a href="https://medeina.xyz">https://medeina.xyz</a></li>
<li><a href="https://mediadesignpractices.net">https://mediadesignpractices.net</a></li>
<li><a href="https://meireundmeire.com">https://meireundmeire.com</a></li>
<li><a href="https://meli-email.org">https://meli-email.org</a></li>
<li><a href="https://michaelschindhelm.com">https://michaelschindhelm.com</a></li>
<li><a href="https://monkey.org">https://monkey.org</a></li>
<li><a href="https://monochrom-records.de">https://monochrom-records.de</a></li>
<li><a href="https://mosgraf.ru">https://mosgraf.ru</a></li>
<li><a href="https://mushon.com">https://mushon.com</a></li>
<li><a href="https://my-messages.com">https://my-messages.com</a></li>
<li><a href="https://naderman.de">https://naderman.de</a></li>
<li><a href="https://namespace.studio">https://namespace.studio</a></li>
<li><a href="https://natasjabokkerink.nl">https://natasjabokkerink.nl</a></li>
<li><a href="https://nathanielbartlett.com">https://nathanielbartlett.com</a></li>
<li><a href="https://nearthespeedoflight.com">https://nearthespeedoflight.com</a></li>
<li><a href="https://neon-sky.com">https://neon-sky.com</a></li>
<li><a href="https://neserapas.ch">https://neserapas.ch</a></li>
<li><a href="https://newmodels.io">https://newmodels.io</a></li>
<li><a href="https://NewPlymouthID.com">https://NewPlymouthID.com</a></li>
<li><a href="https://nitratestock.net">https://nitratestock.net</a></li>
<li><a href="https://nomnomvega.com">https://nomnomvega.com</a></li>
<li><a href="https://nooneeverreallydies.com">https://nooneeverreallydies.com</a></li>
<li><a href="https://normaleating.com">https://normaleating.com</a></li>
<li><a href="https://northstar.nu">https://northstar.nu</a></li>
<li><a href="https://nudgethemes.com">https://nudgethemes.com</a></li>
<li><a href="https://obraarchitects.com">https://obraarchitects.com</a></li>
<li><a href="https://odivino.com">https://odivino.com</a></li>
<li><a href="https://oklahomaseedsandclones.com">https://oklahomaseedsandclones.com</a></li>
<li><a href="https://olduse.net">https://olduse.net</a></li>
<li><a href="https://oliverherlitschek.com">https://oliverherlitschek.com</a></li>
<li><a href="https://omcabin.com">https://omcabin.com</a></li>
<li><a href="https://openid.net">https://openid.net</a></li>
<li><a href="https://openset.nl">https://openset.nl</a></li>
<li><a href="https://openzfs.org">https://openzfs.org</a></li>
<li><a href="https://owltastic.com">https://owltastic.com</a></li>
<li><a href="https://packet-biweekly.com">https://packet-biweekly.com</a></li>
<li><a href="https://pal-tv.de">https://pal-tv.de</a></li>
<li><a href="https://paralleluniver.se">https://paralleluniver.se</a></li>
<li><a href="https://pasteldefender.com">https://pasteldefender.com</a></li>
<li><a href="https://pathtoyoungness.com">https://pathtoyoungness.com</a></li>
<li><a href="https://patrickjonkman.nl">https://patrickjonkman.nl</a></li>
<li><a href="https://paulcampillo.com">https://paulcampillo.com</a></li>
<li><a href="https://people-people.com">https://people-people.com</a></li>
<li><a href="https://permutations.com">https://permutations.com</a></li>
<li><a href="https://Petergodfreysmith.com">https://Petergodfreysmith.com</a></li>
<li><a href="https://PH-N.com">https://PH-N.com</a></li>
<li><a href="https://pizzarules.com">https://pizzarules.com</a></li>
<li><a href="https://pl80.cc">https://pl80.cc</a></li>
<li><a href="https://ponto.ws">https://ponto.ws</a></li>
<li><a href="https://popdose.com">https://popdose.com</a></li>
<li><a href="https://positivewriter.com">https://positivewriter.com</a></li>
<li><a href="https://postuma.nl">https://postuma.nl</a></li>
<li><a href="https://prettylies.net">https://prettylies.net</a></li>
<li><a href="https://psytranceguide.com">https://psytranceguide.com</a></li>
<li><a href="https://punct.xyz">https://punct.xyz</a></li>
<li><a href="https://pw-magazine.com">https://pw-magazine.com</a></li>
<li><a href="https://queensmuseum.org">https://queensmuseum.org</a></li>
<li><a href="https://queriously.com">https://queriously.com</a></li>
<li><a href="https://racheldejoode.com">https://racheldejoode.com</a></li>
<li><a href="https://radfatties.com">https://radfatties.com</a></li>
<li><a href="https://ramenaccessmemory.com">https://ramenaccessmemory.com</a></li>
<li><a href="https://ramensky.com">https://ramensky.com</a></li>
<li><a href="https://raoulgottschling.de">https://raoulgottschling.de</a></li>
<li><a href="https://raphaelbastide.com">https://raphaelbastide.com</a></li>
<li><a href="https://rayearth.net">https://rayearth.net</a></li>
<li><a href="https://realokdesign.com">https://realokdesign.com</a></li>
<li><a href="https://reas.com">https://reas.com</a></li>
<li><a href="https://recessanalog.org">https://recessanalog.org</a></li>
<li><a href="https://redchaingames.com">https://redchaingames.com</a></li>
<li><a href="https://rednoise.org">https://rednoise.org</a></li>
<li><a href="https://refixyourself.com">https://refixyourself.com</a></li>
<li><a href="https://republique.studio">https://republique.studio</a></li>
<li><a href="https://respectfullyconnected.com">https://respectfullyconnected.com</a></li>
<li><a href="https://revealingerrors.com">https://revealingerrors.com</a></li>
<li><a href="https://rge-partner.de">https://rge-partner.de</a></li>
<li><a href="https://rheingold.com">https://rheingold.com</a></li>
<li><a href="https://rheumjc.com">https://rheumjc.com</a></li>
<li><a href="https://richearthinstitute.org">https://richearthinstitute.org</a></li>
<li><a href="https://ricksilva.net">https://ricksilva.net</a></li>
<li><a href="https://robertfinkei.com">https://robertfinkei.com</a></li>
<li><a href="https://robotgentleman.com">https://robotgentleman.com</a></li>
<li><a href="https://ronmevissen.com">https://ronmevissen.com</a></li>
<li><a href="https://roundtableresidency.net">https://roundtableresidency.net</a></li>
<li><a href="https://rrg.ru">https://rrg.ru</a></li>
<li><a href="https://ruplastica.ru">https://ruplastica.ru</a></li>
<li><a href="https://russrizzo.net">https://russrizzo.net</a></li>
<li><a href="https://ryancan.build">https://ryancan.build</a></li>
<li><a href="https://s0nshine.net">https://s0nshine.net</a></li>
<li><a href="https://sagamusix.de">https://sagamusix.de</a></li>
<li><a href="https://saintgervais.ch">https://saintgervais.ch</a></li>
<li><a href="https://san-serriffe.com">https://san-serriffe.com</a></li>
<li><a href="https://scenecult.cc">https://scenecult.cc</a></li>
<li><a href="https://scope-typeface.com">https://scope-typeface.com</a></li>
<li><a href="https://serhii.net">https://serhii.net</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Contacts</title>
      <link>https://www.mr70.eu/contact/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/contact/</guid>
      <description><![CDATA[<p>My name is Matteo Redaelli, I live in Italy next to Lecco</p>
<p>You can contact me via email at <a href="mailto:matteo.redaelli@gmail.com">matteo.redaelli@gmail.com</a> or twitter</p>
<p>Regards</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Family Riddle problem with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-jan-2024/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-jan-2024/</guid>
      <description><![CDATA[<p>My #prolog solution for &ldquo;Family Riddle&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-january-2024/">dmcommunity.org challenge Jan 2024</a>.</p>
<p>Let’s assume that Rene and Leo are both heads of household, and, what a coincidence, both families include three girls and three boys. The youngest child in Leo’s family is a girl, and in Rene’s family, a little girl has just arrived. In other words, there is a girl in Rene’s family whose age is less than one year. Neither family includes any twins, nor any children closer in  age than a year. All the children are under age ten. In each family, the sum of the ages of the girls is equal to the sum of the ages of the boys; in fact, the sum of the squares of the ages of the girls is equal to the sum of the squares of the ages of the boys. The sum of the ages of all these children is 60.</p>
<p>My solution (without duplicates / permutations): the ages of children of the same sex are ordered.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">findall</span>([<span style="color:#8be9fd;font-style:italic">LeoBoys</span>,<span style="color:#8be9fd;font-style:italic">LeoGirls</span>,<span style="color:#8be9fd;font-style:italic">ReneBoys</span>,<span style="color:#8be9fd;font-style:italic">ReneGirls</span>], <span style="color:#50fa7b">sol</span>([<span style="color:#8be9fd;font-style:italic">LeoBoys</span>,<span style="color:#8be9fd;font-style:italic">LeoGirls</span>,<span style="color:#8be9fd;font-style:italic">ReneBoys</span>,<span style="color:#8be9fd;font-style:italic">ReneGirls</span>]), <span style="color:#8be9fd;font-style:italic">Solutions</span>), <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">Solutions</span>, <span style="color:#8be9fd;font-style:italic">Tot</span>).
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Solutions</span> <span style="color:#ff79c6">=</span> [[[<span style="color:#bd93f9">4</span>, <span style="color:#bd93f9">5</span>, <span style="color:#bd93f9">9</span>], [<span style="color:#bd93f9">3</span>, <span style="color:#bd93f9">7</span>, <span style="color:#bd93f9">8</span>], [<span style="color:#bd93f9">1</span>, <span style="color:#bd93f9">3</span>, <span style="color:#bd93f9">8</span>], [<span style="color:#bd93f9">0</span>, <span style="color:#bd93f9">5</span>, <span style="color:#bd93f9">7</span>]]],
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Tot</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">1.</span>
</span></span></code></pre></div><p>Below the code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">max_age</span>(<span style="color:#bd93f9">9</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sum_age</span>(<span style="color:#bd93f9">60</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">count_same_sex</span>(<span style="color:#bd93f9">3</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">constraints_family_same_sex</span>(<span style="color:#8be9fd;font-style:italic">L</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">max_age</span>(<span style="color:#8be9fd;font-style:italic">MaxAge</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">count_same_sex</span>(<span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% both families include three girls and three boys.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">L</span>, <span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% All the children are under age ten</span>
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">L</span> <span style="color:#f1fa8c">ins</span> <span style="color:#bd93f9">0.</span>.<span style="color:#8be9fd;font-style:italic">MaxAge</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% ages in sorted order </span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">ordered_list</span>(<span style="color:#8be9fd;font-style:italic">L</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">constraints_family</span>(<span style="color:#8be9fd;font-style:italic">Boys</span>, <span style="color:#8be9fd;font-style:italic">Girls</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_list</span>(<span style="color:#8be9fd;font-style:italic">Boys</span>, <span style="color:#8be9fd;font-style:italic">Sum</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_list</span>(<span style="color:#8be9fd;font-style:italic">Girls</span>, <span style="color:#8be9fd;font-style:italic">Sum</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_square_list</span>(<span style="color:#8be9fd;font-style:italic">Boys</span>, <span style="color:#8be9fd;font-style:italic">SumS</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_square_list</span>(<span style="color:#8be9fd;font-style:italic">Girls</span>, <span style="color:#8be9fd;font-style:italic">SumS</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sum_list</span>([<span style="color:#8be9fd;font-style:italic">E</span>|<span style="color:#8be9fd;font-style:italic">L</span>], <span style="color:#8be9fd;font-style:italic">Sum</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_list</span>(<span style="color:#8be9fd;font-style:italic">L</span>, <span style="color:#8be9fd;font-style:italic">SumL</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Sum</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">E</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">SumL</span>.
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sum_list</span>([], <span style="color:#bd93f9">0</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sum_square_list</span>([<span style="color:#8be9fd;font-style:italic">E</span>|<span style="color:#8be9fd;font-style:italic">L</span>], <span style="color:#8be9fd;font-style:italic">Sum</span>):-
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_square_list</span>(<span style="color:#8be9fd;font-style:italic">L</span>, <span style="color:#8be9fd;font-style:italic">SumL</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">Sum</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">E</span> <span style="color:#f1fa8c">^</span> <span style="color:#bd93f9">2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">SumL</span>.
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sum_square_list</span>([], <span style="color:#bd93f9">0</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">ordered_list</span>([<span style="color:#8be9fd;font-style:italic">E1</span>,<span style="color:#8be9fd;font-style:italic">E2</span>|<span style="color:#8be9fd;font-style:italic">L</span>]):-
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">E1</span> <span style="color:#f1fa8c">#=&lt;</span> <span style="color:#8be9fd;font-style:italic">E2</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">ordered_list</span>([<span style="color:#8be9fd;font-style:italic">E2</span>|<span style="color:#8be9fd;font-style:italic">L</span>]).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">ordered_list</span>([<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">E</span>]).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">ordered_list</span>([]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sol</span>([<span style="color:#8be9fd;font-style:italic">LeoBoys</span>, <span style="color:#8be9fd;font-style:italic">LeoGirls</span>, <span style="color:#8be9fd;font-style:italic">ReneBoys</span>, <span style="color:#8be9fd;font-style:italic">ReneGirls</span>]):-    
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% All the children are under age ten</span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% both families include three girls and three boys.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family_same_sex</span>(<span style="color:#8be9fd;font-style:italic">LeoBoys</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family_same_sex</span>(<span style="color:#8be9fd;font-style:italic">LeoGirls</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family_same_sex</span>(<span style="color:#8be9fd;font-style:italic">ReneBoys</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family_same_sex</span>(<span style="color:#8be9fd;font-style:italic">ReneGirls</span>),
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% in Rene’s family, a little girl has just arrived</span>
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">ReneGirls</span> <span style="color:#ff79c6">=</span> [<span style="color:#bd93f9">0</span>|<span style="color:#ff79c6">_</span>],
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% The youngest child in Leo’s family is a girl</span>
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">LeoBoys</span> <span style="color:#ff79c6">=</span> [<span style="color:#8be9fd;font-style:italic">LB1</span>|<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">RestLeoBoys</span>],
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">LeoGirls</span> <span style="color:#ff79c6">=</span> [<span style="color:#8be9fd;font-style:italic">LG1</span>|<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">RestLeoGirls</span>],
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">LG1</span> <span style="color:#f1fa8c">#&lt;</span> <span style="color:#8be9fd;font-style:italic">LB1</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">append</span>(<span style="color:#8be9fd;font-style:italic">LeoBoys</span>, <span style="color:#8be9fd;font-style:italic">LeoGirls</span>, <span style="color:#8be9fd;font-style:italic">LeoList</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">append</span>(<span style="color:#8be9fd;font-style:italic">ReneBoys</span>, <span style="color:#8be9fd;font-style:italic">ReneGirls</span>, <span style="color:#8be9fd;font-style:italic">ReneList</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">append</span>(<span style="color:#8be9fd;font-style:italic">LeoList</span>, <span style="color:#8be9fd;font-style:italic">ReneList</span>, <span style="color:#8be9fd;font-style:italic">AllChildren</span>),
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% Neither family includes any twins, nor any children closer in age than a year</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">all_distinct</span>(<span style="color:#8be9fd;font-style:italic">LeoList</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">all_distinct</span>(<span style="color:#8be9fd;font-style:italic">ReneList</span>),
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% The sum of the ages of all these children is 60.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_age</span>(<span style="color:#8be9fd;font-style:italic">SumAge</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">sum_list</span>(<span style="color:#8be9fd;font-style:italic">AllChildren</span>, <span style="color:#8be9fd;font-style:italic">SumAge</span>),
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">%% In each family, the sum of the ages of the girls is equal to the sum of the ages of the boys</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family</span>(<span style="color:#8be9fd;font-style:italic">LeoBoys</span>, <span style="color:#8be9fd;font-style:italic">LeoGirls</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">constraints_family</span>(<span style="color:#8be9fd;font-style:italic">ReneBoys</span>, <span style="color:#8be9fd;font-style:italic">ReneGirls</span>),
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">label</span>(<span style="color:#8be9fd;font-style:italic">AllChildren</span>).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Nginx web server</title>
      <link>https://www.mr70.eu/ragno/nginx/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/ragno/nginx/</guid>
      <description><![CDATA[<p><a href="https://nginx.org">Nginx</a> is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Russian developer Igor Sysoev and publicly released in 2004.[9] Nginx is free and open-source software, released under the terms of the 2-clause BSD license. A large fraction of web servers use Nginx,[10] often as a load balancer</p>
<p>Some web sites using the opensource software Nginx are:</p>
<ul>
<li><a href="https://04d.co">https://04d.co</a></li>
<li><a href="https://0b673cce.xyz">https://0b673cce.xyz</a></li>
<li><a href="https://1984.is">https://1984.is</a></li>
<li><a href="https://19daysinjapan.com">https://19daysinjapan.com</a></li>
<li><a href="https://1mi.media">https://1mi.media</a></li>
<li><a href="https://1uffakind.com">https://1uffakind.com</a></li>
<li><a href="https://2050.earth">https://2050.earth</a></li>
<li><a href="https://2051.vision">https://2051.vision</a></li>
<li><a href="https://20angles.com">https://20angles.com</a></li>
<li><a href="https://24ways.org">https://24ways.org</a></li>
<li><a href="https://291780.com:8443">https://291780.com:8443</a></li>
<li><a href="https://365mg.ru">https://365mg.ru</a></li>
<li><a href="https://3dtoday.ru">https://3dtoday.ru</a></li>
<li><a href="https://505games.com">https://505games.com</a></li>
<li><a href="https://51north.nl">https://51north.nl</a></li>
<li><a href="https://777gacor.com">https://777gacor.com</a></li>
<li><a href="https://777gacor.xyz">https://777gacor.xyz</a></li>
<li><a href="https://99bitcoins.com">https://99bitcoins.com</a></li>
<li><a href="https://99remotejobs.com">https://99remotejobs.com</a></li>
<li><a href="https://aantonioni.me">https://aantonioni.me</a></li>
<li><a href="https://aavina.com">https://aavina.com</a></li>
<li><a href="https://abcs.pro">https://abcs.pro</a></li>
<li><a href="https://a-bieb.nl">https://a-bieb.nl</a></li>
<li><a href="https://abiznews.net">https://abiznews.net</a></li>
<li><a href="https://abordage.dev">https://abordage.dev</a></li>
<li><a href="https://aboutmeditation.com">https://aboutmeditation.com</a></li>
<li><a href="https://absolutvip.ru">https://absolutvip.ru</a></li>
<li><a href="https://ac6v.com">https://ac6v.com</a></li>
<li><a href="https://acawiki.org">https://acawiki.org</a></li>
<li><a href="https://access-for-all.ch">https://access-for-all.ch</a></li>
<li><a href="https://achooandthesneezes.com">https://achooandthesneezes.com</a></li>
<li><a href="https://acko.net">https://acko.net</a></li>
<li><a href="https://acloserlisten.com">https://acloserlisten.com</a></li>
<li><a href="https://acousticbrainz.org">https://acousticbrainz.org</a></li>
<li><a href="https://acritch.com">https://acritch.com</a></li>
<li><a href="https://action-flix.com">https://action-flix.com</a></li>
<li><a href="https://activelogic.com">https://activelogic.com</a></li>
<li><a href="https://actualitte.com">https://actualitte.com</a></li>
<li><a href="https://adamloving.com">https://adamloving.com</a></li>
<li><a href="https://ada-school.org">https://ada-school.org</a></li>
<li><a href="https://adast.dk">https://adast.dk</a></li>
<li><a href="https://adindex.ru">https://adindex.ru</a></li>
<li><a href="https://adpass.ru">https://adpass.ru</a></li>
<li><a href="https://affecttheverb.com">https://affecttheverb.com</a></li>
<li><a href="https://agrobvk.ru">https://agrobvk.ru</a></li>
<li><a href="https://agromonitoring.com">https://agromonitoring.com</a></li>
<li><a href="https://agroperm-ck.ru">https://agroperm-ck.ru</a></li>
<li><a href="https://aicpawards.com">https://aicpawards.com</a></li>
<li><a href="https://aic-qsoft.ru">https://aic-qsoft.ru</a></li>
<li><a href="https://aimfond.ru">https://aimfond.ru</a></li>
<li><a href="https://airportcityplaza.ru">https://airportcityplaza.ru</a></li>
<li><a href="https://airspeedvelocity.net">https://airspeedvelocity.net</a></li>
<li><a href="https://ajkdblog.org">https://ajkdblog.org</a></li>
<li><a href="https://akanekinomoto.com">https://akanekinomoto.com</a></li>
<li><a href="https://akitrf.ru">https://akitrf.ru</a></li>
<li><a href="https://akona.ru">https://akona.ru</a></li>
<li><a href="https://akperspectives.com">https://akperspectives.com</a></li>
<li><a href="https://akpp.top">https://akpp.top</a></li>
<li><a href="https://alanburgon.com">https://alanburgon.com</a></li>
<li><a href="https://albumreviews.blog">https://albumreviews.blog</a></li>
<li><a href="https://aldf.org">https://aldf.org</a></li>
<li><a href="https://alecmapesfrances.com">https://alecmapesfrances.com</a></li>
<li><a href="https://alekzandriia.com">https://alekzandriia.com</a></li>
<li><a href="https://aleteia.org">https://aleteia.org</a></li>
<li><a href="https://alexherrero.org">https://alexherrero.org</a></li>
<li><a href="https://alexisjanvier.net">https://alexisjanvier.net</a></li>
<li><a href="https://alicecph.com">https://alicecph.com</a></li>
<li><a href="https://alivebe.com">https://alivebe.com</a></li>
<li><a href="https://allamericandocs.com">https://allamericandocs.com</a></li>
<li><a href="https://all-events.ru">https://all-events.ru</a></li>
<li><a href="https://allium.house">https://allium.house</a></li>
<li><a href="https://allpoetry.com">https://allpoetry.com</a></li>
<li><a href="https://alm-faza.ru">https://alm-faza.ru</a></li>
<li><a href="https://altairspace.com">https://altairspace.com</a></li>
<li><a href="https://alternative.me">https://alternative.me</a></li>
<li><a href="https://aluminiumleader.ru">https://aluminiumleader.ru</a></li>
<li><a href="https://amazingred.ru">https://amazingred.ru</a></li>
<li><a href="https://americanaffairsjournal.org">https://americanaffairsjournal.org</a></li>
<li><a href="https://amisays.com">https://amisays.com</a></li>
<li><a href="https://amuseconf.com">https://amuseconf.com</a></li>
<li><a href="https://anarchistickaknihovna.org">https://anarchistickaknihovna.org</a></li>
<li><a href="https://anarhisticka-biblioteka.net">https://anarhisticka-biblioteka.net</a></li>
<li><a href="https://ancor.ru">https://ancor.ru</a></li>
<li><a href="https://andreas-kurtz.de">https://andreas-kurtz.de</a></li>
<li><a href="https://andreaslydemann.com">https://andreaslydemann.com</a></li>
<li><a href="https://andr.ee">https://andr.ee</a></li>
<li><a href="https://andrewbanchi.ch">https://andrewbanchi.ch</a></li>
<li><a href="https://anerma.de">https://anerma.de</a></li>
<li><a href="https://angelcruz.dev">https://angelcruz.dev</a></li>
<li><a href="https://angelemassage.ch">https://angelemassage.ch</a></li>
<li><a href="https://anie.la">https://anie.la</a></li>
<li><a href="https://anitagraser.com">https://anitagraser.com</a></li>
<li><a href="https://ankiweb.net">https://ankiweb.net</a></li>
<li><a href="https://anklebuster.com">https://anklebuster.com</a></li>
<li><a href="https://annualreportbam.com">https://annualreportbam.com</a></li>
<li><a href="https://anotherwiki.org">https://anotherwiki.org</a></li>
<li><a href="https://anr.fr">https://anr.fr</a></li>
<li><a href="https://antaltalent.ru">https://antaltalent.ru</a></li>
<li><a href="https://antgrup.ru">https://antgrup.ru</a></li>
<li><a href="https://anyhowhq.com">https://anyhowhq.com</a></li>
<li><a href="https://apoia.se">https://apoia.se</a></li>
<li><a href="https://apolloapp.io">https://apolloapp.io</a></li>
<li><a href="https://apontious.com">https://apontious.com</a></li>
<li><a href="https://appdecentral.com">https://appdecentral.com</a></li>
<li><a href="https://appmakers.dev">https://appmakers.dev</a></li>
<li><a href="https://appventure.me">https://appventure.me</a></li>
<li><a href="https://aprilbell.com">https://aprilbell.com</a></li>
<li><a href="https://aquent.com">https://aquent.com</a></li>
<li><a href="https://arachne.cc">https://arachne.cc</a></li>
<li><a href="https://archived.software">https://archived.software</a></li>
<li><a href="https://ardupilot.org">https://ardupilot.org</a></li>
<li><a href="https://arenzana.org">https://arenzana.org</a></li>
<li><a href="https://arequeue.com">https://arequeue.com</a></li>
<li><a href="https://argumenti.ru">https://argumenti.ru</a></li>
<li><a href="https://armonchegorsk.ru">https://armonchegorsk.ru</a></li>
<li><a href="https://arppsoft.ru">https://arppsoft.ru</a></li>
<li><a href="https://artbabridgereport.org">https://artbabridgereport.org</a></li>
<li><a href="https://artbyritva.com">https://artbyritva.com</a></li>
<li><a href="https://a-r-t-e-m.com">https://a-r-t-e-m.com</a></li>
<li><a href="https://artisanalwriter.com">https://artisanalwriter.com</a></li>
<li><a href="https://arturgruchala.com">https://arturgruchala.com</a></li>
<li><a href="https://ashishkakkad.com">https://ashishkakkad.com</a></li>
<li><a href="https://asiagrace.com">https://asiagrace.com</a></li>
<li><a href="https://asia-import.ru">https://asia-import.ru</a></li>
<li><a href="https://asmjit.com">https://asmjit.com</a></li>
<li><a href="https://asninfo.ru">https://asninfo.ru</a></li>
<li><a href="https://atlasmag.dk">https://atlasmag.dk</a></li>
<li><a href="https://atnfriends.com">https://atnfriends.com</a></li>
<li><a href="https://atscaleconference.com">https://atscaleconference.com</a></li>
<li><a href="https://audiodramareviews.com">https://audiodramareviews.com</a></li>
<li><a href="https://audiomass.co">https://audiomass.co</a></li>
<li><a href="https://audunsandvik.com">https://audunsandvik.com</a></li>
<li><a href="https://auge360.com">https://auge360.com</a></li>
<li><a href="https://augmentedcode.io">https://augmentedcode.io</a></li>
<li><a href="https://auphonic.com">https://auphonic.com</a></li>
<li><a href="https://aussies.space">https://aussies.space</a></li>
<li><a href="https://autcollab.org">https://autcollab.org</a></li>
<li><a href="https://autismandhealth.org">https://autismandhealth.org</a></li>
<li><a href="https://auto.coffee">https://auto.coffee</a></li>
<li><a href="https://autocrypt.org">https://autocrypt.org</a></li>
<li><a href="https://automario.eu">https://automario.eu</a></li>
<li><a href="https://automarketolog.ru">https://automarketolog.ru</a></li>
<li><a href="https://automatorplugin.com">https://automatorplugin.com</a></li>
<li><a href="https://automattic.design">https://automattic.design</a></li>
<li><a href="https://avatar-ss.org">https://avatar-ss.org</a></li>
<li><a href="https://av-atlas.org">https://av-atlas.org</a></li>
<li><a href="https://awakenyourmyth.com">https://awakenyourmyth.com</a></li>
<li><a href="https://a-way-to-go.com">https://a-way-to-go.com</a></li>
<li><a href="https://aygwriting.com">https://aygwriting.com</a></li>
<li><a href="https://babich.biz">https://babich.biz</a></li>
<li><a href="https://badoo.com">https://badoo.com</a></li>
<li><a href="https://bagandboots.com">https://bagandboots.com</a></li>
<li><a href="https://balansemerket.no">https://balansemerket.no</a></li>
<li><a href="https://balkhifoundation.com">https://balkhifoundation.com</a></li>
<li><a href="https://bannedbooksweek.org">https://bannedbooksweek.org</a></li>
<li><a href="https://bantayogngmgabayani.org">https://bantayogngmgabayani.org</a></li>
<li><a href="https://barier.pro">https://barier.pro</a></li>
<li><a href="https://barvanet.kz">https://barvanet.kz</a></li>
<li><a href="https://basepath.com">https://basepath.com</a></li>
<li><a href="https://batranete.com">https://batranete.com</a></li>
<li><a href="https://bauermedia.sk">https://bauermedia.sk</a></li>
<li><a href="https://bazt.ru">https://bazt.ru</a></li>
<li><a href="https://bbiz.io">https://bbiz.io</a></li>
<li><a href="https://bbn-consultants.com">https://bbn-consultants.com</a></li>
<li><a href="https://bcode.news">https://bcode.news</a></li>
<li><a href="https://bdearch.com">https://bdearch.com</a></li>
<li><a href="https://bdsmovement.net">https://bdsmovement.net</a></li>
<li><a href="https://beakandlens.com">https://beakandlens.com</a></li>
<li><a href="https://bear.im">https://bear.im</a></li>
<li><a href="https://bearmccreary.com">https://bearmccreary.com</a></li>
<li><a href="https://beefree.io">https://beefree.io</a></li>
<li><a href="https://beepsquad.wtf">https://beepsquad.wtf</a></li>
<li><a href="https://beherenowchild.com">https://beherenowchild.com</a></li>
<li><a href="https://belkacar.ru">https://belkacar.ru</a></li>
<li><a href="https://belko.xyz">https://belko.xyz</a></li>
<li><a href="https://bellebcooper.com">https://bellebcooper.com</a></li>
<li><a href="https://bemaniso.ws">https://bemaniso.ws</a></li>
<li><a href="https://ben.blog">https://ben.blog</a></li>
<li><a href="https://benbrown.com">https://benbrown.com</a></li>
<li><a href="https://benharri.org">https://benharri.org</a></li>
<li><a href="https://benjaminscholtysik.com">https://benjaminscholtysik.com</a></li>
<li><a href="https://benscheirman.com">https://benscheirman.com</a></li>
<li><a href="https://bensonplace.org">https://bensonplace.org</a></li>
<li><a href="https://berkshirehathaway.com">https://berkshirehathaway.com</a></li>
<li><a href="https://bernar.do">https://bernar.do</a></li>
<li><a href="https://besties.house">https://besties.house</a></li>
<li><a href="https://bestkora.com">https://bestkora.com</a></li>
<li><a href="https://bestly.ru">https://bestly.ru</a></li>
<li><a href="https://bestrussia.tv">https://bestrussia.tv</a></li>
<li><a href="https://beyondthebundle.com">https://beyondthebundle.com</a></li>
<li><a href="https://bfmspb.ru">https://bfmspb.ru</a></li>
<li><a href="https://bhp.sk">https://bhp.sk</a></li>
<li><a href="https://bibliotecaanarchica.org">https://bibliotecaanarchica.org</a></li>
<li><a href="https://bibliotecaanarquista.org">https://bibliotecaanarquista.org</a></li>
<li><a href="https://bigboy.us">https://bigboy.us</a></li>
<li><a href="https://bigposting.com">https://bigposting.com</a></li>
<li><a href="https://bigzh.ch">https://bigzh.ch</a></li>
<li><a href="https://bijerik.nl">https://bijerik.nl</a></li>
<li><a href="https://biobot.io">https://biobot.io</a></li>
<li><a href="https://biologicalspeculation.blog">https://biologicalspeculation.blog</a></li>
<li><a href="https://biscuit.town">https://biscuit.town</a></li>
<li><a href="https://bisteinoff.ru">https://bisteinoff.ru</a></li>
<li><a href="https://bits.media">https://bits.media</a></li>
<li><a href="https://bit-tech.net">https://bit-tech.net</a></li>
<li><a href="https://bizgraphic.ch">https://bizgraphic.ch</a></li>
<li><a href="https://bjango.com">https://bjango.com</a></li>
<li><a href="https://blackjackbreak.com">https://blackjackbreak.com</a></li>
<li><a href="https://bleemeo.com">https://bleemeo.com</a></li>
<li><a href="https://blend2d.com">https://blend2d.com</a></li>
<li><a href="https://blindinstituteoftechnology.org">https://blindinstituteoftechnology.org</a></li>
<li><a href="https://blips.club">https://blips.club</a></li>
<li><a href="https://blockclubchicago.org">https://blockclubchicago.org</a></li>
<li><a href="https://blogmaverick.com">https://blogmaverick.com</a></li>
<li><a href="https://blue-ant.ru">https://blue-ant.ru</a></li>
<li><a href="https://blueosmuseum.com">https://blueosmuseum.com</a></li>
<li><a href="https://blues.org">https://blues.org</a></li>
<li><a href="https://bm24.ru">https://bm24.ru</a></li>
<li><a href="https://boardgamegeek.com">https://boardgamegeek.com</a></li>
<li><a href="https://bombeck.io">https://bombeck.io</a></li>
<li><a href="https://bonkers.name">https://bonkers.name</a></li>
<li><a href="https://booking.design">https://booking.design</a></li>
<li><a href="https://bookmarkos.com">https://bookmarkos.com</a></li>
<li><a href="https://boosty.to">https://boosty.to</a></li>
<li><a href="https://boren.blog">https://boren.blog</a></li>
<li><a href="https://bosfera.ru">https://bosfera.ru</a></li>
<li><a href="https://bost.link">https://bost.link</a></li>
<li><a href="https://bouah.net">https://bouah.net</a></li>
<li><a href="https://boulogne-autoworks.nl">https://boulogne-autoworks.nl</a></li>
<li><a href="https://bowmo.com">https://bowmo.com</a></li>
<li><a href="https://bo-won.com">https://bo-won.com</a></li>
<li><a href="https://boxin.space">https://boxin.space</a></li>
<li><a href="https://brainthrive.co">https://brainthrive.co</a></li>
<li><a href="https://brandefense.io">https://brandefense.io</a></li>
<li><a href="https://branding.city">https://branding.city</a></li>
<li><a href="https://brandpad.io">https://brandpad.io</a></li>
<li><a href="https://brandthrive.co">https://brandthrive.co</a></li>
<li><a href="https://breed.nl">https://breed.nl</a></li>
<li><a href="https://brettlindler.xyz">https://brettlindler.xyz</a></li>
<li><a href="https://brickinsights.com">https://brickinsights.com</a></li>
<li><a href="https://bristolgameshub.com">https://bristolgameshub.com</a></li>
<li><a href="https://broo.ke">https://broo.ke</a></li>
<li><a href="https://brutalist.design">https://brutalist.design</a></li>
<li><a href="https://bsmsummit.com">https://bsmsummit.com</a></li>
<li><a href="https://btcpodcasting.com">https://btcpodcasting.com</a></li>
<li><a href="https://btkoch.xyz">https://btkoch.xyz</a></li>
<li><a href="https://btlmag.ru">https://btlmag.ru</a></li>
<li><a href="https://buerobumbum.com">https://buerobumbum.com</a></li>
<li><a href="https://builtwithstatamic.com">https://builtwithstatamic.com</a></li>
<li><a href="https://bunny.garden">https://bunny.garden</a></li>
<li><a href="https://burda.ua">https://burda.ua</a></li>
<li><a href="https://burodata.ru">https://burodata.ru</a></li>
<li><a href="https://businessethicsblog.com">https://businessethicsblog.com</a></li>
<li><a href="https://businessgraduatesassociation.com">https://businessgraduatesassociation.com</a></li>
<li><a href="https://buybrand.ru">https://buybrand.ru</a></li>
<li><a href="https://buymanager.biz">https://buymanager.biz</a></li>
<li><a href="https://buyshared.net">https://buyshared.net</a></li>
<li><a href="https://bytes.zone">https://bytes.zone</a></li>
<li><a href="https://caddy.community">https://caddy.community</a></li>
<li><a href="https://calckey.world">https://calckey.world</a></li>
<li><a href="https://calmingmanatee.com">https://calmingmanatee.com</a></li>
<li><a href="https://campoallecomete.it">https://campoallecomete.it</a></li>
<li><a href="https://candidkay.com">https://candidkay.com</a></li>
<li><a href="https://candoella.com">https://candoella.com</a></li>
<li><a href="https://caneco.dev">https://caneco.dev</a></li>
<li><a href="https://captainawkward.com">https://captainawkward.com</a></li>
<li><a href="https://captainkicks.com">https://captainkicks.com</a></li>
<li><a href="https://carbonengineering.com">https://carbonengineering.com</a></li>
<li><a href="https://cardioteka.ru">https://cardioteka.ru</a></li>
<li><a href="https://carleighbaker.com">https://carleighbaker.com</a></li>
<li><a href="https://carlrobertshaw.com">https://carlrobertshaw.com</a></li>
<li><a href="https://carrotranch.com">https://carrotranch.com</a></li>
<li><a href="https://carymillsap.com">https://carymillsap.com</a></li>
<li><a href="https://casaos.io">https://casaos.io</a></li>
<li><a href="https://casatwy.com">https://casatwy.com</a></li>
<li><a href="https://case.app">https://case.app</a></li>
<li><a href="https://cashmereradio.com">https://cashmereradio.com</a></li>
<li><a href="https://casinopilota.it">https://casinopilota.it</a></li>
<li><a href="https://casinopilot.ca">https://casinopilot.ca</a></li>
<li><a href="https://casinopiloten.com">https://casinopiloten.com</a></li>
<li><a href="https://casinopiloten.se">https://casinopiloten.se</a></li>
<li><a href="https://casinotroll.com">https://casinotroll.com</a></li>
<li><a href="https://cassavafilms.com">https://cassavafilms.com</a></li>
<li><a href="https://castopod.it">https://castopod.it</a></li>
<li><a href="https://catexpo.kz">https://catexpo.kz</a></li>
<li><a href="https://catlintucker.com">https://catlintucker.com</a></li>
<li><a href="https://causa-arcana.com">https://causa-arcana.com</a></li>
<li><a href="https://cawaxbar.com">https://cawaxbar.com</a></li>
<li><a href="https://cbwcd.org">https://cbwcd.org</a></li>
<li><a href="https://cchange.xyz">https://cchange.xyz</a></li>
<li><a href="https://cctld.ru">https://cctld.ru</a></li>
<li><a href="https://cdm.link">https://cdm.link</a></li>
<li><a href="https://cenexelresearch.com">https://cenexelresearch.com</a></li>
<li><a href="https://ceur-ws.org">https://ceur-ws.org</a></li>
<li><a href="https://chadnet.org">https://chadnet.org</a></li>
<li><a href="https://chainsclub.de">https://chainsclub.de</a></li>
<li><a href="https://chamomile.studio">https://chamomile.studio</a></li>
<li><a href="https://chertluedde.com">https://chertluedde.com</a></li>
<li><a href="https://cherub.im">https://cherub.im</a></li>
<li><a href="https://chicagoseedsandclones.com">https://chicagoseedsandclones.com</a></li>
<li><a href="https://china-parts.ru">https://china-parts.ru</a></li>
<li><a href="https://chir.ag">https://chir.ag</a></li>
<li><a href="https://choosemycar.com">https://choosemycar.com</a></li>
<li><a href="https://chrisguillebeau.com">https://chrisguillebeau.com</a></li>
<li><a href="https://chri.sk">https://chri.sk</a></li>
<li><a href="https://christianselig.com">https://christianselig.com</a></li>
<li><a href="https://christinebialczak.com">https://christinebialczak.com</a></li>
<li><a href="https://christinecronau.com">https://christinecronau.com</a></li>
<li><a href="https://christinekloceklim.com">https://christinekloceklim.com</a></li>
<li><a href="https://christmascreeps.com">https://christmascreeps.com</a></li>
<li><a href="https://christmaspastpodcast.com">https://christmaspastpodcast.com</a></li>
<li><a href="https://christmasunderground.com">https://christmasunderground.com</a></li>
<li><a href="https://chromophiliat.dk">https://chromophiliat.dk</a></li>
<li><a href="https://chronosphere.io">https://chronosphere.io</a></li>
<li><a href="https://chucklefish.org">https://chucklefish.org</a></li>
<li><a href="https://ciderassociation.org">https://ciderassociation.org</a></li>
<li><a href="https://cihar.com">https://cihar.com</a></li>
<li><a href="https://cimacitta.ch">https://cimacitta.ch</a></li>
<li><a href="https://cinch.io">https://cinch.io</a></li>
<li><a href="https://cine365films.com">https://cine365films.com</a></li>
<li><a href="https://cinetv.ru">https://cinetv.ru</a></li>
<li><a href="https://cioinfluence.com">https://cioinfluence.com</a></li>
<li><a href="https://circular-economy-switzerland.ch">https://circular-economy-switzerland.ch</a></li>
<li><a href="https://cis.ru">https://cis.ru</a></li>
<li><a href="https://citizensciencefoundation.org">https://citizensciencefoundation.org</a></li>
<li><a href="https://citymapper.com">https://citymapper.com</a></li>
<li><a href="https://clairelemoine.art">https://clairelemoine.art</a></li>
<li><a href="https://clever-dm.ru">https://clever-dm.ru</a></li>
<li><a href="https://client-portal.io">https://client-portal.io</a></li>
<li><a href="https://clockify.me">https://clockify.me</a></li>
<li><a href="https://clojureverse.org">https://clojureverse.org</a></li>
<li><a href="https://clouarchitekten.ch">https://clouarchitekten.ch</a></li>
<li><a href="https://cloudconvert.com">https://cloudconvert.com</a></li>
<li><a href="https://cloudup.com">https://cloudup.com</a></li>
<li><a href="https://coachingfederation.org">https://coachingfederation.org</a></li>
<li><a href="https://coalitiontechnologies.com">https://coalitiontechnologies.com</a></li>
<li><a href="https://codekitchen.community">https://codekitchen.community</a></li>
<li><a href="https://codemirror.net">https://codemirror.net</a></li>
<li><a href="https://coders-home.de">https://coders-home.de</a></li>
<li><a href="https://codingwithempathy.com">https://codingwithempathy.com</a></li>
<li><a href="https://coffeeandpens.com">https://coffeeandpens.com</a></li>
<li><a href="https://cogalleries.com">https://cogalleries.com</a></li>
<li><a href="https://coinkyt.com">https://coinkyt.com</a></li>
<li><a href="https://colejorissen.com">https://colejorissen.com</a></li>
<li><a href="https://collective.world">https://collective.world</a></li>
<li><a href="https://colorama.space">https://colorama.space</a></li>
<li><a href="https://colorbash.art">https://colorbash.art</a></li>
<li><a href="https://combineswift.com">https://combineswift.com</a></li>
<li><a href="https://commento.io">https://commento.io</a></li>
<li><a href="https://commercialtype.com">https://commercialtype.com</a></li>
<li><a href="https://commonplacefacts.com">https://commonplacefacts.com</a></li>
<li><a href="https://complexityzoo.net">https://complexityzoo.net</a></li>
<li><a href="https://complexoffices.nl">https://complexoffices.nl</a></li>
<li><a href="https://conglommora.com">https://conglommora.com</a></li>
<li><a href="https://congresstime.ru">https://congresstime.ru</a></li>
<li><a href="https://conical-fermenter.com">https://conical-fermenter.com</a></li>
<li><a href="https://connex.digital">https://connex.digital</a></li>
<li><a href="https://connpass.com">https://connpass.com</a></li>
<li><a href="https://cono.rs">https://cono.rs</a></li>
<li><a href="https://constantvariables.co">https://constantvariables.co</a></li>
<li><a href="https://consumedbyink.ca">https://consumedbyink.ca</a></li>
<li><a href="https://content.industries">https://content.industries</a></li>
<li><a href="https://continentalmagazine.com">https://continentalmagazine.com</a></li>
<li><a href="https://contravariance.rocks">https://contravariance.rocks</a></li>
<li><a href="https://controlmousemedia.com">https://controlmousemedia.com</a></li>
<li><a href="https://conwaypubliclibrary.org">https://conwaypubliclibrary.org</a></li>
<li><a href="https://coolab.al">https://coolab.al</a></li>
<li><a href="https://coolify.io">https://coolify.io</a></li>
<li><a href="https://cor.ax">https://cor.ax</a></li>
<li><a href="https://cpaexchange.ru">https://cpaexchange.ru</a></li>
<li><a href="https://creonit.com">https://creonit.com</a></li>
<li><a href="https://crevv.com">https://crevv.com</a></li>
<li><a href="https://cristinamalcorra.com">https://cristinamalcorra.com</a></li>
<li><a href="https://crowdsignal.com">https://crowdsignal.com</a></li>
<li><a href="https://cser.org">https://cser.org</a></li>
<li><a href="https://ctcmr.com">https://ctcmr.com</a></li>
<li><a href="https://curiousmatterpodcast.com">https://curiousmatterpodcast.com</a></li>
<li><a href="https://currentsymposium.com">https://currentsymposium.com</a></li>
<li><a href="https://curtissannmatlock.com">https://curtissannmatlock.com</a></li>
<li><a href="https://cvet-32.ru">https://cvet-32.ru</a></li>
<li><a href="https://cytamins.ru">https://cytamins.ru</a></li>
<li><a href="https://daintreedigital.com">https://daintreedigital.com</a></li>
<li><a href="https://dasbisschentotschlag.de">https://dasbisschentotschlag.de</a></li>
<li><a href="https://davidliebermann.de">https://davidliebermann.de</a></li>
<li><a href="https://deborahjayauthor.com">https://deborahjayauthor.com</a></li>
<li><a href="https://decideforimpact.com">https://decideforimpact.com</a></li>
<li><a href="https://delirium-magazin.ch">https://delirium-magazin.ch</a></li>
<li><a href="https://deschoolamsterdam.nl">https://deschoolamsterdam.nl</a></li>
<li><a href="https://dewarmewinkel.nl">https://dewarmewinkel.nl</a></li>
<li><a href="https://dhananjayparkhe.com">https://dhananjayparkhe.com</a></li>
<li><a href="https://digitale-pracht.de">https://digitale-pracht.de</a></li>
<li><a href="https://digitalhumanitiesnow.org">https://digitalhumanitiesnow.org</a></li>
<li><a href="https://digitaloxy.ru">https://digitaloxy.ru</a></li>
<li><a href="https://digitalshortbread.com">https://digitalshortbread.com</a></li>
<li><a href="https://doc-tv.ru">https://doc-tv.ru</a></li>
<li><a href="https://dosboxdmclub.com">https://dosboxdmclub.com</a></li>
<li><a href="https://dpgeorge.net">https://dpgeorge.net</a></li>
<li><a href="https://dreamproject98.com">https://dreamproject98.com</a></li>
<li><a href="https://dtrace.org">https://dtrace.org</a></li>
<li><a href="https://eidos.digital">https://eidos.digital</a></li>
<li><a href="https://elanofficial.ae">https://elanofficial.ae</a></li>
<li><a href="https://elex.is">https://elex.is</a></li>
<li><a href="https://eloquentjavascript.net">https://eloquentjavascript.net</a></li>
<li><a href="https://emile.space">https://emile.space</a></li>
<li><a href="https://eseeknives.com">https://eseeknives.com</a></li>
<li><a href="https://esnie.org">https://esnie.org</a></li>
<li><a href="https://eunachoi.kr">https://eunachoi.kr</a></li>
<li><a href="https://exnil.io">https://exnil.io</a></li>
<li><a href="https://expad.ie">https://expad.ie</a></li>
<li><a href="https://expoclub.ru">https://expoclub.ru</a></li>
<li><a href="https://exposingtheinvisible.org">https://exposingtheinvisible.org</a></li>
<li><a href="https://fantv.ru">https://fantv.ru</a></li>
<li><a href="https://faringwell.com">https://faringwell.com</a></li>
<li><a href="https://fat-tony.ch">https://fat-tony.ch</a></li>
<li><a href="https://feinmantheother.com">https://feinmantheother.com</a></li>
<li><a href="https://ffffound.com">https://ffffound.com</a></li>
<li><a href="https://fivebooks.com">https://fivebooks.com</a></li>
<li><a href="https://fivedotoh.com">https://fivedotoh.com</a></li>
<li><a href="https://folder-one.eu">https://folder-one.eu</a></li>
<li><a href="https://foldingforum.org">https://foldingforum.org</a></li>
<li><a href="https://foliodot.com">https://foliodot.com</a></li>
<li><a href="https://forestofreading.com">https://forestofreading.com</a></li>
<li><a href="https://fourhourworkweek.com">https://fourhourworkweek.com</a></li>
<li><a href="https://francis.bio">https://francis.bio</a></li>
<li><a href="https://frantech.ca">https://frantech.ca</a></li>
<li><a href="https://free15c.com">https://free15c.com</a></li>
<li><a href="https://freedompodcasting.com">https://freedompodcasting.com</a></li>
<li><a href="https://freeride72.ru">https://freeride72.ru</a></li>
<li><a href="https://fronterabrands.com">https://fronterabrands.com</a></li>
<li><a href="https://futurearchitectureplatform.org">https://futurearchitectureplatform.org</a></li>
<li><a href="https://gabrielgambetta.biz">https://gabrielgambetta.biz</a></li>
<li><a href="https://gacor-gacor.vip">https://gacor-gacor.vip</a></li>
<li><a href="https://gamingrambleweekly.uk">https://gamingrambleweekly.uk</a></li>
<li><a href="https://ganzenest.nl">https://ganzenest.nl</a></li>
<li><a href="https://gazetafilidavidkovo.ru">https://gazetafilidavidkovo.ru</a></li>
<li><a href="https://gbumac.ru">https://gbumac.ru</a></li>
<li><a href="https://gel4u.ru">https://gel4u.ru</a></li>
<li><a href="https://ghostly.com">https://ghostly.com</a></li>
<li><a href="https://gieskes.nl">https://gieskes.nl</a></li>
<li><a href="https://glitche.com">https://glitche.com</a></li>
<li><a href="https://go2phystech.ru">https://go2phystech.ru</a></li>
<li><a href="https://graffitiremovals.org">https://graffitiremovals.org</a></li>
<li><a href="https://greencube.gallery">https://greencube.gallery</a></li>
<li><a href="https://gsenzao.ru">https://gsenzao.ru</a></li>
<li><a href="https://gunroswell.com">https://gunroswell.com</a></li>
<li><a href="https://hagstrombuilder.com">https://hagstrombuilder.com</a></li>
<li><a href="https://helpfullyit.com">https://helpfullyit.com</a></li>
<li><a href="https://henningbrauer.com">https://henningbrauer.com</a></li>
<li><a href="https://hidden-mountain.com">https://hidden-mountain.com</a></li>
<li><a href="https://himate.org">https://himate.org</a></li>
<li><a href="https://homunculus.jp">https://homunculus.jp</a></li>
<li><a href="https://hr-elearning.ru">https://hr-elearning.ru</a></li>
<li><a href="https://humrik.com">https://humrik.com</a></li>
<li><a href="https://iamtired.online">https://iamtired.online</a></li>
<li><a href="https://icecast.org">https://icecast.org</a></li>
<li><a href="https://icetrek.com">https://icetrek.com</a></li>
<li><a href="https://imba.io">https://imba.io</a></li>
<li><a href="https://inari.jp">https://inari.jp</a></li>
<li><a href="https://info@accessola.com">https://info@accessola.com</a></li>
<li><a href="https://inmoment.com">https://inmoment.com</a></li>
<li><a href="https://inmostgame.com">https://inmostgame.com</a></li>
<li><a href="https://interface.bio">https://interface.bio</a></li>
<li><a href="https://ipcalf.com">https://ipcalf.com</a></li>
<li><a href="https://ipresence.jp">https://ipresence.jp</a></li>
<li><a href="https://isreg.ru">https://isreg.ru</a></li>
<li><a href="https://istoriya.tv">https://istoriya.tv</a></li>
<li><a href="https://ithrivegames.org">https://ithrivegames.org</a></li>
<li><a href="https://itl-engg.com">https://itl-engg.com</a></li>
<li><a href="https://jaspervdj.be">https://jaspervdj.be</a></li>
<li><a href="https://javiloureiro.com">https://javiloureiro.com</a></li>
<li><a href="https://jeannebataille.com">https://jeannebataille.com</a></li>
<li><a href="https://jeremeyduvall.com">https://jeremeyduvall.com</a></li>
<li><a href="https://jeyranmain.com">https://jeyranmain.com</a></li>
<li><a href="https://johanahlback.com">https://johanahlback.com</a></li>
<li><a href="https://johnrieber.com">https://johnrieber.com</a></li>
<li><a href="https://johnwhowell.com">https://johnwhowell.com</a></li>
<li><a href="https://joshualande.com">https://joshualande.com</a></li>
<li><a href="https://joyent.com">https://joyent.com</a></li>
<li><a href="https://junichi11.com">https://junichi11.com</a></li>
<li><a href="https://k21.center">https://k21.center</a></li>
<li><a href="https://kamaleon.viajes">https://kamaleon.viajes</a></li>
<li><a href="https://kanerobinson.com">https://kanerobinson.com</a></li>
<li><a href="https://kaskadproject.com">https://kaskadproject.com</a></li>
<li><a href="https://katjagrace.com">https://katjagrace.com</a></li>
<li><a href="https://keyaar.in">https://keyaar.in</a></li>
<li><a href="https://khlevent.ru">https://khlevent.ru</a></li>
<li><a href="https://kimasendorf.com">https://kimasendorf.com</a></li>
<li><a href="https://kirkhamamovieaday.com">https://kirkhamamovieaday.com</a></li>
<li><a href="https://k-komma.de">https://k-komma.de</a></li>
<li><a href="https://kmallan.com">https://kmallan.com</a></li>
<li><a href="https://knapsacknews.com">https://knapsacknews.com</a></li>
<li><a href="https://komedia-tv.ru">https://komedia-tv.ru</a></li>
<li><a href="https://korteksin.ru">https://korteksin.ru</a></li>
<li><a href="https://kraak.net">https://kraak.net</a></li>
<li><a href="https://kuntsevo-gazeta.ru">https://kuntsevo-gazeta.ru</a></li>
<li><a href="https://lab-sp.ru">https://lab-sp.ru</a></li>
<li><a href="https://lailagohar.com">https://lailagohar.com</a></li>
<li><a href="https://lastheavy.com">https://lastheavy.com</a></li>
<li><a href="https://leviconrad.blog">https://leviconrad.blog</a></li>
<li><a href="https://liebermannkiepe.de">https://liebermannkiepe.de</a></li>
<li><a href="https://lifelongactivist.com">https://lifelongactivist.com</a></li>
<li><a href="https://lifewaykefir.ie">https://lifewaykefir.ie</a></li>
<li><a href="https://lindaghillfiction.com">https://lindaghillfiction.com</a></li>
<li><a href="https://linux-mm.org">https://linux-mm.org</a></li>
<li><a href="https://litworldinterviews.com">https://litworldinterviews.com</a></li>
<li><a href="https://liviasatriano.com">https://liviasatriano.com</a></li>
<li><a href="https://livingthecanadiandream.com">https://livingthecanadiandream.com</a></li>
<li><a href="https://lockrmail.com">https://lockrmail.com</a></li>
<li><a href="https://lorilschafer.com">https://lorilschafer.com</a></li>
<li><a href="https://lovenonsense.com">https://lovenonsense.com</a></li>
<li><a href="https://loversmagazine.com">https://loversmagazine.com</a></li>
<li><a href="https://lowcarbgenesis.com">https://lowcarbgenesis.com</a></li>
<li><a href="https://luminhouse.ru">https://luminhouse.ru</a></li>
<li><a href="https://luxuryaerozona.net">https://luxuryaerozona.net</a></li>
<li><a href="https://madmimi.com">https://madmimi.com</a></li>
<li><a href="https://madrugada-portugal.com">https://madrugada-portugal.com</a></li>
<li><a href="https://magasinsgeneraux.com">https://magasinsgeneraux.com</a></li>
<li><a href="https://magerecords.com">https://magerecords.com</a></li>
<li><a href="https://manifestos.de">https://manifestos.de</a></li>
<li><a href="https://mantik.cc">https://mantik.cc</a></li>
<li><a href="https://manuelbuerger.com">https://manuelbuerger.com</a></li>
<li><a href="https://mariuswatz.com">https://mariuswatz.com</a></li>
<li><a href="https://markedmovies.org">https://markedmovies.org</a></li>
<li><a href="https://marsfallpod.com">https://marsfallpod.com</a></li>
<li><a href="https://marshallandthemovies.com">https://marshallandthemovies.com</a></li>
<li><a href="https://martyuk.com">https://martyuk.com</a></li>
<li><a href="https://marygaudin.com">https://marygaudin.com</a></li>
<li><a href="https://massart.edu">https://massart.edu</a></li>
<li><a href="https://maximiliankiepe.de">https://maximiliankiepe.de</a></li>
<li><a href="https://maxsiedentopf.com">https://maxsiedentopf.com</a></li>
<li><a href="https://mentalspace.eu">https://mentalspace.eu</a></li>
<li><a href="https://mightyinthemidwest.com">https://mightyinthemidwest.com</a></li>
<li><a href="https://mikeallegra.com">https://mikeallegra.com</a></li>
<li><a href="https://mises.org">https://mises.org</a></li>
<li><a href="https://mitte.ru">https://mitte.ru</a></li>
<li><a href="https://m-l-xl.org">https://m-l-xl.org</a></li>
<li><a href="https://modernmediterranean.com">https://modernmediterranean.com</a></li>
<li><a href="https://momcilo.xyz">https://momcilo.xyz</a></li>
<li><a href="https://monstersoupcomic.com">https://monstersoupcomic.com</a></li>
<li><a href="https://monthly.mx">https://monthly.mx</a></li>
<li><a href="https://moreisbetterthanless.com">https://moreisbetterthanless.com</a></li>
<li><a href="https://moritzjekat.de">https://moritzjekat.de</a></li>
<li><a href="https://movabletype.com">https://movabletype.com</a></li>
<li><a href="https://movabletype.org">https://movabletype.org</a></li>
<li><a href="https://mozhaiskiy-gazeta.ru">https://mozhaiskiy-gazeta.ru</a></li>
<li><a href="https://msppk.ru">https://msppk.ru</a></li>
<li><a href="https://myriadusa.org">https://myriadusa.org</a></li>
<li><a href="https://mysterystudio.com">https://mysterystudio.com</a></li>
<li><a href="https://nalyzhi.ru">https://nalyzhi.ru</a></li>
<li><a href="https://nancyaruegg.com">https://nancyaruegg.com</a></li>
<li><a href="https://nedhickson.com">https://nedhickson.com</a></li>
<li><a href="https://nedshannon.com">https://nedshannon.com</a></li>
<li><a href="https://nir.media">https://nir.media</a></li>
<li><a href="https://nofacilities.com">https://nofacilities.com</a></li>
<li><a href="https://nophonetime.nl">https://nophonetime.nl</a></li>
<li><a href="https://nudgethemes.com">https://nudgethemes.com</a></li>
<li><a href="https://nworegonskywarn.info">https://nworegonskywarn.info</a></li>
<li><a href="https://obraarchitects.com">https://obraarchitects.com</a></li>
<li><a href="https://ochakovo-gazeta.ru">https://ochakovo-gazeta.ru</a></li>
<li><a href="https://ochdoch.de">https://ochdoch.de</a></li>
<li><a href="https://ohmycard.ru">https://ohmycard.ru</a></li>
<li><a href="https://oioioi.io">https://oioioi.io</a></li>
<li><a href="https://oklahomaseedsandclones.com">https://oklahomaseedsandclones.com</a></li>
<li><a href="https://oliverherlitschek.com">https://oliverherlitschek.com</a></li>
<li><a href="https://opus-codec.org">https://opus-codec.org</a></li>
<li><a href="https://osminstroy.ru">https://osminstroy.ru</a></li>
<li><a href="https://oysteinbrager.com">https://oysteinbrager.com</a></li>
<li><a href="https://paidmembershipspro.com">https://paidmembershipspro.com</a></li>
<li><a href="https://pariaradikal.de">https://pariaradikal.de</a></li>
<li><a href="https://pastspeaks.com">https://pastspeaks.com</a></li>
<li><a href="https://paulcampillo.com">https://paulcampillo.com</a></li>
<li><a href="https://pedroajo.com">https://pedroajo.com</a></li>
<li><a href="https://pennie.com">https://pennie.com</a></li>
<li><a href="https://pepperteam.ru">https://pepperteam.ru</a></li>
<li><a href="https://philipwthorne.com">https://philipwthorne.com</a></li>
<li><a href="https://phoboslab.org">https://phoboslab.org</a></li>
<li><a href="https://pieterpaulpothoven.com">https://pieterpaulpothoven.com</a></li>
<li><a href="https://piusbacher.com">https://piusbacher.com</a></li>
<li><a href="https://plumvillage.org">https://plumvillage.org</a></li>
<li><a href="https://pomogat-prosto.ru">https://pomogat-prosto.ru</a></li>
<li><a href="https://post4d.net">https://post4d.net</a></li>
<li><a href="https://pow.cx">https://pow.cx</a></li>
<li><a href="https://pre-code.com">https://pre-code.com</a></li>
<li><a href="https://proudlymadeindc.com">https://proudlymadeindc.com</a></li>
<li><a href="https://publicannouncement.org">https://publicannouncement.org</a></li>
<li><a href="https://q.berlin">https://q.berlin</a></li>
<li><a href="https://qgpennyworth.com">https://qgpennyworth.com</a></li>
<li><a href="https://rabtl.ru">https://rabtl.ru</a></li>
<li><a href="https://raffinerie.com">https://raffinerie.com</a></li>
<li><a href="https://ramenki-gazeta.ru">https://ramenki-gazeta.ru</a></li>
<li><a href="https://randomlanguagepoetry.com">https://randomlanguagepoetry.com</a></li>
<li><a href="https://ratsar.org">https://ratsar.org</a></li>
<li><a href="https://rawrtacular.com">https://rawrtacular.com</a></li>
<li><a href="https://realsocialskills.org">https://realsocialskills.org</a></li>
<li><a href="https://rebelsguidetopm.com">https://rebelsguidetopm.com</a></li>
<li><a href="https://researchr.org">https://researchr.org</a></li>
<li><a href="https://rhythmsection.blog">https://rhythmsection.blog</a></li>
<li><a href="https://roadtirement.com">https://roadtirement.com</a></li>
<li><a href="https://rollo-press.com">https://rollo-press.com</a></li>
<li><a href="https://rommelsantor.com">https://rommelsantor.com</a></li>
<li><a href="https://rosettacode.org">https://rosettacode.org</a></li>
<li><a href="https://rspp.ru">https://rspp.ru</a></li>
<li><a href="https://rubyrussia.club">https://rubyrussia.club</a></li>
<li><a href="https://rudetective.tv">https://rudetective.tv</a></li>
<li><a href="https://ruplastica.ru">https://ruplastica.ru</a></li>
<li><a href="https://rusroman.ru">https://rusroman.ru</a></li>
<li><a href="https://ryanlanz.com">https://ryanlanz.com</a></li>
<li><a href="https://samoburja.com">https://samoburja.com</a></li>
<li><a href="https://sarafan-tv.ru">https://sarafan-tv.ru</a></li>
<li><a href="https://sarahzero.com">https://sarahzero.com</a></li>
<li><a href="https://seanbreslin.jp">https://seanbreslin.jp</a></li>
<li><a href="https://sminex.com">https://sminex.com</a></li>
<li><a href="https://spdx.dev">https://spdx.dev</a></li>
<li><a href="https://tenderatlas.org">https://tenderatlas.org</a></li>
<li><a href="https://the-apothecary.club">https://the-apothecary.club</a></li>
<li><a href="https://thinc.blog">https://thinc.blog</a></li>
<li><a href="https://veneto.fm">https://veneto.fm</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Opensource softwares - database</title>
      <link>https://www.mr70.eu/opensource/databases/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/opensource/databases/</guid>
      <description><![CDATA[<h2 id="search-engines">Search engines</h2>
<p>TODO</p>
<p>RDBMS</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Opensource softwares - Prolog</title>
      <link>https://www.mr70.eu/opensource/prolog/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/opensource/prolog/</guid>
      <description><![CDATA[<ul>
<li>SWI-Prolog: <a href="https://www.swi-prolog.org">homepage</a>, <a href="https://github.com/SWI-Prolog/swipl-devel">repo</a></li>
<li>GNU Prolog: <a href="http://www.gprolog.org">homepage</a>, <a href="https://github.com/didoudiaz/gprolog">repo</a></li>
<li>YAP Prolog: <a href="https://www.dcc.fc.up.pt/~vsc/yap">homepage</a>, <a href="https://github.com/vscosta/yap">repo</a></li>
<li>B-Prolog: <a href="http://www.picat-lang.org/bprolog">homepage</a>, <a href="https://github.com/rurban/picat-lang">repo</a></li>
<li>Ciao Prolog: <a href="https://ciao-lang.org">homepage</a>, <a href="https://github.com/ciao-lang/ciao">repo</a></li>
<li>Scryer Prolog: <a href="https://github.com/mthom/scryer-prolog">homepage</a>, <a href="https://github.com/mthom/scryer-prolog">repo</a></li>
<li>XSB Prolog: <a href="http://xsb.sourceforge.net">homepage</a>, <a href="https://sourceforge.net/projects/xsb">repo</a></li>
<li>ECLiPSe Prolog: <a href="https://eclipseclp.org">homepage</a>, <a href="https://github.com/eclipse-clp/eclipse-clp">repo</a></li>
<li>Tau Prolog: <a href="http://tau-prolog.org">homepage</a>, <a href="https://github.com/tau-prolog/tau-prolog">repo</a></li>
<li>Logtalk: <a href="https://logtalk.org">homepage</a>, <a href="https://github.com/LogtalkDotOrg/logtalk3">repo</a></li>
<li>tuProlog: <a href="http://tuprolog.unibo.it">homepage</a>, <a href="https://github.com/tuProlog/2p-kt">repo</a></li>
<li>Strawberry Prolog: <a href="http://www.dobrev.com">homepage</a>, <a href="https://github.com/DobrevDeveloper/StrawberryProlog">repo</a></li>
<li>Lean Prolog: <a href="https://github.com/rla/lean-prolog">homepage</a>, <a href="https://github.com/rla/lean-prolog">repo</a></li>
<li>Trealla: <a href="https://github.com/trealla-prolog/trealla">homepage</a>, <a href="https://github.com/trealla-prolog/trealla">repo</a></li>
<li>N-Prolog: <a href="https://github.com/sasagawa888/nprolog">homepage</a>, <a href="https://github.com/sasagawa888/nprolog">repo</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Varnish cache</title>
      <link>https://www.mr70.eu/ragno/varnish/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/ragno/varnish/</guid>
      <description><![CDATA[<p><a href="https://varnish-cache.org/intro/index.html">Varnish cache</a> is a reverse caching proxy used as HTTP accelerator for content-heavy dynamic web sites as well as APIs. In contrast to other web accelerators, such as Squid, which began life as a client-side cache, or Apache and nginx, which are primarily origin servers, Varnish was designed as an HTTP accelerator. Varnish is focused exclusively on HTTP, unlike other proxy servers that often support FTP, SMTP, and other network protocols.</p>
<p>Some web sites using the opensource software Varnish are:</p>
<ul>
<li><a href="https://13h.tw">https://13h.tw</a></li>
<li><a href="https://1inch.io">https://1inch.io</a></li>
<li><a href="https://24ways.org">https://24ways.org</a></li>
<li><a href="https://3dcomic.shop">https://3dcomic.shop</a></li>
<li><a href="https://98.codes">https://98.codes</a></li>
<li><a href="https://accelerated.tech">https://accelerated.tech</a></li>
<li><a href="https://achhunna.com">https://achhunna.com</a></li>
<li><a href="https://adamferch.com">https://adamferch.com</a></li>
<li><a href="https://adamschwartz.co">https://adamschwartz.co</a></li>
<li><a href="https://aerotwist.com">https://aerotwist.com</a></li>
<li><a href="https://agilemanifesto.org">https://agilemanifesto.org</a></li>
<li><a href="https://agustinvaleriani.com">https://agustinvaleriani.com</a></li>
<li><a href="https://aicollective.tools">https://aicollective.tools</a></li>
<li><a href="https://akaptur.com">https://akaptur.com</a></li>
<li><a href="https://akr.am">https://akr.am</a></li>
<li><a href="https://albertodebortoli.com">https://albertodebortoli.com</a></li>
<li><a href="https://alexsci.com">https://alexsci.com</a></li>
<li><a href="https://alien-magazine.com">https://alien-magazine.com</a></li>
<li><a href="https://allanyu.nyc">https://allanyu.nyc</a></li>
<li><a href="https://alloc-init.com">https://alloc-init.com</a></li>
<li><a href="https://alva.ro">https://alva.ro</a></li>
<li><a href="https://americanexpress.io">https://americanexpress.io</a></li>
<li><a href="https://amourchips.com">https://amourchips.com</a></li>
<li><a href="https://andrewhallam.com">https://andrewhallam.com</a></li>
<li><a href="https://andrewyates.net">https://andrewyates.net</a></li>
<li><a href="https://aneacsu.com">https://aneacsu.com</a></li>
<li><a href="https://anne.li">https://anne.li</a></li>
<li><a href="https://annema.me">https://annema.me</a></li>
<li><a href="https://anthonytran.info">https://anthonytran.info</a></li>
<li><a href="https://antitypical.com">https://antitypical.com</a></li>
<li><a href="https://antran.app">https://antran.app</a></li>
<li><a href="https://archive.pe">https://archive.pe</a></li>
<li><a href="https://arjenwiersma.nl">https://arjenwiersma.nl</a></li>
<li><a href="https://arjunnayini.com">https://arjunnayini.com</a></li>
<li><a href="https://armancohan.com">https://armancohan.com</a></li>
<li><a href="https://armswiki.org">https://armswiki.org</a></li>
<li><a href="https://ar.to">https://ar.to</a></li>
<li><a href="https://ary.as">https://ary.as</a></li>
<li><a href="https://ashellinthepit.com">https://ashellinthepit.com</a></li>
<li><a href="https://ashugeo.com">https://ashugeo.com</a></li>
<li><a href="https://asur.dev">https://asur.dev</a></li>
<li><a href="https://attalitech.com">https://attalitech.com</a></li>
<li><a href="https://augment.health">https://augment.health</a></li>
<li><a href="https://aurelia.io">https://aurelia.io</a></li>
<li><a href="https://azamsharp.com">https://azamsharp.com</a></li>
<li><a href="https://aztef.com">https://aztef.com</a></li>
<li><a href="https://backstage.io">https://backstage.io</a></li>
<li><a href="https://banalbanal.org">https://banalbanal.org</a></li>
<li><a href="https://barbarianprincess.com">https://barbarianprincess.com</a></li>
<li><a href="https://basscss.com">https://basscss.com</a></li>
<li><a href="https://baudo.in">https://baudo.in</a></li>
<li><a href="https://beautifuljekyll.com">https://beautifuljekyll.com</a></li>
<li><a href="https://belijzajac.dev">https://belijzajac.dev</a></li>
<li><a href="https://benleivian.com">https://benleivian.com</a></li>
<li><a href="https://berlincodeofconduct.org">https://berlincodeofconduct.org</a></li>
<li><a href="https://bicyclewheel.info">https://bicyclewheel.info</a></li>
<li><a href="https://binarybuilder.org">https://binarybuilder.org</a></li>
<li><a href="https://blackhole.run">https://blackhole.run</a></li>
<li><a href="https://bl.ag">https://bl.ag</a></li>
<li><a href="https://bla.ir">https://bla.ir</a></li>
<li><a href="https://bnmsummit.com">https://bnmsummit.com</a></li>
<li><a href="https://boardgamegeek.com">https://boardgamegeek.com</a></li>
<li><a href="https://bobatealee.com">https://bobatealee.com</a></li>
<li><a href="https://bob.farm">https://bob.farm</a></li>
<li><a href="https://bo-en.info">https://bo-en.info</a></li>
<li><a href="https://bones.dog">https://bones.dog</a></li>
<li><a href="https://boomerang.work">https://boomerang.work</a></li>
<li><a href="https://box2d.org">https://box2d.org</a></li>
<li><a href="https://boxicons.com">https://boxicons.com</a></li>
<li><a href="https://braythwayt.com">https://braythwayt.com</a></li>
<li><a href="https://breakingtheboycode.com">https://breakingtheboycode.com</a></li>
<li><a href="https://browserify.org">https://browserify.org</a></li>
<li><a href="https://brunch.io">https://brunch.io</a></li>
<li><a href="https://bsn.design">https://bsn.design</a></li>
<li><a href="https://bthdonohue.com">https://bthdonohue.com</a></li>
<li><a href="https://buttercms.com">https://buttercms.com</a></li>
<li><a href="https://cabbi.bo">https://cabbi.bo</a></li>
<li><a href="https://callcentertrainingtips.com">https://callcentertrainingtips.com</a></li>
<li><a href="https://cami.la">https://cami.la</a></li>
<li><a href="https://capistranorb.com">https://capistranorb.com</a></li>
<li><a href="https://caprover.com">https://caprover.com</a></li>
<li><a href="https://carmo.io">https://carmo.io</a></li>
<li><a href="https://carpeaqua.com">https://carpeaqua.com</a></li>
<li><a href="https://cay.la">https://cay.la</a></li>
<li><a href="https://cctplus.dev">https://cctplus.dev</a></li>
<li><a href="https://cd2bit.com">https://cd2bit.com</a></li>
<li><a href="https://cdf1982.com">https://cdf1982.com</a></li>
<li><a href="https://changelog.com">https://changelog.com</a></li>
<li><a href="https://charliemchapman.com">https://charliemchapman.com</a></li>
<li><a href="https://chibug.org">https://chibug.org</a></li>
<li><a href="https://chikomukwenha.co">https://chikomukwenha.co</a></li>
<li><a href="https://chkchkchk.net">https://chkchkchk.net</a></li>
<li><a href="https://chocolatey.org">https://chocolatey.org</a></li>
<li><a href="https://chowdhary.org">https://chowdhary.org</a></li>
<li><a href="https://chrisandriessen.nl">https://chrisandriessen.nl</a></li>
<li><a href="https://christiantiefenau.de">https://christiantiefenau.de</a></li>
<li><a href="https://christophhauf.com">https://christophhauf.com</a></li>
<li><a href="https://codakuma.com">https://codakuma.com</a></li>
<li><a href="https://codeandrun.it">https://codeandrun.it</a></li>
<li><a href="https://codecompletion.io">https://codecompletion.io</a></li>
<li><a href="https://codowd.com">https://codowd.com</a></li>
<li><a href="https://coincodex.com">https://coincodex.com</a></li>
<li><a href="https://communityhomeworks.org">https://communityhomeworks.org</a></li>
<li><a href="https://computecuter.com">https://computecuter.com</a></li>
<li><a href="https://concise-encoding.org">https://concise-encoding.org</a></li>
<li><a href="https://container-registry.com">https://container-registry.com</a></li>
<li><a href="https://copypaste.wtf">https://copypaste.wtf</a></li>
<li><a href="https://cryogenweb.org">https://cryogenweb.org</a></li>
<li><a href="https://damianogui.com">https://damianogui.com</a></li>
<li><a href="https://danielmoldoveanu.com">https://danielmoldoveanu.com</a></li>
<li><a href="https://dennishatwieger.de">https://dennishatwieger.de</a></li>
<li><a href="https://digitale-pracht.de">https://digitale-pracht.de</a></li>
<li><a href="https://distributedweb.care">https://distributedweb.care</a></li>
<li><a href="https://dobbstown.org">https://dobbstown.org</a></li>
<li><a href="https://dotclub.club">https://dotclub.club</a></li>
<li><a href="https://easings.net">https://easings.net</a></li>
<li><a href="https://eldred.fr">https://eldred.fr</a></li>
<li><a href="https://elegantcode.com">https://elegantcode.com</a></li>
<li><a href="https://emmah.net">https://emmah.net</a></li>
<li><a href="https://enes.in">https://enes.in</a></li>
<li><a href="https://exposure.money">https://exposure.money</a></li>
<li><a href="https://extrapractice.space">https://extrapractice.space</a></li>
<li><a href="https://fanfarefanfare.nl">https://fanfarefanfare.nl</a></li>
<li><a href="https://flashpoint.io">https://flashpoint.io</a></li>
<li><a href="https://flipnote.studio">https://flipnote.studio</a></li>
<li><a href="https://fossasia.org">https://fossasia.org</a></li>
<li><a href="https://frozentime.se">https://frozentime.se</a></li>
<li><a href="https://gameofpwners.com">https://gameofpwners.com</a></li>
<li><a href="https://gavilanmeasurex.org">https://gavilanmeasurex.org</a></li>
<li><a href="https://getpoole.com">https://getpoole.com</a></li>
<li><a href="https://goodtypefoundry.com">https://goodtypefoundry.com</a></li>
<li><a href="https://gridfinity.xyz">https://gridfinity.xyz</a></li>
<li><a href="https://haxeflixel.com">https://haxeflixel.com</a></li>
<li><a href="https://hboon.com">https://hboon.com</a></li>
<li><a href="https://hired.com">https://hired.com</a></li>
<li><a href="https://independentspaceindex.at">https://independentspaceindex.at</a></li>
<li><a href="https://isfglobal.org">https://isfglobal.org</a></li>
<li><a href="https://jalopnik.com">https://jalopnik.com</a></li>
<li><a href="https://jen@jenblood.com">https://jen@jenblood.com</a></li>
<li><a href="https://jensnikolaus.com">https://jensnikolaus.com</a></li>
<li><a href="https://jstherightway.org">https://jstherightway.org</a></li>
<li><a href="https://juliusasling.se">https://juliusasling.se</a></li>
<li><a href="https://jvieker.com">https://jvieker.com</a></li>
<li><a href="https://jxnblk.com">https://jxnblk.com</a></li>
<li><a href="https://kraak.net">https://kraak.net</a></li>
<li><a href="https://learn-haskell.blog">https://learn-haskell.blog</a></li>
<li><a href="https://lindahintz.com">https://lindahintz.com</a></li>
<li><a href="https://lisacharlottemuth.com">https://lisacharlottemuth.com</a></li>
<li><a href="https://livinlavidalowcarb.com">https://livinlavidalowcarb.com</a></li>
<li><a href="https://marcosero.com">https://marcosero.com</a></li>
<li><a href="https://markuskreutzer.com">https://markuskreutzer.com</a></li>
<li><a href="https://martyromero.me">https://martyromero.me</a></li>
<li><a href="https://massart.edu">https://massart.edu</a></li>
<li><a href="https://materializecss.com">https://materializecss.com</a></li>
<li><a href="https://maximsiebert.com">https://maximsiebert.com</a></li>
<li><a href="https://michael.team">https://michael.team</a></li>
<li><a href="https://mises.org">https://mises.org</a></li>
<li><a href="https://mrash.co">https://mrash.co</a></li>
<li><a href="https://mrdoob.com">https://mrdoob.com</a></li>
<li><a href="https://mrzool.cc">https://mrzool.cc</a></li>
<li><a href="https://natasjabokkerink.nl">https://natasjabokkerink.nl</a></li>
<li><a href="https://newmonumentsgc.com">https://newmonumentsgc.com</a></li>
<li><a href="https://node.green">https://node.green</a></li>
<li><a href="https://ofplace.info">https://ofplace.info</a></li>
<li><a href="https://onym.co">https://onym.co</a></li>
<li><a href="https://opensourcedesign.net">https://opensourcedesign.net</a></li>
<li><a href="https://openworm.org">https://openworm.org</a></li>
<li><a href="https://pablotheflamingo.com">https://pablotheflamingo.com</a></li>
<li><a href="https://payinterns.nyc">https://payinterns.nyc</a></li>
<li><a href="https://pedr0.com">https://pedr0.com</a></li>
<li><a href="https://pennie.com">https://pennie.com</a></li>
<li><a href="https://pitscher.net">https://pitscher.net</a></li>
<li><a href="https://pl80.cc">https://pl80.cc</a></li>
<li><a href="https://powermoves.blog">https://powermoves.blog</a></li>
<li><a href="https://printedweb.org">https://printedweb.org</a></li>
<li><a href="https://pyvideo.org">https://pyvideo.org</a></li>
<li><a href="https://rahulshinde.com">https://rahulshinde.com</a></li>
<li><a href="https://railsbridge.nz">https://railsbridge.nz</a></li>
<li><a href="https://rarlindseysmash.com">https://rarlindseysmash.com</a></li>
<li><a href="https://regent-lang.org">https://regent-lang.org</a></li>
<li><a href="https://rikkikimacovich.com">https://rikkikimacovich.com</a></li>
<li><a href="https://rileytestut.com">https://rileytestut.com</a></li>
<li><a href="https://robbrackett.com">https://robbrackett.com</a></li>
<li><a href="https://rosettacode.org">https://rosettacode.org</a></li>
<li><a href="https://rr-project.org">https://rr-project.org</a></li>
<li><a href="https://samoburja.com">https://samoburja.com</a></li>
<li><a href="https://spdx.dev">https://spdx.dev</a></li>
<li><a href="https://theproductivedad.com">https://theproductivedad.com</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Wordpress</title>
      <link>https://www.mr70.eu/ragno/wordpress/</link>
      <pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/ragno/wordpress/</guid>
      <description><![CDATA[<p><a href="https://wordpress.org">Wordpress</a> WordPress (also known as WP or WordPress.org) is a web content management system. It was originally created as a tool to publish blogs but has evolved to support publishing other web content, including more traditional websites, mailing lists and Internet forum, media galleries, membership sites, learning management systems and online stores. Available as free and open-source software, WordPress is among the most popular content management systems – it was used by 43.1% of the top 10 million websites as of December 2023</p>
<p>Some web sites using the opensource software Wordpress are:</p>
<ul>
<li><a href="https://19daysinjapan.com">https://19daysinjapan.com</a></li>
<li><a href="https://1ppm.de">https://1ppm.de</a></li>
<li><a href="https://2051.vision">https://2051.vision</a></li>
<li><a href="https://216digital.com">https://216digital.com</a></li>
<li><a href="https://2x4.org">https://2x4.org</a></li>
<li><a href="https://321growthacademy.com">https://321growthacademy.com</a></li>
<li><a href="https://360monitoring.com">https://360monitoring.com</a></li>
<li><a href="https://4beste.com">https://4beste.com</a></li>
<li><a href="https://505games.com">https://505games.com</a></li>
<li><a href="https://5sw.de">https://5sw.de</a></li>
<li><a href="https://757colorcoded.org">https://757colorcoded.org</a></li>
<li><a href="https://99bitcoins.com">https://99bitcoins.com</a></li>
<li><a href="https://99flying.com">https://99flying.com</a></li>
<li><a href="https://aaig.info">https://aaig.info</a></li>
<li><a href="https://abalone-fondation.org">https://abalone-fondation.org</a></li>
<li><a href="https://abhealthshop.com">https://abhealthshop.com</a></li>
<li><a href="https://abilityexperience.org">https://abilityexperience.org</a></li>
<li><a href="https://abiznews.net">https://abiznews.net</a></li>
<li><a href="https://abnormalreturns.com">https://abnormalreturns.com</a></li>
<li><a href="https://abortionfunds.org">https://abortionfunds.org</a></li>
<li><a href="https://aboutlifemg.ru">https://aboutlifemg.ru</a></li>
<li><a href="https://aboutmeditation.com">https://aboutmeditation.com</a></li>
<li><a href="https://access-for-all.ch">https://access-for-all.ch</a></li>
<li><a href="https://achooandthesneezes.com">https://achooandthesneezes.com</a></li>
<li><a href="https://acoding.academy">https://acoding.academy</a></li>
<li><a href="https://acrabstracts.org">https://acrabstracts.org</a></li>
<li><a href="https://adamloving.com">https://adamloving.com</a></li>
<li><a href="https://adamwulf.me">https://adamwulf.me</a></li>
<li><a href="https://ada-school.org">https://ada-school.org</a></li>
<li><a href="https://adlounge.ca">https://adlounge.ca</a></li>
<li><a href="https://adpass.ru">https://adpass.ru</a></li>
<li><a href="https://adriahost.rs">https://adriahost.rs</a></li>
<li><a href="https://aequalis.cl">https://aequalis.cl</a></li>
<li><a href="https://aerosairship.com">https://aerosairship.com</a></li>
<li><a href="https://affiliatewp.com">https://affiliatewp.com</a></li>
<li><a href="https://affordanything.com">https://affordanything.com</a></li>
<li><a href="https://afit.store">https://afit.store</a></li>
<li><a href="https://aftershockmedia.com">https://aftershockmedia.com</a></li>
<li><a href="https://agostini.tech">https://agostini.tech</a></li>
<li><a href="https://ainoblocks.io">https://ainoblocks.io</a></li>
<li><a href="https://ainowinstitute.org">https://ainowinstitute.org</a></li>
<li><a href="https://airportcityplaza.ru">https://airportcityplaza.ru</a></li>
<li><a href="https://aitoolsmasters.com">https://aitoolsmasters.com</a></li>
<li><a href="https://ajkdblog.org">https://ajkdblog.org</a></li>
<li><a href="https://aku.co">https://aku.co</a></li>
<li><a href="https://alainbertaud.com">https://alainbertaud.com</a></li>
<li><a href="https://alber.to">https://alber.to</a></li>
<li><a href="https://albumreviews.blog">https://albumreviews.blog</a></li>
<li><a href="https://alekzandriia.com">https://alekzandriia.com</a></li>
<li><a href="https://aleteia.org">https://aleteia.org</a></li>
<li><a href="https://alexfirs.com">https://alexfirs.com</a></li>
<li><a href="https://aliabdaal.com">https://aliabdaal.com</a></li>
<li><a href="https://allamericandocs.com">https://allamericandocs.com</a></li>
<li><a href="https://allegrograph.com">https://allegrograph.com</a></li>
<li><a href="https://almaskater.com">https://almaskater.com</a></li>
<li><a href="https://alondragarciamiro.shop">https://alondragarciamiro.shop</a></li>
<li><a href="https://alpeadria-trailcup.com">https://alpeadria-trailcup.com</a></li>
<li><a href="https://alphabrewops.com">https://alphabrewops.com</a></li>
<li><a href="https://alphathiel.de">https://alphathiel.de</a></li>
<li><a href="https://altcoinlog.com">https://altcoinlog.com</a></li>
<li><a href="https://amambient.com">https://amambient.com</a></li>
<li><a href="https://amastyleinsider.com">https://amastyleinsider.com</a></li>
<li><a href="https://ameliezhao.com">https://ameliezhao.com</a></li>
<li><a href="https://americanaffairsjournal.org">https://americanaffairsjournal.org</a></li>
<li><a href="https://amiantos.net">https://amiantos.net</a></li>
<li><a href="https://amourchips.com">https://amourchips.com</a></li>
<li><a href="https://analogrevolution.com">https://analogrevolution.com</a></li>
<li><a href="https://anbefaltcasino.com">https://anbefaltcasino.com</a></li>
<li><a href="https://anchore.com">https://anchore.com</a></li>
<li><a href="https://andreaslydemann.com">https://andreaslydemann.com</a></li>
<li><a href="https://andreasviklund.com">https://andreasviklund.com</a></li>
<li><a href="https://andrejgajdos.com">https://andrejgajdos.com</a></li>
<li><a href="https://andrewking.ca">https://andrewking.ca</a></li>
<li><a href="https://andybargh.com">https://andybargh.com</a></li>
<li><a href="https://anniemurphypaul.com">https://anniemurphypaul.com</a></li>
<li><a href="https://anonymousgunshop.com">https://anonymousgunshop.com</a></li>
<li><a href="https://anonyome.com">https://anonyome.com</a></li>
<li><a href="https://anpc.ro">https://anpc.ro</a></li>
<li><a href="https://antaltalent.ru">https://antaltalent.ru</a></li>
<li><a href="https://anthonyjcoleman.com">https://anthonyjcoleman.com</a></li>
<li><a href="https://antiplagiat.ru">https://antiplagiat.ru</a></li>
<li><a href="https://antixlinux.com">https://antixlinux.com</a></li>
<li><a href="https://anton.io">https://anton.io</a></li>
<li><a href="https://anylex.ru">https://anylex.ru</a></li>
<li><a href="https://apiabroad.com">https://apiabroad.com</a></li>
<li><a href="https://apollopad.com">https://apollopad.com</a></li>
<li><a href="https://applewithbtcs.com">https://applewithbtcs.com</a></li>
<li><a href="https://applyfilters.fm">https://applyfilters.fm</a></li>
<li><a href="https://appmakers.dev">https://appmakers.dev</a></li>
<li><a href="https://appracatappra.com">https://appracatappra.com</a></li>
<li><a href="https://appstore-tagebuch.de">https://appstore-tagebuch.de</a></li>
<li><a href="https://apra.cz">https://apra.cz</a></li>
<li><a href="https://aprilbell.com">https://aprilbell.com</a></li>
<li><a href="https://aquent.com">https://aquent.com</a></li>
<li><a href="https://aquent.de">https://aquent.de</a></li>
<li><a href="https://aquentscout.com">https://aquentscout.com</a></li>
<li><a href="https://aquentstudios.com">https://aquentstudios.com</a></li>
<li><a href="https://aquenttalent.com">https://aquenttalent.com</a></li>
<li><a href="https://arborxr.com">https://arborxr.com</a></li>
<li><a href="https://argus-sec.com">https://argus-sec.com</a></li>
<li><a href="https://artisanalwriter.com">https://artisanalwriter.com</a></li>
<li><a href="https://artistdynamix.com">https://artistdynamix.com</a></li>
<li><a href="https://arunraghavan.net">https://arunraghavan.net</a></li>
<li><a href="https://ashishkakkad.com">https://ashishkakkad.com</a></li>
<li><a href="https://asia-import.ru">https://asia-import.ru</a></li>
<li><a href="https://askelpalautin.fi">https://askelpalautin.fi</a></li>
<li><a href="https://astoriapost.com">https://astoriapost.com</a></li>
<li><a href="https://astronomicalpark.cl">https://astronomicalpark.cl</a></li>
<li><a href="https://atarim.io">https://atarim.io</a></li>
<li><a href="https://atenai.org">https://atenai.org</a></li>
<li><a href="https://atmos.earth">https://atmos.earth</a></li>
<li><a href="https://atmoszero.energy">https://atmoszero.energy</a></li>
<li><a href="https://atnfriends.com">https://atnfriends.com</a></li>
<li><a href="https://atscaleconference.com">https://atscaleconference.com</a></li>
<li><a href="https://audio.dev">https://audio.dev</a></li>
<li><a href="https://audiokitpro.com">https://audiokitpro.com</a></li>
<li><a href="https://auge360.com">https://auge360.com</a></li>
<li><a href="https://augmatic.org">https://augmatic.org</a></li>
<li><a href="https://aussernet.de">https://aussernet.de</a></li>
<li><a href="https://austingil.com">https://austingil.com</a></li>
<li><a href="https://australiansouthasiancentre.com">https://australiansouthasiancentre.com</a></li>
<li><a href="https://autcollab.org">https://autcollab.org</a></li>
<li><a href="https://authy.com">https://authy.com</a></li>
<li><a href="https://autismacceptance.com">https://autismacceptance.com</a></li>
<li><a href="https://autisticadvocacy.org">https://autisticadvocacy.org</a></li>
<li><a href="https://automarketolog.ru">https://automarketolog.ru</a></li>
<li><a href="https://automatenspielex.com">https://automatenspielex.com</a></li>
<li><a href="https://automatorplugin.com">https://automatorplugin.com</a></li>
<li><a href="https://awakenyourmyth.com">https://awakenyourmyth.com</a></li>
<li><a href="https://awnnetwork.org">https://awnnetwork.org</a></li>
<li><a href="https://aygwriting.com">https://aygwriting.com</a></li>
<li><a href="https://aynrand.org">https://aynrand.org</a></li>
<li><a href="https://azcapitoltimes.com">https://azcapitoltimes.com</a></li>
<li><a href="https://aztef.com">https://aztef.com</a></li>
<li><a href="https://bagandboots.com">https://bagandboots.com</a></li>
<li><a href="https://balkhifoundation.com">https://balkhifoundation.com</a></li>
<li><a href="https://banks-finance.ru">https://banks-finance.ru</a></li>
<li><a href="https://bannedbooksweek.org">https://bannedbooksweek.org</a></li>
<li><a href="https://bantayogngmgabayani.org">https://bantayogngmgabayani.org</a></li>
<li><a href="https://barbarianprincess.com">https://barbarianprincess.com</a></li>
<li><a href="https://barcolumbus.pt">https://barcolumbus.pt</a></li>
<li><a href="https://barier.pro">https://barier.pro</a></li>
<li><a href="https://barnarts.org">https://barnarts.org</a></li>
<li><a href="https://barto.li">https://barto.li</a></li>
<li><a href="https://basepath.com">https://basepath.com</a></li>
<li><a href="https://basicincome.org">https://basicincome.org</a></li>
<li><a href="https://basicincometoday.com">https://basicincometoday.com</a></li>
<li><a href="https://bassistance.de">https://bassistance.de</a></li>
<li><a href="https://basvangeuns.nl">https://basvangeuns.nl</a></li>
<li><a href="https://batranete.com">https://batranete.com</a></li>
<li><a href="https://battleofolustee.org">https://battleofolustee.org</a></li>
<li><a href="https://baysidepost.com">https://baysidepost.com</a></li>
<li><a href="https://bazt.ru">https://bazt.ru</a></li>
<li><a href="https://bclaconnect.ca">https://bclaconnect.ca</a></li>
<li><a href="https://bearmccreary.com">https://bearmccreary.com</a></li>
<li><a href="https://behindtheblack.com">https://behindtheblack.com</a></li>
<li><a href="https://bencikculinary.sk">https://bencikculinary.sk</a></li>
<li><a href="https://benharri.org">https://benharri.org</a></li>
<li><a href="https://benibischof.ch">https://benibischof.ch</a></li>
<li><a href="https://bensonplace.org">https://bensonplace.org</a></li>
<li><a href="https://bepet.org">https://bepet.org</a></li>
<li><a href="https://bernoff.com">https://bernoff.com</a></li>
<li><a href="https://bestbonusmoney.com">https://bestbonusmoney.com</a></li>
<li><a href="https://betterexplained.com">https://betterexplained.com</a></li>
<li><a href="https://beyondthebundle.com">https://beyondthebundle.com</a></li>
<li><a href="https://bffbtc.org">https://bffbtc.org</a></li>
<li><a href="https://b-h.ch">https://b-h.ch</a></li>
<li><a href="https://bigbluebutton.org">https://bigbluebutton.org</a></li>
<li><a href="https://bigposting.com">https://bigposting.com</a></li>
<li><a href="https://bigzh.ch">https://bigzh.ch</a></li>
<li><a href="https://bikeportland.org">https://bikeportland.org</a></li>
<li><a href="https://biobot.io">https://biobot.io</a></li>
<li><a href="https://bisteinoff.ru">https://bisteinoff.ru</a></li>
<li><a href="https://bitcryptomarket.com">https://bitcryptomarket.com</a></li>
<li><a href="https://bitgilt.com">https://bitgilt.com</a></li>
<li><a href="https://bitsplitting.org">https://bitsplitting.org</a></li>
<li><a href="https://bixacolor.com">https://bixacolor.com</a></li>
<li><a href="https://bizit.rs">https://bizit.rs</a></li>
<li><a href="https://blackandwhitecontractors.com">https://blackandwhitecontractors.com</a></li>
<li><a href="https://blindinstituteoftechnology.org">https://blindinstituteoftechnology.org</a></li>
<li><a href="https://blockclubchicago.org">https://blockclubchicago.org</a></li>
<li><a href="https://blogbuzzter.de">https://blogbuzzter.de</a></li>
<li><a href="https://blogmaverick.com">https://blogmaverick.com</a></li>
<li><a href="https://blueandpine.com">https://blueandpine.com</a></li>
<li><a href="https://blues.com">https://blues.com</a></li>
<li><a href="https://blues.org">https://blues.org</a></li>
<li><a href="https://b-masters.com">https://b-masters.com</a></li>
<li><a href="https://bmoreart.com">https://bmoreart.com</a></li>
<li><a href="https://bnmsummit.com">https://bnmsummit.com</a></li>
<li><a href="https://bonifii.com">https://bonifii.com</a></li>
<li><a href="https://bookalyser.com">https://bookalyser.com</a></li>
<li><a href="https://bookplaces.blog">https://bookplaces.blog</a></li>
<li><a href="https://boren.blog">https://boren.blog</a></li>
<li><a href="https://boulderlocavore.com">https://boulderlocavore.com</a></li>
<li><a href="https://bowdoinorient.com">https://bowdoinorient.com</a></li>
<li><a href="https://bowmo.com">https://bowmo.com</a></li>
<li><a href="https://bpcp.org">https://bpcp.org</a></li>
<li><a href="https://brainoverbrawn.com">https://brainoverbrawn.com</a></li>
<li><a href="https://brainthrive.co">https://brainthrive.co</a></li>
<li><a href="https://brandefense.io">https://brandefense.io</a></li>
<li><a href="https://branding.city">https://branding.city</a></li>
<li><a href="https://brandthrive.co">https://brandthrive.co</a></li>
<li><a href="https://breakingmuscle.com">https://breakingmuscle.com</a></li>
<li><a href="https://breed.nl">https://breed.nl</a></li>
<li><a href="https://brenebrown.com">https://brenebrown.com</a></li>
<li><a href="https://brevans.io">https://brevans.io</a></li>
<li><a href="https://bridgetowermedia.com">https://bridgetowermedia.com</a></li>
<li><a href="https://bristolgameshub.com">https://bristolgameshub.com</a></li>
<li><a href="https://broadly.com">https://broadly.com</a></li>
<li><a href="https://brokedownbodymoshpitmind.com">https://brokedownbodymoshpitmind.com</a></li>
<li><a href="https://brooklynpost.com">https://brooklynpost.com</a></li>
<li><a href="https://browsomepro.com">https://browsomepro.com</a></li>
<li><a href="https://brunobrito.pt">https://brunobrito.pt</a></li>
<li><a href="https://brutalistthemes.com">https://brutalistthemes.com</a></li>
<li><a href="https://bryansk.news">https://bryansk.news</a></li>
<li><a href="https://bryntum.com">https://bryntum.com</a></li>
<li><a href="https://bsgcraft.com">https://bsgcraft.com</a></li>
<li><a href="https://bsmsummit.com">https://bsmsummit.com</a></li>
<li><a href="https://buckscountybeacon.com">https://buckscountybeacon.com</a></li>
<li><a href="https://bugfender.com">https://bugfender.com</a></li>
<li><a href="https://builtbycivilization.com">https://builtbycivilization.com</a></li>
<li><a href="https://bulkpublishing.ai">https://bulkpublishing.ai</a></li>
<li><a href="https://bundesverband-gwb.de">https://bundesverband-gwb.de</a></li>
<li><a href="https://businessdirectoryplugin.com">https://businessdirectoryplugin.com</a></li>
<li><a href="https://butyoudontlooksick.com">https://butyoudontlooksick.com</a></li>
<li><a href="https://buymanager.biz">https://buymanager.biz</a></li>
<li><a href="https://buyrealcounterfeitmoney.com">https://buyrealcounterfeitmoney.com</a></li>
<li><a href="https://bystronom.ru">https://bystronom.ru</a></li>
<li><a href="https://caddac.ca">https://caddac.ca</a></li>
<li><a href="https://calmingmanatee.com">https://calmingmanatee.com</a></li>
<li><a href="https://caloriesproper.com">https://caloriesproper.com</a></li>
<li><a href="https://calvarychapel.com">https://calvarychapel.com</a></li>
<li><a href="https://cambodianvillagefund.org">https://cambodianvillagefund.org</a></li>
<li><a href="https://campnrs.com">https://campnrs.com</a></li>
<li><a href="https://cancercareservices.org">https://cancercareservices.org</a></li>
<li><a href="https://candoella.com">https://candoella.com</a></li>
<li><a href="https://cannanine.com">https://cannanine.com</a></li>
<li><a href="https://cantwaitforchristmaspod.com">https://cantwaitforchristmaspod.com</a></li>
<li><a href="https://captainkicks.com">https://captainkicks.com</a></li>
<li><a href="https://carbonengineering.com">https://carbonengineering.com</a></li>
<li><a href="https://cardiffcyclecity.org">https://cardiffcyclecity.org</a></li>
<li><a href="https://caricaturestl.com">https://caricaturestl.com</a></li>
<li><a href="https://carleighbaker.com">https://carleighbaker.com</a></li>
<li><a href="https://carrotranch.com">https://carrotranch.com</a></li>
<li><a href="https://carymillsap.com">https://carymillsap.com</a></li>
<li><a href="https://casinohex.org">https://casinohex.org</a></li>
<li><a href="https://casinopiloot.com">https://casinopiloot.com</a></li>
<li><a href="https://casinopilota.it">https://casinopilota.it</a></li>
<li><a href="https://casinopilot.ca">https://casinopilot.ca</a></li>
<li><a href="https://casinopiloten.com">https://casinopiloten.com</a></li>
<li><a href="https://casinopiloten.se">https://casinopiloten.se</a></li>
<li><a href="https://casinoszondercruks.com">https://casinoszondercruks.com</a></li>
<li><a href="https://casinotroll.com">https://casinotroll.com</a></li>
<li><a href="https://casino-utan-svensk-licens.com">https://casino-utan-svensk-licens.com</a></li>
<li><a href="https://casinozondercruks.net">https://casinozondercruks.net</a></li>
<li><a href="https://casinozonderregistratie.net">https://casinozonderregistratie.net</a></li>
<li><a href="https://cassavafilms.com">https://cassavafilms.com</a></li>
<li><a href="https://cbwcd.org">https://cbwcd.org</a></li>
<li><a href="https://ccdumps.co">https://ccdumps.co</a></li>
<li><a href="https://cchange.xyz">https://cchange.xyz</a></li>
<li><a href="https://cebi.org">https://cebi.org</a></li>
<li><a href="https://cedalo.com">https://cedalo.com</a></li>
<li><a href="https://cenexelresearch.com">https://cenexelresearch.com</a></li>
<li><a href="https://cens.cl">https://cens.cl</a></li>
<li><a href="https://ceoweekly.com">https://ceoweekly.com</a></li>
<li><a href="https://cfeapps.com">https://cfeapps.com</a></li>
<li><a href="https://change2change.me">https://change2change.me</a></li>
<li><a href="https://changes.melbourne">https://changes.melbourne</a></li>
<li><a href="https://channelzeronetwork.com">https://channelzeronetwork.com</a></li>
<li><a href="https://charlestonbusiness.com">https://charlestonbusiness.com</a></li>
<li><a href="https://chicagoseedsandclones.com">https://chicagoseedsandclones.com</a></li>
<li><a href="https://choosemycar.com">https://choosemycar.com</a></li>
<li><a href="https://chrishufnagel.com">https://chrishufnagel.com</a></li>
<li><a href="https://christinecronau.com">https://christinecronau.com</a></li>
<li><a href="https://christmaspastpodcast.com">https://christmaspastpodcast.com</a></li>
<li><a href="https://christophhauf.com">https://christophhauf.com</a></li>
<li><a href="https://chronosphere.io">https://chronosphere.io</a></li>
<li><a href="https://chucklefish.org">https://chucklefish.org</a></li>
<li><a href="https://chudovo.com">https://chudovo.com</a></li>
<li><a href="https://chugsdesigns.com">https://chugsdesigns.com</a></li>
<li><a href="https://churchleadershipcollective.com">https://churchleadershipcollective.com</a></li>
<li><a href="https://ciderassociation.org">https://ciderassociation.org</a></li>
<li><a href="https://cinch.io">https://cinch.io</a></li>
<li><a href="https://cioinfluence.com">https://cioinfluence.com</a></li>
<li><a href="https://ciq.com">https://ciq.com</a></li>
<li><a href="https://circlecube.com">https://circlecube.com</a></li>
<li><a href="https://circular-economy-switzerland.ch">https://circular-economy-switzerland.ch</a></li>
<li><a href="https://cisoclub.ru">https://cisoclub.ru</a></li>
<li><a href="https://citizensciencefoundation.org">https://citizensciencefoundation.org</a></li>
<li><a href="https://clairelemoine.art">https://clairelemoine.art</a></li>
<li><a href="https://clasebcn.com">https://clasebcn.com</a></li>
<li><a href="https://classtechtips.com">https://classtechtips.com</a></li>
<li><a href="https://claudiorimann.com">https://claudiorimann.com</a></li>
<li><a href="https://clever-dm.ru">https://clever-dm.ru</a></li>
<li><a href="https://client-portal.io">https://client-portal.io</a></li>
<li><a href="https://clouddevs.com">https://clouddevs.com</a></li>
<li><a href="https://cloverlabs.io">https://cloverlabs.io</a></li>
<li><a href="https://cmca-med.org">https://cmca-med.org</a></li>
<li><a href="https://cmox.co">https://cmox.co</a></li>
<li><a href="https://cmsrun.org">https://cmsrun.org</a></li>
<li><a href="https://coalitiontechnologies.com">https://coalitiontechnologies.com</a></li>
<li><a href="https://cocaineonlinebuy.com">https://cocaineonlinebuy.com</a></li>
<li><a href="https://coconuts.co">https://coconuts.co</a></li>
<li><a href="https://codaconversion.com">https://codaconversion.com</a></li>
<li><a href="https://codapostproduction.com">https://codapostproduction.com</a></li>
<li><a href="https://codeastudio.com">https://codeastudio.com</a></li>
<li><a href="https://codecookread.com">https://codecookread.com</a></li>
<li><a href="https://codefresh.io">https://codefresh.io</a></li>
<li><a href="https://coders-home.de">https://coders-home.de</a></li>
<li><a href="https://codingwithempathy.com">https://codingwithempathy.com</a></li>
<li><a href="https://coffeeandpens.com">https://coffeeandpens.com</a></li>
<li><a href="https://cogres.com">https://cogres.com</a></li>
<li><a href="https://coinjournal.net">https://coinjournal.net</a></li>
<li><a href="https://cointhrill.com">https://cointhrill.com</a></li>
<li><a href="https://coling2018.org">https://coling2018.org</a></li>
<li><a href="https://collective.world">https://collective.world</a></li>
<li><a href="https://colohouse.com">https://colohouse.com</a></li>
<li><a href="https://colorblindprogramming.com">https://colorblindprogramming.com</a></li>
<li><a href="https://colorkit.co">https://colorkit.co</a></li>
<li><a href="https://colorlib.com">https://colorlib.com</a></li>
<li><a href="https://colormagazine.com">https://colormagazine.com</a></li>
<li><a href="https://columbiabusinessreport.com">https://columbiabusinessreport.com</a></li>
<li><a href="https://comicofepicfail.com">https://comicofepicfail.com</a></li>
<li><a href="https://comment.org">https://comment.org</a></li>
<li><a href="https://communitychange.org">https://communitychange.org</a></li>
<li><a href="https://communityhomeworks.org">https://communityhomeworks.org</a></li>
<li><a href="https://complexoffices.nl">https://complexoffices.nl</a></li>
<li><a href="https://condatis.com">https://condatis.com</a></li>
<li><a href="https://conffab.com">https://conffab.com</a></li>
<li><a href="https://connex.digital">https://connex.digital</a></li>
<li><a href="https://cono.rs">https://cono.rs</a></li>
<li><a href="https://consejoctci.cl">https://consejoctci.cl</a></li>
<li><a href="https://contactpointnano.ch">https://contactpointnano.ch</a></li>
<li><a href="https://contagious.dev">https://contagious.dev</a></li>
<li><a href="https://contemporaryhaibunonline.com">https://contemporaryhaibunonline.com</a></li>
<li><a href="https://content.industries">https://content.industries</a></li>
<li><a href="https://contentmarketinginstitute.com">https://contentmarketinginstitute.com</a></li>
<li><a href="https://continentalmagazine.com">https://continentalmagazine.com</a></li>
<li><a href="https://controlmousemedia.com">https://controlmousemedia.com</a></li>
<li><a href="https://conversationsdigital.com">https://conversationsdigital.com</a></li>
<li><a href="https://cookieinformation.com">https://cookieinformation.com</a></li>
<li><a href="https://coolbirdchie.com">https://coolbirdchie.com</a></li>
<li><a href="https://cooperpetcare.com">https://cooperpetcare.com</a></li>
<li><a href="https://copyblogger.com">https://copyblogger.com</a></li>
<li><a href="https://corporateclub.ru">https://corporateclub.ru</a></li>
<li><a href="https://cristinamalcorra.com">https://cristinamalcorra.com</a></li>
<li><a href="https://criticall.es">https://criticall.es</a></li>
<li><a href="https://criticalmediartstudio.com">https://criticalmediartstudio.com</a></li>
<li><a href="https://cukier.works">https://cukier.works</a></li>
<li><a href="https://curiousmatterpodcast.com">https://curiousmatterpodcast.com</a></li>
<li><a href="https://cyrus.website">https://cyrus.website</a></li>
<li><a href="https://daintreedigital.com">https://daintreedigital.com</a></li>
<li><a href="https://danchez.com">https://danchez.com</a></li>
<li><a href="https://darkwebspot.com">https://darkwebspot.com</a></li>
<li><a href="https://datastori.es">https://datastori.es</a></li>
<li><a href="https://david.garden">https://david.garden</a></li>
<li><a href="https://davidgomezmaestre.com">https://davidgomezmaestre.com</a></li>
<li><a href="https://davidrudnick.org">https://davidrudnick.org</a></li>
<li><a href="https://decorativearchitecturalproducts.com">https://decorativearchitecturalproducts.com</a></li>
<li><a href="https://delirium-magazin.ch">https://delirium-magazin.ch</a></li>
<li><a href="https://delsdoodles.com">https://delsdoodles.com</a></li>
<li><a href="https://der-ringer.com">https://der-ringer.com</a></li>
<li><a href="https://desformesdecompensation.com">https://desformesdecompensation.com</a></li>
<li><a href="https://dhananjayparkhe.com">https://dhananjayparkhe.com</a></li>
<li><a href="https://dia.tv">https://dia.tv</a></li>
<li><a href="https://didiva.com">https://didiva.com</a></li>
<li><a href="https://dieneuenorm.de">https://dieneuenorm.de</a></li>
<li><a href="https://digitale-pracht.de">https://digitale-pracht.de</a></li>
<li><a href="https://digitalhumanitiesnow.org">https://digitalhumanitiesnow.org</a></li>
<li><a href="https://djcoregon.com">https://djcoregon.com</a></li>
<li><a href="https://dobbstown.org">https://dobbstown.org</a></li>
<li><a href="https://dominikpodsiadly.com">https://dominikpodsiadly.com</a></li>
<li><a href="https://donpark.org">https://donpark.org</a></li>
<li><a href="https://dossierindustries.co">https://dossierindustries.co</a></li>
<li><a href="https://drxlr.com">https://drxlr.com</a></li>
<li><a href="https://dtrace.org">https://dtrace.org</a></li>
<li><a href="https://elegantcode.com">https://elegantcode.com</a></li>
<li><a href="https://elex.is">https://elex.is</a></li>
<li><a href="https://emilievizcano.com">https://emilievizcano.com</a></li>
<li><a href="https://eyeofestival.com">https://eyeofestival.com</a></li>
<li><a href="https://fb4k.org">https://fb4k.org</a></li>
<li><a href="https://fikrirasy.id">https://fikrirasy.id</a></li>
<li><a href="https://filezillapro.com">https://filezillapro.com</a></li>
<li><a href="https://filmplicity.com">https://filmplicity.com</a></li>
<li><a href="https://fireballprinting.com">https://fireballprinting.com</a></li>
<li><a href="https://flarerpg.org">https://flarerpg.org</a></li>
<li><a href="https://flashpoint.io">https://flashpoint.io</a></li>
<li><a href="https://forestofreading.com">https://forestofreading.com</a></li>
<li><a href="https://fourhourworkweek.com">https://fourhourworkweek.com</a></li>
<li><a href="https://frame-optik.de">https://frame-optik.de</a></li>
<li><a href="https://franklinstreetcreative.org">https://franklinstreetcreative.org</a></li>
<li><a href="https://freakanimes.com">https://freakanimes.com</a></li>
<li><a href="https://freedompodcasting.com">https://freedompodcasting.com</a></li>
<li><a href="https://fronterabrands.com">https://fronterabrands.com</a></li>
<li><a href="https://gamingtrend.com">https://gamingtrend.com</a></li>
<li><a href="https://garytaubes.com">https://garytaubes.com</a></li>
<li><a href="https://gavilanmeasurex.org">https://gavilanmeasurex.org</a></li>
<li><a href="https://gbumac.ru">https://gbumac.ru</a></li>
<li><a href="https://gel4u.ru">https://gel4u.ru</a></li>
<li><a href="https://genericevents.com">https://genericevents.com</a></li>
<li><a href="https://getpauseapp.com">https://getpauseapp.com</a></li>
<li><a href="https://go2phystech.ru">https://go2phystech.ru</a></li>
<li><a href="https://goodtypefoundry.com">https://goodtypefoundry.com</a></li>
<li><a href="https://gothenburgdesignfestival.se">https://gothenburgdesignfestival.se</a></li>
<li><a href="https://grassrootsvolunteering.org">https://grassrootsvolunteering.org</a></li>
<li><a href="https://gsenzao.ru">https://gsenzao.ru</a></li>
<li><a href="https://guillaumeruiz.com">https://guillaumeruiz.com</a></li>
<li><a href="https://gzet.net">https://gzet.net</a></li>
<li><a href="https://handsonheritage.com">https://handsonheritage.com</a></li>
<li><a href="https://healthtalkforhorses.com">https://healthtalkforhorses.com</a></li>
<li><a href="https://helpfullyit.com">https://helpfullyit.com</a></li>
<li><a href="https://hijinksensue.com">https://hijinksensue.com</a></li>
<li><a href="https://himate.org">https://himate.org</a></li>
<li><a href="https://hookagency.com">https://hookagency.com</a></li>
<li><a href="https://hotelradioparis.com">https://hotelradioparis.com</a></li>
<li><a href="https://howbabycomic.com">https://howbabycomic.com</a></li>
<li><a href="https://howdoyou.tech">https://howdoyou.tech</a></li>
<li><a href="https://howgameschangetheworld.com">https://howgameschangetheworld.com</a></li>
<li><a href="https://hubsfestival.com">https://hubsfestival.com</a></li>
<li><a href="https://humrik.com">https://humrik.com</a></li>
<li><a href="https://hypesrus.com">https://hypesrus.com</a></li>
<li><a href="https://inmoment.com">https://inmoment.com</a></li>
<li><a href="https://inmostgame.com">https://inmostgame.com</a></li>
<li><a href="https://innermostparts.org">https://innermostparts.org</a></li>
<li><a href="https://innovatingwithai.com">https://innovatingwithai.com</a></li>
<li><a href="https://interface.bio">https://interface.bio</a></li>
<li><a href="https://ipresence.jp">https://ipresence.jp</a></li>
<li><a href="https://isfglobal.org">https://isfglobal.org</a></li>
<li><a href="https://jamez.it">https://jamez.it</a></li>
<li><a href="https://jeron.org">https://jeron.org</a></li>
<li><a href="https://journalofdigitalhumanities.org">https://journalofdigitalhumanities.org</a></li>
<li><a href="https://judascompanion.com">https://judascompanion.com</a></li>
<li><a href="https://jules-durand.fr">https://jules-durand.fr</a></li>
<li><a href="https://juliusasling.se">https://juliusasling.se</a></li>
<li><a href="https://junichi11.com">https://junichi11.com</a></li>
<li><a href="https://kamaleon.viajes">https://kamaleon.viajes</a></li>
<li><a href="https://kitkatpecson.com">https://kitkatpecson.com</a></li>
<li><a href="https://klikkentheke.com">https://klikkentheke.com</a></li>
<li><a href="https://knapsacknews.com">https://knapsacknews.com</a></li>
<li><a href="https://ktgy.com">https://ktgy.com</a></li>
<li><a href="https://lailagohar.com">https://lailagohar.com</a></li>
<li><a href="https://leeeeza.com">https://leeeeza.com</a></li>
<li><a href="https://letsmuseeum.com">https://letsmuseeum.com</a></li>
<li><a href="https://lifeathome.ch">https://lifeathome.ch</a></li>
<li><a href="https://lifelistened.com">https://lifelistened.com</a></li>
<li><a href="https://lifelongactivist.com">https://lifelongactivist.com</a></li>
<li><a href="https://lifewaykefir.ie">https://lifewaykefir.ie</a></li>
<li><a href="https://likelike.org">https://likelike.org</a></li>
<li><a href="https://liviasatriano.com">https://liviasatriano.com</a></li>
<li><a href="https://livingthecanadiandream.com">https://livingthecanadiandream.com</a></li>
<li><a href="https://lockrmail.com">https://lockrmail.com</a></li>
<li><a href="https://lovedrop.org">https://lovedrop.org</a></li>
<li><a href="https://lutopiquant.fr">https://lutopiquant.fr</a></li>
<li><a href="https://mad-love-records.com">https://mad-love-records.com</a></li>
<li><a href="https://maisieskidmore.com">https://maisieskidmore.com</a></li>
<li><a href="https://marckremers.com">https://marckremers.com</a></li>
<li><a href="https://mariamindbodyhealth.com">https://mariamindbodyhealth.com</a></li>
<li><a href="https://marinarachello.com">https://marinarachello.com</a></li>
<li><a href="https://mariuswatz.com">https://mariuswatz.com</a></li>
<li><a href="https://marsfallpod.com">https://marsfallpod.com</a></li>
<li><a href="https://martinmartin.net">https://martinmartin.net</a></li>
<li><a href="https://matadornetwork.com">https://matadornetwork.com</a></li>
<li><a href="https://maxsiedentopf.com">https://maxsiedentopf.com</a></li>
<li><a href="https://meireundmeire.com">https://meireundmeire.com</a></li>
<li><a href="https://mejorhogar.top">https://mejorhogar.top</a></li>
<li><a href="https://michaelschindhelm.com">https://michaelschindhelm.com</a></li>
<li><a href="https://mirelleborra.com">https://mirelleborra.com</a></li>
<li><a href="https://modernmediterranean.com">https://modernmediterranean.com</a></li>
<li><a href="https://monstersoupcomic.com">https://monstersoupcomic.com</a></li>
<li><a href="https://montenegrojaramillo.info">https://montenegrojaramillo.info</a></li>
<li><a href="https://mushon.com">https://mushon.com</a></li>
<li><a href="https://myriadusa.org">https://myriadusa.org</a></li>
<li><a href="https://mythemeshop.com">https://mythemeshop.com</a></li>
<li><a href="https://namespace.studio">https://namespace.studio</a></li>
<li><a href="https://nda-paris.com">https://nda-paris.com</a></li>
<li><a href="https://nesinecasino.io">https://nesinecasino.io</a></li>
<li><a href="https://newmonumentsgc.com">https://newmonumentsgc.com</a></li>
<li><a href="https://nik.art">https://nik.art</a></li>
<li><a href="https://nir.media">https://nir.media</a></li>
<li><a href="https://nitrogenwealth.com">https://nitrogenwealth.com</a></li>
<li><a href="https://nophonetime.nl">https://nophonetime.nl</a></li>
<li><a href="https://northstar.nu">https://northstar.nu</a></li>
<li><a href="https://nudgethemes.com">https://nudgethemes.com</a></li>
<li><a href="https://numenera.com">https://numenera.com</a></li>
<li><a href="https://oklahomaseedsandclones.com">https://oklahomaseedsandclones.com</a></li>
<li><a href="https://omcabin.com">https://omcabin.com</a></li>
<li><a href="https://openid.net">https://openid.net</a></li>
<li><a href="https://optimisingnutrition.com">https://optimisingnutrition.com</a></li>
<li><a href="https://pal-tv.de">https://pal-tv.de</a></li>
<li><a href="https://parallel18.com">https://parallel18.com</a></li>
<li><a href="https://paralleluniver.se">https://paralleluniver.se</a></li>
<li><a href="https://pathtoyoungness.com">https://pathtoyoungness.com</a></li>
<li><a href="https://paulcampillo.com">https://paulcampillo.com</a></li>
<li><a href="https://pedroajo.com">https://pedroajo.com</a></li>
<li><a href="https://pennie.com">https://pennie.com</a></li>
<li><a href="https://people-people.com">https://people-people.com</a></li>
<li><a href="https://pepperteam.ru">https://pepperteam.ru</a></li>
<li><a href="https://plumvillage.org">https://plumvillage.org</a></li>
<li><a href="https://popdose.com">https://popdose.com</a></li>
<li><a href="https://positivewriter.com">https://positivewriter.com</a></li>
<li><a href="https://postuma.nl">https://postuma.nl</a></li>
<li><a href="https://pre-code.com">https://pre-code.com</a></li>
<li><a href="https://proteinpower.com">https://proteinpower.com</a></li>
<li><a href="https://publicannouncement.org">https://publicannouncement.org</a></li>
<li><a href="https://pykorry.com">https://pykorry.com</a></li>
<li><a href="https://q.berlin">https://q.berlin</a></li>
<li><a href="https://qgpennyworth.com">https://qgpennyworth.com</a></li>
<li><a href="https://queensmuseum.org">https://queensmuseum.org</a></li>
<li><a href="https://radfatties.com">https://radfatties.com</a></li>
<li><a href="https://raoulgottschling.de">https://raoulgottschling.de</a></li>
<li><a href="https://rare-syd.com">https://rare-syd.com</a></li>
<li><a href="https://ratsar.org">https://ratsar.org</a></li>
<li><a href="https://readwrite.com">https://readwrite.com</a></li>
<li><a href="https://realokdesign.com">https://realokdesign.com</a></li>
<li><a href="https://realsocialskills.org">https://realsocialskills.org</a></li>
<li><a href="https://rebelsguidetopm.com">https://rebelsguidetopm.com</a></li>
<li><a href="https://recycling-solutions.ru">https://recycling-solutions.ru</a></li>
<li><a href="https://redchaingames.com">https://redchaingames.com</a></li>
<li><a href="https://refixyourself.com">https://refixyourself.com</a></li>
<li><a href="https://respectfullyconnected.com">https://respectfullyconnected.com</a></li>
<li><a href="https://revealingerrors.com">https://revealingerrors.com</a></li>
<li><a href="https://rge-partner.de">https://rge-partner.de</a></li>
<li><a href="https://rheumjc.com">https://rheumjc.com</a></li>
<li><a href="https://richearthinstitute.org">https://richearthinstitute.org</a></li>
<li><a href="https://robbwolf.com">https://robbwolf.com</a></li>
<li><a href="https://rollo-press.com">https://rollo-press.com</a></li>
<li><a href="https://ronangelo.com">https://ronangelo.com</a></li>
<li><a href="https://saintgervais.ch">https://saintgervais.ch</a></li>
<li><a href="https://samoburja.com">https://samoburja.com</a></li>
<li><a href="https://san-serriffe.com">https://san-serriffe.com</a></li>
<li><a href="https://servebolt.com">https://servebolt.com</a></li>
<li><a href="https://sketchyideas.co">https://sketchyideas.co</a></li>
<li><a href="https://spdx.dev">https://spdx.dev</a></li>
<li><a href="https://theproductivedad.com">https://theproductivedad.com</a></li>
<li><a href="https://thinc.blog">https://thinc.blog</a></li>
<li><a href="https://veneto.fm">https://veneto.fm</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Coins challenge Oct 2023 with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-oct-2023/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-oct-2023/</guid>
      <description><![CDATA[<p>My #prolog solution for &ldquo;Coins&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-oct-2023/">dmcommunity.org challenge Oct 2023</a>.</p>
<p>Suppose you need to pay 1 Euro. In how many different ways you can do it via 1c, 2c, 5c, 10c, 20c, 50c and 1 Euro coins?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#6272a4">%%  findall(S, sol(100, S), All), maplist(writeln, All).</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% ...</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% [94,3,0,0,0,0,0]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% [95,0,1,0,0,0,0]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% [96,2,0,0,0,0,0]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% [98,1,0,0,0,0,0]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% [100,0,0,0,0,0,0]</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">%% ...</span>
</span></span></code></pre></div><p>Below the code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>:- <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sol</span>(<span style="color:#8be9fd;font-style:italic">TOT</span>, [<span style="color:#8be9fd;font-style:italic">C1</span>, <span style="color:#8be9fd;font-style:italic">C2</span>, <span style="color:#8be9fd;font-style:italic">C5</span>, <span style="color:#8be9fd;font-style:italic">C10</span>, <span style="color:#8be9fd;font-style:italic">C20</span>, <span style="color:#8be9fd;font-style:italic">C50</span>, <span style="color:#8be9fd;font-style:italic">C100</span>]) :-
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C1</span>   <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..100</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C2</span>   <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..50</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C5</span>   <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..20</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C10</span>  <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..10</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C20</span>  <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..5</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C50</span>  <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..2</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">C100</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">TOT</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">C1</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">1</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C2</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C5</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">5</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C10</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">10</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C20</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">20</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C50</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">50</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">C100</span><span style="color:#ff79c6">*</span><span style="color:#bd93f9">100</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">label</span>([<span style="color:#8be9fd;font-style:italic">C1</span>, <span style="color:#8be9fd;font-style:italic">C2</span>, <span style="color:#8be9fd;font-style:italic">C5</span>, <span style="color:#8be9fd;font-style:italic">C10</span>, <span style="color:#8be9fd;font-style:italic">C20</span>, <span style="color:#8be9fd;font-style:italic">C50</span>, <span style="color:#8be9fd;font-style:italic">C100</span>]).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>DevOps Qlik Cloud - managing qlik cloud resources with OpenTofu / Terraform</title>
      <link>https://www.mr70.eu/posts/open-tofu-terraform-qlik-cloud/</link>
      <pubDate>Tue, 10 Oct 2023 09:14:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/open-tofu-terraform-qlik-cloud/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>Open tofu (a Terraform fork) is an open-source infrastructure as code (IaC) tool that allows you to define, provision, and manage infrastructure as code. Terraform can be used to manage a wide range of infrastructure resources, including <a href="https://www.qlik.com">Qlik Cloud</a> resources.</p>
<p>Here are some of the benefits of using OpenTofu/Terraform to manage Qlik Cloud resources:</p>
<p>Consistency: Terraform allows you to define your infrastructure in a consistent and repeatable way. This can help to reduce errors and improve the overall quality of your infrastructure.</p>
<pre><code>Automation: Terraform can be used to automate the deployment and management of your Qlik Cloud resources. This can save you time and effort, and it can also help to improve the reliability of your infrastructure.

Version control: Terraform allows you to version control your infrastructure configuration. This means that you can track changes to your infrastructure over time and easily roll back to previous versions if necessary.
</code></pre>
<p>To get started with OpenTofu/Terraform, you will need to install the OpenTofu/Terraform CLI tool. Once you have installed the OpenTofu/Terraform CLI, you can create a new Terraform configuration file. Terraform configuration files are written in a language called HashiCorp Configuration Language (HCL).</p>
<p>To manage Qlik Cloud resources with Terraform, you will need to use the Mastercard/terraform-provider-restapi provider. This provider allows you to use Terraform to manage any REST API, which makes it very flexible and powerful.</p>
<h2 id="usage">Usage</h2>
<p>Below I&rsquo;ll show how to create some Qlik groups, spaces and space assigments.</p>
<p>Create a folder and inside the following files:</p>
<p>File variables.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;QLIK_APIKEY&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">type</span> = string
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;QLIK_URI&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">type</span> = string
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File versions.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span>terraform {
</span></span><span style="display:flex;"><span>  required_providers {
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">restapi</span> = {
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">source</span> = <span style="color:#f1fa8c">&#34;mastercard/restapi&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">version</span> = <span style="color:#f1fa8c">&#34;1.18.2&#34;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File providers.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">provider</span> <span style="color:#f1fa8c">&#34;restapi&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">alias</span>                = <span style="color:#f1fa8c">&#34;qlik_saas&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">uri</span>                  = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.QLIK_URI<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">debug</span>                = <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">write_returns_object</span> = <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">headers</span> = {
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">Authorization</span> = <span style="color:#f1fa8c">&#34;Bearer </span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.QLIK_APIKEY<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;Content-Type&#34;</span> <span style="color:#ff79c6">=</span> <span style="color:#f1fa8c">&#34;application/json&#34;</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File qlik_groups.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;restapi_object&#34;</span> <span style="color:#f1fa8c">&#34;group_Developer&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> restapi.qlik_saas
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/api/v1/groups&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    data</span> <span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic"> jsonencode</span>({
</span></span><span style="display:flex;"><span>        name<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;Developer&#34;</span>
</span></span><span style="display:flex;"><span>        status<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;active&#34;</span>
</span></span><span style="display:flex;"><span>        assignedRoles<span style="color:#ff79c6">:</span> []})
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;restapi_object&#34;</span> <span style="color:#f1fa8c">&#34;group_Italy&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> restapi.qlik_saas
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/api/v1/groups&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    data</span> <span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic"> jsonencode</span>({
</span></span><span style="display:flex;"><span>        name<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;Italy&#34;</span>
</span></span><span style="display:flex;"><span>        status<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;active&#34;</span>
</span></span><span style="display:flex;"><span>        assignedRoles<span style="color:#ff79c6">:</span> []})
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File qlik_space_italy.tf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;restapi_object&#34;</span> <span style="color:#f1fa8c">&#34;space_Italy&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> restapi.qlik_saas
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/api/v1/spaces&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    data</span> <span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic"> jsonencode</span>({
</span></span><span style="display:flex;"><span>	name<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;Italy&#34;</span>
</span></span><span style="display:flex;"><span>	type<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;managed&#34;</span>
</span></span><span style="display:flex;"><span>	description<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;Italy space&#34;</span> })
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;restapi_object&#34;</span> <span style="color:#f1fa8c">&#34;space_Italy_assigments_group_Developer&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> restapi.qlik_saas
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/api/v1/spaces/</span><span style="color:#f1fa8c">${</span>resource.restapi_object.space_Italy.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">/assignments&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    data</span> <span style="color:#ff79c6">=</span>  jsonencode({
</span></span><span style="display:flex;"><span>	type<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;group&#34;</span>
</span></span><span style="display:flex;"><span>	roles<span style="color:#ff79c6">:</span> [<span style="color:#f1fa8c">&#34;consumer&#34;</span>,<span style="color:#f1fa8c">&#34;contributor&#34;</span>,<span style="color:#f1fa8c">&#34;dataconsumer&#34;</span>,<span style="color:#f1fa8c">&#34;publisher&#34;</span>]
</span></span><span style="display:flex;"><span>	assigneeId<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>resource.restapi_object.group_Developer.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;restapi_object&#34;</span> <span style="color:#f1fa8c">&#34;space_Italy_assigments_group_Italy&#34;</span> {
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    provider</span> <span style="color:#ff79c6">=</span> restapi.qlik_saas
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/api/v1/spaces/</span><span style="color:#f1fa8c">${</span>resource.restapi_object.space_Italy.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">/assignments&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">    data</span> <span style="color:#ff79c6">=</span>  jsonencode({
</span></span><span style="display:flex;"><span>	type<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;group&#34;</span>
</span></span><span style="display:flex;"><span>	roles<span style="color:#ff79c6">:</span> [<span style="color:#f1fa8c">&#34;consumer&#34;</span>,<span style="color:#f1fa8c">&#34;dataconsumer&#34;</span>]
</span></span><span style="display:flex;"><span>	assigneeId<span style="color:#ff79c6">:</span> <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>resource.restapi_object.group_Italy.id<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Now you can create your resources with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">export</span> <span style="color:#8be9fd;font-style:italic">TF_VAR_QLIK_APIKEY</span><span style="color:#ff79c6">=</span>xxxxxxxxxxxxxxxxxxxxxxxx
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">export</span> <span style="color:#8be9fd;font-style:italic">TF_VAR_QLIK_URI</span><span style="color:#ff79c6">=</span>https://mytenant.eu.qlikcloud.com
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>tofu init
</span></span><span style="display:flex;"><span>tofu plan -out myplan
</span></span><span style="display:flex;"><span>tofu apply myplan
</span></span></code></pre></div><h2 id="importing-existing-resources">Importing existing resources</h2>
<p>You could also import in the terraform state any resources already/manually created with something like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tofu import restapi_object.space_Germany /api/v1/spaces/12222222
</span></span></code></pre></div><h2 id="managing-several-environmentsstates">Managing several environments/states</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tofu workspace create dev
</span></span><span style="display:flex;"><span>tofu workspace create prd
</span></span><span style="display:flex;"><span>tofu workspace <span style="color:#ff79c6">select</span> dev
</span></span></code></pre></div><h2 id="references">References:</h2>
<ul>
<li><a href="https://github.com/matteoredaelli/qlik-cloud-devops-terraform-opentofu">qlik-cloud-devops-terraform-opentofu github repository</a></li>
<li><a href="https://opentofu.org/">OpenTofu</a> witch is a fork of Terraform under the Linux Foundation unbrella.</li>
<li><a href="https://github.com/Mastercard/terraform-provider-restapi">Mastercard/terraform-provider-restapi</a></li>
<li><a href="https://www.qlik.com">Qlik cloud</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calling Qliksense Repository API from Apache Drill via sql</title>
      <link>https://www.mr70.eu/posts/apache-drill-qliksense-repository-api-rest/</link>
      <pubDate>Wed, 23 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-drill-qliksense-repository-api-rest/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>I&rsquo;ll show how to connect to <a href="https://help.qlik.com/en-US/sense-developer/November2021/APIs/RepositoryServiceAPI/index.html?page=0">Qliksense Repository API</a> via sql using <a href="https://drill.apache.org/">Apache Drill</a>.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/4/42/Apache_Drill_logo.svg" alt="drill"></p>
<p>In this example Qliksense engine service runs at <a href="https://qlik.redaelli.org:4242/">https://qlik.redaelli.org:4242/</a></p>
<h2 id="download">Download</h2>
<p>Download and unzip Apache Drill from <a href="https://drill.apache.org/download/">https://drill.apache.org/download/</a></p>
<h2 id="configure">Configure</h2>
<p>Create or edit the file conf/storage-plugins-override.conf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#f1fa8c">&#34;storage&#34;</span>: {
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;qliksense&#34;</span> : {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;type&#34;</span> : <span style="color:#f1fa8c">&#34;http&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;cacheResults&#34;</span> : <span style="color:#ff79c6">true</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;connections&#34;</span> : {
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">&#34;p4242&#34;</span> : {
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;url&#34;</span> : <span style="color:#f1fa8c">&#34;http://nginx.redaelli.org/qlik/&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;method&#34;</span> : <span style="color:#f1fa8c">&#34;GET&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;authType&#34;</span> : <span style="color:#f1fa8c">&#34;none&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;userName&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;password&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;postBody&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;params&#34;</span> : [<span style="color:#f1fa8c">&#34;filter&#34;</span>],
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;dataPath&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;requireTail&#34;</span> : <span style="color:#ff79c6">true</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;inputType&#34;</span> : <span style="color:#f1fa8c">&#34;json&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;xmlDataLevel&#34;</span> : <span style="color:#bd93f9">1</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;proxyType&#34;</span> : <span style="color:#f1fa8c">&#34;direct&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;enabled&#34;</span> : <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>At the moment Apache drill cannot query external rest services with client certificates <a href="https://issues.apache.org/jira/browse/DRILL-8052">DRILL-8052</a> and so we need a reverse proxy like Nginx.</p>
<p>Inside nginx configure a reverse proxy like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>    location /qlik/ {
</span></span><span style="display:flex;"><span>        proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>        proxy_set_header X-Real-IP $remote_addr;
</span></span><span style="display:flex;"><span>        proxy_set_header x-qlik-xrfkey 9003456789Zbcdez;
</span></span><span style="display:flex;"><span>        proxy_set_header X-Qlik-User &#34;UserDirectory=internal;UserId=sa_repository&#34;;
</span></span><span style="display:flex;"><span>        set $args $args&amp;xrfkey=9003456789Zbcdez;
</span></span><span style="display:flex;"><span>        proxy_pass https://qlik.redaelli.org:4242/;
</span></span><span style="display:flex;"><span>        proxy_ssl_certificate     /certificates/qlik/client.pem;
</span></span><span style="display:flex;"><span>        proxy_ssl_certificate_key /certificates/qlik/client_key.pem;
</span></span><span style="display:flex;"><span>        proxy_ssl_verify       off;
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><h2 id="start-drill">Start Drill</h2>
<p>Run drill with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./bin/drill-embedded
</span></span></code></pre></div><p>Now the system is started and you have a command line sql interface. There is also a web ui at http://localhost:8047/ where you can run queries or add/change storages/connections instead of editing the previous file (http://localhost:8047/storage)</p>
<h2 id="queries">Queries</h2>
<h3 id="extract-a-stream-with-custom-properties-values-nested-json">Extract a stream with custom properties values (nested json)</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">select</span>
</span></span><span style="display:flex;"><span>  t1.name <span style="color:#ff79c6">as</span> streamName,
</span></span><span style="display:flex;"><span>  t1.<span style="color:#ff79c6">owner</span> <span style="color:#ff79c6">as</span> streamOwner,
</span></span><span style="display:flex;"><span>  t1.cps.definition.name <span style="color:#ff79c6">as</span> cpName,
</span></span><span style="display:flex;"><span>  t1.cps.value <span style="color:#ff79c6">as</span> cpValue
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> (
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">select</span>
</span></span><span style="display:flex;"><span>    s.name,
</span></span><span style="display:flex;"><span>    s.<span style="color:#ff79c6">owner</span>.name <span style="color:#ff79c6">owner</span>,
</span></span><span style="display:flex;"><span>    flatten(s.customProperties) <span style="color:#ff79c6">as</span> cps
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">from</span>
</span></span><span style="display:flex;"><span>    qliksense.p4242.<span style="color:#ff79c6">`</span>qrs<span style="color:#ff79c6">/</span>stream<span style="color:#ff79c6">/</span><span style="color:#ff79c6">full</span><span style="color:#ff79c6">`</span> s
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">where</span>
</span></span><span style="display:flex;"><span>    filter<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;name eq &#39;&#39;Merlot&#39;&#39;&#39;</span>
</span></span><span style="display:flex;"><span>) t1;
</span></span></code></pre></div><p>The output is</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>+------------+---------------+---------------+-----------------+
</span></span><span style="display:flex;"><span>| streamName |  streamOwner  |    cpName     |     cpValue     |
</span></span><span style="display:flex;"><span>+------------+---------------+---------------+-----------------+
</span></span><span style="display:flex;"><span>| Merlot     | sa.vino       | CustomBalance | SelfService     |
</span></span><span style="display:flex;"><span>| Merlot     | sa.vino       | GroupAccess   | Qliksense_Merlot|
</span></span><span style="display:flex;"><span>+------------+---------------+---------------+-----------------+
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calling Talend Cloud Rest API from Apache Drill via sql</title>
      <link>https://www.mr70.eu/posts/apache-drill-talend-cloud-api-rest/</link>
      <pubDate>Fri, 04 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-drill-talend-cloud-api-rest/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>I&rsquo;ll show how to connect to <a href="https://help.talend.com/r/en-US/Cloud/management-console-user-guide/tic-api">Talend Cloud API</a> via sql using <a href="https://drill.apache.org/">Apache Drill</a>.</p>
<p><img src="/img/drill.png" alt="drill"></p>
<h2 id="download">Download</h2>
<p>Download Apache Drill from <a href="https://drill.apache.org/download/">https://drill.apache.org/download/</a></p>
<h2 id="configure">Configure</h2>
<p>Create or edit the file conf/storage-plugins-override.conf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#f1fa8c">&#34;storage&#34;</span>: {
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;talendcloud&#34;</span> : {
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;type&#34;</span> : <span style="color:#f1fa8c">&#34;http&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;cacheResults&#34;</span> : <span style="color:#ff79c6">true</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;connections&#34;</span> : {
</span></span><span style="display:flex;"><span>	  <span style="color:#ff79c6">&#34;get&#34;</span> : {
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;url&#34;</span> : <span style="color:#f1fa8c">&#34;https://api.eu.cloud.talend.com&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;method&#34;</span> : <span style="color:#f1fa8c">&#34;GET&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;headers&#34;</span> : {
</span></span><span style="display:flex;"><span>		  <span style="color:#ff79c6">&#34;Authorization&#34;</span> : <span style="color:#f1fa8c">&#34;Bearer MYSECRETKEY&#34;</span>
</span></span><span style="display:flex;"><span>		},
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;authType&#34;</span> : <span style="color:#f1fa8c">&#34;none&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;userName&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;password&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;postBody&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;params&#34;</span> : [<span style="color:#f1fa8c">&#34;query&#34;</span>],
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;dataPath&#34;</span> : <span style="color:#ff79c6">null</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;requireTail&#34;</span> : <span style="color:#ff79c6">true</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;inputType&#34;</span> : <span style="color:#f1fa8c">&#34;json&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;xmlDataLevel&#34;</span> : <span style="color:#bd93f9">1</span>
</span></span><span style="display:flex;"><span>	  }
</span></span><span style="display:flex;"><span>	},
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;proxyType&#34;</span> : <span style="color:#f1fa8c">&#34;direct&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;enabled&#34;</span> : <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="start-drill">Start Drill</h2>
<p>Run drill with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./bin/drill-embedded
</span></span></code></pre></div><p>Now the system is started and you have a command line sql interface. There is also a web ui at http://localhost:8047/ where you can run queries or add/change storages/connections instead of editing the previous file (http://localhost:8047/storage)</p>
<h2 id="queries">Queries</h2>
<h3 id="clusters-and-remote-engines">Clusters and remote engines</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">alter</span> <span style="color:#ff79c6">session</span> <span style="color:#ff79c6">set</span> <span style="color:#ff79c6">`</span>store.json.all_text_mode<span style="color:#ff79c6">`</span> <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">true</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">select</span>
</span></span><span style="display:flex;"><span>	engine.<span style="color:#ff79c6">*</span>, clusters.<span style="color:#ff79c6">*</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span>
</span></span><span style="display:flex;"><span>	talendcloud.<span style="color:#ff79c6">get</span>.<span style="color:#ff79c6">`/</span>tmc<span style="color:#ff79c6">/</span>v2.<span style="color:#bd93f9">6</span><span style="color:#ff79c6">/</span>runtimes<span style="color:#ff79c6">/</span>remote<span style="color:#ff79c6">-</span>engines<span style="color:#ff79c6">`</span> <span style="color:#ff79c6">as</span> engine
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">inner</span> <span style="color:#ff79c6">join</span>
</span></span><span style="display:flex;"><span>	talendcloud.<span style="color:#ff79c6">get</span>.<span style="color:#ff79c6">`/</span>tmc<span style="color:#ff79c6">/</span>v2.<span style="color:#bd93f9">6</span><span style="color:#ff79c6">/</span>runtimes<span style="color:#ff79c6">/</span>remote<span style="color:#ff79c6">-</span>engine<span style="color:#ff79c6">-</span>clusters<span style="color:#ff79c6">`</span> <span style="color:#ff79c6">as</span> clusters
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">on</span> engine.clusterId <span style="color:#ff79c6">=</span> clusters.id
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">where</span>
</span></span><span style="display:flex;"><span>	engine.query<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;workspace.environment.name==PRD;status==PAIRED;workspace.name==DATA&#39;</span> <span style="color:#ff79c6">limit</span> <span style="color:#bd93f9">1</span>;
</span></span></code></pre></div><p>The output is</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>createDate               2021-06-10T09:40:37.676Z
</span></span><span style="display:flex;"><span>updateDate               2021-06-10T10:09:47.780Z
</span></span><span style="display:flex;"><span>id                       646464
</span></span><span style="display:flex;"><span>name                     AWS_PRD_02
</span></span><span style="display:flex;"><span>workspace                {&#34;id&#34;:&#34;8886&#34;,&#34;name&#34;:&#34;DATA&#34;,&#34;owner&#34;:&#34;matteo&#34;,&#34;type&#34;:&#34;custom&#34;,&#34;environment&#34;:{&#34;id&#34;:&#34;8787&#34;,&#34;name&#34;:&#34;PRD&#34;,&#34;default&#34;:&#34;false&#34;}}
</span></span><span style="display:flex;"><span>runtimeId                4434
</span></span><span style="display:flex;"><span>availability             AVAILABLE
</span></span><span style="display:flex;"><span>status                   PAIRED
</span></span><span style="display:flex;"><span>runProfiles              [&#34;TALEND_RUNTIME&#34;,&#34;MICROSERVICE&#34;,&#34;JOB_SERVER&#34;]
</span></span><span style="display:flex;"><span>debug                    {}
</span></span><span style="display:flex;"><span>clusterId                6565
</span></span><span style="display:flex;"><span>esbCompatibilityVersion  7.3.1
</span></span><span style="display:flex;"><span>description              null
</span></span><span style="display:flex;"><span>createDate0              2021-06-30T15:16:43.538Z
</span></span><span style="display:flex;"><span>updateDate0              2021-06-30T15:16:43.538Z
</span></span><span style="display:flex;"><span>id0                      5454
</span></span><span style="display:flex;"><span>name0                    AWS_CLUSTER
</span></span><span style="display:flex;"><span>description0             Remote Engine Cluster - Produzione AWS
</span></span><span style="display:flex;"><span>workspace0               {&#34;id&#34;:&#34;32323&#34;,&#34;name&#34;:&#34;DATA&#34;,&#34;owner&#34;:&#34;matteo&#34;,&#34;type&#34;:&#34;custom&#34;,&#34;environment&#34;:{&#34;id&#34;:&#34;5454&#34;,&#34;name&#34;:&#34;PRD&#34;,&#34;default&#34;:&#34;false&#34;}}
</span></span><span style="display:flex;"><span>runtimeId0               1112
</span></span><span style="display:flex;"><span>availability0            AVAILABLE
</span></span></code></pre></div><h3 id="users-and-groups">Users and groups</h3>
<p>From the TMC it id not possibile to extract a csv with users and groups. The following queries can help.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">select</span>
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">g</span>.name,
</span></span><span style="display:flex;"><span>	u.email
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span>
</span></span><span style="display:flex;"><span>	(<span style="color:#ff79c6">select</span> name, flatten(userIds) <span style="color:#ff79c6">as</span> uid
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">from</span> talendcloud.<span style="color:#ff79c6">get</span>.<span style="color:#ff79c6">`</span>v1<span style="color:#ff79c6">/</span>management<span style="color:#ff79c6">/</span>groups<span style="color:#ff79c6">`</span>) <span style="color:#ff79c6">g</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">inner</span> <span style="color:#ff79c6">join</span>
</span></span><span style="display:flex;"><span>	  talendcloud.<span style="color:#ff79c6">get</span>.<span style="color:#ff79c6">`</span>v1<span style="color:#ff79c6">/</span>management<span style="color:#ff79c6">/</span>users<span style="color:#ff79c6">`</span> u
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">on</span>
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">g</span>.uid <span style="color:#ff79c6">=</span> u.id
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">order</span> <span style="color:#ff79c6">by</span>
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">g</span>.name,
</span></span><span style="display:flex;"><span>	u.mail;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">with</span> users <span style="color:#ff79c6">as</span>
</span></span><span style="display:flex;"><span>	 (<span style="color:#ff79c6">select</span> email, flatten(roles) <span style="color:#ff79c6">role</span> <span style="color:#ff79c6">from</span> talendcloud.<span style="color:#ff79c6">get</span>.<span style="color:#ff79c6">`</span>v1<span style="color:#ff79c6">/</span>management<span style="color:#ff79c6">/</span>users<span style="color:#ff79c6">`</span>)
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">select</span>
</span></span><span style="display:flex;"><span>	users.email <span style="color:#ff79c6">as</span> email,
</span></span><span style="display:flex;"><span>	users.<span style="color:#ff79c6">role</span>.name <span style="color:#ff79c6">as</span> <span style="color:#ff79c6">role</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> users
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">where</span>
</span></span><span style="display:flex;"><span>	users.<span style="color:#ff79c6">role</span>.name <span style="color:#ff79c6">like</span> <span style="color:#f1fa8c">&#39;COMPANY1%&#39;</span> <span style="color:#ff79c6">or</span> users.<span style="color:#ff79c6">role</span>.name <span style="color:#ff79c6">like</span> <span style="color:#f1fa8c">&#39;COMPANY2%&#39;</span>;
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Sharing Windows guest vpn connection</title>
      <link>https://www.mr70.eu/posts/share-guest-vpn/</link>
      <pubDate>Sun, 03 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/share-guest-vpn/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>I have a linux workstation with a corporate guest Windows image running on kvm. I would like to share the guest windows vpn connection with my linux host workstation.</p>
<p>My linux host has one network: virbr0 (public) with an ip 192.168.122.x</p>
<p>My vpn/corporate subnet is 10.150.0.0/16</p>
<h2 id="solution">Solution</h2>
<p>Create on linux/kvm a new host only/private net ( I have an ip 192.168.100.x) and enable it in the windows guest os (ip 192.168.100.236)</p>
<p><img src="/img/kvm-virbr0.png" alt="virbr0">
<img src="/img/kvm-virbr1.png" alt="virbr1"></p>
<p>On the guest OS you should have several networks. I named them: virbr0 (public/internet), virbr1 (private, host only), vpn (created/used by your vpn client).</p>
<h2 id="solution-with-sshuttle">Solution with sshuttle</h2>
<p>(<a href="https://sshuttle.readthedocs.io/en/stable/index.html">sshuttle</a>): connecting to many remote hosts like native connections (without socks and pac files).</p>
<p>&ldquo;Sshuttle is not exactly a VPN, and not exactly port forwarding. It’s kind of both, and kind of neither.&rdquo;</p>
<p>&ldquo;Sshuttle assembles the TCP stream locally, multiplexes it statefully over an ssh session, and disassembles it back into packets at the other end. So it never ends up doing TCP-over-TCP. It’s just data-over-TCP, which is safe.&rdquo;</p>
<p>I installed sshuttle with &ldquo;apt-get install sshuttle&rdquo; on my debian laptop</p>
<p>Then I installed sshd and python on the guest windows (I used cygwin).</p>
<p>Finally I was able to run:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cp /etc/resolv.conf.corporate /etc/resolv.conf
</span></span><span style="display:flex;"><span>sshuttle -r matteo@192.168.100.239 10.150.0.0/16
</span></span></code></pre></div><h2 id="solution-with-network-sharing">Solution with network sharing</h2>
<h3 id="guest-windows-side">Guest Windows side</h3>
<p>Start your vpn in your windows guest OS (I saw that checkpoint - I suppose for securty reason - changes the ip address of the host net and share options of its own net)</p>
<p>Share the vpn net with the host only net: below my screenshots</p>
<p><img src="/img/guest-windows-net-share.png" alt="share"></p>
<p><img src="/img/guest-windows-net-final.png" alt="final"></p>
<h3 id="host-linux-side">Host Linux side</h3>
<p>Enable the required routing</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cp /etc/resolv.conf.corporate /etc/resolv.conf
</span></span><span style="display:flex;"><span>ip route add 10.150.0.0/15 via 192.168.100.236 dev virbr1
</span></span></code></pre></div><h2 id="ps">PS</h2>
<p>One year ago I wrote an article with some useful networking tricks <a href="https://matteoredaelli.netlify.app/news/my-networking-survival-kit/">https://matteoredaelli.netlify.app/news/my-networking-survival-kit/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Parsing qliksense healthcheck api results</title>
      <link>https://www.mr70.eu/posts/qliksense_healthcheck/</link>
      <pubDate>Wed, 15 Sep 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/qliksense_healthcheck/</guid>
      <description><![CDATA[<h2 id="abstract">Abstract</h2>
<p>When you do a stress test/troubleshooting of a qliksense node it is useful to collect the responses of the <a href="https://help.qlik.com/en-US/sense-developer/May2021/Subsystems/EngineAPI/Content/Sense_EngineAPI/GettingSystemInformation/HealthCheckStatus.htm">healthcheck api</a> and extract some useful info from them (which and how many applications were loaded in memory, &hellip;)</p>
<h2 id="collecting-data">Collecting data</h2>
<p>I usually use the command line tool <a href="https://pypi.org/project/qsense/">qsense</a> for querying the Qliksense repository</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#ff79c6">while</span> <span style="color:#ff79c6">[</span> <span style="color:#bd93f9">1</span> <span style="color:#ff79c6">]</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">do</span> 
</span></span><span style="display:flex;"><span>    qsense healthcheck  qlikhost1.redaelli.org ~/certificates/qlik/client.pem &gt;&gt; healthcheck.jl
</span></span><span style="display:flex;"><span>    sleep <span style="color:#bd93f9">60</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">done</span>
</span></span></code></pre></div><p>Each line of the file healthcheck.jl is a json object like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;version&#34;</span>: <span style="color:#f1fa8c">&#34;12.763.10&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;started&#34;</span>: <span style="color:#f1fa8c">&#34;20210915T165938.000+0200&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;mem&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;committed&#34;</span>: <span style="color:#bd93f9">72283.234375</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;allocated&#34;</span>: <span style="color:#bd93f9">118266.04296875</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;free&#34;</span>: <span style="color:#bd93f9">436586.79296875</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;cpu&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;total&#34;</span>: <span style="color:#bd93f9">0</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;session&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;active&#34;</span>: <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;total&#34;</span>: <span style="color:#bd93f9">63</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;apps&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;active_docs&#34;</span>: [
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;0599e6baa-3b4a-4648-bbdb-47013a02dc21&#34;</span>
</span></span><span style="display:flex;"><span>    ],
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;loaded_docs&#34;</span>: [
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;15e0547c-c4eb-4492-a1db-1603d8295423&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;163777f8-9582-46b0-9418-a01f2d71c32d&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;059e6baa-3b4a-4648-bbdb-47013a02dc21&#34;</span>
</span></span><span style="display:flex;"><span>    ],
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;in_memory_docs&#34;</span>: [
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;15e0547c-c4eb-4492-a1db-1603d8295423&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;163777f8-9582-46b0-9418-a01f2d71c32d&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f1fa8c">&#34;059e6baa-3b4a-4648-bbdb-47013a02dc21&#34;</span>
</span></span><span style="display:flex;"><span>    ],
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;calls&#34;</span>: <span style="color:#bd93f9">17126</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;selections&#34;</span>: <span style="color:#bd93f9">300</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;users&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;active&#34;</span>: <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;total&#34;</span>: <span style="color:#bd93f9">6</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;cache&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;hits&#34;</span>: <span style="color:#bd93f9">70</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;lookups&#34;</span>: <span style="color:#bd93f9">70</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;added&#34;</span>: <span style="color:#bd93f9">0</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;replaced&#34;</span>: <span style="color:#bd93f9">0</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&#34;bytes_added&#34;</span>: <span style="color:#bd93f9">0</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;saturated&#34;</span>: <span style="color:#ff79c6">false</span>,
</span></span></code></pre></div><p>It can be useful to show application names instead of their Ids. So we can download the dataset with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsense entity qlikhost1.redaelli.org ~/certificates/qlik/client.pem app --filter <span style="color:#f1fa8c">&#34;published eq true&#34;</span> &gt; app.json
</span></span></code></pre></div><h2 id="extracting-some-info">Extracting some info</h2>
<p>With the following script</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python healthcheck.py healthcheck.jl healthcheck-out
</span></span></code></pre></div><p>you can extract a csv with the info</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>timestamp, mem_free, session_active, session_total, users_active, users_total, app1, app2, app3, ...
</span></span></code></pre></div><p>Below the source of the script</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#6272a4">## file  healthcheck.py</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> pyspark.sql <span style="color:#ff79c6">import</span> SparkSession
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> pyspark.sql <span style="color:#ff79c6">import</span> functions <span style="color:#ff79c6">as</span> F
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>infile <span style="color:#ff79c6">=</span> sys<span style="color:#ff79c6">.</span>argv[<span style="color:#bd93f9">1</span>]
</span></span><span style="display:flex;"><span>outfile <span style="color:#ff79c6">=</span> sys<span style="color:#ff79c6">.</span>argv[<span style="color:#bd93f9">2</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>spark <span style="color:#ff79c6">=</span> SparkSession<span style="color:#ff79c6">.</span>builder<span style="color:#ff79c6">.</span>getOrCreate()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>df <span style="color:#ff79c6">=</span> spark<span style="color:#ff79c6">.</span>read<span style="color:#ff79c6">.</span>json(infile)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>apps <span style="color:#ff79c6">=</span> spark<span style="color:#ff79c6">.</span>read<span style="color:#ff79c6">.</span>json(<span style="color:#f1fa8c">&#34;apps.json&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>df<span style="color:#ff79c6">.</span>select(F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;now&#34;</span>), 
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;mem.free&#34;</span>)<span style="color:#ff79c6">.</span>alias(<span style="color:#f1fa8c">&#34;mem_free&#34;</span>), 
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;session.active&#34;</span>)<span style="color:#ff79c6">.</span>alias(<span style="color:#f1fa8c">&#34;session_active&#34;</span>), 
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;session.total&#34;</span>)<span style="color:#ff79c6">.</span>alias(<span style="color:#f1fa8c">&#34;session_total&#34;</span>),
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;users.active&#34;</span>)<span style="color:#ff79c6">.</span>alias(<span style="color:#f1fa8c">&#34;users_active&#34;</span>), 
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;users.total&#34;</span>)<span style="color:#ff79c6">.</span>alias(<span style="color:#f1fa8c">&#34;users_total&#34;</span>),
</span></span><span style="display:flex;"><span>          F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;apps.in_memory_docs&#34;</span>))\
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">.</span>withColumn(<span style="color:#f1fa8c">&#34;id&#34;</span>, F<span style="color:#ff79c6">.</span>explode(F<span style="color:#ff79c6">.</span>col(<span style="color:#f1fa8c">&#34;in_memory_docs&#34;</span>)))\
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">.</span>join(apps, <span style="color:#f1fa8c">&#39;id&#39;</span>, how<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;left&#34;</span>)<span style="color:#ff79c6">.</span>withColumn(<span style="color:#f1fa8c">&#34;fullname&#34;</span>, F<span style="color:#ff79c6">.</span>concat(<span style="color:#f1fa8c">&#34;name&#34;</span>, <span style="color:#f1fa8c">&#34;id&#34;</span>))<span style="color:#ff79c6">.</span>select([<span style="color:#f1fa8c">&#34;now&#34;</span>, <span style="color:#f1fa8c">&#34;mem_free&#34;</span>, <span style="color:#f1fa8c">&#34;session_active&#34;</span>, <span style="color:#f1fa8c">&#34;session_total&#34;</span>,<span style="color:#f1fa8c">&#34;users_active&#34;</span>, <span style="color:#f1fa8c">&#34;users_total&#34;</span>, <span style="color:#f1fa8c">&#34;fullname&#34;</span>])\
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">.</span>groupBy([<span style="color:#f1fa8c">&#34;now&#34;</span>, <span style="color:#f1fa8c">&#34;mem_free&#34;</span>, <span style="color:#f1fa8c">&#34;session_active&#34;</span>, <span style="color:#f1fa8c">&#34;session_total&#34;</span>,<span style="color:#f1fa8c">&#34;users_active&#34;</span>, <span style="color:#f1fa8c">&#34;users_total&#34;</span>])\
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">.</span>pivot(<span style="color:#f1fa8c">&#34;fullname&#34;</span>)<span style="color:#ff79c6">.</span>count()<span style="color:#ff79c6">.</span>coalesce(<span style="color:#bd93f9">1</span>)<span style="color:#ff79c6">.</span>write<span style="color:#ff79c6">.</span>mode(<span style="color:#f1fa8c">&#34;overwrite&#34;</span>)<span style="color:#ff79c6">.</span>option(<span style="color:#f1fa8c">&#34;sep&#34;</span>,<span style="color:#f1fa8c">&#34;;&#34;</span>)<span style="color:#ff79c6">.</span>option(<span style="color:#f1fa8c">&#34;header&#34;</span>,<span style="color:#f1fa8c">&#34;true&#34;</span>)<span style="color:#ff79c6">.</span>csv(outfile)
</span></span></code></pre></div><h2 id="whenhow-many-times-was-the-engine-restarted-what-happened-just-before">When/how many times was the engine restarted? What happened just before?</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> collections
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> pprint
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> re
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> pandas <span style="color:#ff79c6">as</span> pd
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">def</span> <span style="color:#50fa7b">load_data</span>(day, infile):
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">return</span> pd<span style="color:#ff79c6">.</span>read_json(infile, lines<span style="color:#ff79c6">=</span><span style="color:#ff79c6">True</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">def</span> <span style="color:#50fa7b">load_apps</span>():
</span></span><span style="display:flex;"><span>    url <span style="color:#ff79c6">=</span> <span style="color:#f1fa8c">&#34;app.json&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">return</span> pd<span style="color:#ff79c6">.</span>read_json(url)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">def</span> <span style="color:#50fa7b">parse_healtcheck</span>(infile):
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">def</span> <span style="color:#50fa7b">lists_diff</span>(li1, li2):
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">return</span> <span style="color:#8be9fd;font-style:italic">list</span>(<span style="color:#8be9fd;font-style:italic">set</span>(li1) <span style="color:#ff79c6">-</span> <span style="color:#8be9fd;font-style:italic">set</span>(li2)) <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">list</span>(<span style="color:#8be9fd;font-style:italic">set</span>(li2) <span style="color:#ff79c6">-</span> <span style="color:#8be9fd;font-style:italic">set</span>(li1))
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    df <span style="color:#ff79c6">=</span> load_data(infile)
</span></span><span style="display:flex;"><span>    started <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">None</span>
</span></span><span style="display:flex;"><span>    active <span style="color:#ff79c6">=</span> loaded <span style="color:#ff79c6">=</span> last_active <span style="color:#ff79c6">=</span> last_loaded <span style="color:#ff79c6">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">for</span> index, row <span style="color:#ff79c6">in</span> df<span style="color:#ff79c6">.</span>iterrows():
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">if</span> row[<span style="color:#f1fa8c">&#34;started&#34;</span>] <span style="color:#ff79c6">!=</span> started:
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(<span style="color:#f1fa8c">&#34;******************************************&#34;</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(<span style="color:#f1fa8c">&#34;Engine started at </span><span style="color:#f1fa8c">{started}</span><span style="color:#f1fa8c">&#34;</span><span style="color:#ff79c6">.</span>format(started<span style="color:#ff79c6">=</span>row[<span style="color:#f1fa8c">&#34;started&#34;</span>]))
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(<span style="color:#f1fa8c">&#34;******************************************&#34;</span>)
</span></span><span style="display:flex;"><span>            started<span style="color:#ff79c6">=</span>row[<span style="color:#f1fa8c">&#34;started&#34;</span>]
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(<span style="color:#f1fa8c">&#34;Previous active:&#34;</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(active)
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(<span style="color:#f1fa8c">&#34;Previous loaded:&#34;</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#8be9fd;font-style:italic">print</span>(loaded)
</span></span><span style="display:flex;"><span>            last_active <span style="color:#ff79c6">=</span> last_active <span style="color:#ff79c6">+</span> active
</span></span><span style="display:flex;"><span>            last_loaded <span style="color:#ff79c6">=</span> last_loaded <span style="color:#ff79c6">+</span> loaded
</span></span><span style="display:flex;"><span>        new_active <span style="color:#ff79c6">=</span> row[<span style="color:#f1fa8c">&#34;apps&#34;</span>][<span style="color:#f1fa8c">&#34;active_docs&#34;</span>]
</span></span><span style="display:flex;"><span>        new_loaded <span style="color:#ff79c6">=</span> row[<span style="color:#f1fa8c">&#34;apps&#34;</span>][<span style="color:#f1fa8c">&#34;loaded_docs&#34;</span>]
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>        delta_active <span style="color:#ff79c6">=</span> lists_diff(new_active, active)
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">if</span> delta_active <span style="color:#ff79c6">!=</span> []:
</span></span><span style="display:flex;"><span>            pprint<span style="color:#ff79c6">.</span>pprint(row[<span style="color:#f1fa8c">&#34;now&#34;</span>] <span style="color:#ff79c6">+</span> <span style="color:#f1fa8c">&#34;: new active apps: &#34;</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">str</span>(delta_active))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        delta_loaded <span style="color:#ff79c6">=</span> lists_diff(new_loaded, loaded)
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">if</span> delta_loaded <span style="color:#ff79c6">!=</span> []:
</span></span><span style="display:flex;"><span>            pprint<span style="color:#ff79c6">.</span>pprint(row[<span style="color:#f1fa8c">&#34;now&#34;</span>] <span style="color:#ff79c6">+</span> <span style="color:#f1fa8c">&#34;: new loaded apps: &#34;</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">str</span>(delta_loaded))
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        active <span style="color:#ff79c6">=</span> new_active
</span></span><span style="display:flex;"><span>        loaded <span style="color:#ff79c6">=</span> new_loaded
</span></span><span style="display:flex;"><span>    pprint<span style="color:#ff79c6">.</span>pprint(<span style="color:#f1fa8c">&#34;Latest loaded apps: &#34;</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">str</span>(collections<span style="color:#ff79c6">.</span>Counter(last_loaded)))
</span></span><span style="display:flex;"><span>    pprint<span style="color:#ff79c6">.</span>pprint(<span style="color:#f1fa8c">&#34;Latest active apps: &#34;</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">str</span>(collections<span style="color:#ff79c6">.</span>Counter(last_active)))
</span></span><span style="display:flex;"><span>    pprint<span style="color:#ff79c6">.</span>pprint(<span style="color:#f1fa8c">&#34;Latest restarts: &#34;</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">str</span>(df<span style="color:#ff79c6">.</span>started<span style="color:#ff79c6">.</span>unique()))
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">if</span> __name__ <span style="color:#ff79c6">==</span> <span style="color:#f1fa8c">&#34;__main__&#34;</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4"># execute only if run as a script</span>
</span></span><span style="display:flex;"><span>    infile <span style="color:#ff79c6">=</span> sys<span style="color:#ff79c6">.</span>argv[<span style="color:#bd93f9">1</span>]
</span></span><span style="display:flex;"><span>    parse_healthcheck(infile)
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>aws-ext</title>
      <link>https://www.mr70.eu/posts/aws_ext/</link>
      <pubDate>Fri, 25 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/aws_ext/</guid>
      <description><![CDATA[<p>The <a href="https://pypi.org/project/aws-ext/">aws_ext</a> python package contains some useful functions (built on top of boto3)
for managing some aws services. At the moment only some utilities for the Aws Glue Data catalog</p>
<h2 id="installation">Installation</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install aws_ext
</span></span></code></pre></div><h2 id="usage">Usage</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> boto3
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> aws_ext
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>session <span style="color:#ff79c6">=</span> boto3<span style="color:#ff79c6">.</span>session<span style="color:#ff79c6">.</span>Session()
</span></span></code></pre></div><h2 id="glue">GLUE</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">from</span> aws_ext <span style="color:#ff79c6">import</span> glue_databases
</span></span><span style="display:flex;"><span>glue_client <span style="color:#ff79c6">=</span> session<span style="color:#ff79c6">.</span>client(<span style="color:#f1fa8c">&#34;glue&#34;</span>)
</span></span></code></pre></div><h3 id="extracting-tables-with-too-many-versions">Extracting tables with (too) many versions</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>glue_databases<span style="color:#ff79c6">.</span>get_tables_with_many_versions(glue_client, database_name<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;mydb&#34;</span>, threshold<span style="color:#ff79c6">=</span><span style="color:#bd93f9">1</span>)
</span></span></code></pre></div><h3 id="deleting-old-tables-versions">Deleting old tables versions</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>glue_databases<span style="color:#ff79c6">.</span>delete_old_tables_versions(glue_client, database_name<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;mydb&#34;</span>, keep<span style="color:#ff79c6">=</span><span style="color:#bd93f9">1</span>, dryrun<span style="color:#ff79c6">=</span><span style="color:#ff79c6">True</span>)
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Where is gold challenge with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-jun-2021/</link>
      <pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-jun-2021/</guid>
      <description><![CDATA[<p>My #prolog solution for &ldquo;Where is gold?&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-june-2021/">dmcommunity.org challenge Jun 2021</a>: 0 means empty, 1 means gold</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">solution</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Box1</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">Box3</span>, <span style="color:#8be9fd;font-style:italic">Box3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">0</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Box2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">1.</span>
</span></span></code></pre></div><p>below the code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:-<span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sentence1</span>(    <span style="color:#bd93f9">1</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">not_sentence1</span>(<span style="color:#bd93f9">0</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sentence2</span>(    <span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#bd93f9">0</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">not_sentence2</span>(<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#bd93f9">1</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">sentence3</span>(    <span style="color:#bd93f9">0</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">not_sentence3</span>(<span style="color:#bd93f9">1</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">true_only_one_sentence</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>, <span style="color:#8be9fd;font-style:italic">Box2</span>, <span style="color:#8be9fd;font-style:italic">Box3</span>):-
</span></span><span style="display:flex;"><span>	(       <span style="color:#50fa7b">sentence1</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>), <span style="color:#50fa7b">not_sentence2</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>), <span style="color:#50fa7b">not_sentence3</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>) ) ;
</span></span><span style="display:flex;"><span>	(   <span style="color:#50fa7b">not_sentence1</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>),     <span style="color:#50fa7b">sentence2</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>), <span style="color:#50fa7b">not_sentence3</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>) ) ;
</span></span><span style="display:flex;"><span>	(   <span style="color:#50fa7b">not_sentence1</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>), <span style="color:#50fa7b">not_sentence2</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>),     <span style="color:#50fa7b">sentence3</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>,<span style="color:#8be9fd;font-style:italic">Box2</span>,<span style="color:#8be9fd;font-style:italic">Box3</span>) ).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">solution</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>, <span style="color:#8be9fd;font-style:italic">Box2</span>, <span style="color:#8be9fd;font-style:italic">Box3</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Box1</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..1</span>, <span style="color:#6272a4">/* 0 empty, 1 gold */</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Box2</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Box3</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0..1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Box1</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Box2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Box3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#bd93f9">1</span>, <span style="color:#6272a4">/* only one box contains gold */</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">true_only_one_sentence</span>(<span style="color:#8be9fd;font-style:italic">Box1</span>, <span style="color:#8be9fd;font-style:italic">Box2</span>, <span style="color:#8be9fd;font-style:italic">Box3</span>).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>GraphQL datasource for Qliksense</title>
      <link>https://www.mr70.eu/posts/apollo-datasource-qliksense/</link>
      <pubDate>Sat, 27 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apollo-datasource-qliksense/</guid>
      <description><![CDATA[<h2 id="qliksense-datasource-for-graphql-apollo-server">Qliksense datasource for GraphQL Apollo server</h2>
<p><a href="https://github.com/matteoredaelli/apollo-datasource-qliksense">apollo-datasource-qliksense</a> is a Qliksense datasource for the GraphQL <a href="https://www.apollographql.com/">Apollo server</a>. &ldquo;Apollo is the industry-standard GraphQL implementation, providing the data graph layer that connects modern apps to the cloud.&rdquo;</p>
<h3 id="installation">Installation</h3>
<p>npm install apollo-datasource-qliksense</p>
<h3 id="usage">Usage</h3>
<p>Below a very basic sample</p>
<p>File index.js file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff79c6">const</span> resolvers <span style="color:#ff79c6">=</span> require(<span style="color:#f1fa8c">&#39;./resolvers&#39;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> { ApolloServer, gql } <span style="color:#ff79c6">=</span> require(<span style="color:#f1fa8c">&#39;apollo-server&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> { makeExecutableSchema } <span style="color:#ff79c6">=</span> require(<span style="color:#f1fa8c">&#39;graphql-tools&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> { QliksenseDataSource } <span style="color:#ff79c6">=</span> require(<span style="color:#f1fa8c">&#39;apollo-datasource-qliksense&#39;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> qliksense <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">new</span> QliksenseDataSource(<span style="color:#f1fa8c">&#34;https://myqlikserver.redaelli.org:4242&#34;</span>,
</span></span><span style="display:flex;"><span>				process.env.QLIK_CERTIFICATE,
</span></span><span style="display:flex;"><span>				process.env.QLIK_CERTIFICATE_KEY);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> { readFileSync } <span style="color:#ff79c6">=</span> require(<span style="color:#f1fa8c">&#39;fs&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> typeDefs <span style="color:#ff79c6">=</span> readFileSync(<span style="color:#f1fa8c">&#39;./schema.graphql).toString(&#39;</span>utf<span style="color:#ff79c6">-</span><span style="color:#bd93f9">8</span>&#39;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> graphqlSchemaObj <span style="color:#ff79c6">=</span> { <span style="color:#6272a4">//makeExecutableSchema({
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span>	typeDefs<span style="color:#ff79c6">:</span> typeDefs,
</span></span><span style="display:flex;"><span>	resolvers<span style="color:#ff79c6">:</span> resolvers,
</span></span><span style="display:flex;"><span>	tracing<span style="color:#ff79c6">:</span> <span style="color:#ff79c6">true</span>,
</span></span><span style="display:flex;"><span>	dataSources<span style="color:#ff79c6">:</span> () =&gt; ({ qliksense<span style="color:#ff79c6">:</span> qliksense })
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">const</span> server <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">new</span> ApolloServer(graphqlSchemaObj);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">// The `listen` method launches a web server.
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span>server.listen().then(({ url }) =&gt; {
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#f1fa8c">`🚀  Server ready at </span><span style="color:#f1fa8c">${</span>url<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">`</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>File schema.graphql</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">type</span> <span style="color:#50fa7b">Json</span> {
</span></span><span style="display:flex;"><span>	 json: <span style="color:#50fa7b">String</span>
</span></span><span style="display:flex;"><span>	 }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">type</span> <span style="color:#50fa7b">Query</span> {
</span></span><span style="display:flex;"><span>  qliksense_entity(
</span></span><span style="display:flex;"><span>	entity: <span style="color:#50fa7b">String</span>!,
</span></span><span style="display:flex;"><span>	count: <span style="color:#50fa7b">Boolean</span>,
</span></span><span style="display:flex;"><span>	filter:<span style="color:#50fa7b">String</span>): <span style="color:#50fa7b">Json</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>File resolvers.js</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>module.exports <span style="color:#ff79c6">=</span> {
</span></span><span style="display:flex;"><span>  Query<span style="color:#ff79c6">:</span> {
</span></span><span style="display:flex;"><span>	  qliksense_entity<span style="color:#ff79c6">:</span> <span style="color:#ff79c6">async</span> (_source, { entity, count, filter }, { dataSources }) =&gt; {
</span></span><span style="display:flex;"><span>	  resp <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">await</span> dataSources.qliksense.getEntity(entity, count, filter);
</span></span><span style="display:flex;"><span>	  <span style="color:#ff79c6">return</span> {json<span style="color:#ff79c6">:</span>  JSON.stringify(resp) }
</span></span><span style="display:flex;"><span>	  },
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Sample graphql queries</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  qliksense_entity(
</span></span><span style="display:flex;"><span>	entity: <span style="color:#f1fa8c">&#34;custompropertydefinition&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">filter</span>: <span style="color:#f1fa8c">&#34;Name eq &#39;GroupAccess&#39;&#34;</span>
</span></span><span style="display:flex;"><span>  ) {
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">json</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  qliksense_entity(
</span></span><span style="display:flex;"><span>	entity: <span style="color:#f1fa8c">&#34;user&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">count</span>: <span style="color:#50fa7b">true</span>
</span></span><span style="display:flex;"><span>  ) {
</span></span><span style="display:flex;"><span>	json
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="graphql-schema-for-qliksense-entities">Graphql schema for Qliksense entities</h3>
<p>I suggest the tool <a href="https://github.com/walmartlabs/json-to-simple-graphql-schema">https://github.com/walmartlabs/json-to-simple-graphql-schema</a> for building a graphql schema from a sample json file (an export of a Qliksense entity like app, user, custompropertydefinition, datasource, &hellip;).</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>qsense python library and command line tool for qliksense</title>
      <link>https://www.mr70.eu/posts/qsense-qliksense/</link>
      <pubDate>Tue, 16 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/qsense-qliksense/</guid>
      <description><![CDATA[<h2 id="qsense">qSense</h2>
<p><a href="https://github.com/matteoredaelli/qsense">qsense</a> is an python library and command line tool for qliksense</p>
<h3 id="some-useful-commands">Some useful commands</h3>
<h4 id="export_remove_old_apps">export_remove_old_apps</h4>
<p>Export (published or passing any other filter) applications to qvd files</p>
<pre><code>qsense export_delete_old_apps qliksense.redaelli.org ~/certificates/client.pem  --target_path '/tmp' --modified_days=300 --last_reload_days=300
</code></pre>
<h4 id="deallocate_analyzer_licenses_for_professionals">deallocate_analyzer_licenses_for_professionals</h4>
<p>Deallocate analyzer license fom users with a professional license</p>
<pre><code>qsense deallocate_analyzer_licenses_for_professionals qliksense.redaelli.org ~/certificates/client.pem --nodryrun
</code></pre>
<h4 id="delete_removed_exernally_users">delete_removed_exernally_users</h4>
<p>Delete users that were removed externally (from active directory?)</p>
<pre><code>qsense delete_removed_exernally_users qliksense.redaelli.org ~/certificates/client.pem GROUP --nodryrun
</code></pre>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Medical Services challenge with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-feb-2021/</link>
      <pubDate>Tue, 02 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-feb-2021/</guid>
      <description><![CDATA[<p>My #swi #prolog solution for &ldquo;Benchmark &lsquo;Medical Services&rsquo;&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-feb-2021/">dmcommunity.org challenge Feb 2021</a> can be tested running a public docker image</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>	docker run -p 8888:8888 -d --name matteoredaelli/dmcommunity_org_2021_02:latest
</span></span><span style="display:flex;"><span>	wget https://github.com/DMCommunity/dmcommunity_shared/raw/master/MedicalServices.json
</span></span><span style="display:flex;"><span>	curl -XPOST -d @MedicalServices.json -H <span style="color:#f1fa8c">&#34;Accept: application/json&#34;</span> -H <span style="color:#f1fa8c">&#34;Content-type: application/json&#34;</span> http://localhost:8888/many
</span></span></code></pre></div><p>The decision table is a set of prolog facts like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#50fa7b">decision_table</span>(<span style="color:#f1fa8c">&#39;Office&#39;</span>,<span style="color:#f1fa8c">&#39;acupuncture&#39;</span>,<span style="color:#f1fa8c">&#39;PL123&#39;</span>,<span style="color:#f1fa8c">&#39;L&#39;</span>,<span style="color:#f1fa8c">&#39;Y&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;2015-01-01&#39;</span>,<span style="color:#f1fa8c">&#39;2023-12-31&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">decision_table</span>(<span style="color:#f1fa8c">&#39;Outpatient&#39;</span>,<span style="color:#f1fa8c">&#39;acupuncture&#39;</span>,<span style="color:#f1fa8c">&#39;PL123&#39;</span>,<span style="color:#f1fa8c">&#39;L&#39;</span>,<span style="color:#f1fa8c">&#39;Y&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;2015-01-01&#39;</span>,<span style="color:#f1fa8c">&#39;2023-12-31&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">decision_table</span>(<span style="color:#f1fa8c">&#39;Inpatient&#39;</span>,<span style="color:#f1fa8c">&#39;acupuncture&#39;</span>,<span style="color:#f1fa8c">&#39;PL123&#39;</span>,<span style="color:#f1fa8c">&#39;L&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;2015-01-01&#39;</span>,<span style="color:#f1fa8c">&#39;2023-12-31&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>,<span style="color:#f1fa8c">&#39;N&#39;</span>).
</span></span></code></pre></div><p>The core of the solution is inside the rules.pl file</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#50fa7b">parse_input</span>(<span style="color:#50fa7b">json</span>([<span style="color:#f1fa8c">placeOfService</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">PlaceOfService</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">type</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">Type</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">plan</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">Plan</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">groupSize</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">GroupSize</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">inNetwork</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">InNetwork</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">isCovered</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">IsCovered</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">dateOfService</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">DateOfService</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">coveredInFull=</span><span style="color:#ff79c6">_</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">copay=</span><span style="color:#ff79c6">_</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">coInsurance=</span><span style="color:#ff79c6">_</span>]),
</span></span><span style="display:flex;"><span>		<span style="color:#50fa7b">json</span>([<span style="color:#f1fa8c">placeOfService</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">PlaceOfService</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">type</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">Type</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">plan</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">Plan</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">groupSize</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">GroupSize</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">inNetwork</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">InNetwork</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">isCovered</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">IsCovered</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">dateOfService</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">DateOfService</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">coveredInFull</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">CoveredInFull</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">copay</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">Copay</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">coInsurance</span><span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">CoInsurance</span>])):-
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">decision_table</span>(<span style="color:#8be9fd;font-style:italic">PlaceOfService</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">Type</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">Plan</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">GroupSize</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">InNetwork</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">IsCovered</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">DateOfService1</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">DateOfService2</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">CoveredInFull</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">Copay</span>,
</span></span><span style="display:flex;"><span>			   <span style="color:#8be9fd;font-style:italic">CoInsurance</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#6272a4">%% check date: must be between the two dates in decision_table</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">atom_string</span>(<span style="color:#8be9fd;font-style:italic">DateOfService</span>, <span style="color:#8be9fd;font-style:italic">DateOfServiceString</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">atom_string</span>(<span style="color:#8be9fd;font-style:italic">DateOfService1</span>, <span style="color:#8be9fd;font-style:italic">DateOfService1String</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">atom_string</span>(<span style="color:#8be9fd;font-style:italic">DateOfService2</span>, <span style="color:#8be9fd;font-style:italic">DateOfService2String</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">DateOfService1String</span> <span style="color:#f1fa8c">@=&lt;</span> <span style="color:#8be9fd;font-style:italic">DateOfServiceString</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">DateOfServiceString</span>  <span style="color:#f1fa8c">@=&lt;</span> <span style="color:#8be9fd;font-style:italic">DateOfService2String</span>.
</span></span></code></pre></div><p>The file server.pl contains the code for the rest server that exposes the core functions as http POST requests.</p>
<h2 id="references">References:</h2>
<ul>
<li><a href="https://gitlab.com/matteoredaelli/dmcommunity_2021_02">https://gitlab.com/matteoredaelli/dmcommunity_2021_02</a></li>
<li><a href="https://hub.docker.com/repository/docker/matteoredaelli/dmcommunity_org_2021_02">https://hub.docker.com/repository/docker/matteoredaelli/dmcommunity_org_2021_02</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Virtual Chess tournament with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-dec-2020/</link>
      <pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-dec-2020/</guid>
      <description><![CDATA[<p>Below my #swi #prolog solution for &ldquo;Virtual Chess tournament&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-dec-2020/">dmcommunity.org challenge Dec 2020</a></p>
<p>Player 1 is Fischer, player 2 is Kasparov and player 3 is Karpov.</p>
<p>I can find two solutions (Score1,Wins1,Draws1,Loses1 are Fischer&rsquo;s score, number of wins, draws and loses,..) is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">time</span>(<span style="color:#50fa7b">solution</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>,<span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Loses1</span>],[<span style="color:#8be9fd;font-style:italic">Score2</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>],[<span style="color:#8be9fd;font-style:italic">Score3</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]])).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">% 1,297,058 inferences, 0.136 CPU in 0.136 seconds (100% CPU, 9557549 Lips)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">15</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">4</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Draws1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">7</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Loses1</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">Draws2</span>, <span style="color:#8be9fd;font-style:italic">Draws2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">3</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">13</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">5</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Loses2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">6</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">14</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins3</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">Loses3</span>, <span style="color:#8be9fd;font-style:italic">Loses3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">2</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Draws3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">10</span> ;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">% 152,142 inferences, 0.021 CPU in 0.021 seconds (100% CPU, 7203556 Lips)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">15</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">Draws2</span>, <span style="color:#8be9fd;font-style:italic">Draws2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">4</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Draws1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">7</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Loses1</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">3</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">14</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">Loses2</span>, <span style="color:#8be9fd;font-style:italic">Loses2</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">5</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Score3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">13</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Wins3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Draws3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">11</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Loses3</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">2</span> ;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">time</span>(<span style="color:#50fa7b">findall</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>,<span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Loses1</span>],[<span style="color:#8be9fd;font-style:italic">Score2</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>],[<span style="color:#8be9fd;font-style:italic">Score3</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]], <span style="color:#50fa7b">solution</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>,<span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Loses1</span>],[<span style="color:#8be9fd;font-style:italic">Score2</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>],[<span style="color:#8be9fd;font-style:italic">Score3</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]]), <span style="color:#8be9fd;font-style:italic">L</span>)), <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">L</span>, <span style="color:#8be9fd;font-style:italic">TotSolutions</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">% 2,401,046 inferences, 0.252 CPU in 0.252 seconds (100% CPU, 9530423 Lips)</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">L</span> <span style="color:#ff79c6">=</span> [[[<span style="color:#bd93f9">15</span>, <span style="color:#bd93f9">4</span>, <span style="color:#bd93f9">7</span>, <span style="color:#bd93f9">3</span>], [<span style="color:#bd93f9">13</span>, <span style="color:#bd93f9">5</span>, <span style="color:#bd93f9">3</span>, <span style="color:#bd93f9">6</span>], [<span style="color:#bd93f9">14</span>, <span style="color:#bd93f9">2</span>, <span style="color:#bd93f9">10</span>, <span style="color:#bd93f9">2</span>]], [[<span style="color:#bd93f9">15</span>, <span style="color:#bd93f9">4</span>, <span style="color:#bd93f9">7</span>, <span style="color:#bd93f9">3</span>], [<span style="color:#bd93f9">14</span>, <span style="color:#bd93f9">5</span>, <span style="color:#bd93f9">4</span>, <span style="color:#bd93f9">5</span>], [<span style="color:#bd93f9">13</span>, <span style="color:#bd93f9">1</span>, <span style="color:#bd93f9">11</span>, <span style="color:#bd93f9">2</span>]]],
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">TotSolutions</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">2.</span>
</span></span></code></pre></div><p>Below my dec2020.pl script</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#50fa7b">tot_games</span>(<span style="color:#bd93f9">14</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">tot_games_two_players</span>(<span style="color:#bd93f9">7</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">match_two_players</span>(<span style="color:#8be9fd;font-style:italic">Wins1</span>, <span style="color:#8be9fd;font-style:italic">Draws</span>, <span style="color:#8be9fd;font-style:italic">Wins2</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#6272a4">%% constraint: 7 games agains each player</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">tot_games_two_players</span>(<span style="color:#8be9fd;font-style:italic">TotGames</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0.</span>.<span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Draws</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0.</span>.<span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#f1fa8c">in</span> <span style="color:#bd93f9">0.</span>.<span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">TotGames</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">tournament</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>, <span style="color:#8be9fd;font-style:italic">Wins1</span>, <span style="color:#8be9fd;font-style:italic">Draws1</span>, <span style="color:#8be9fd;font-style:italic">Loses1</span>],
</span></span><span style="display:flex;"><span>	   [<span style="color:#8be9fd;font-style:italic">Score2</span>, <span style="color:#8be9fd;font-style:italic">Wins2</span>, <span style="color:#8be9fd;font-style:italic">Draws2</span>, <span style="color:#8be9fd;font-style:italic">Loses2</span>],
</span></span><span style="display:flex;"><span>	   [<span style="color:#8be9fd;font-style:italic">Score3</span>, <span style="color:#8be9fd;font-style:italic">Wins3</span>, <span style="color:#8be9fd;font-style:italic">Draws3</span>, <span style="color:#8be9fd;font-style:italic">Loses3</span>]
</span></span><span style="display:flex;"><span>	  ]):-
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">tot_games</span>(<span style="color:#8be9fd;font-style:italic">TotGames</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">match_two_players</span>(<span style="color:#8be9fd;font-style:italic">Wins12</span>, <span style="color:#8be9fd;font-style:italic">Draws12</span>, <span style="color:#8be9fd;font-style:italic">Wins21</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">match_two_players</span>(<span style="color:#8be9fd;font-style:italic">Wins13</span>, <span style="color:#8be9fd;font-style:italic">Draws13</span>, <span style="color:#8be9fd;font-style:italic">Wins31</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">match_two_players</span>(<span style="color:#8be9fd;font-style:italic">Wins23</span>, <span style="color:#8be9fd;font-style:italic">Draws23</span>, <span style="color:#8be9fd;font-style:italic">Wins32</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins12</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins13</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins21</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins23</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins31</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins32</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Loses1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins21</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins31</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Loses2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins12</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins32</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Loses3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins13</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Wins23</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Draws1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Draws12</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws13</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Draws2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Draws12</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws23</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Draws3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Draws13</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws23</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws1</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Loses1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Loses2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins3</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws3</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Loses3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">TotGames</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Score1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins1</span> <span style="color:#ff79c6">*</span> <span style="color:#bd93f9">2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Score2</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#ff79c6">*</span> <span style="color:#bd93f9">2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws2</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Score3</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Wins3</span> <span style="color:#ff79c6">*</span> <span style="color:#bd93f9">2</span> <span style="color:#ff79c6">+</span> <span style="color:#8be9fd;font-style:italic">Draws3</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#6272a4">%% constraint: Fischer (1) is the winner</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Score1</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Score2</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Score1</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Score3</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#6272a4">%% constraint: Kasparov (2) is the most aggressive</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Wins1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Wins2</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Wins3</span>,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#6272a4">%% constraint: Karpov (3) is the best defensive player</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Loses1</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Loses3</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Loses2</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Loses3</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">solution</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>,<span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Loses1</span>],
</span></span><span style="display:flex;"><span>	  [<span style="color:#8be9fd;font-style:italic">Score2</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>],
</span></span><span style="display:flex;"><span>	  [<span style="color:#8be9fd;font-style:italic">Score3</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]]):-
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">tournament</span>([[<span style="color:#8be9fd;font-style:italic">Score1</span>,<span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Loses1</span>],
</span></span><span style="display:flex;"><span>		   [<span style="color:#8be9fd;font-style:italic">Score2</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>],
</span></span><span style="display:flex;"><span>		   [<span style="color:#8be9fd;font-style:italic">Score3</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]]),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">label</span>([<span style="color:#8be9fd;font-style:italic">Score1</span>, <span style="color:#8be9fd;font-style:italic">Score2</span>, <span style="color:#8be9fd;font-style:italic">Score3</span>,
</span></span><span style="display:flex;"><span>		   <span style="color:#8be9fd;font-style:italic">Wins1</span>,<span style="color:#8be9fd;font-style:italic">Wins2</span>,<span style="color:#8be9fd;font-style:italic">Wins3</span>,
</span></span><span style="display:flex;"><span>		   <span style="color:#8be9fd;font-style:italic">Draws1</span>,<span style="color:#8be9fd;font-style:italic">Draws2</span>,<span style="color:#8be9fd;font-style:italic">Draws3</span>,
</span></span><span style="display:flex;"><span>		   <span style="color:#8be9fd;font-style:italic">Loses1</span>,<span style="color:#8be9fd;font-style:italic">Loses2</span>,<span style="color:#8be9fd;font-style:italic">Loses3</span>]).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calculator with Two Buttons with Prolog</title>
      <link>https://www.mr70.eu/posts/dmcommunity_org_challenge-nov-2020/</link>
      <pubDate>Sat, 14 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dmcommunity_org_challenge-nov-2020/</guid>
      <description><![CDATA[<p>Below my #prolog solution for &ldquo;Calculator with Two Buttons&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-nov-2020/">dmcommunity.org challenge Nov 2020</a></p>
<p>swipl nov2020.pl</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#f1fa8c">?-</span> <span style="color:#50fa7b">shortest_path</span>(<span style="color:#bd93f9">0</span>,<span style="color:#bd93f9">5034</span>,<span style="color:#8be9fd;font-style:italic">Path</span>), <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">Path</span>,<span style="color:#8be9fd;font-style:italic">Len</span>), <span style="color:#50fa7b">findall</span>(<span style="color:#8be9fd;font-style:italic">Op</span>,<span style="color:#50fa7b">member</span>([<span style="color:#ff79c6">_</span>,<span style="color:#8be9fd;font-style:italic">Op</span>,<span style="color:#ff79c6">_</span>], <span style="color:#8be9fd;font-style:italic">Path</span>), <span style="color:#8be9fd;font-style:italic">Ops</span>).
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Path</span> <span style="color:#ff79c6">=</span> [[<span style="color:#bd93f9">0</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">1</span>],[<span style="color:#bd93f9">1</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">2</span>],[<span style="color:#bd93f9">2</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">3</span>],[<span style="color:#bd93f9">3</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">4</span>],[<span style="color:#bd93f9">4</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">5</span>],[<span style="color:#bd93f9">5</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#bd93f9">50</span>],[<span style="color:#bd93f9">50</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#bd93f9">500</span>],[<span style="color:#bd93f9">500</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">501</span>],[<span style="color:#bd93f9">501</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">502</span>],[<span style="color:#bd93f9">502</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">503</span>],[<span style="color:#bd93f9">503</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#bd93f9">5030</span>],[<span style="color:#bd93f9">5030</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">5031</span>],[<span style="color:#bd93f9">5031</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">5032</span>],[<span style="color:#bd93f9">5032</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">5033</span>],[<span style="color:#bd93f9">5033</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#bd93f9">5034</span>]],
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Len</span> <span style="color:#ff79c6">=</span> <span style="color:#bd93f9">15</span>,
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">Ops</span> <span style="color:#ff79c6">=</span> [<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">*</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#f1fa8c">+</span>].
</span></span></code></pre></div><p>Below my nov2020.pl script</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:- <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">shortest_path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">Path</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">From</span> <span style="color:#f1fa8c">#&gt;=</span> <span style="color:#bd93f9">0</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">shortest_path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#bd93f9">0</span>, <span style="color:#8be9fd;font-style:italic">Path</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">shortest_path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">MaxDepth</span>, <span style="color:#8be9fd;font-style:italic">Path</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">MaxDepth</span>, <span style="color:#8be9fd;font-style:italic">Path</span>),! .
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">shortest_path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">MaxDepth</span>, <span style="color:#8be9fd;font-style:italic">Path</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">MaxDepth1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">MaxDepth</span> <span style="color:#ff79c6">+</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">shortest_path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">MaxDepth1</span>, <span style="color:#8be9fd;font-style:italic">Path</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#ff79c6">_</span><span style="color:#8be9fd;font-style:italic">MaxDepth</span>, [[<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">Op</span>, <span style="color:#8be9fd;font-style:italic">To</span>]]):-
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">step</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">Op</span>, <span style="color:#8be9fd;font-style:italic">To</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">path</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">MaxDepth</span>, [[<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">Op</span>, <span style="color:#8be9fd;font-style:italic">Mid</span>]|<span style="color:#8be9fd;font-style:italic">Path</span>]):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Mid</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">From</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">To</span>  <span style="color:#f1fa8c">#&gt;</span> <span style="color:#8be9fd;font-style:italic">Mid</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">MaxDepth</span> <span style="color:#f1fa8c">#&gt;</span> <span style="color:#bd93f9">0</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Depth1</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">MaxDepth</span> <span style="color:#ff79c6">-</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">step</span>(<span style="color:#8be9fd;font-style:italic">From</span>, <span style="color:#8be9fd;font-style:italic">Op</span>, <span style="color:#8be9fd;font-style:italic">Mid</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">path</span>(<span style="color:#8be9fd;font-style:italic">Mid</span>, <span style="color:#8be9fd;font-style:italic">To</span>, <span style="color:#8be9fd;font-style:italic">Depth1</span>, <span style="color:#8be9fd;font-style:italic">Path</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">step</span>(<span style="color:#8be9fd;font-style:italic">N</span>,<span style="color:#f1fa8c">*</span>, <span style="color:#8be9fd;font-style:italic">M</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">M</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">N</span> <span style="color:#ff79c6">*</span> <span style="color:#bd93f9">10.</span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">step</span>(<span style="color:#8be9fd;font-style:italic">N</span>,<span style="color:#f1fa8c">+</span>,<span style="color:#8be9fd;font-style:italic">M</span>):-
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">M</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">N</span> <span style="color:#ff79c6">+</span> <span style="color:#bd93f9">1.</span>
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Active Directory authentication for PostgreSQL users</title>
      <link>https://www.mr70.eu/posts/active-directory-authentication-for-postgresql-users/</link>
      <pubDate>Mon, 12 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/active-directory-authentication-for-postgresql-users/</guid>
      <description><![CDATA[<p>It is easy, you just need to add to the configuration file /var/lib/postgresql/data/pg_hba.conf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>host all all 0.0.0.0/0 ldap ldapserver=&#34;myldapserver&#34; ldapbasedn=&#34;OU=USERS,DC=group,DC=redaelli,DC=org&#34; ldapbinddn=&#34;CN=matteo,OU=USERS,DC=group,DC=redaelli,DC=org&#34; ldapbindpasswd=&#34;MySillyPwd&#34; ldapsearchattribute=&#34;sAMAccountName&#34; ldapscheme=&#34;ldaps&#34;
</span></span></code></pre></div><p>And inside your database yu need to create a role for the Active director users and then grant them to the required databases.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>LDAP search examples from command line</title>
      <link>https://www.mr70.eu/posts/ldap-search-examples/</link>
      <pubDate>Mon, 12 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ldap-search-examples/</guid>
      <description><![CDATA[<h2 id="setup">setup</h2>
<p>In these examples I use kerberos authentication but you could also use basic authentication with -D and -w options</p>
<p>For semplicity I put common options into the environment and I have created an alias</p>
<pre><code>export LDAP_OPTS=&quot;-h myldap.group.example.com -LLL -Y GSSAPI -b dc=group,dc=example,dc=com  -o ldif-wrap=no &quot;

alias adsearch=&quot;/usr/bin/ldapsearch ${LDAP_OPTS}&quot;
</code></pre>
<h2 id="extract-locked-users">Extract locked users</h2>
<p>adsearch &ldquo;(&amp;(objectCategory=Person)(objectClass=User)(lockoutTime&gt;=1))&rdquo; dn</p>
<h2 id="expired-passwords">Expired passwords</h2>
<p>date -d &ldquo;1601/1/1+$(expr 132469210596077795 / 10000000 )Seconds&rdquo;</p>
<p>&ldquo;(&amp;(objectclass=user)(objectcategory=person)(!pwdlastset=0)(pwdlastset&lt;={date})(!userAccountControl:1.2.840.113556.1.4.803:=65536))&rdquo;</p>
<h2 id="extracting-the-flat-list-of-members-of-a-group">Extracting the flat list of members of a group</h2>
<p>How to recursively retreiving teh list of members of a group</p>
<p>&ldquo;(&amp;(objectclass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Qliksense_Professional,OU=Common Services,DC=redaelli,DC=org))&rdquo;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using a GraphQL gateway for backend services (Active Directory, AWS and Qliksense Api samples)</title>
      <link>https://www.mr70.eu/posts/graphql-gateway-ldap-qliksense/</link>
      <pubDate>Sun, 11 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/graphql-gateway-ldap-qliksense/</guid>
      <description><![CDATA[<p>Complex web sites read and write data from/to several backend systems using different interfaces (sql, soap , rest, rpc,..).
But it could be simpler and useful to create a single endpoint and interface for all the backends.</p>
<p><img src="https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2020/10/12/Conceptual-representation-of-API-facade-pattern.png" alt=""></p>
<p>With <a href="https://graphql.org/">GraphQL</a> the frontend applications get from the backends only the list of fields they need and do not receive the static list of the fields provided by the soap/rest services.</p>
<p>I played with graphql and <a href="https://medium.com/walmartglobaltech/open-sourcing-lacinia-our-graphql-library-for-clojure-96a4ce5fc7b8">Walmart lacinia</a> implementing one GraphQL backend for LDAP/Active Directory and one for Qliksense Repository rest api.</p>
<p>When you query an ldap server asking for members of a group, you receive the list of distinguishedNames of the members (see below the values of the field &ldquo;member&rdquo;). With GraphQL you can add other fields (see below &ldquo;memberObjects&rdquo;) for retreiving more useful info.</p>
<p>I also added other &ldquo;meta&rdquo; fields like ip addresses for computer objects</p>
<p>Sample ldap query:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	ldap_objects(
</span></span><span style="display:flex;"><span>		searchdn: <span style="color:#f1fa8c">&#34;dc=redaelli,dc=org&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#50fa7b">filter</span>: <span style="color:#f1fa8c">&#34;(sAMAccountName=qliksense_milano)&#34;</span>)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#50fa7b">dn</span>
</span></span><span style="display:flex;"><span>		member
</span></span><span style="display:flex;"><span>		memberObjects {
</span></span><span style="display:flex;"><span>			displayName
</span></span><span style="display:flex;"><span>			sAMAccountName
</span></span><span style="display:flex;"><span>			mail
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Sample result:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;data&#34;</span>: {
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;ldap_objects&#34;</span>: [
</span></span><span style="display:flex;"><span>	  {
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;dn&#34;</span>: <span style="color:#f1fa8c">&#34;CN=Qliksense_Milano,OU=MngScope,OU=IT,DC=redaelli,DC=org&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;member&#34;</span>: [
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">&#34;CN=user1,OU=Standard GUI Users,DC=redaelli,DC=org&#34;</span>,
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">&#34;CN=user2,OU=Standard GUI Users,DC=redaelli,DC=org&#34;</span>],
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;memberObjects&#34;</span>: [
</span></span><span style="display:flex;"><span>		  {
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;displayName&#34;</span>: <span style="color:#f1fa8c">&#34;User1&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;sAMAccountName&#34;</span>: <span style="color:#f1fa8c">&#34;user1&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;mail&#34;</span>: <span style="color:#f1fa8c">&#34;name1.lastname1@redaelli.org&#34;</span>
</span></span><span style="display:flex;"><span>		  },
</span></span><span style="display:flex;"><span>		  {
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;displayName&#34;</span>: <span style="color:#f1fa8c">&#34;User2&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;sAMAccountName&#34;</span>: <span style="color:#f1fa8c">&#34;user2&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;mail&#34;</span>: <span style="color:#f1fa8c">&#34;name2.lastname2@redaelli.org&#34;</span>
</span></span><span style="display:flex;"><span>		  }]
</span></span></code></pre></div><p>Sample ldap query extracting computers and IP addresses</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  ldap_objects(
</span></span><span style="display:flex;"><span>	system: <span style="color:#f1fa8c">&#34;group&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">searchdn</span>: <span style="color:#f1fa8c">&#34;dc=group,dc=redaelli,dc=org&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">filter</span>: <span style="color:#f1fa8c">&#34;(&amp;(objectClass=computer)(sAMAccountName=dmcAAA*))&#34;</span>
</span></span><span style="display:flex;"><span>  )
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">operatingSystem</span>
</span></span><span style="display:flex;"><span>	operatingSystemVersion
</span></span><span style="display:flex;"><span>	dNSHostName
</span></span><span style="display:flex;"><span>		ipAddresses
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Result:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;data&#34;</span>: {
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;ldap_objects&#34;</span>: [
</span></span><span style="display:flex;"><span>	  {
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;operatingSystem&#34;</span>: <span style="color:#f1fa8c">&#34;Windows Server 2016 Datacenter&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;operatingSystemVersion&#34;</span>: <span style="color:#f1fa8c">&#34;10.0 (14393)&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;dNSHostName&#34;</span>: <span style="color:#f1fa8c">&#34;DMCAAAW.group.redaelli.org&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;ipAddresses&#34;</span>: [
</span></span><span style="display:flex;"><span>		  <span style="color:#f1fa8c">&#34;20.12.9.4&#34;</span>
</span></span><span style="display:flex;"><span>		]
</span></span><span style="display:flex;"><span>	  },
</span></span></code></pre></div><p>Sample qliksense query:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-graphql" data-lang="graphql"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  qliksense_streams(
</span></span><span style="display:flex;"><span>	system: <span style="color:#f1fa8c">&#34;myqlikserver&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">filter</span>:<span style="color:#f1fa8c">&#34;name eq &#39;Milan&#39;&#34;</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">id</span>
</span></span><span style="display:flex;"><span>	name
</span></span><span style="display:flex;"><span>	customProperties {
</span></span><span style="display:flex;"><span>	  value
</span></span><span style="display:flex;"><span>	  definition {
</span></span><span style="display:flex;"><span>		name
</span></span><span style="display:flex;"><span>	  }
</span></span><span style="display:flex;"><span>	}}}
</span></span></code></pre></div><p>Result:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">&#34;data&#34;</span>: {
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">&#34;qliksense_streams&#34;</span>: [
</span></span><span style="display:flex;"><span>	  {
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;id&#34;</span>: <span style="color:#f1fa8c">&#34;10a842ba-cdda-48fa-93f6-z53c92cdad61&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;name&#34;</span>: <span style="color:#f1fa8c">&#34;Milan&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ff79c6">&#34;customProperties&#34;</span>: [
</span></span><span style="display:flex;"><span>		  {
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;value&#34;</span>: <span style="color:#f1fa8c">&#34;Qliksense_Milan&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#ff79c6">&#34;definition&#34;</span>: {
</span></span><span style="display:flex;"><span>			  <span style="color:#ff79c6">&#34;name&#34;</span>: <span style="color:#f1fa8c">&#34;GroupAccess&#34;</span>
</span></span><span style="display:flex;"><span>		  }}
</span></span><span style="display:flex;"><span>	  ]}]}}
</span></span></code></pre></div><p>The libraries can be found at</p>
<ul>
<li><a href="https://github.com/matteoredaelli/lacinia-backend-aws/">https://github.com/matteoredaelli/lacinia-backend-aws/</a> (poc)</li>
<li><a href="https://github.com/matteoredaelli/lacinia-backend-ldap/">https://github.com/matteoredaelli/lacinia-backend-ldap/</a> (usable)</li>
<li><a href="https://github.com/matteoredaelli/lacinia-backend-qliksense/">https://github.com/matteoredaelli/lacinia-backend-qliksense/</a> (usable)</li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using chrome/firefox programmatically for navigating a (Qliksense) website and taking screenshots</title>
      <link>https://www.mr70.eu/posts/navigating-qliksense-pages-with-chrome-firefox-via-scripting/</link>
      <pubDate>Tue, 08 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/navigating-qliksense-pages-with-chrome-firefox-via-scripting/</guid>
      <description><![CDATA[<p>How do you know if the user interface (UI) of a website you&rsquo;re developing works as it should and the site as a whole delivers the optimal user experience (UX)? Headless browsers give you a fast, lightweight way to automate high-level actions and get an idea of how well your site operates in common scenarios.</p>
<p>Links to Headless browers:</p>
<ul>
<li><a href="https://sites.google.com/a/chromium.org/chromedriver/">Chrome</a></li>
<li><a href="https://github.com/mozilla/geckodriver/releases">Firefox</a></li>
<li><a href="http://phantomjs.org/download.html">Phantomjs</a></li>
<li><a href="https://webkit.org/blog/6900/webdriver-support-in-safari-10/">Safari</a></li>
</ul>
<p>I found the nice clojure library <a href="https://github.com/igrishaev/etaoin">etaoin</a> for using a browser programmatically. Below my code</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span>(<span style="color:#8be9fd;font-style:italic">ns </span><span style="color:#8be9fd;font-style:italic">org.redaelli.qlik-bot-navigation</span>
</span></span><span style="display:flex;"><span>  (<span style="color:#f1fa8c">:use</span> [<span style="color:#8be9fd;font-style:italic">etaoin.api</span>])
</span></span><span style="display:flex;"><span>  (<span style="color:#f1fa8c">:require</span> [<span style="color:#8be9fd;font-style:italic">etaoin.keys</span> <span style="color:#f1fa8c">:as</span> <span style="color:#8be9fd;font-style:italic">k</span>])
</span></span><span style="display:flex;"><span>  (<span style="color:#f1fa8c">:gen-class</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#8be9fd;font-style:italic">defn </span><span style="color:#8be9fd;font-style:italic">-main</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f1fa8c">&#34;Navigate qliksense pages and then take a screeshot.&#34;</span>
</span></span><span style="display:flex;"><span>  [<span style="color:#ff79c6">&amp;</span> <span style="color:#8be9fd;font-style:italic">args</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (<span style="color:#50fa7b">with-chrome</span> {} <span style="color:#8be9fd;font-style:italic">ff</span> <span style="color:#6272a4">;; additional options first, then bind name</span>
</span></span><span style="display:flex;"><span>	(<span style="color:#8be9fd;font-style:italic">doto </span><span style="color:#8be9fd;font-style:italic">ff</span>
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">go</span> <span style="color:#f1fa8c">&#34;https://qliksense.redaelli.org/&#34;</span>)
</span></span><span style="display:flex;"><span>	  <span style="color:#6272a4">;; form login</span>
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">fill-multi</span> {<span style="color:#f1fa8c">:username-input</span> <span style="color:#f1fa8c">&#34;REDAELLI\\matteo&#34;</span>
</span></span><span style="display:flex;"><span>				   <span style="color:#f1fa8c">:password-input</span> <span style="color:#f1fa8c">&#34;MySillyPassword&#34;</span>})
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">click</span> {<span style="color:#f1fa8c">:tag</span> <span style="color:#f1fa8c">:input</span>
</span></span><span style="display:flex;"><span>			  <span style="color:#f1fa8c">:type</span> <span style="color:#f1fa8c">:submit</span>})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">wait-visible</span> {<span style="color:#f1fa8c">:class</span> <span style="color:#f1fa8c">&#34;lui-list__item lui-list__action q-li-stream&#34;</span>})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  <span style="color:#6272a4">;; enter the first stream</span>
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">click</span> {<span style="color:#f1fa8c">:tag</span> <span style="color:#f1fa8c">:li</span>
</span></span><span style="display:flex;"><span>			  <span style="color:#f1fa8c">:class</span> <span style="color:#f1fa8c">&#34;lui-list__item lui-list__action q-li-stream&#34;</span>})
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  <span style="color:#6272a4">;; take a screenshot</span>
</span></span><span style="display:flex;"><span>	  (<span style="color:#50fa7b">screenshot</span> (<span style="color:#50fa7b">java.io.File.</span> <span style="color:#f1fa8c">&#34;screenshot.png&#34;</span>)))))
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto quickly extract LDAP attributes for a list of users</title>
      <link>https://www.mr70.eu/posts/ldap-curl-mail-samaccountame/</link>
      <pubDate>Mon, 07 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ldap-curl-mail-samaccountame/</guid>
      <description><![CDATA[<p>I had a list of email addresses and my boss asked me to extract the login names (SamAccountname attribute in Active Directory). I quickly did it with:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>  cat mails.txt | while read mail
</span></span><span style="display:flex;"><span>  do
</span></span><span style="display:flex;"><span>	echo /usr/bin/curl  -s --proxy \&#34;\&#34; -u \&#34;MYDOMAIN\\myuser:mypassword\&#34; \&#34;ldap://ldapserver:3268/DC=group,DC=mycompany,DC=com?sAMAccountName?sub?(mail=${mail})\&#34;
</span></span><span style="display:flex;"><span>  done  | bash | grep &#34;sAMAccountName:&#34; | cut -f2 -d&#34;:&#34; | sed -e &#39;s/^ /&#34;/&#39; -e &#39;s/$/&#34;,/&#39;
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Switching from Wordpress to a static website</title>
      <link>https://www.mr70.eu/posts/2020-07-22-switch-from-wordpress-to-hugo/</link>
      <pubDate>Mon, 20 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/2020-07-22-switch-from-wordpress-to-hugo/</guid>
      <description><![CDATA[<p>I migrated my Blog site from Wordpress to a faster static web site using  markdown files and <a href="https://gohugo.io/">Hugo</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Doctor Planning resolved with #Prolog</title>
      <link>https://www.mr70.eu/posts/doctor-planning-resolved-with-prolog/</link>
      <pubDate>Wed, 22 Apr 2020 15:36:33 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/doctor-planning-resolved-with-prolog/</guid>
      <description><![CDATA[<p>Below my #prolog solution for &ldquo;Doctor Planning&rdquo; proposed by <a href="https://dmcommunity.org/challenge/challenge-apr-2020/">dmcommunity.org challenge April 2020</a></p>
<p><a href="dmcommunity.org"><img src="https://dmcommunity.files.wordpress.com/2020/04/doctorplanning.jpg" alt=""></a></p>
<p>There should be more constraints like a limit of shifts a week for each doctor&hellip; In any case after few seconds I get the first result [[2,3,4],[2,3,4],[2,3,4],[2,3,4],[1,2,3],[1,2,4],[1,2,4]]</p>
<p>It means: Monday sheets: doctor 2 (early), doctor 3 (late) and doctor 4 (night)&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>:- use_module(library(clpfd)). /* using swi-prolog */
</span></span><span style="display:flex;"><span>:- use_module(library(clpz)). /* using scryer-prolog */
</span></span><span style="display:flex;"><span>/*
</span></span><span style="display:flex;"><span>  solver for issue
</span></span><span style="display:flex;"><span>  https://dmcommunity.org/challenge/challenge-apr-2020/
</span></span><span style="display:flex;"><span>  tested with swi-prolog and scryer-prolog
</span></span><span style="display:flex;"><span>*/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>/*
</span></span><span style="display:flex;"><span>  constraint 1:
</span></span><span style="display:flex;"><span>  a doctor can work only a shift a day
</span></span><span style="display:flex;"><span>*/
</span></span><span style="display:flex;"><span>constraint1_one_shift_a_day(Doctors):-
</span></span><span style="display:flex;"><span>	all_different(Doctors).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>/*
</span></span><span style="display:flex;"><span>  constraint 2:
</span></span><span style="display:flex;"><span>  a doctor should always be available
</span></span><span style="display:flex;"><span>  for his shift
</span></span><span style="display:flex;"><span>*/
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(1, 5, _).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(1, 6, _).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(1, 7, _).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(2, _, 1).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(2, _, 2).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(3, Day, _):- Day in 1..5.
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(3, Day, Shift):- Day in 6..7, Shift in 1..2.
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(4, _, _).
</span></span><span style="display:flex;"><span>constraint2_doctor_day_shift(5, _, _).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>constraint2_doctor5(Doctors):-
</span></span><span style="display:flex;"><span>	findall(5, member([_,_,5], Doctors), Turns),
</span></span><span style="display:flex;"><span>	length(Turns, Tot), Tot #&lt;2.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>/*
</span></span><span style="display:flex;"><span>  constraint 3:
</span></span><span style="display:flex;"><span>  if a doctor has a night shift,
</span></span><span style="display:flex;"><span>  they either get the next day off or
</span></span><span style="display:flex;"><span>  the night shift again
</span></span><span style="display:flex;"><span>*/
</span></span><span style="display:flex;"><span>constraint3_two_shifts_rest([[D11,D12,D13],
</span></span><span style="display:flex;"><span>			     [D21,D22,D23],
</span></span><span style="display:flex;"><span>			     [D31,D32,D33],
</span></span><span style="display:flex;"><span>			     [D41,D42,D43],
</span></span><span style="display:flex;"><span>			     [D51,D52,D53],
</span></span><span style="display:flex;"><span>			     [D61,D62,D63],
</span></span><span style="display:flex;"><span>			     [D71,D72,D73]
</span></span><span style="display:flex;"><span>			    ]):-
</span></span><span style="display:flex;"><span>	D13 #\= D21,
</span></span><span style="display:flex;"><span>	D13 #\= D22,
</span></span><span style="display:flex;"><span>	D23 #\= D31,
</span></span><span style="display:flex;"><span>	D23 #\= D32,
</span></span><span style="display:flex;"><span>	D33 #\= D41,
</span></span><span style="display:flex;"><span>	D33 #\= D42,
</span></span><span style="display:flex;"><span>	D43 #\= D51,
</span></span><span style="display:flex;"><span>	D43 #\= D52,
</span></span><span style="display:flex;"><span>	D53 #\= D61,
</span></span><span style="display:flex;"><span>	D53 #\= D62,
</span></span><span style="display:flex;"><span>	D63 #\= D71,
</span></span><span style="display:flex;"><span>	D63 #\= D72,
</span></span><span style="display:flex;"><span>	D73 #\= D11,
</span></span><span style="display:flex;"><span>	D73 #\= D12.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>/*
</span></span><span style="display:flex;"><span>  constaint 4:
</span></span><span style="display:flex;"><span>  both days in the weekend on none
</span></span><span style="display:flex;"><span>*/
</span></span><span style="display:flex;"><span>constraint4_both_saturday_sunday([_,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  [D61,D62,D63],
</span></span><span style="display:flex;"><span>				  [D61,D62,D63]
</span></span><span style="display:flex;"><span>				 ]).
</span></span><span style="display:flex;"><span>constraint4_both_saturday_sunday([_,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  _,
</span></span><span style="display:flex;"><span>				  [D61,D62,D63],
</span></span><span style="display:flex;"><span>				  [D62,D61,D63]
</span></span><span style="display:flex;"><span>				 ]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>overall_constraints(Doctors):-
</span></span><span style="display:flex;"><span>	constraint3_two_shifts_rest(Doctors),
</span></span><span style="display:flex;"><span>	constraint4_both_saturday_sunday(Doctors),
</span></span><span style="display:flex;"><span>	constraint2_doctor5(Doctors).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>solve_one_day(Day, Doctors):-
</span></span><span style="display:flex;"><span>	length(Doctors,3),
</span></span><span style="display:flex;"><span>	Doctors ins 1..5,
</span></span><span style="display:flex;"><span>	constraint1_one_shift_a_day(Doctors),
</span></span><span style="display:flex;"><span>	Doctors = [Doctor1, Doctor2, Doctor3],
</span></span><span style="display:flex;"><span>	/* constraint 2 */
</span></span><span style="display:flex;"><span>	constraint2_doctor_day_shift(Doctor1, Day, 1),
</span></span><span style="display:flex;"><span>	constraint2_doctor_day_shift(Doctor2, Day, 2),
</span></span><span style="display:flex;"><span>	constraint2_doctor_day_shift(Doctor3, Day, 3).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>solve_day_by_day([], _Doctors).
</span></span><span style="display:flex;"><span>solve_day_by_day([Day|Days], [DayDoctors|Doctors]):-
</span></span><span style="display:flex;"><span>	solve_one_day(Day, DayDoctors),
</span></span><span style="display:flex;"><span>	solve_day_by_day(Days, Doctors).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>solve(Doctors):-
</span></span><span style="display:flex;"><span>	solve_day_by_day([1,2,3,4,5,6,7], Doctors),
</span></span><span style="display:flex;"><span>	overall_constraints(Doctors).
</span></span></code></pre></div><hr>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="https://twitter.com/princess_gergo" title="gergo@tud.at">Gergö Barany</a> - <!-- raw HTML omitted -->Apr 6, 2020<!-- raw HTML omitted --></p>
<p>Nice solution! I was wondering how to approach this with CLP(FD), it did not seem &ldquo;natural&rdquo; to me. Here is my solution using a more &ldquo;symbolic&rdquo; approach, not using numerical constraints but with DCGs and aggressive use of dif/2: % A day is a list of three Doctor-Day-Shift terms. Only one shift per day % for each doctor. day(Day, EarlyDoc, LateDoc, NightDoc) &ndash;&gt; [EarlyDoc-Day-early, LateDoc-Day-late, NightDoc-Day-night], { dif(EarlyDoc, LateDoc), dif(EarlyDoc, NightDoc), dif(LateDoc, NightDoc) }. % A week is a list of Doctor-Day-Shift terms. week &ndash;&gt; day(sun, EarlySun, LateSun, NightSun), % Whoever works this night shift does not work the early or late shift % the next day. { dif(NightSun, EarlyMon), dif(NightSun, LateMon) }, day(mon, EarlyMon, LateMon, NightMon), { dif(NightMon, EarlyTue), dif(NightMon, LateTue) }, day(tue, EarlyTue, LateTue, NightTue), { dif(NightTue, EarlyWed), dif(NightTue, LateWed) }, day(wed, EarlyWed, LateWed, NightWed), { dif(NightWed, EarlyThu), dif(NightWed, LateThu) }, day(thu, EarlyThu, LateThu, NightThu), { dif(NightThu, EarlyFri), dif(NightThu, LateFri) }, day(fri, EarlyFri, LateFri, NightFri), { dif(NightFri, EarlySat), dif(NightFri, LateSat) }, day(sat, EarlySat, LateSat, NightSat), { dif(NightSat, EarlySun), dif(NightSat, LateSun) }, % The week starts and ends with a Sunday to ensure all constraints wrap % around correctly. In this formulation, both Sundays have the same % schedule, but this could be relaxed. day(sun, EarlySun, LateSun, NightSun). % Just the general constraints, no doctor-specific ones yet. schedule_(Schedule) :- phrase(week, Schedule). day(mon). day(tue). day(wed). day(thu). day(fri). day(sat). day(sun). weekend(sat). weekend(sun). shift(early). shift(late). shift(night). % Doctor-specific availability rules. doctor_available(fleming-Day-Shift) :- shift(Shift), member(Day, [fri, sat, sun]). doctor_available(freud-Day-Shift) :- member(Shift, [early, late]), day(Day). doctor_available(heimlich-Day-Shift) :- day(Day), shift(Shift), \+ ( weekend(Day), Shift = night ). doctor_available(eustachi-Day-Shift) :- day(Day), shift(Shift). doctor_available(golgi-Day-Shift) :- day(Day), shift(Shift). % but at max 2 night shifts, see golgi_rule/1 % A day with actual doctors assigned. scheduled_day(Day) &ndash;&gt; [EarlyDoc-Day-early, LateDoc-Day-late, NightDoc-Day-night], { doctor_available(EarlyDoc-Day-early), doctor_available(LateDoc-Day-late), doctor_available(NightDoc-Day-night) }. % A week with doctors assigned. scheduled_week &ndash;&gt; scheduled_day(sun), scheduled_day(mon), scheduled_day(tue), scheduled_day(wed), scheduled_day(thu), scheduled_day(fri), scheduled_day(sat), scheduled_day(sun). weekend_rule(Schedule) :- Weekend = [SatEarlyDoc-sat-early, SatLateDoc-sat-late, SatNightDoc-sat-night, SunEarlyDoc-sun-early, SunLateDoc-sun-late, SunNightDoc-sun-night], append(_Prefix, Weekend, Schedule), % The doctors working the Saturday shifts must have Sunday shifts as % well. SunDocs = [SunEarlyDoc, SunLateDoc, SunNightDoc], member(SatEarlyDoc, SunDocs), member(SatLateDoc, SunDocs), member(SatNightDoc, SunDocs), % There is no doctor working a Saturday and not Sunday, or vice versa. % This is redundant, it is implied by the other constraints. \+ ( member(Doctor-sat-_, Schedule), \+ member(Doctor-sun-_, Schedule) ), \+ ( member(Doctor-sun-_, Schedule), \+ member(Doctor-sat-_, Schedule) ). golgi_rule(Schedule) :- bagof(Day, Shift^member(golgi-Day-Shift, Schedule), GolgiNights), length(GolgiNights, N), N =&lt; 2. % Main predicate: A fully scheduled week with all constraints applied. schedule(Schedule) :- schedule_(Schedule), phrase(scheduled_week, Schedule), golgi_rule(Schedule), weekend_rule(Schedule). Tested with SWI-Prolog 7.2.3. Example solution: ?- time(schedule(S)), maplist(writeln, S). % 26,781 inferences, 0.003 CPU in 0.003 seconds (100% CPU, 7957758 Lips) fleming-sun-early freud-sun-late eustachi-sun-night freud-mon-early heimlich-mon-late eustachi-mon-night freud-tue-early heimlich-tue-late eustachi-tue-night freud-wed-early heimlich-wed-late eustachi-wed-night freud-thu-early heimlich-thu-late eustachi-thu-night fleming-fri-early freud-fri-late golgi-fri-night fleming-sat-early freud-sat-late eustachi-sat-night fleming-sun-early freud-sun-late eustachi-sun-night S = [fleming-sun-early, freud-sun-late, eustachi-sun-night, freud-mon-early, heimlich-mon-late, eustachi-mon-night, freud-tue-early, &hellip; - &hellip; - late, &hellip; - &hellip;|&hellip;] . If I&rsquo;m not mistaken, this is equivalent to your sample solution except for having Golgi on Friday night instead of Heimlich.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Imperative (not functional) languages are so boring. Long life to logical and declarative programming like Prolog</title>
      <link>https://www.mr70.eu/posts/imperative-languages-so-boring-long-life-to-logical-and-declarative-or-at-least-functional-programming-like-prolog/</link>
      <pubDate>Sat, 18 Apr 2020 19:21:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/imperative-languages-so-boring-long-life-to-logical-and-declarative-or-at-least-functional-programming-like-prolog/</guid>
      <description><![CDATA[<p>Below a simple example of using a a declarative language (<a href="https://en.wikipedia.org/wiki/Prolog">Prolog</a>) for finding all solutions for a trick game&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>?- use_module(library(clpfd)).
</span></span><span style="display:flex;"><span>?- X in 1..9, Y #= (X * 3 + 3) * 3, Z #= (Y rem 10) + (Y div 10), setof(Z, X^Y^label([X,Y,Z]), Sol).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Sol = [9],
</span></span></code></pre></div><p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2020/04/prolog-clp.jpg" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>My Networking Survival Kit</title>
      <link>https://www.mr70.eu/posts/my-networking-survival-kit/</link>
      <pubDate>Sun, 15 Mar 2020 21:44:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/my-networking-survival-kit/</guid>
      <description><![CDATA[<p>In this small tutorial I&rsquo;ll speak about tunneling, ssh port forwarding, <a href="https://en.wikipedia.org/wiki/SOCKS">socks</a>, <a href="https://en.wikipedia.org/wiki/Proxy_auto-config">pac files</a>, <a href="https://sshuttle.readthedocs.io/en/stable/how-it-works.html">Sshuttle</a></p>
<p><img src="https://www.howtogeek.com/wp-content/uploads/2017/03/why-is-a-network-tunnel-called-a-tunnel-00.jpg" alt=""></p>
<p>I&rsquo;ve been using Linux since 1995 but I have never been interested a lot in networking. In these many days of smart working (due to Covid-19) I have found some useful tricks to connect to remote systems that are not directly reachable from my lan/vpn</p>
<p><strong>Case 1</strong> (port forwarding): I wanted to connect to targethost.redaelli.org at tcp port 10000 but I was not able to reach it directly but only through an other host (tunnelhost.redaelli.org). With the following command I was able to reach the target host connecting to localhost:10000</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ssh -NL 10000:targethost.redaelli.org:10000 r@tunnelhost.redaelli.org
</span></span></code></pre></div><p><strong>Case 2</strong> (many port forwarding): I added in the file $HOME/.ssh/config</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Host tunnelhost
</span></span><span style="display:flex;"><span>User matteo
</span></span><span style="display:flex;"><span>Hostname tunnelhost.redaelli.org
</span></span><span style="display:flex;"><span>LocalForward 10000 192.168.20.152:10000
</span></span><span style="display:flex;"><span>LocalForward 10001 192.168.40.123:10000
</span></span><span style="display:flex;"><span>LocalForward 10002 192.168.60.112:10000
</span></span></code></pre></div><p>And after running &ldquo;ssh -N tunnelhost&rdquo; I was able to reach the target systems through localhost:10000, localhost:10001 and localhost:10002</p>
<p><strong>Case 3</strong> (socks5): connecting to many remote hosts using their hostnames (and not localhost). I started a socks server with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ssh -D 9999 -q -C -N matteo@tunnelhost.redaelli.org
</span></span></code></pre></div><p>An then I configured it in network settings in Firefox.</p>
<p>A further improvement was to create a &ldquo;pac&rdquo; file and set it in the network settings in Firefox. My <em>pac file</em> was</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>function FindProxyForURL(url, host) {
</span></span><span style="display:flex;"><span>    var useSocks = [&#34;remotehost.redaelli.org&#34;, 
</span></span><span style="display:flex;"><span>                    &#34;remotehost2.redaelli.org&#34;];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    for (var i= 0; i &lt; useSocks.length; i++) {
</span></span><span style="display:flex;"><span>	if (shExpMatch(host, useSocks[i])) {
</span></span><span style="display:flex;"><span>	    return &#34;SOCKS localhost:9999 ; DIRECT&#34;;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    if (isInNet(dnsResolve(host), &#34;192.168.20.0&#34;, &#34;255.255.255.0&#34;) ||
</span></span><span style="display:flex;"><span>        isInNet(dnsResolve(host), &#34;192.168.40.0&#34;, &#34;255.255.255.0&#34;) ||
</span></span><span style="display:flex;"><span>        isInNet(dnsResolve(host), &#34;192.168.60.0&#34;, &#34;255.255.255.0&#34;)
</span></span><span style="display:flex;"><span>       ) {
</span></span><span style="display:flex;"><span>	    return &#34;SOCKS localhost:9999 ; DIRECT&#34;;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    return &#34;DIRECT&#34;;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><strong>Case 4</strong> (<a href="https://sshuttle.readthedocs.io/en/stable/index.html">sshuttle</a>): connecting to many remote hosts like native connections (without socks and pac files).</p>
<p>&ldquo;Sshuttle is not exactly a VPN, and not exactly port forwarding. It’s kind of both, and kind of neither.&rdquo;</p>
<p>&ldquo;Sshuttle assembles the TCP stream locally, multiplexes it statefully over an ssh session, and disassembles it back into packets at the other end. So it never ends up doing TCP-over-TCP. It’s just data-over-TCP, which is safe.&rdquo;</p>
<p>I installed sshuttle with &ldquo;apt-get install sshuttle&rdquo; on my debian laptop and then I ran</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>sshuttle -r matteo@tunnelhost.redaelli.org 192.168.20.0/24 192.168.40.0/24 192.168.60.0/24
</span></span></code></pre></div><p>For sure there are many other more powerful and better solutions. But for the moment these are the one I have used.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>How to backup and restore Glue data catalog</title>
      <link>https://www.mr70.eu/posts/how-to-backup-and-restore-glue-data-catalog/</link>
      <pubDate>Fri, 21 Feb 2020 14:46:17 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/how-to-backup-and-restore-glue-data-catalog/</guid>
      <description><![CDATA[<p>How to recover a wrongly deleted glue table? You should have scheduled a periodic backup of Glue data catalog with</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>aws glue get-tables --database-name mydb &gt; glue-mydb.json
</span></span></code></pre></div><p>And recreate your table with the command</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>aws glue create-table --cli-input-json &#39;{...}&#39;
</span></span></code></pre></div><p>But the json format of <em>aws glue get-tables</em> is quite different from the json format of <em>aws create-table</em>. For the conversion you can use a simple python script like the following one</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>import json, sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>def dict_convert(dict):
</span></span><span style="display:flex;"><span>    DatabaseName = dict[&#39;DatabaseName&#39;]
</span></span><span style="display:flex;"><span>    del dict[&#39;DatabaseName&#39;]
</span></span><span style="display:flex;"><span>    del dict[&#39;CreateTime&#39;]
</span></span><span style="display:flex;"><span>    del dict[&#39;UpdateTime&#39;]
</span></span><span style="display:flex;"><span>    del dict[&#39;IsRegisteredWithLakeFormation&#39;]
</span></span><span style="display:flex;"><span>    result = {
</span></span><span style="display:flex;"><span>        &#39;DatabaseName&#39;: DatabaseName,
</span></span><span style="display:flex;"><span>        &#39;TableInput&#39;: dict
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    return result
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>data = json.load(sys.stdin)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>for t in data[&#34;TableList&#34;]:
</span></span><span style="display:flex;"><span>    print(json.dumps(dict_convert(t), default=str))
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>N queens problem in Prolog</title>
      <link>https://www.mr70.eu/posts/n-queens-in-prolog/</link>
      <pubDate>Fri, 10 Jan 2020 17:59:40 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/n-queens-in-prolog/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2009/01/8queens.png" alt=""></p>
<p>Below the <a href="https://en.wikipedia.org/wiki/Eight_queens_puzzle">N Queens problem</a> solved in <a href="https://en.wikipedia.org/wiki/Prolog">Prolog</a> and <a href="https://www.swi-prolog.org/pldoc/man?section=clpfd">Constraint Logic Programming over Finite Domains</a> library</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span>:- <span style="color:#50fa7b">use_module</span>(<span style="color:#50fa7b">library</span>(<span style="color:#f1fa8c">clpfd</span>)).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">n_queens</span>(<span style="color:#8be9fd;font-style:italic">N</span>, <span style="color:#8be9fd;font-style:italic">Queens</span>) :-
</span></span><span style="display:flex;"><span>        <span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>, <span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>        <span style="color:#8be9fd;font-style:italic">Queens</span> <span style="color:#f1fa8c">ins</span> <span style="color:#bd93f9">1.</span>.<span style="color:#8be9fd;font-style:italic">N</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">all_different</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>), <span style="color:#6272a4">%% the queens must be in different columns</span>
</span></span><span style="display:flex;"><span>        <span style="color:#50fa7b">different_diagonals</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">different_diagonals</span>([]).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">different_diagonals</span>([<span style="color:#8be9fd;font-style:italic">Q</span>|<span style="color:#8be9fd;font-style:italic">Queens</span>]) :- <span style="color:#50fa7b">different_diagonals</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>, <span style="color:#8be9fd;font-style:italic">Q</span>, <span style="color:#bd93f9">1</span>), <span style="color:#50fa7b">different_diagonals</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">different_diagonals</span>([], <span style="color:#ff79c6">_</span>, <span style="color:#ff79c6">_</span>).
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">different_diagonals</span>([<span style="color:#8be9fd;font-style:italic">Q</span>|<span style="color:#8be9fd;font-style:italic">Queens</span>], <span style="color:#8be9fd;font-style:italic">Q0</span>, <span style="color:#8be9fd;font-style:italic">Distance</span>) :-
</span></span><span style="display:flex;"><span>        <span style="color:#50fa7b">abs</span>(<span style="color:#8be9fd;font-style:italic">Q0</span> <span style="color:#ff79c6">-</span> <span style="color:#8be9fd;font-style:italic">Q</span>) <span style="color:#f1fa8c">#\=</span> <span style="color:#8be9fd;font-style:italic">Distance</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#8be9fd;font-style:italic">NewDistance</span> <span style="color:#f1fa8c">#=</span> <span style="color:#8be9fd;font-style:italic">Distance</span> <span style="color:#ff79c6">+</span> <span style="color:#bd93f9">1</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#50fa7b">different_diagonals</span>(<span style="color:#8be9fd;font-style:italic">Queens</span>, <span style="color:#8be9fd;font-style:italic">Q0</span>, <span style="color:#8be9fd;font-style:italic">NewDistance</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">/* 
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   Queens is the list of columns of the queens: the corresponding rows are the position of the elements/columns in the list Queens
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   Examples:
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   ?- n_queens(8, Queens), labeling([ff], Queens).
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   %@ Queens = [1, 5, 8, 6, 3, 7, 2, 4] ;
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   %@ Queens = [1, 6, 8, 3, 7, 4, 2, 5] .
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   The result chess cells are, for instance, [1,1], [2,5], [3,8], [4,6], [5,3], [6,7], [7,2], [8,4]
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">   Suggestion from https://www.swi-prolog.org/pldoc/man?section=clpfd-n-queens
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"> */</span> 
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Prolog and Constraint Logic Programming over Finite Domains</title>
      <link>https://www.mr70.eu/posts/prolog-and-constraint-logic-programming-over-finite-domains/</link>
      <pubDate>Mon, 06 Jan 2020 22:11:34 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/prolog-and-constraint-logic-programming-over-finite-domains/</guid>
      <description><![CDATA[<p>I like Prolog and in these days I have studied the library CLP(FD).</p>
<p>For instance it is easy to write a simple code for solving &ldquo;How many men and horses have 8 heads and 20 feet?&rdquo;. You write the rules and contraints and Prolog will find the solution for you</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>men_and_horses(Men, Horses):-
</span></span><span style="display:flex;"><span>	Men in 0..10,
</span></span><span style="display:flex;"><span>	Horses in 0..10,
</span></span><span style="display:flex;"><span>	Men + Horses #= 8, %% heads must be 8
</span></span><span style="display:flex;"><span>	Men * 2 + Horses * 4 #= 20. %% feet must be 20
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>?- men_and_horses(Men, Horses).
</span></span><span style="display:flex;"><span> Men = 6,
</span></span><span style="display:flex;"><span> Horses = 2.
</span></span></code></pre></div><p>&ldquo;clp(fd) is useful for solving a wide variety of find values for these variables problems. Here are some broad categories of problems that clp(fd) can address:</p>
<ul>
<li>Scheduling problems, like, when should we do what work in this factory to make these products?</li>
<li>Optimization problems, like which mix of products should we make in this factory to maximize profits?</li>
<li>Satisficing problems, like finding an arrangement of rooms in a hospital that meets criteria like having the operating theater near the recovery rooms, or finding a set of vacation plans the whole family can agree on.</li>
<li>Sequence problems, like finding a travel itinerary that gets us to our destination.</li>
<li>Labeling problems, like Sudoku or Cryptarithm puzzles</li>
<li>&hellip;. &quot; [See <a href="http://www.pathwayslms.com/swipltuts/clpfd/clpfd.html#_what_is_clp_fd_good_for">what_is_clp_fd_good_for</a>]</li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Running Talend Remote Engine in a docker container</title>
      <link>https://www.mr70.eu/posts/running-talend-remote-engine-in-a-docker-container/</link>
      <pubDate>Tue, 05 Nov 2019 21:42:39 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/running-talend-remote-engine-in-a-docker-container/</guid>
      <description><![CDATA[<p><img src="data:image/png;base64,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" alt=""></p>
<p>I was not able to find a Dockerfile for running <a href="https://help.talend.com/reader/fVsqK4EX251aKQqa92tKog/bKsphatApOCYKWmwQ_Ue7g">Talend Remote Engine</a> in a container. So I tried to build a new one. It is a working in progress: do you have any suggestions?</p>
<p>TODO / Next steps:</p>
<ul>
<li>registering the engine using Talend API</li>
<li>running the engine with a unix user &ldquo;talend&rdquo;</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>FROM centos:7
</span></span><span style="display:flex;"><span># centos is the recommended linux distribution
</span></span><span style="display:flex;"><span>MAINTAINER  Matteo Redaelli &lt;matteo.redaelli@gmail.com&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># Build and run this image with:
</span></span><span style="display:flex;"><span># - docker build -t  talend/remote_engine:2.7.0
</span></span><span style="display:flex;"><span># - docker run -d --name talend_remote_engine talend/remote_engine:2.7.0 run
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># Set environment variables.
</span></span><span style="display:flex;"><span>ENV TALEND_HOME /opt/talend
</span></span><span style="display:flex;"><span>ENV TALEND_ENGINE_HOME $TALEND_HOME/remote_engine
</span></span><span style="display:flex;"><span>ENV HOME $TALEND_HOME
</span></span><span style="display:flex;"><span>ENV JAVA_VERSION=java-1.8.0-openjdk
</span></span><span style="display:flex;"><span>ENV JAVA_HOME /usr/lib/jvm/$JAVA_VERSION
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># Installing java
</span></span><span style="display:flex;"><span>RUN yum update -y &amp;&amp; \
</span></span><span style="display:flex;"><span>   yum install -y $JAVA_VERSION ${JAVA_VERSION}-devel &amp;&amp; \
</span></span><span style="display:flex;"><span>   rm -rf /var/cache/yum
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># Define working directory.
</span></span><span style="display:flex;"><span>WORKDIR $TALEND_HOME
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>## remember to update config files before creating the image
</span></span><span style="display:flex;"><span>## - Talend-RemoteEngine-*/etc/preauthorized.key.cfg with the engine key, name and description
</span></span><span style="display:flex;"><span>## - Talend-RemoteEngine-*/etc/system.properties with proxy settings (if needed)
</span></span><span style="display:flex;"><span>COPY Talend-RemoteEngine-V2.7.0 $TALEND_ENGINE_HOME
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>#RUN mkdir $HOME/.m2
</span></span><span style="display:flex;"><span>#COPY settings.xml $HOME/.m2/settings.xml
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># Define default command.
</span></span><span style="display:flex;"><span># See trun source for options: you shuld use &#34;run&#34;
</span></span><span style="display:flex;"><span>ENTRYPOINT [&#34;/opt/talend/remote_engine/bin/trun&#34;]
</span></span></code></pre></div><hr>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="%22tgourdel@talend.com%22">Thibaut Gourdel</a> - <!-- raw HTML omitted -->Nov 3, 2019<!-- raw HTML omitted --></p>
<p>Hello Matteo, thanks for sharing this. It&rsquo;s a great start to containerize your Talend Remote Engine! What you could add is an entrypoint file to configure your remote engine at runtime (instead of build time). What I mean is to pass the preauthorizedkey and other configuration variables via environment variable to the container so that you build your remote engine once and you can run it with different parameters. You can achieve that by having a shell script as the entrypoint, configure the config file via this shell script based on environment variables and then start the remote engine. At the end it would look like this: docker run -d -e PREAUTHORIZEDKEY=****** -e WEB_LISTENING_PORT=8043 talend/remote_engine:2.7.0 run Thibaut</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Emacs package sql-sqlline and python package sqlu</title>
      <link>https://www.mr70.eu/posts/emacs-package-sql-sqlline-and-python-package-sqlu/</link>
      <pubDate>Mon, 04 Nov 2019 15:27:07 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/emacs-package-sql-sqlline-and-python-package-sqlu/</guid>
      <description><![CDATA[<p>Few days ago I published the following two opensource packages:</p>
<ul>
<li><a href="https://melpa.org/#/sql-sqlline">sql-sqlline</a>: an emacs package that extends sql package for quering less known databases (aws redshift, aws athena, ..)</li>
<li><a href="https://pypi.org/project/sqlu/">sqlu</a>: a python package for extracting tables from sql select statements</li>
</ul>
<hr>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="https://bulksteroid.com/" title="moseconey@arcor.de">buy Andriol</a> - <!-- raw HTML omitted -->Mar 2, 2020<!-- raw HTML omitted --></p>
<p>I don&rsquo;t know if it&rsquo;s just me or if perhaps everybody else experiencing issues with yor site. It appears as though some of the written text on your posts are running off the screen. Can somebody else please comment and let me know if this is happening to them as well? This could be a issue with my internet browser because I&rsquo;ve had this happen before. Many thanks buy Andriol</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using Apache Camel from Groovy</title>
      <link>https://www.mr70.eu/posts/using-apache-camel-from-groovy/</link>
      <pubDate>Thu, 03 Oct 2019 13:22:27 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/using-apache-camel-from-groovy/</guid>
      <description><![CDATA[<p><a href="https://camel.apache.org/">Apache Camel</a> is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.</p>
<p><a href="https://en.wikipedia.org/wiki/Apache_Software_Foundation">Apache</a> <strong>Groovy</strong> is a Java-syntax-compatible <a href="https://en.wikipedia.org/wiki/Object-oriented_programming">object-oriented</a><a href="https://en.wikipedia.org/wiki/Programming_language">programming language</a> for the <a href="https://en.wikipedia.org/wiki/Java_(software_platform)">Java platform</a>. It is both a static and <a href="https://en.wikipedia.org/wiki/Dynamic_programming_language">dynamic</a> language with features similar to those of <a href="https://en.wikipedia.org/wiki/Python_(programming_language)">Python</a>, <a href="https://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a>, and <a href="https://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a>. It can be used as both a <a href="https://en.wikipedia.org/wiki/Programming_language">programming language</a> and a <a href="https://en.wikipedia.org/wiki/Scripting_language">scripting language</a> for the Java Platform, is compiled to <a href="https://en.wikipedia.org/wiki/Java_virtual_machine">Java virtual machine</a> (JVM) <a href="https://en.wikipedia.org/wiki/Bytecode">bytecode</a>, and interoperates seamlessly with other Java code and <a href="https://en.wikipedia.org/wiki/Library_(computing)">libraries</a>. Groovy uses a <a href="https://en.wikipedia.org/wiki/Curly_bracket_programming_language">curly-bracket syntax</a> similar to Java&rsquo;s. Groovy supports <a href="https://en.wikipedia.org/wiki/Closure_(computer_programming)">closures</a>, multiline strings, and <a href="https://en.wikipedia.org/wiki/String_interpolation">expressions embedded in strings</a>. Much of Groovy&rsquo;s power lies in its <a href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a> transformations, triggered through annotations. [Wikipedia]</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Create a file camel-test.groovy like the following
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> @Grab(&#39;org.apache.camel:camel-core:2.21.5&#39;)
</span></span><span style="display:flex;"><span> @Grab(&#39;javax.xml.bind:jaxb-api:2.3.0&#39;)
</span></span><span style="display:flex;"><span> @Grab(&#39;org.slf4j:slf4j-simple:1.7.21&#39;)
</span></span><span style="display:flex;"><span> @Grab(&#39;javax.activation:activation:1.1.1&#39;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> import org.apache.camel.\*
</span></span><span style="display:flex;"><span> import org.apache.camel.impl.\*
</span></span><span style="display:flex;"><span> import org.apache.camel.builder.\*
</span></span><span style="display:flex;"><span> def camelContext = new DefaultCamelContext()
</span></span><span style="display:flex;"><span> camelContext.addRoutes(new RouteBuilder() {
</span></span><span style="display:flex;"><span>	 def void configure() {
</span></span><span style="display:flex;"><span>		 from(&#34;timer://jdkTimer?period=3000&#34;)
</span></span><span style="display:flex;"><span>			 .to(&#34;log://camelLogger?level=INFO&#34;)
</span></span><span style="display:flex;"><span>	 }
</span></span><span style="display:flex;"><span> })
</span></span><span style="display:flex;"><span> camelContext.start()
</span></span><span style="display:flex;"><span> addShutdownHook{ camelContext.stop() }
</span></span><span style="display:flex;"><span> synchronized(this){ this.wait() }
</span></span></code></pre></div><p>Test it with</p>
<p>JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 groovy camel-test.groovy</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using Terraform for managining Amazon Web Service infrastructure</title>
      <link>https://www.mr70.eu/posts/using-terraform-for-managining-amazon-web-service-infrastructure/</link>
      <pubDate>Mon, 30 Sep 2019 12:18:23 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/using-terraform-for-managining-amazon-web-service-infrastructure/</guid>
      <description><![CDATA[<p>In the last days I tested <a href="https://www.terraform.io/">Terraform</a> (Use Infrastructure as Code to provision and manage any cloud, infrastructure, or service) for managing some resources in a AWS cloud ebvironemnt.</p>
<p>In this sample I&rsquo;ll create and schedule a lambda function</p>
<p>Create a file &ldquo;variables.tf&rdquo; with the content:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;aws_region&#34;</span> {<span style="color:#50fa7b">default</span> = <span style="color:#f1fa8c">&#34;eu-west-1&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;aws_profile&#34;</span> {<span style="color:#50fa7b">default</span> = <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;project&#34;</span> {<span style="color:#50fa7b">default</span> = <span style="color:#f1fa8c">&#34;my_project&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;vpc&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;XXXXX&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;subnets&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;XXXX&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;aws_account&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;XXX&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;security_groups&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;XXXX&#34;</span>}<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">#
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;db_redshift_host&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;db_redshift_port&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;db_redshift_name&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;db_redshift_username&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">variable</span> <span style="color:#f1fa8c">&#34;db_redshift_password&#34;</span> {<span style="color:#50fa7b">default</span>= <span style="color:#f1fa8c">&#34;&#34;</span>}
</span></span></code></pre></div><p>Create a file lambda.tf as follow:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-terraform" data-lang="terraform"><span style="display:flex;"><span><span style="color:#ff79c6">provider</span> <span style="color:#f1fa8c">&#34;aws&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">region</span>  = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.aws_region<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">profile</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.aws_profile<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>}<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># CLOUDWATCH
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_cloudwatch_log_group&#34;</span> <span style="color:#f1fa8c">&#34;log_group&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">name</span>              = <span style="color:#f1fa8c">&#34;/aws/lambda/</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">retention_in_days</span> = <span style="color:#bd93f9">14</span>
</span></span><span style="display:flex;"><span>}<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># CLOUDWATCH rules
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_cloudwatch_event_rule&#34;</span> <span style="color:#f1fa8c">&#34;rule&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">name</span>        = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">-rule&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">description</span> = <span style="color:#f1fa8c">&#34;scheduler for </span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">schedule_expression</span> = <span style="color:#f1fa8c">&#34;cron(0 10 * * ? *)&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_cloudwatch_event_target&#34;</span> <span style="color:#f1fa8c">&#34;trigger_lambda&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">rule</span>  = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_cloudwatch_event_rule.rule.name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">arn</span>   = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_lambda_function.lambda.arn<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>}<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># iam
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ############################################################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_role&#34;</span> <span style="color:#f1fa8c">&#34;role&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">name</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">_role&#34;</span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">  #assume_role_policy = &#34;${file(&#34;assumerolepolicy.json&#34;)}&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span>  <span style="color:#50fa7b">assume_role_policy</span> = <span style="color:#ff79c6">&lt;&lt;EOF</span><span style="color:#f1fa8c">
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">{
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">&#34;Version&#34;: &#34;2012-10-17&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">&#34;Statement&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  {
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;Action&#34;: &#34;sts:AssumeRole&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;Principal&#34;: {
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;Service&#34;: &#34;lambda.amazonaws.com&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    },
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;Effect&#34;: &#34;Allow&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    &#34;Sid&#34;: &#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  }
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">]
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">}
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span><span style="color:#ff79c6">EOF</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_policy&#34;</span> <span style="color:#f1fa8c">&#34;logging&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">name</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">_logging&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">path</span> = <span style="color:#f1fa8c">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">description</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c"> IAM policy for logging&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">policy</span> = <span style="color:#ff79c6">&lt;&lt;EOF</span><span style="color:#f1fa8c">
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">{
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  &#34;Version&#34;: &#34;2012-10-17&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  &#34;Statement&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    {
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;Action&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">        &#34;logs:CreateLogGroup&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">        &#34;logs:CreateLogStream&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">        &#34;logs:PutLogEvents&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      ],
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;Resource&#34;: &#34;arn:aws:logs:*:*:*&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">      &#34;Effect&#34;: &#34;Allow&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">    }
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">  ]
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c">}
</span></span></span><span style="display:flex;"><span><span style="color:#f1fa8c"></span><span style="color:#ff79c6">EOF</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_role_policy_attachment&#34;</span> <span style="color:#f1fa8c">&#34;logging&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">role</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_role.role.name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">policy_arn</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_policy.logging.arn<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_role_policy_attachment&#34;</span> <span style="color:#f1fa8c">&#34;policy_attachment_vpc&#34;</span> {<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">  #name       = &#34;${var.project}_attachment_vpc&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span>  <span style="color:#50fa7b">role</span>       = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_role.role.name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">policy_arn</span> = <span style="color:#f1fa8c">&#34;arn:aws:iam::aws:policy/AmazonVPCFullAccess&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_role_policy_attachment&#34;</span> <span style="color:#f1fa8c">&#34;policy_attachment_rds&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">role</span>       = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_role.role.name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">policy_arn</span> = <span style="color:#f1fa8c">&#34;arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_iam_role_policy_attachment&#34;</span> <span style="color:#f1fa8c">&#34;policy_attachment_redshift&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">role</span>       = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_role.role.name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">policy_arn</span> = <span style="color:#f1fa8c">&#34;arn:aws:iam::aws:policy/AmazonRedshiftReadOnlyAccess&#34;</span>
</span></span><span style="display:flex;"><span>}<span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4">
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ###############################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># lambda_action
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"># ###############################################
</span></span></span><span style="display:flex;"><span><span style="color:#6272a4"></span><span style="color:#ff79c6">
</span></span></span><span style="display:flex;"><span><span style="color:#ff79c6">resource</span> <span style="color:#f1fa8c">&#34;aws_lambda_function&#34;</span> <span style="color:#f1fa8c">&#34;lambda&#34;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">function_name</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.project<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">_lambda&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">depends_on</span>    = [<span style="color:#f1fa8c">&#34;aws_iam_role_policy_attachment.logging&#34;</span>, <span style="color:#f1fa8c">&#34;aws_cloudwatch_log_group.log_group&#34;</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">filename</span>      = <span style="color:#f1fa8c">&#34;lambda.zip&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">role</span>          = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span>aws_iam_role.role.arn<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">handler</span>       = <span style="color:#f1fa8c">&#34;lambda_function.lambda_handler&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">source_code_hash</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">filebase64sha256</span>(<span style="color:#f1fa8c">&#34;lambda.zip&#34;</span>)<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">runtime</span> = <span style="color:#f1fa8c">&#34;python3.7&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">timeout</span>          = <span style="color:#f1fa8c">&#34;30&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">memory_size</span>      = <span style="color:#bd93f9">256</span>
</span></span><span style="display:flex;"><span>  <span style="color:#50fa7b">publish</span>          = <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>  vpc_config {
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">subnet_ids</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.subnets<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">security_group_ids</span> = <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.security_groups<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  environment {
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">variables</span> = {
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">db_redshift_host</span>= <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.db_redshift_host<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">db_redshift_port</span>= <span style="color:#8be9fd;font-style:italic">var</span>.db_redshift_port
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">db_redshift_name</span>= <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.db_redshift_name<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">db_redshift_username</span>= <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.db_redshift_username<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#50fa7b">db_redshift_password</span>= <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">var</span>.db_redshift_password<span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>} 
</span></span></code></pre></div><p>Now you can run</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>terraform init 
</span></span><span style="display:flex;"><span>terraform  plan -var aws\_profile=myprofile
</span></span><span style="display:flex;"><span>terraform  apply -var aws\_profile=myprofile 
</span></span><span style="display:flex;"><span>terraform  destroy -var aws\_profile=myprofile 
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Scheduling AWS EMR clusters resize</title>
      <link>https://www.mr70.eu/posts/scheduling-aws-emr-clusters-resize/</link>
      <pubDate>Mon, 22 Jul 2019 21:16:37 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/scheduling-aws-emr-clusters-resize/</guid>
      <description><![CDATA[<p>Below a sample of howto schedule an Amzon Elastic MapReduce (EMR) cluster resize. It is useful if you have a cluster that is less used during the nights or in the weekends</p>
<p>I used a lambda function triggered by a Cloudwatch rule. Here is my python lambda function</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>import boto3, json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>MIN=1
</span></span><span style="display:flex;"><span>MAX=10
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>def lambda_handler(event, context):
</span></span><span style="display:flex;"><span>    region = event[&#34;region&#34;]
</span></span><span style="display:flex;"><span>    ClusterId = event[&#34;ClusterId&#34;]
</span></span><span style="display:flex;"><span>    InstanceGroupId = event[&#34;InstanceGroupId&#34;]
</span></span><span style="display:flex;"><span>    InstanceCount = int(event[&#39;InstanceCount&#39;])
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    if InstanceCount &gt;= MIN and InstanceCount &lt;= MAX:
</span></span><span style="display:flex;"><span>        client = boto3.client(&#39;emr&#39;, region_name=region)
</span></span><span style="display:flex;"><span>        response = client.modify_instance_groups(
</span></span><span style="display:flex;"><span>            ClusterId=ClusterId,
</span></span><span style="display:flex;"><span>            InstanceGroups= [{
</span></span><span style="display:flex;"><span>                &#34;InstanceGroupId&#34;: InstanceGroupId,
</span></span><span style="display:flex;"><span>                &#34;InstanceCount&#34;: InstanceCount
</span></span><span style="display:flex;"><span>            }])
</span></span><span style="display:flex;"><span>        return response
</span></span><span style="display:flex;"><span>    else:
</span></span><span style="display:flex;"><span>        msg = &#34;EMR cluster id %s (%s): InstanceCount=%d is NOT allowed [%d,%d]&#34; % (ClusterId, region, InstanceGroupId, InstanceCount, MIN,MAX)
</span></span><span style="display:flex;"><span>        return {&#34;response&#34;: &#34;ko&#34;, &#34;message&#34;: msg}
</span></span></code></pre></div><p>Below the CloudWatch rule where the input event is a constant json object like </p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>{&#34;region&#34;: &#34;eu-west-1&#34;,&#34;ClusterId&#34;: &#34;j-dsds&#34;,&#34;InstanceGroupId&#34;: &#34;ig-sdsd&#34;,&#34;InstanceCount&#34;: 8}
</span></span></code></pre></div><p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2019/07/rule.png" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Exporting database tables to csv files with Apache Camel</title>
      <link>https://www.mr70.eu/posts/exporting-database-tables-to-csv-files-with-apache-camel/</link>
      <pubDate>Fri, 24 May 2019 07:12:48 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/exporting-database-tables-to-csv-files-with-apache-camel/</guid>
      <description><![CDATA[<p>Below the interested part of code using spring xml</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> &lt;bean id=&#34;ds-patriot-dw_ro&#34; class=&#34;org.springframework.jdbc.datasource.DriverManagerDataSource&#34;&gt;
</span></span><span style="display:flex;"><span>		 &lt;property name=&#34;driverClassName&#34; value=&#34;oracle.jdbc.OracleDriver&#34; /&gt;
</span></span><span style="display:flex;"><span>		  &lt;property name=&#34;url&#34; value=&#34;jdbc:oracle:thin:@//patriot.redaelli.org:1111/RED&#34;/&gt;
</span></span><span style="display:flex;"><span>		  &lt;property name=&#34;Username&#34; value=&#34;user&#34;/&gt;
</span></span><span style="display:flex;"><span>		  &lt;property name=&#34;Password&#34; value=&#34;pwd&#34;/&gt;
</span></span><span style="display:flex;"><span>  &lt;/bean&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;camelContext id=&#34;MyCamel&#34; streamCache=&#34;true&#34; xmlns=&#34;http://camel.apache.org/schema/spring&#34;&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	&lt;route id=&#34;scheduler&#34;&gt;
</span></span><span style="display:flex;"><span>	  &lt;from uri=&#34;timer:hello?repeatCount=1&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;setHeader headerName=&#34;ndays&#34;&gt;
</span></span><span style="display:flex;"><span>		&lt;constant&gt;0&lt;/constant&gt;
</span></span><span style="display:flex;"><span>	  &lt;/setHeader&gt;
</span></span><span style="display:flex;"><span>	  &lt;to uri=&#34;direct:start&#34;/&gt;
</span></span><span style="display:flex;"><span>	&lt;/route&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	&lt;route&gt;
</span></span><span style="display:flex;"><span>	  &lt;from uri=&#34;direct:start&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;setBody&gt;
</span></span><span style="display:flex;"><span>		&lt;constant&gt;table1,table2,table3&lt;/constant&gt;
</span></span><span style="display:flex;"><span>	  &lt;/setBody&gt;
</span></span><span style="display:flex;"><span>	  &lt;split streaming=&#34;true&#34;&gt;
</span></span><span style="display:flex;"><span>		&lt;tokenize token=&#34;,&#34; /&gt;
</span></span><span style="display:flex;"><span>		&lt;setHeader headerName=&#34;tablename&#34;&gt;
</span></span><span style="display:flex;"><span>		  &lt;simple&gt;${body}&lt;/simple&gt;
</span></span><span style="display:flex;"><span>		&lt;/setHeader&gt;
</span></span><span style="display:flex;"><span>		&lt;to uri=&#34;direct:jdbc2csv&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;/split&gt;
</span></span><span style="display:flex;"><span>	&lt;/route&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	&lt;route&gt;
</span></span><span style="display:flex;"><span>	  &lt;from uri=&#34;direct:jdbc2csv&#34;/&gt;
</span></span><span style="display:flex;"><span>		&lt;to uri=&#34;direct:get-jdbc-data&#34; pattern=&#34;InOut&#34; /&gt;
</span></span><span style="display:flex;"><span>		&lt;to uri=&#34;direct:export-csv&#34; /&gt;
</span></span><span style="display:flex;"><span>	&lt;/route&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	&lt;route&gt;
</span></span><span style="display:flex;"><span>	  &lt;from uri=&#34;direct:get-jdbc-data&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;log message=&#34;quering table ${headers.tablename}...&#34;/&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  &lt;setBody&gt;
</span></span><span style="display:flex;"><span>		&lt;groovy&gt;&lt;![CDATA[
</span></span><span style="display:flex;"><span>		  &#34;SELECT * from &#34; + request.headers.get(&#39;tablename&#39;)
</span></span><span style="display:flex;"><span>	]]&gt;
</span></span><span style="display:flex;"><span>		&lt;/groovy&gt;
</span></span><span style="display:flex;"><span>	  &lt;/setBody&gt;
</span></span><span style="display:flex;"><span>	  &lt;log message=&#34;quering statement: ${body}...&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;to uri=&#34;jdbc:ds-patriot-dw_ro?useHeadersAsParameters=true&amp;outputType=StreamList&#34;/&gt;
</span></span><span style="display:flex;"><span>	&lt;/route&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	&lt;route&gt;
</span></span><span style="display:flex;"><span>	  &lt;from uri=&#34;direct:export-csv&#34;/&gt;
</span></span><span style="display:flex;"><span>			&lt;log message=&#34;saving table ${headers.tablename} to ${headers.CamelFileName}...&#34;/&gt;
</span></span><span style="display:flex;"><span>	  &lt;setHeader headerName=&#34;CamelFileName&#34;&gt;
</span></span><span style="display:flex;"><span>		&lt;groovy&gt;
</span></span><span style="display:flex;"><span>		  request.headers.get(&#39;tablename&#39;).replace(&#34;.&#34;, &#34;_&#34;) + &#34;/&#34; + request.headers.get(&#39;tablename&#39;) + &#34;.csv&#34;
</span></span><span style="display:flex;"><span>		&lt;/groovy&gt;
</span></span><span style="display:flex;"><span>	  &lt;/setHeader&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  &lt;!-- &lt;marshal&gt;&lt;csv&gt;&lt;/marshal&gt; does not include header. I have to export it manualy.. --&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  &lt;multicast stopOnException=&#34;true&#34;&gt;
</span></span><span style="display:flex;"><span>		&lt;pipeline&gt;
</span></span><span style="display:flex;"><span>		  &lt;log message=&#34;saving table ${headers.tablename} header to ${headers.CamelFileName}...&#34;/&gt;
</span></span><span style="display:flex;"><span>		  &lt;setBody&gt;
</span></span><span style="display:flex;"><span>	&lt;groovy&gt;request.headers.get(&#39;CamelJdbcColumnNames&#39;).join(&#34;;&#34;) + &#34;\n&#34;&lt;/groovy&gt;
</span></span><span style="display:flex;"><span>		  &lt;/setBody&gt;
</span></span><span style="display:flex;"><span>		  &lt;to uri=&#34;file:output&#34;/&gt;
</span></span><span style="display:flex;"><span>		&lt;/pipeline&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>		&lt;pipeline&gt;
</span></span><span style="display:flex;"><span>		  &lt;log message=&#34;saving table ${headers.tablename} rows to ${headers.CamelFileName}...&#34;/&gt;
</span></span><span style="display:flex;"><span>		  &lt;marshal&gt;
</span></span><span style="display:flex;"><span>			&lt;csv delimiter=&#34;;&#34; headerDisabled=&#34;false&#34; useMaps=&#34;true&#34;/&gt;
</span></span><span style="display:flex;"><span>		  &lt;/marshal&gt;
</span></span><span style="display:flex;"><span>		  &lt;to uri=&#34;file:output?fileExist=Append&#34;/&gt;
</span></span><span style="display:flex;"><span>		&lt;/pipeline&gt;
</span></span><span style="display:flex;"><span>	  &lt;/multicast&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	  &lt;log message=&#34;saved table ${headers.tablename} to ${headers.CamelFileName}...&#34;/&gt;
</span></span><span style="display:flex;"><span>  &lt;/route&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  &lt;/camelContext&gt;
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Active Directory client with powershell</title>
      <link>https://www.mr70.eu/posts/ldap-client_with_powershell/</link>
      <pubDate>Fri, 19 Apr 2019 07:37:24 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ldap-client_with_powershell/</guid>
      <description><![CDATA[<h1 id="add-ad-users-from-csv-to-group-using-powershell">Add AD users from csv to group using powershell</h1>
<p>A sample script for adding users (taken from a csv file) to an Active Directory group</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>$GroupName = &#34;Qliksense_SI_Techedge&#34;
</span></span><span style="display:flex;"><span>$Users =  &#34;e:\scripts\users.csv&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Import-module ActiveDirectory
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$dc = Get-ADDomainController -DomainName mydomain.redaelli.org -Discover -NextClosestSite
</span></span><span style="display:flex;"><span>$server = $dc.HostName[0]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>get-content $Users | ForEach-Object {
</span></span><span style="display:flex;"><span>  Get-ADUser -Server $server -LDAPFilter &#34;(mail=$_)&#34; } |
</span></span><span style="display:flex;"><span>  Select-Object -ExpandProperty sAMAccountName |  ForEach-Object { Add-ADGroupMember -Server $server -Identity $GroupName -Member $_ }
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>AWS Lake Formation: the new Datalake solution proposed by Amazon</title>
      <link>https://www.mr70.eu/posts/aws-lake-formation-the-new-datalake-solution-proposed-by-amazon/</link>
      <pubDate>Thu, 29 Nov 2018 21:04:11 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/aws-lake-formation-the-new-datalake-solution-proposed-by-amazon/</guid>
      <description><![CDATA[<p><a href="https://aws.amazon.com/lake-formation/">AWS Lake Formation</a> is a service that makes it easy to set up a secure data lake in days. A data lake is a centralized, curated, and secured repository that stores all your data, both in its original form and prepared for analysis. A data lake enables you to break down data silos and combine different types of analytics to gain insights and guide better business decisions.</p>
<p>However, setting up and managing data lakes today involves a lot of manual, complicated, and time-consuming tasks. This work includes loading data from diverse sources, monitoring those data flows, setting up partitions, turning on encryption and managing keys, defining transformation jobs and monitoring their operation, re-organizing data into a columnar format, configuring access control settings, deduplicating redundant data, matching linked records, granting access to data sets, and auditing access over time.</p>
<p>Creating a data lake with Lake Formation is as simple as defining where your data resides and what data access and security policies you want to apply. Lake Formation then collects and catalogs data from databases and object storage, moves the data into your new Amazon S3 data lake, cleans and classifies data using machine learning algorithms, and secures access to your sensitive data. Your users can then access a centralized catalog of data which describes available data sets and their appropriate usage. Your users then leverage these data sets with their choice of analytics and machine learning services, like Amazon EMR for Apache Spark, Amazon Redshift, Amazon Athena, Amazon Sagemaker, and Amazon QuickSight. [<a href="https://aws.amazon.com/lake-formation/">aws.amazon.com</a>]</p>
<p>Lake Formation automatically configures underlying AWS services, including S3, AWS Glue, AWS IAM, AWS KMS, Amazon Athena, Amazon Redshift, and Amazon EMR for Apache Spark, to ensure compliance with your defined policies. If you’ve set up transformation jobs spanning AWS services, Lake Formation configures the flows, centralizes their orchestration, and lets you monitor the execution of your jobs. With Lake Formation, you can configure and manage your data lake without manually integrating multiple underlying AWS services</p>
<p>Sources:</p>
<ul>
<li><a href="https://aws.amazon.com/lake-formation/features/">https://aws.amazon.com/lake-formation/features/</a></li>
<li><a href="https://www.zdnet.com/article/aws-unveils-lake-formation-for-easy-data-lake-building/">https://www.zdnet.com/article/aws-unveils-lake-formation-for-easy-data-lake-building/</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Building a Cloud-Agnostic Serverless infrastructure with Apache OpenWhisk</title>
      <link>https://www.mr70.eu/posts/building-a-cloud-agnostic-serverless-infrastructure-with-apache-openwhisk/</link>
      <pubDate>Thu, 29 Nov 2018 20:29:02 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/building-a-cloud-agnostic-serverless-infrastructure-with-apache-openwhisk/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2018/11/OW-Abstract-Architecture-Diagram-1024x487.png" alt=""></p>
<p>&ldquo;<a href="https://openwhisk.apache.org/">Apache OpenWhisk</a> (Incubating) is an open source, distributed Serverless platform that executes functions (fx) in response to events at any scale. OpenWhisk manages the infrastructure, servers and scaling using Docker containers so you can focus on building amazing and efficient applications&hellip;</p>
<p>DEPLOY Anywhere: Since Apache OpenWhisk builds its components using containers it easily supports many deployment options both locally and within Cloud infrastructures. Options include many of today&rsquo;s popular Container frameworks such as <a href="https://github.com/apache/incubator-openwhisk-deploy-kube/blob/master/README.md">Kubernetes</a>, <a href="https://github.com/apache/incubator-openwhisk-deploy-mesos/blob/master/README.md">Mesos</a> and <a href="https://github.com/apache/incubator-openwhisk-devtools/blob/master/docker-compose/README.md">Compose</a></p>
<p>ANY LANGUAGES: Work with what you know and love. OpenWhisk supports a growing list of your favorite languages such as <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-nodejs">NodeJS</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-swift">Swift</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-java">Java</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-go">Go</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-java">Scala</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-python">Python</a></strong>, <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-php">PHP</a></strong> and <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-ruby">Ruby</a></strong>.</p>
<p>If you need languages or libraries the current &ldquo;out-of-the-box&rdquo; runtimes do not support, you can create and customize your own executables as Zip Actions which run on the <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-docker/blob/master/README.md">Docker</a></strong> runtime by using the <strong><a href="https://github.com/apache/incubator-openwhisk-runtime-docker/blob/master/sdk/docker/README.md">Docker SDK</a></strong>. &quot; [<a href="https://openwhisk.apache.org/">openwhisk.apache.org</a>]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Building a Cloud-Agnostic Serverless infrastructure with Knative</title>
      <link>https://www.mr70.eu/posts/building-a-cloud-agnostic-serverless-infrastructure/</link>
      <pubDate>Fri, 23 Nov 2018 08:16:05 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/building-a-cloud-agnostic-serverless-infrastructure/</guid>
      <description><![CDATA[<p>KNATIVE is Kubernetes-based platform to build, deploy, and manage modern serverless workloads</p>
<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2018/11/knative-1024x677.png" alt=""></p>
<p>&ldquo;Knative provides a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center. Knative components are built on Kubernetes and codify the best practices shared by successful real-world Kubernetes-based frameworks. It enables developers to focus just on writing interesting code, without worrying about the “boring but difficult” parts of building, deploying, and managing an application.&rdquo; [<a href="https://cloud.google.com/knative/">https://cloud.google.com/knative/</a>]</p>
<p>&ldquo;Knative has been developed by Google in close partnership with <a href="https://content.pivotal.io/blog/knative-powerful-building-blocks-for-a-portable-function-platform">Pivotal</a>, <a href="https://www.ibm.com/blogs/cloud-computing/2018/07/24/ibm-cloud-google-knative-serverless/">IBM</a>, <a href="https://blog.openshift.com/state-of-serverless-in-kubernetes-knative-and-openshift-cloud-functions/">Red Hat,</a> and <a href="https://blogs.sap.com/?p=696354">SAP</a>.&rdquo; [<a href="https://www.infoq.com/news/2018/07/knative-kubernetes-serverless">infoq.com</a>]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Querying public knowledge graph databases</title>
      <link>https://www.mr70.eu/posts/querying-public-knowledge-graph-databases/</link>
      <pubDate>Sat, 18 Aug 2018 19:54:22 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/querying-public-knowledge-graph-databases/</guid>
      <description><![CDATA[<p>You can query public knowledge graph databases (like <a href="https://wikidata.org">wikidata.org</a> and <a href="https://dbpedia.org">dbpedia.org</a>) using <a href="https://en.wikipedia.org/wiki/SPARQL">SPARQL</a>. For instance for extracting all &ldquo;known&rdquo; programming languages, you can use the query</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>SELECT ?item ?itemLabel WHERE {
</span></span><span style="display:flex;"><span> ?item wdt:P31 wd:Q9143.
</span></span><span style="display:flex;"><span> SERVICE wikibase:label { bd:serviceParam wikibase:language &#34;[AUTO\_LANGUAGE],en&#34;. }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>LIMIT 1000
</span></span></code></pre></div><p>There are also SPARQL clients for most of programming languages. With (swi) prolog you can easily run</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>\[library(semweb/sparql\_client)\].
</span></span><span style="display:flex;"><span>sparql\_query(&#39;SELECT ?item ?itemLabel WHERE {?item wdt:P31 wd:Q9143. SERVICE wikibase:label { bd:serviceParam wikibase:language &#34;\[AUTO\_LANGUAGE\],en&#34;. }} LIMIT 1000&#39;, Row, \[ scheme(https),host(&#39;query.wikidata.org&#39;), path(&#39;/sparql&#39;)\]).
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Adding Active Directory authentication to RStudio Server Open Source edition</title>
      <link>https://www.mr70.eu/posts/adding-active-directory-authentication-to-rstudio-server-open-source-edition/</link>
      <pubDate>Wed, 28 Mar 2018 20:43:01 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/adding-active-directory-authentication-to-rstudio-server-open-source-edition/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2018/03/RStudio-Logo-Blue-Gray-125.png" alt="">Have you installed the statistical <a href="https://www.r-project.org/">R language</a> and  <a href="https://www.rstudio.com/products/rstudio/#Server">RStudio Server</a> in a corporare environment and you would like to authenticate users using Active Directory instead of local unix users and passwords? It is easy, you just need to install libpam-krb5&hellip; ;-)  Below a sample Dockerfile if you want to install RStudio Server in a <a href="https://www.docker.com/">Docker</a> container&hellip; FROM rocker/rstudio RUN apt-get update ADD krb5.conf /etc RUN apt-get install -y krb5-config libpam-krb5 RUN apt-get install -y openjdk-8-jdk r-cran-rjava #setup R configs RUN echo &ldquo;r &lt;- getOption(&lsquo;repos&rsquo;); r[&lsquo;CRAN&rsquo;] &lt;- &lsquo;<a href="http://cran.us.r-project.org">http://cran.us.r-project.org</a>&rsquo;; options(repos = r);&rdquo; &gt; ~/.Rprofile #INSTALL LIBAIO1 &amp; UNZIP (NEEDED FOR STRONG-ORACLE) RUN apt-get update \ &amp;&amp; apt-get install -y libaio1 \ &amp;&amp; apt-get install -y build-essential \ &amp;&amp; apt-get install -y unzip \ &amp;&amp; apt-get install -y curl \ &amp;&amp; rm -rf /var/lib/apt/lists/* #ADD ORACLE INSTANT CLIENT RUN mkdir -p opt/oracle ADD ./oracle/linux/ . RUN unzip instantclient-basic-linux.x64-12.2.0.1.0.zip -d /opt/oracle \ &amp;&amp; unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip -d /opt/oracle \ &amp;&amp; unzip instantclient-odbc-linux.x64-12.2.0.1.0-2.zip -d /opt/oracle \ &amp;&amp; unzip instantclient-jdbc-linux.x64-12.2.0.1.0.zip -d /opt/oracle \ &amp;&amp; mv /opt/oracle/instantclient_12_2 /opt/oracle/instantclient \ &amp;&amp; ln -s /opt/oracle/instantclient/libclntsh.so.12.1 /opt/oracle/instantclient/libclntsh.so \ &amp;&amp; ln -s /opt/oracle/instantclient/libocci.so.12.1 /opt/oracle/instantclient/libocci.so \ &amp;&amp; rm instantclient-*zip #ENV ORACLE_HOME=&quot;/opt/oracle/instantclient&quot; ENV LD_LIBRARY_PATH=&quot;/opt/oracle/instantclient&quot; #ENV OCI_HOME=&quot;/opt/oracle/instantclient&quot; ENV OCI_LIB=&quot;/opt/oracle/instantclient&quot; ENV OCI_INCLUDE_DIR=&quot;/opt/oracle/instantclient/sdk/include&quot; RUN echo &lsquo;/opt/oracle/instantclient/&rsquo; | tee -a /etc/ld.so.conf.d/oracle_instant_client.conf &amp;&amp; ldconfig RUN Rscript -e &ldquo;install.packages(&lsquo;yhatr&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;ggplot2&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;plyr&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;reshape2&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;forecast&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;stringr&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&rsquo;lubridate&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;randomForest&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;rpart&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;RJDBC&rsquo;)&rdquo; RUN Rscript -e &ldquo;install.packages(&lsquo;ROracle&rsquo;)&rdquo; RUN adduser -u 2000 &ndash;disabled-password &ndash;gecos &quot;&quot; matteo RUN adduser -u 2001 &ndash;disabled-password &ndash;gecos &quot;&quot; marco</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Google Assistent in italiano per comandarele luci Xiaomi</title>
      <link>https://www.mr70.eu/posts/google-assistent-in-italiano-per-comandarele-luci-xiaomi/</link>
      <pubDate>Sat, 17 Mar 2018 21:33:46 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/google-assistent-in-italiano-per-comandarele-luci-xiaomi/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2018/03/google-assistant-169x300.png" alt="">Finalmente posso comandare le luci (xiaomi) di casa mia in italiano con Google Assistant! Per esempio funzionano le frasi</p>
<ul>
<li>accendi le luci</li>
<li>spegni le luci</li>
<li>luce rossa</li>
<li>luce banca calda</li>
<li>&hellip;</li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Latest packages for Elixir Haskell Lua dotNet NodeJs Php Python R Ruby Scala</title>
      <link>https://www.mr70.eu/posts/latest-packages-for-elixir-haskell-lua-dotnet-nodejs-php-python-r-ruby-scala/</link>
      <pubDate>Thu, 10 Aug 2017 08:45:20 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/latest-packages-for-elixir-haskell-lua-dotnet-nodejs-php-python-r-ruby-scala/</guid>
      <description><![CDATA[<p>The site <a href="http://packages.matteoredaelli.eu/">packages.matteoredaelli.eu</a> collects the last updated packages for most of programming languages (at the moment Elixir Haskell Lua dotNet NodeJs Php Python R Ruby Scala)</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Prolog for theorem proving, expert systems, type inference systems, and automated planning...</title>
      <link>https://www.mr70.eu/posts/prolog-for-theorem-proving-expert-systems-type-inference-systems-and-automated-planning/</link>
      <pubDate>Thu, 25 May 2017 09:46:31 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/prolog-for-theorem-proving-expert-systems-type-inference-systems-and-automated-planning/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2017/05/schema_rete_metro-milano-300x212.jpg" alt="">In the name of the father of <a href="https://en.wikipedia.org/wiki/Prolog">Prolog</a> (<a href="https://en.wikipedia.org/wiki/Alain_Colmerauer">Alain_Colmerauer</a> who died few days ago), I&rsquo;ll show how to use Prolog for solving a common business problem: finding the paths in a graph between two nodes.. &ldquo;Prolog is <a href="https://en.wikipedia.org/wiki/Declarative_programming" title="Declarative programming">declarative</a> programming language: the program logic is expressed in terms of relations, represented as facts and <a href="https://en.wikipedia.org/wiki/Rule_of_inference" title="Rule of inference">rules</a>. A computation is initiated by running a <em>query</em> over these relations&rdquo;. [Wikipiedia]. &ldquo;<strong>Prolog</strong> is a general-purpose <a href="https://en.wikipedia.org/wiki/Logic_programming" title="Logic programming">logic programming</a> language associated with <a href="https://en.wikipedia.org/wiki/Artificial_intelligence" title="Artificial intelligence">artificial intelligence</a> and <a href="https://en.wikipedia.org/wiki/Computational_linguistics" title="Computational linguistics">computational linguistics</a> [..] The language has been used for <a href="https://en.wikipedia.org/wiki/Automated_theorem_proving" title="Automated theorem proving">theorem proving</a>, <a href="https://en.wikipedia.org/wiki/Expert_system" title="Expert system">expert systems</a>, <a href="https://en.wikipedia.org/wiki/Type_inference" title="Type inference">type inference</a> systems, and <a href="https://en.wikipedia.org/wiki/Automated_planning" title="Automated planning">automated planning</a>, as well as its original intended field of use, <a href="https://en.wikipedia.org/wiki/Natural_language_processing" title="Natural language processing">natural language processing.</a>[Wikipiedia]. You tell Prolog the facts and rules of your game and it will find the solution ;-) In this tutorial my graph is the network of underground/train stations of Milan. The facts are like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>station(&#39;Affori centro&#39;, m3).
</span></span><span style="display:flex;"><span>station(&#39;Affori FN&#39;, m3).
</span></span><span style="display:flex;"><span>station(&#39;Affori&#39;, s2).
</span></span><span style="display:flex;"><span>station(&#39;Affori&#39;, s4).
</span></span><span style="display:flex;"><span>station(&#39;Airuno&#39;, s8).
</span></span><span style="display:flex;"><span>station(&#39;Albairate - Vermezzo&#39;, s9).
</span></span><span style="display:flex;"><span>station(&#39;Albate Camerlata&#39;, s11).
</span></span><span style="display:flex;"><span>station(&#39;Albizzate&#39;, s5).
</span></span><span style="display:flex;"><span>station(&#39;Amendola Fiera&#39;, m1).
</span></span><span style="display:flex;"><span>station(&#39;Arcore&#39;, s8).
</span></span><span style="display:flex;"><span>station(&#39;Assago Milanofiori Forum&#39;, m2).
</span></span><span style="display:flex;"><span>station(&#39;Assago Milanofiori Nord&#39;, m2).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>edge(&#39;Villapizzone&#39;, &#39;Lancetti&#39;, s5).
</span></span><span style="display:flex;"><span>edge(&#39;Villapizzone&#39;, &#39;Lancetti&#39;, s6).
</span></span><span style="display:flex;"><span>edge(&#39;Villa Pompea&#39;, &#39;Gorgonzola&#39;, m2).
</span></span><span style="display:flex;"><span>edge(&#39;Villa Raverio&#39;, &#39;Carate-Calò&#39;, s7).
</span></span><span style="display:flex;"><span>edge(&#39;Villasanta&#39;, &#39;Monza Sobborghi&#39;, s7).
</span></span><span style="display:flex;"><span>edge(&#39;Villa S. Giovanni&#39;, &#39;Precotto&#39;, m1).
</span></span><span style="display:flex;"><span>edge(&#39;Vimodrone&#39;, &#39;Cascina Burrona&#39;, m2).
</span></span><span style="display:flex;"><span>edge(&#39;Vittuone&#39;, &#39;Pregnana Milanese&#39;, s6).
</span></span><span style="display:flex;"><span>edge(&#39;Wagner&#39;, &#39;De Angeli&#39;, m1).
</span></span><span style="display:flex;"><span>edge(&#39;Zara&#39;, &#39;Isola&#39;, m5).
</span></span><span style="display:flex;"><span>edge(&#39;Zara&#39;, &#39;Sondrio&#39;, m3).
</span></span><span style="display:flex;"><span>```The rules are like```
</span></span><span style="display:flex;"><span>adiacent(\[X,L1\], \[Y,L1\]) :- edge(X,Y, L1) ; edge(Y, X, L1).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>change(L1,L2, X) :-
</span></span><span style="display:flex;"><span> station(X,L1),
</span></span><span style="display:flex;"><span> station(X,L2),
</span></span><span style="display:flex;"><span> not(L1 == L2).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>same_line_path(Node, Node, _, [Node]). % rule 1
</span></span><span style="display:flex;"><span>same_line_path(Start, Finish, Visited, [Start | Path]) :- % rule 2
</span></span><span style="display:flex;"><span> adiacent(Start, X),
</span></span><span style="display:flex;"><span> not(member(X, Visited)),
</span></span><span style="display:flex;"><span> same_line_path(X, Finish, [X | Visited], Path).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>one_change_line_path([Start,L1], [End,L2], Visited, Path):-
</span></span><span style="display:flex;"><span> station(Start,L1),
</span></span><span style="display:flex;"><span> station(End,L2),
</span></span><span style="display:flex;"><span> change(L1,L2, X),
</span></span><span style="display:flex;"><span> same_line_path([Start,L1], [X,L1], [[Start,L1]|Visited], Path1),
</span></span><span style="display:flex;"><span> same_line_path([X,L2], [End,L2], [[X,L2]|Visited], Path2),
</span></span><span style="display:flex;"><span> append(Path1, Path2, Path).
</span></span></code></pre></div><p>You can find the source code of the Prolog webservice at <a href="https://github.com/matteoredaelli/metropolitana-milano">https://github.com/matteoredaelli/metropolitana-milano</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>howto extract sentences from an ebook/doc/pdf/text file</title>
      <link>https://www.mr70.eu/posts/howto-extract-sentences-from-an-ebookdocpdftext-file/</link>
      <pubDate>Wed, 05 Apr 2017 20:43:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-extract-sentences-from-an-ebookdocpdftext-file/</guid>
      <description><![CDATA[<p><img src="http://tika.apache.org/tika.png" alt=""> You can easily extract sentences froma epub/pdf/office/text file thanks to the opensource projects [Apache Tika](http://Apache Tika) and <a href="https://opennlp.apache.org/">Apache OpenNlp</a> with a command like```
java -jar tika-app-1.14.jar -t ebook.epub | opennlp SentenceDetector it-sent.bi</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Deploy tomcat applications in Docker containers</title>
      <link>https://www.mr70.eu/posts/deploy-tomcat-applications-in-docker-containers/</link>
      <pubDate>Tue, 14 Mar 2017 16:37:34 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/deploy-tomcat-applications-in-docker-containers/</guid>
      <description><![CDATA[<p><img src="http://tomcat.apache.org/images/tomcat.png" alt="">Deploying you applications in containers, you are sure that they are easily portable and scalable&hellip; Here a sample of deploying a .war application using a Docker container Create a Dockerfile like```
FROM tomcat:8-jre8</p>
<p>MAINTAINER &ldquo;Matteo <a href="mailto:matteo.redaelli@gmail.com">matteo.redaelli@gmail.com</a>&rdquo;</p>
<p>ADD server.xml /usr/local/tomcat/conf/
ADD tomcat-users.xml /usr/local/tomcat/conf/
ADD ojdbc6.jar /usr/local/tomcat/lib/
ADD bips.war /usr/local/tomcat/webapps/
<code>Build a docker image</code>
docker build . -t myapp
<code>Run one or more docker images of your appplication with</code>
docker run &ndash;restart=unless-stopped &ndash;name myapp1 -p 8080:8080 -d myapp
docker run &ndash;restart=unless-stopped &ndash;name myapp2 -p 8081:8080 -d myapp
<code>It is better to redirect tomcat logs to stdout: in this way you can see them with</code>
docker logs myapp</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Docker" data-lang="Docker"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Continuous integration and continuous delivery with Jenkins</title>
      <link>https://www.mr70.eu/posts/continuous-integration-and-continuous-delivery-with-jenkins/</link>
      <pubDate>Fri, 10 Mar 2017 14:25:45 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/continuous-integration-and-continuous-delivery-with-jenkins/</guid>
      <description><![CDATA[<p><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2017/03/jenkins-obiee.png" alt=""> In this post I&rsquo;ll show how to use the opensource tool #<a href="https://jenkins.io/">Jenkins</a>, &ldquo;the leading #opensource automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project&rdquo;. I&rsquo;ll create a simple pipeline that executes remote tasks via ssh. It could be used for <em>continuous integration</em> and continuous delivery for Oracle OBIEE Systems</p>
<h4 id="install-in-a-docker-container">Install (in a docker container)</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>docker run -p 8080:8080 -p 50000:50000 -v /home/oracle/docker\_shares/jenkins:/var/jenkins\_home -d jenkins
</span></span></code></pre></div><h4 id="configurecredentials">Configure credentials</h4>
<p>Login to Jenkins  (<a href="http://jenkins.redaelli.org:8080">http://jenkins.redaelli.org:8080</a>) Jenkins -&gt; Manage Jenkins -&gt; Credential -&gt; System -&gt; Add credential</p>
<h4 id="configure-remote-nodes">Configure remote nodes</h4>
<p>Jenkins -&gt; Manage Jenkins -&gt; Manage nodes -&gt;  Add node</p>
<h4 id="httpwwwredaelliorgmatteo-blogwp-contentuploads201703jenkins-ssh-nodepng"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2017/03/jenkins-ssh-node.png" alt=""></h4>
<p>Configure Pipeline Jenkins -&gt; New Item -&gt; Pipeline See <a href="https://gist.github.com/matteoredaelli/8d306d79e547f3fdfd5d1c467373f8e0">https://gist.github.com/matteoredaelli/8d306d79e547f3fdfd5d1c467373f8e0</a> <img src="https://jenkins.io/images/226px-Jenkins_logo.svg.png" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Log analysis with ELK for Business Intelligence systems</title>
      <link>https://www.mr70.eu/posts/centralized-logging-with-elk-for-business-intelligence-systems/</link>
      <pubDate>Tue, 28 Feb 2017 21:43:41 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/centralized-logging-with-elk-for-business-intelligence-systems/</guid>
      <description><![CDATA[<p>In this post I&rsquo;ll show howto collect logs from several applications (<a href="https://www.oracle.com/BI">Oracle OBIEE</a>, <a href="https://www.oracle.com/Essbase">Oracle Essbase</a>, <a href="http://www.qlik.com/">QlikView</a>, Apache logs, Linux system logs) with the <a href="https://www.elastic.co/webinars/introduction-elk-stack">ELK</a> (<a href="https://www.elastic.co/products/elasticsearch">Elasticsearch</a>, <a href="https://www.elastic.co/products/logstash">Logstash</a> and <a href="s://www.elastic.co/products/kibana">Kibana</a>) stack. ELK is a powerful opensource alternative for <a href="https://www.splunk.com/">Splunk</a>. It can easily manage multiline logs. Installing the ELK stack in docker containers is really fast, easy and flexible..</p>
<h2 id="client-side">Client side</h2>
<p>To be installed where are the logs. On Linux, using <a href="https://www.docker.com/">docker</a>, run</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker run -d --restart<span style="color:#ff79c6">=</span>unless-stopped -v <span style="color:#f1fa8c">&#34;</span><span style="color:#8be9fd;font-style:italic">$PWD</span><span style="color:#f1fa8c">&#34;</span>/filebeat.yml:/filebeat.yml -v <span style="color:#f1fa8c">&#34;</span><span style="color:#8be9fd;font-style:italic">$PWD</span><span style="color:#f1fa8c">&#34;</span>/filebeat.template.json:/filebeat.template.json -v <span style="color:#f1fa8c">&#34;</span><span style="color:#8be9fd;font-style:italic">$PWD</span><span style="color:#f1fa8c">&#34;</span>/filebeat.template-es2x.json:/filebeat.template-es2x.json -v /home/oracle/Oracle:/Oracle:ro -v /var/log:/var/log:ro --name filebeat prima/filebeat:latest
</span></span></code></pre></div><p>Sample filebeat.yml file for collecting <strong>Obiee logs</strong> is</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">filebeat.prospectors</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input_type</span>: log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">document_type</span>: obiee_access_log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/bi_server1/logs/access.log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">exclude_lines</span>: [<span style="color:#f1fa8c">&#34;\t200\t[0-9]+$&#34;</span>, <span style="color:#f1fa8c">&#34;\t304\t[0-9]+$&#34;</span>]
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input_type</span>: log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">document_type</span>: obiee_log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/bi_server1/logs/bi_server1-diagnostic.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obiccs1/logs/nqcluster.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obiccs1/logs/nqscheduler.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obijh1/logs/jh.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obips1/logs/sawlog0.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obis1/logs/obis1-diagnostic.log
</span></span><span style="display:flex;"><span>	- /Oracle/Middleware/Oracle_Home/user_projects/domains/bi/servers/obisch1/logs/nqscheduler.log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">multiline.pattern</span>: <span style="color:#f1fa8c">&#39;^\[[0-9]{4}-[0-9]{2}-[0-9]{2}&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">multiline.negate</span>: <span style="color:#ff79c6">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">multiline.match</span>: after
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">ignore_older</span>: 10m
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">level</span>: debug
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input_type</span>: log
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span>	- /var/log/*.log
</span></span><span style="display:flex;"><span>	- /var/log/messages
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">document_type</span>: syslog
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">exclude_lines</span>: [<span style="color:#f1fa8c">&#34;^DBG&#34;</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">include_lines</span>: [<span style="color:#f1fa8c">&#34;^ERR&#34;</span>, <span style="color:#f1fa8c">&#34;^WARN&#34;</span>, <span style="color:#f1fa8c">&#34;Error&#34;</span>, <span style="color:#f1fa8c">&#34;error&#34;</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">exclude_files</span>: [<span style="color:#f1fa8c">&#34;.gz$&#34;</span>, <span style="color:#f1fa8c">&#34;vmware-vmsvc*.log&#34;</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">level</span>: debug
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">ignore_older</span>: 10m
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">name</span>: zaff.redaelli.org
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">tags</span>: [<span style="color:#f1fa8c">&#34;obiee&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">env</span>: production
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">output.logstash</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">hosts </span>: [<span style="color:#f1fa8c">&#34;fourier.redaelli.org:5044&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">processors</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">drop_event</span>:
</span></span><span style="display:flex;"><span>	 <span style="color:#ff79c6">when</span>:
</span></span><span style="display:flex;"><span>	   <span style="color:#ff79c6">or</span>:
</span></span><span style="display:flex;"><span>		 - <span style="color:#ff79c6">regexp</span>:
</span></span><span style="display:flex;"><span>			 <span style="color:#ff79c6">message</span>: <span style="color:#f1fa8c">&#34;/Info&#34;</span>
</span></span><span style="display:flex;"><span>		 - <span style="color:#ff79c6">regexp</span>:
</span></span><span style="display:flex;"><span>			 <span style="color:#ff79c6">message</span>: <span style="color:#f1fa8c">&#34;NOTIFICATION&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">logging.level</span>: error
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">logging.selectors</span>: [<span style="color:#f1fa8c">&#34;*&#34;</span>]
</span></span></code></pre></div><p>Sample filebeat.yaml for Qlikview logs</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">filebeat.prospectors</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input\_type</span>: log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">document\_type</span>: qlikview\_log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span> - G:\\QLIK\_CONFIG\\QVS\\Logs\\Events\_APP13IT\_\*.log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">include\_lines</span>: \[&#34;Error&#34;\]
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">ignore\_older</span>: 10m
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">name</span>: app13it
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input\_type</span>: log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">document\_type</span>: qlikview\_log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span> - G:\\QLIK\_CONFIG\\QVS\\Logs\\Events\_APP18IT\_\*.log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">include\_lines</span>: \[&#34;Error&#34;\]
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">ignore\_older</span>: 10m
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">name</span>: app18it
</span></span><span style="display:flex;"><span>- <span style="color:#ff79c6">input\_type</span>: log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">document\_type</span>: qlikview\_log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">paths</span>:
</span></span><span style="display:flex;"><span> - G:\\QLIK\_CONFIG\\QVS\\Logs\\Events\_APP25IT\_\*.log
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">include\_lines</span>: \[&#34;Error&#34;\]
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">ignore\_older</span>: 10m
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">name</span>: app25it
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#================================ General =====================================</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">tags</span>: \[&#34;qlikview&#34;\]
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">fields</span>:
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">env</span>: production
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#================================ Outputs =====================================</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">output.logstash</span>:
</span></span><span style="display:flex;"><span> <span style="color:#6272a4"># The Logstash hosts</span>
</span></span><span style="display:flex;"><span> <span style="color:#ff79c6">hosts </span>: \[&#34;ambra.redaelli.org:5044&#34;\]
</span></span><span style="display:flex;"><span><span style="color:#6272a4">#================================ Logging =====================================</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">logging.level</span>: error
</span></span></code></pre></div><h2 id="server-side-logstash-and-kibana">Server side (Logstash and kibana)</h2>
<p>On linux, using docker</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>docker run -d --restart=unless-stopped --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/oracle/apps/docker\_shares/elasticsearch\_data:/usr/share/elasticsearch/data elasticsearch
</span></span><span style="display:flex;"><span>docker run -d --restart=unless-stopped --name logstash -p 5044:5044 --link elasticsearch:elasticsearch -v /home/oracle/apps/docker\_shares/logstash:/logstash logstash -f /logstash/logstash.conf
</span></span><span style="display:flex;"><span>docker run --restart=unless-stopped --name kibana --link elasticsearch:elasticsearch -p 5601:5601 -d kibana
</span></span></code></pre></div><p>Sample logstash.conf</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>input {
</span></span><span style="display:flex;"><span> beats {
</span></span><span style="display:flex;"><span> port =&gt; 5044
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>filter {
</span></span><span style="display:flex;"><span>  if [type] == &#34;syslog&#34; {
</span></span><span style="display:flex;"><span>	grok {
</span></span><span style="display:flex;"><span>	  match =&gt; { &#34;message&#34; =&gt; &#34;%{SYSLOGLINE}&#34; }
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>	  match =&gt; [ &#34;timestamp&#34;, &#34;MMM  d HH:mm:ss&#34;, &#34;MMM dd HH:mm:ss&#34; ]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  } else
</span></span><span style="display:flex;"><span>  if [type] == &#34;apache_httpd_log&#34; {
</span></span><span style="display:flex;"><span>	grok {
</span></span><span style="display:flex;"><span>	  match =&gt; { &#34;message&#34; =&gt; &#34;%{COMBINEDAPACHELOG}&#34; }
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>	  match =&gt; [ &#34;timestamp&#34; , &#34;dd/MMM/yyyy:HH:mm:ss Z&#34; ]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  } else
</span></span><span style="display:flex;"><span>  if [type] == &#34;essbase_log&#34; {
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>	   gsub =&gt; [&#39;message&#39;, &#34;\n&#34;, &#34; &#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>		gsub =&gt; [&#39;message&#39;, &#34;\r&#34;, &#34; &#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	grok{
</span></span><span style="display:flex;"><span>		match =&gt; [&#34;message&#34;,&#34;\[%{TIMESTAMP_ISO8601:timestamp}\] \[.*\] \[%{LOGLEVEL:loglevel}\:?\d*\] %{GREEDYDATA:log_message}&#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>		match =&gt; [&#34;timestamp&#34;, &#34;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZZ&#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	if ([message] !~ &#34;ERROR&#34; or [message] !~ &#34;Error&#34;) {
</span></span><span style="display:flex;"><span>	  drop {}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  } else
</span></span><span style="display:flex;"><span>  if [type] == &#34;obiee_log&#34; {
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>	   gsub =&gt; [&#39;message&#39;, &#34;\n&#34;, &#34; &#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>		gsub =&gt; [&#39;message&#39;, &#34;\r&#34;, &#34; &#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	grok{
</span></span><span style="display:flex;"><span>		match =&gt; [&#34;message&#34;,&#34;\[%{TIMESTAMP_ISO8601:timestamp}\] \[.*\] \[%{LOGLEVEL:loglevel}\:?\d*\] %{GREEDYDATA:log_message}&#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>		match =&gt; [&#34;timestamp&#34;, &#34;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZZ&#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	if ([message] !~ &#34;\[ERROR&#34;) {
</span></span><span style="display:flex;"><span>	  drop {}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  } else
</span></span><span style="display:flex;"><span>  if [type] == &#34;obiee_access_log&#34; {
</span></span><span style="display:flex;"><span>	 # 2017-02-17	11:37:01	GET	e82f1268-7238-4672-a983-03e62ebc9b9c-0000026f	0	/analytics/Missing_uicomponents/sensecomplete/sensecomplete.css	404	1164
</span></span><span style="display:flex;"><span>	grok {
</span></span><span style="display:flex;"><span>		match =&gt; { &#34;message&#34; =&gt; &#34;%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}\t%{TIME:time}\t%{WORD:method}\t%{NOTSPACE:dummy1}\t%{NUMBER:dummy2}\t%{URIPATH:uri}\t%{NUMBER:response}\t%{NUMBER:bytes}&#34;}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>	  add_field =&gt; {
</span></span><span style="display:flex;"><span>		&#34;timestamp&#34; =&gt; &#34;%{year}-%{month}-%{day} %{time}&#34;
</span></span><span style="display:flex;"><span>	  }
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>		gsub =&gt; [&#39;message&#39;, &#34;\t&#34;, &#34; &#34;]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>	  match =&gt; [ &#34;timestamp&#34; , &#34;yyyy-MM-dd HH:mm:ss&#34; ]
</span></span><span style="display:flex;"><span>	  timezone =&gt; &#34;Europe/Rome&#34;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>	  remove_field =&gt; [ &#34;timestamp&#34;, &#34;year&#34;, &#34;month&#34;, &#34;day&#34;, &#34;time&#34;, &#34;dummy1&#34;, &#34;dummy2&#34; ]
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  } else
</span></span><span style="display:flex;"><span>  if [type] == &#34;qlikview_log&#34; {
</span></span><span style="display:flex;"><span>	# Server Started	Timestamp	SeverityID	EventID	Severity	Message
</span></span><span style="display:flex;"><span>	# 2017-02-19 18:01:29	2017-02-21 00:00:16	4	700	Information	Debug: CNTService::Handler(4)
</span></span><span style="display:flex;"><span>	grok {
</span></span><span style="display:flex;"><span>		match =&gt; { &#34;message&#34; =&gt; &#34;%{YEAR:y}-%{MONTHNUM:m}-%{MONTHDAY:d} %{TIME:t}\t%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{TIME:time}\t%{NUMBER:severityid}\t%{NUMBER:eventid}\t%{WORD:loglevel}\t%{GREEDYDATA:log_message}&#34;}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	mutate {
</span></span><span style="display:flex;"><span>	  add_field =&gt; {
</span></span><span style="display:flex;"><span>		&#34;timestamp&#34; =&gt; &#34;%{year}-%{month}-%{day} %{time}&#34;
</span></span><span style="display:flex;"><span>	  }
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	date {
</span></span><span style="display:flex;"><span>	  match =&gt; [ &#34;timestamp&#34; , &#34;yyyy-MM-dd HH:mm:ss&#34; ]
</span></span><span style="display:flex;"><span>	  timezone =&gt; &#34;Europe/Rome&#34;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>output {
</span></span><span style="display:flex;"><span>   elasticsearch {
</span></span><span style="display:flex;"><span>	  hosts =&gt; [&#34;elasticsearch:9200&#34;]
</span></span><span style="display:flex;"><span>	  index =&gt; &#34;%{[@metadata][beat]}-%{+YYYY.MM.dd}&#34;
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span>   stdout {
</span></span><span style="display:flex;"><span>	  codec =&gt; rubydebug
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Sample microservice for exposing database tables via REST using node.js express.js in a docker container</title>
      <link>https://www.mr70.eu/posts/sample-microservice-for-exposing-database-tables-via-rest-using-node-js-express-js-in-a-docker-container/</link>
      <pubDate>Thu, 09 Feb 2017 17:17:27 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/sample-microservice-for-exposing-database-tables-via-rest-using-node-js-express-js-in-a-docker-container/</guid>
      <description><![CDATA[<p><img src="http://thisdavej.com/wp-content/uploads/2016/02/nodejs-logo.png" alt="">I have started learning <a href="https://nodejs.org/">node.js</a>: The first result is this <a href="https://github.com/matteoredaelli/node-express-rest-oracle-docker">github repository</a> where you can find a basic project of a rest web service that exposes oracle data. How to run the service forever (with autorestart on failures)? I tested it both with a docker container and the <a href="http://pm2.keymetrics.io/">pm2</a> tool <img src="http://zdnet4.cbsistatic.com/hub/i/r/2014/10/02/1f130129-49e2-11e4-b6a0-d4ae52e95e57/resize/770xauto/2598bf8706f23f291a520c42165e6b1f/docker-vm-container.png" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Building a Chat Bot...</title>
      <link>https://www.mr70.eu/posts/building-a-chat-bot/</link>
      <pubDate>Sat, 21 Jan 2017 15:59:31 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/building-a-chat-bot/</guid>
      <description><![CDATA[<p>[last update: June, 5 2017] My next project will be a Chat Bot.. Starting points are:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/AIML">AIML (</a><strong><a href="https://en.wikipedia.org/wiki/Artificial_intelligence" title="Artificial intelligence">Artificial Intelligence</a> Markup Language</strong>) standard</li>
<li><a href="https://messengerplatform.fb.com/">https://messengerplatform.fb.com/</a> [from Facebook]</li>
<li><a href="https://dev.botframework.com/">https://dev.botframework.com/</a>  [from Microsoft]</li>
<li><a href="https://www.rivescript.com/">https://www.rivescript.com/</a></li>
<li><a href="https://sourceforge.net/projects/chatscript/">https://sourceforge.net/projects/chatscript/</a></li>
<li><a href="http://chatterbot.readthedocs.io">Chatterbot</a></li>
</ul>
<p>There are also some useful softwares as a service like</p>
<ul>
<li><a href="https://api.ai/">Api.ai</a> (Google)</li>
<li><a href="https://wit.ai/">Wit.ai</a> (Facebook)</li>
<li><a href="https://www.luis.ai/">LUIS</a> (Microsoft)</li>
<li><a href="https://www.ibm.com/watson/">Watson</a> (IBM)</li>
<li><a href="https://aws.amazon.com/lex/">Lex</a> (Amazon)</li>
</ul>
<p>And  alternatives:</p>
<ul>
<li><a href="https://rasa.ai/">rasa.ai</a></li>
</ul>
<p>Useful ML libraries:</p>
<ul>
<li><a href="https://spacy.io/">spacy.io</a></li>
<li><a href="https://www.tensorflow.org/">Tensorflow</a></li>
<li><a href="http://tflearn.org/">tflearn</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Managing Spark dataframes in Python</title>
      <link>https://www.mr70.eu/posts/managing-spark-dataframes-in-python/</link>
      <pubDate>Fri, 02 Dec 2016 11:00:41 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/managing-spark-dataframes-in-python/</guid>
      <description><![CDATA[<p><img src="http://spark.apache.org/images/spark-logo-trademark.png" alt=""> Below a quick sample of using <a href="http://spark.apache.org/">Apache Spark</a> (2.0) dataframes for manipulating data. Sample data is a file of jsonlines like```
{&ldquo;description&rdquo;: &ldquo;255/40 ZR17 94W&rdquo;, &ldquo;ean&rdquo;: &ldquo;EAN: 4981910401193&rdquo;, &ldquo;season&rdquo;: &ldquo;tires_season summer&rdquo;, &ldquo;price&rdquo;: &ldquo;203,98&rdquo;, &ldquo;model&rdquo;: &ldquo;Michelin Pilot Sport PS2 255/40 R17&rdquo;, &ldquo;id&rdquo;: &ldquo;MPN: 2351610&rdquo;}
{&ldquo;description&rdquo;: &ldquo;225/55 R17 101V XL&rdquo;, &ldquo;ean&rdquo;: &ldquo;EAN: 5452000438744&rdquo;, &ldquo;season&rdquo;: &ldquo;tires_season summer&rdquo;, &ldquo;price&rdquo;: &ldquo;120,98&rdquo;, &ldquo;model&rdquo;: &ldquo;Pirelli P Zero 205/45 R17&rdquo;, &ldquo;id&rdquo;: &ldquo;MPN: 530155&rdquo;}</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>from pyspark.sql import SparkSession
</span></span><span style="display:flex;"><span>from pyspark.sql import Row
</span></span><span style="display:flex;"><span>from pyspark.sql.functions import col
</span></span><span style="display:flex;"><span>from pyspark.sql.functions import lit
</span></span><span style="display:flex;"><span>from pyspark.sql.functions import \*
</span></span><span style="display:flex;"><span>import re, sys
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># warehouse\_location points to the default location for managed databases and tables
</span></span><span style="display:flex;"><span>warehouse\_location = &#39;spark-warehouse&#39;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>spark = SparkSession \\
</span></span><span style="display:flex;"><span>    .builder \\
</span></span><span style="display:flex;"><span>    .appName(&#34;Python Spark  &#34;) \\
</span></span><span style="display:flex;"><span>    .config(&#34;spark.sql.warehouse.dir&#34;, warehouse\_location) \\
</span></span><span style="display:flex;"><span>    .enableHiveSupport() \\
</span></span><span style="display:flex;"><span>    .getOrCreate()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>records\_orig = spark.read.json(&#34;scraped\_tyres\_data.json&#34;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>## removing bad records 
</span></span><span style="display:flex;"><span>records = records\_orig \\
</span></span><span style="display:flex;"><span>  .filter(records.id != &#39;&#39;) \\
</span></span><span style="display:flex;"><span>  .filter(regexp\_extract(&#39;description&#39;, &#39;(rinnovati)&#39;, 1) == &#39;&#39;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>## saving bad records  
</span></span><span style="display:flex;"><span>records\_orig.subtract(records).coalesce(1).write.csv(&#34;bad-records.csv&#34;, sep=&#34;;&#34;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># extract new features
</span></span><span style="display:flex;"><span>regexp\_size = &#34;(\\d+)/(\\d+) R(\\d+) (\\d+)(\\w+)\\s\*&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>records = records \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;width&#34;,       regexp\_extract(&#34;description&#34;, regexp\_size, 1)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;ratio&#34;,       regexp\_extract(&#34;description&#34;, regexp\_size, 2)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;diameter&#34;,    regexp\_extract(&#34;description&#34;, regexp\_size, 3)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;load\_index&#34;,  regexp\_extract(&#34;description&#34;, regexp\_size, 4)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;speed\_index&#34;, regexp\_extract(&#34;description&#34;, regexp\_size, 5)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;brand&#34;,       regexp\_extract(&#34;model&#34;, &#34;^(\\w+) &#34;, 1)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;season&#34;,      trim(regexp\_replace(&#34;season&#34;, &#34;tires\_season&#34;,&#34;&#34;))) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;id&#34;,          trim(regexp\_replace(&#34;id&#34;, &#34;MPN: &#34;,&#34;&#34;))) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;ean&#34;,         trim(regexp\_replace(&#34;ean&#34;, &#34;EAN: &#34;,&#34;&#34;))) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;runflat&#34;,     regexp\_extract(&#34;description&#34;, &#34;(runflat)&#34;, 1)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;mfs&#34;,         regexp\_extract(&#34;description&#34;, &#34;(MFS|FSL|bordo di protezione|bordino di protezione)&#34;, 1)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;xl&#34;,          regexp\_extract(&#34;description&#34;, &#34; (XL|RF)\\s\*&#34;, 1)) \\
</span></span><span style="display:flex;"><span>  .withColumn(&#34;chiodabile&#34;,  regexp\_extract(&#34;description&#34;, &#34;(chiodabile)\\s\*&#34;, 1))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>## extracting and saving all season values
</span></span><span style="display:flex;"><span>records.select(&#34;season&#34;).distinct().coalesce(1).write.csv(&#34;season\_values&#34;, sep=&#34;;&#34;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># misc
</span></span><span style="display:flex;"><span># records.columns   # show columns
</span></span><span style="display:flex;"><span># records.groupBy(&#34;brand&#34;).count().show()
</span></span><span style="display:flex;"><span># records.groupBy(&#34;brand&#34;).count().filter(&#34;count &gt; 100&#34;).show(20,False)
</span></span><span style="display:flex;"><span>#
</span></span><span style="display:flex;"><span># renaming all columns before joining dataframes with same column names
</span></span><span style="display:flex;"><span># records\_renamed = records.select(\*(col(x).alias(x + &#39;\_renamed&#39;) for x in records.columns))
</span></span><span style="display:flex;"><span># join two dataframe
</span></span><span style="display:flex;"><span># records.join(record\_renamed, records.ean == records\_renamed.ean\_renamed)
</span></span><span style="display:flex;"><span>#
</span></span><span style="display:flex;"><span>#
</span></span><span style="display:flex;"><span># saving data to several formats
</span></span><span style="display:flex;"><span>records.coalesce(1).write.csv(&#34;result.csv&#34;, sep=&#34;;&#34;)
</span></span><span style="display:flex;"><span>records.write.json(&#34;result.json&#34;)
</span></span><span style="display:flex;"><span>records.write.parquet(&#34;result.parquet&#34;)
</span></span><span style="display:flex;"><span>records.write.format(&#34;com.databricks.spark.avro&#34;).save(&#34;result.avro&#34;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>```
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto batch Install OBIEE 12c (silent mode)</title>
      <link>https://www.mr70.eu/posts/howto-programmatically-install-obiee-12c-silent-mode/</link>
      <pubDate>Thu, 24 Nov 2016 12:24:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-programmatically-install-obiee-12c-silent-mode/</guid>
      <description><![CDATA[<p>If you wanted to install / deploy automatically obiee systems in a datacenter/cloud you could simply run few simple commands like:```
export TEMP=/home/oracle/tmp
export TEMPDIR=/home/oracle/tmp
export JAVA_HOME=/home/oracle/apps/jdk1.8.0</p>
<p>java -Djava.io.tmpdir=/home/oracle/tmp -jar fmw_12.2.1.2.0_infrastructure.jar \
-silent -responseFile /home/oracle/KIT/response_01_fmw_infrastructure.rsp \
-invPtrLoc /home/oracle/oraInst.loc</p>
<p>./bi_platform-12.2.1.2.0_linux64.bin -silent \
-responseFile /home/oracle/KIT/response_02_bi_platform.rsp \
-invPtrLoc /home/oracle/oraInst.loc \
-ignoreSysPrereqs</p>
<p>export ORACLE_HOME=/home/oracle/Oracle/Middleware/Oracle_Home
export BI_PRODUCT_HOME=$ORACLE_HOME/bi
$BI_PRODUCT_HOME/bin/config.sh -silent \
-responseFile /home/oracle/KIT/response_03_bi_platform_config.rsp \
-invPtrLoc /home/oracle/oraInst.loc \
-ignoreSysPrereqs<img src="http://www.oracle.com/us/assets/cw20v1-bi-overview-2720811.jpg" alt=""></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>### Comments:
</span></span><span style="display:flex;"><span>#### 
</span></span><span style="display:flex;"><span>[Rahul]( &#34;panchalrahul6@gmail.com&#34;) - &lt;time datetime=&#34;2018-12-13 14:45:08&#34;&gt;Dec 4, 2018&lt;/time&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>from where to get those silent files ?
</span></span><span style="display:flex;"><span>&lt;hr /&gt;
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Any faster alternative to #Hadoop HDFS?</title>
      <link>https://www.mr70.eu/posts/any-faster-alternative-to-hadoop-hdfs/</link>
      <pubDate>Thu, 17 Nov 2016 08:36:05 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/any-faster-alternative-to-hadoop-hdfs/</guid>
      <description><![CDATA[<p>I&rsquo;d like to have an alternative to Hadoop HDFS, a faster and not java filesystem:</p>
<ul>
<li><a href="https://aws.amazon.com/it/s3/">S3:</a> <a href="https://wiki.apache.org/hadoop/AmazonS3">S3 Support in Apache Hadoop</a> if your servers are hosted at Amazon AWS</li>
<li><a href="http://ceph.com/">chep</a>: using <a href="http://docs.ceph.com/docs/jewel/cephfs/hadoop/">hadoop with ceph</a></li>
<li><a href="https://www.gluster.org/">glusterfs</a>: <a href="https://gluster.readthedocs.io/en/latest/Administrator%20Guide/Hadoop/">managing hadoop compatible storage</a></li>
<li><a href="http://www.lustre.org/">lustre</a>: <a href="http://wiki.lustre.org/index.php/Running_Hadoop_with_Lustre">Running hadoop with lustre</a></li>
<li><a href="http://docs.openstack.org/developer/swift/">Openstack Swift</a>: <a href="https://hadoop.apache.org/docs/stable2/hadoop-openstack/index.html#Hadoop_OpenStack_Support:_Swift_Object_Store">Hadoop OpenStack Support: Swift Object Store</a></li>
<li><a href="http://www.xtreemfs.org">xstreamfs</a>: there is an <a href="http://www.xtreemfs.org/downloads/XtreemFSHadoopClient.jar">hadoop client</a></li>
</ul>
<p>Which is better? Any suggestions? References:</p>
<ul>
<li>[1] <a href="https://en.wikipedia.org/wiki/Comparison">https://en.wikipedia.org/wiki/Comparison</a>_of_distributed_file_systems</li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Spark howto import data from a jdbc database using python</title>
      <link>https://www.mr70.eu/posts/apache-spark-howto-import-data-from-a-jdbc-database-using-python/</link>
      <pubDate>Thu, 27 Oct 2016 13:18:32 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-spark-howto-import-data-from-a-jdbc-database-using-python/</guid>
      <description><![CDATA[<p><img src="http://spark.apache.org/images/spark-logo-trademark.png" alt="">Using Apache spark 2.0 and python I&rsquo;ll show how to import a table from a relational database (using its jdbc driver) into a python dataframe and save it in a parquet file. In this demo the database is an oracle 12.x file jdbc-to-parquet.py:```
from pyspark.sql import SparkSession</p>
<p>spark = SparkSession \
    .builder \
    .appName(&ldquo;Python Spark SQL basic example&rdquo;) \
    .getOrCreate()</p>
<p>df = spark.read.format(&ldquo;jdbc&rdquo;).options(url=&ldquo;jdbc:oracle:thin:ro/ro@mydboracle.redaelli.org:1521:MYSID&rdquo;,
dbtable=&ldquo;myuser.dim_country&rdquo;,
driver=&ldquo;oracle.jdbc.OracleDriver&rdquo;).load()</p>
<p>df.write.parquet(&ldquo;country.parquet&rdquo;)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Mailman: Howto recover a mailinglist admin password</title>
      <link>https://www.mr70.eu/posts/mailman-howto-recover-a-mailinglist-admin-password/</link>
      <pubDate>Mon, 09 May 2016 11:28:54 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/mailman-howto-recover-a-mailinglist-admin-password/</guid>
      <description><![CDATA[<p><a href="https://www.gnu.org/software/mailman/"><img src="https://www.gnu.org/software/mailman/images/logo2010-2.jpg" alt=""></a>Do you use <a href="https://www.gnu.org/software/mailman/">mailman</a> and have you lost your admin password of you mailman list? You can easily reset it with```
<em>sudo /usr/lib/mailman/bin/change_pw -l listname -p newpass</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Building websites for high traffic with REST APIs, AngularJs and Jekyll</title>
      <link>https://www.mr70.eu/posts/building-websites-for-high-traffic-with-rest-apis-angularjs-and-jekyll/</link>
      <pubDate>Thu, 05 May 2016 21:19:57 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/building-websites-for-high-traffic-with-rest-apis-angularjs-and-jekyll/</guid>
      <description><![CDATA[<p>If you have few hw resources and/or you expect high traffic on your website, here are some quick suggestions (also taken from the article <a href="http://kylerush.net/blog/meet-the-obama-campaigns-250-million-fundraising-platform/">Meet the Obama campaign&rsquo;s $250 million fundraising platform</a>):</p>
<ul>
<li>Expose your business logic with REST services</li>
<li>Use a javascript framework like angularJS for calling your rest APIs and building a dynamic site</li>
<li>Build a (not so) static website using Jekyll or similars and put your static files on S3 (if you are using Amazon AWS)</li>
<li>use a CDN</li>
</ul>
<p>A sample website (not hosted at AWS but home based using a poor raspberryPI2) is <a href="http://paroleonline.it">http://paroleonline.it</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Adding an application (angularjs&#43;rest api) inside a Wordpress site</title>
      <link>https://www.mr70.eu/posts/adding-an-application-angularjsrest-api-inside-a-wordpress-page/</link>
      <pubDate>Tue, 26 Apr 2016 19:33:03 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/adding-an-application-angularjsrest-api-inside-a-wordpress-page/</guid>
      <description><![CDATA[<p><img src="https://angularjs.org/img/AngularJS-large.png" alt="">If you need to integrate an application written with <a href="https://angularjs.org/">AngularJS</a> and Rest API services in your <a href="https://wordpress.org/">wordpress</a> website, just create an empy page and edit it in &ldquo;text&rdquo; mode with something like```</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>DDNS for your GoDaddy domains</title>
      <link>https://www.mr70.eu/posts/ddns-for-your-godaddy-domains/</link>
      <pubDate>Wed, 13 Apr 2016 20:04:52 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ddns-for-your-godaddy-domains/</guid>
      <description><![CDATA[<p>You can automatically update DNS for your GoDaddy.com domains following the suggestions from the post <a href="http://blogs.umb.edu/michaelbazzinott001/2014/09/14/ddns-with-godaddy/">ddns-with-godaddy</a> but remember to patch the godaddy python library with <a href="https://github.com/claneys/pygodaddy/blob/master/pygodaddy/client.py">this client.py</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Installing Nodejs oracledb module on Suse SLES 11</title>
      <link>https://www.mr70.eu/posts/installing-nodejs-oracledb-module-on-suse-sles11/</link>
      <pubDate>Thu, 11 Feb 2016 09:52:30 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/installing-nodejs-oracledb-module-on-suse-sles11/</guid>
      <description><![CDATA[<p><a href="https://github.com/oracle/node-oracledb/blob/master/INSTALL.md"><img src="http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/2550783.png" alt=""></a>For a quick tutorial about installing Oracle module for <a href="https://nodejs.org/">Nodejs</a> (<a href="https://github.com/oracle/node-oracledb">oracledb</a>) on Suse SLES, follow the info at <a href="https://github.com/oracle/node-oracledb/blob/master/INSTALL.md">Node-OracleDB Installation</a> but remember to use the gcc compiler release 5.0```
export ORACLE_HOME=/home/oracle/instantclient_12_1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME
export OCI_LIBRARY_PATH=$ORACLE_HOME
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>CC=gcc-5 CXX=g++-5 npm install oracledb
</span></span><span style="display:flex;"><span>```
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Deploying microservices in a Docker container</title>
      <link>https://www.mr70.eu/posts/deploying-microservices-in-a-docker-container/</link>
      <pubDate>Fri, 11 Dec 2015 13:09:29 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/deploying-microservices-in-a-docker-container/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/2014/08/04/docker-moving-datacentersapps-from-virtual-machines-to-containers/"><img src="http://zdnet4.cbsistatic.com/hub/i/r/2014/10/02/1f130129-49e2-11e4-b6a0-d4ae52e95e57/resize/770xauto/2598bf8706f23f291a520c42165e6b1f/docker-vm-container.png" alt=""></a>I already spoke about docker containers (<a href="http://www.redaelli.org/matteo-blog/2014/08/04/docker-moving-datacentersapps-from-virtual-machines-to-containers/">moving datacenters apps from virtual machines to containers)</a> This is a quick tutorial (my <a href="https://github.com/matteoredaelli/python-ws-docker">github sample code</a>) about a new way of deploying (micro) services and applications, ie using <a href="https://www.docker.com/">Docker</a> containers: a sample python webservice and an simple web (html + <a href="https://angularjs.org/">angularJS</a> code) page Creating docker containers means defining a file Dockerfile like```
FROM python:3.5
#FROM python:3-onbuild</p>
<p>ENV DEBIAN_FRONTEND noninteractive</p>
<p>ENV HTTP_PROXY=&ldquo;<a href="http://myproxy.redaelli.org:80">http://myproxy.redaelli.org:80</a>&rdquo;
ENV HTTPS_PROXY=&ldquo;<a href="http://myproxy.redaelli.org:80">http://myproxy.redaelli.org:80</a>&rdquo;
ENV http_proxy=&ldquo;<a href="http://myproxy.redaelli.org:80">http://myproxy.redaelli.org:80</a>&rdquo;
ENV https_proxy=&ldquo;<a href="http://myproxy.redaelli.org:80">http://myproxy.redaelli.org:80</a>&rdquo;
ENV PIP_OPTIONS=&quot;&ndash;proxy $HTTP_PROXY&quot;</p>
<p>COPY requirements.txt /usr/src/app/
COPY app.py /usr/src/app/</p>
<p>WORKDIR /usr/src/app
RUN apt-get update &amp;&amp; apt-get install -y nmap
RUN pip install &ndash;proxy $HTTP_PROXY &ndash;no-cache-dir -r requirements.txt</p>
<p>VOLUME [&quot;/usr/src/app&quot;]
EXPOSE 5000</p>
<p>ENTRYPOINT [&ldquo;python&rdquo;]
CMD [&quot;./app.py&quot;]</p>
<p><code>Put the additional python packages you need in a file requirements.txt</code>
Flask
python-nmap
dnspython3
<code>And create your application in the file app.py In this way we are going to create a docker container with python3 and some additional python packages with the command</code>
docker build -t python-infra-ws .
<code>Finally we'll start the container with the command</code>
docker run -d -t &ndash;name python-infra-ws -p 5000:5000 python-infra-ws
<code>Some other useful commands are:</code>
docker stop python-infra-ws
docker start python-infra-ws
docker ps python-infra-ws
docker rm python-infra-ws
docker rmi python-infra-ws</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Download 1 million of twitter users</title>
      <link>https://www.mr70.eu/posts/download-1-million-of-twitter-users/</link>
      <pubDate>Mon, 07 Dec 2015 17:06:54 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/download-1-million-of-twitter-users/</guid>
      <description><![CDATA[<p><img src="http://dailygenius.com/wp-content/uploads/2014/09/twittercloud.png" alt="">I like learning and using new technologies and opensource softwares. For instance I use <a href="http://camel.apache.org/">Apache Camel</a> and <a href="https://www.mongodb.org/">MongoDB</a> for downloading and analyzing twitter data.  <a href="http://www.redaelli.org/matteo/downloads/twitter-users/tu1.zip">Here</a> you can download a sample file with (some attributes of) 1 million of twitter users</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Analyzing huge sensor data in near realtime with Apache Spark Streaming</title>
      <link>https://www.mr70.eu/posts/analyzing-huge-sensor-data-in-near-realtime-with-apache-spark-streaming/</link>
      <pubDate>Wed, 25 Nov 2015 21:19:58 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/analyzing-huge-sensor-data-in-near-realtime-with-apache-spark-streaming/</guid>
      <description><![CDATA[<p><img src="http://spark.apache.org/docs/latest/img/streaming-arch.png" alt="">For this demo I downloaded and installed <a href="http://spark.apache.org/">Apache Spark</a> 1.5.1 Suppose you have a stream of data from several (industrial) machines like<code>MACHINE,TIMESTAMP,SIGNAL1,SIGNAL2,SIGNAL3,... 1,2015-01-01 11:00:01,1.0,1.1,1.2,1.3,.. 2,2015-01-01 11:00:01,2.2,2.1,2.6,2.8,. 3,2015-01-01 11:00:01,1.1,1.2,1.3,1.3,. 1,2015-01-01 11:00:02,1.0,1.1,1.2,1.4,. 1,2015-01-01 11:00:02,1.3,1.2,3.2,3.3,.. ...</code>Below a system, written in Python, that reads data from a stream (use the command &ldquo;nc -lk 9999&rdquo; to send data to the stream) and every 10 seconds collects alerts from signals: at least 4 suspicious values of a specific signal of the same machine```
from pyspark import SparkContext
from pyspark.streaming import StreamingContext</p>
<p>min_occurs = 4</p>
<p>def signals_from_1_row_to_many(row):
  &ldquo;output is (machine, date, signal_number, signal_value)&rdquo;
  result = []
  for f in range(2,21):
    result = result + [(row[0], row[1], f-1, row[f])]
  return result</p>
<p>def isAlert(signal, value):
  defaults = [83.0, 57.0, 37.0, 57.0, 45.0, 19.0, -223.0, 20.50, 20.42, 20.48, 20.24, 20.22, 20.43, 20, 20.44, 20.39, 20.36, 20.25, 1675.0]
  soglia = 0.95
  if value == &lsquo;&rsquo;:
     return True
  value = float(value)
  ref = defaults[signal -1]
  if value &lt; ref - soglia*ref or value &gt; ref + soglia*ref:
    return True
  else:
    return False
 
def isException(machine, signal):</p>
<h1 id="sample-data-the-sensor-19-of-machine-11-is-broken">sample data. the sensor 19 of machine 11 is broken</h1>
<p>  exceptions = [(11,19)]
  return (int(machine), signal) in exceptions</p>
<h1 id="create-a-local-streamingcontext-with-two-working-thread-and-batch-interval-of-10-second">Create a local StreamingContext with two working thread and batch interval of 10 second</h1>
<p>sc = SparkContext(&ldquo;local[2]&rdquo;, &ldquo;SignalsAlerts&rdquo;)
ssc = StreamingContext(sc, 10)</p>
<h1 id="create-a-dstream-that-will-connect-to-hostnameport-like-localhost9999">Create a DStream that will connect to hostname:port, like localhost:9999</h1>
<p>lines = ssc.socketTextStream(&ldquo;localhost&rdquo;, 9999)</p>
<p>all_alerts = lines.map(lambda l: l.split(&quot;,&quot;)) \
                 .flatMap(signals_from_1_row_to_many) \
                 .filter(lambda s: isAlert(s[2], s[3])) \
                 .filter(lambda s: not isException(s[0], s[2])) \
                 .map(lambda s: (s[0]+&rsquo;-&rsquo;+str(s[2]), [(s[1], s[3])])) \
                 .reduceByKey(lambda x, y: x + y)</p>
<p>alerts = all_alerts.filter(lambda s: len(s[1]) &gt; min_occurs)</p>
<p>alerts.pprint()</p>
<p>ssc.start()             # Start the computation
ssc.awaitTermination()  # Wait for the computation to terminate</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>TwitterPopularTags.scala example of Apache Spark Streaming in a standalone project</title>
      <link>https://www.mr70.eu/posts/twitterpopulartags-scala-example-of-apache-spark-streaming-in-a-standalone-project/</link>
      <pubDate>Thu, 22 Oct 2015 20:12:01 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/twitterpopulartags-scala-example-of-apache-spark-streaming-in-a-standalone-project/</guid>
      <description><![CDATA[<p><img src="http://spark.apache.org/docs/latest/img/spark-logo-hd.png" alt=""> This is an easy tutorial of using <a href="http://spark.apache.org/docs/latest/streaming-programming-guide.html">Apache Spark Streaming</a> with <a href="http://www.scala-lang.org/">Scala language</a> using the official  <a href="https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/TwitterPopularTags.scala">TwitterPopularTags.scala</a> example and putting it in a standalone sbt project.   In few minutes you will be able to receive streams of tweets and manipulating then in realtime with  <a href="http://spark.apache.org/docs/latest/streaming-programming-guide.html">Apache Spark Streaming</a></p>
<ul>
<li>Install <a href="http://spark.apache.org">Apache Spark</a> (I used 1.5.1)</li>
<li>Install <a href="http://www.scala-sbt.org/">sbt</a></li>
<li>git clone <a href="https://github.com/matteoredaelli/TwitterPopularTags">https://github.com/matteoredaelli/TwitterPopularTags</a></li>
<li>cd TwitterPopularTags</li>
<li>cp twitter4j.properties.sample twitter4j.properties</li>
<li>edit twitter4j.properties</li>
<li>sbt package</li>
<li>spark-submit &ndash;master local &ndash;packages &ldquo;org.apache.spark:spark-streaming-twitter_2.10:1.5.1&rdquo; ./target/scala-2.10/twitterpopulartags_2.10-1.0.jar italy</li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto collecting twitter data in 15 minutes</title>
      <link>https://www.mr70.eu/posts/howto-collecting-twitter-data-in-15-minutes/</link>
      <pubDate>Fri, 16 Oct 2015 14:01:05 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-collecting-twitter-data-in-15-minutes/</guid>
      <description><![CDATA[<p><img src="http://cdn.javacodegeeks.com/wp-content/uploads/2012/10/apache-camel-logo.jpg" alt="">For this tutorial I assume you are using a  Debian/Ubuntu Linux system but it could be easily adapted for other Openrating Systems</p>
<h2 id="install-the-software">Install the software</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>apt-get install openjdk-7-jdk  
</span></span><span style="display:flex;"><span>wget [http://apache.panu.it/karaf/4.0.2/apache-karaf-4.0.2.tar.gz](http://apache.panu.it/karaf/4.0.2/apache-karaf-4.0.2.tar.gz)
</span></span><span style="display:flex;"><span>tar xvfz apache-karaf-4.0.2.tar.gz
</span></span></code></pre></div><h2 id="start-the-server">Start the server</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cd apache-karaf-4.0.2/
</span></span><span style="display:flex;"><span>./bin/start
</span></span></code></pre></div><h2 id="install-additional-connectors">Install additional connectors</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ssh -p 8101 karaf@localhost
</span></span><span style="display:flex;"><span>feature:repo-add camel 2.16.0
</span></span><span style="display:flex;"><span>feature:install camel camel-blueprint camel-twitter camel-jackson camel-dropbox
</span></span><span style="display:flex;"><span>exit
</span></span></code></pre></div><h2 id="configure-our-routes">Configure our routes</h2>
<p>Create two new files: twitter-to-file.xml```</p>
<!-- raw HTML omitted -->
<p>&lt;blueprint xmlns=&ldquo;<a href="http://www.osgi.org/xmlns/blueprint/v1.0.0%22">http://www.osgi.org/xmlns/blueprint/v1.0.0&quot;</a>
       xmlns:xsi=&ldquo;<a href="http://www.w3.org/2001/XMLSchema-instance%22">http://www.w3.org/2001/XMLSchema-instance&quot;</a>
       xmlns:camel=&ldquo;<a href="http://camel.apache.org/schema/blueprint%22">http://camel.apache.org/schema/blueprint&quot;</a>
       xsi:schemaLocation=&rdquo;
       <a href="http://www.osgi.org/xmlns/blueprint/v1.0.0">http://www.osgi.org/xmlns/blueprint/v1.0.0</a> <a href="http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd</a>
       <a href="http://camel.apache.org/schema/blueprint">http://camel.apache.org/schema/blueprint</a> <a href="http://camel.apache.org/schema/blueprint/camel-blueprint.xsd%22%3E">http://camel.apache.org/schema/blueprint/camel-blueprint.xsd&quot;&gt;</a></p>
<p>  <!-- raw HTML omitted --></p>
<p>    <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
    <!-- raw HTML omitted --></p>
<p>    <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
         <!-- raw HTML omitted -->${in.header.twitter-id}<!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
        <!-- raw HTML omitted -->${body}<!-- raw HTML omitted -->
        <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
    <!-- raw HTML omitted --></p>
<p>    <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
        <!-- raw HTML omitted -->${body}\n<!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
        <!-- raw HTML omitted -->${in.header.CamelFileName}/${date:now:yyyy}/${date:now:MM}/${date:now:dd}<!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
    <!-- raw HTML omitted -->
  <!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<code>twitter-streaming-sample.xml</code>
<!-- raw HTML omitted -->
  <!-- raw HTML omitted -->
    <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
        <!-- raw HTML omitted -->sample<!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
      <!-- raw HTML omitted -->
    <!-- raw HTML omitted --></p>
<p>  <!-- raw HTML omitted -->
<!-- raw HTML omitted --></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>About Cayley a scalable graph database</title>
      <link>https://www.mr70.eu/posts/about-cayley-a-scalable-graph-database/</link>
      <pubDate>Mon, 03 Aug 2015 13:17:24 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/about-cayley-a-scalable-graph-database/</guid>
      <description><![CDATA[<p><a href="https://github.com/google/cayley"><img src="https://raw.githubusercontent.com/google/cayley/master/static/branding/cayley_side.png" alt=""></a>   This is fast tutorial of using the <a href="https://github.com/google/cayley">Caylay graph database</a> (with <a href="https://www.mongodb.org/">MongoDB</a> as backend): Cayley is &ldquo;not a Google project, but created and maintained by a Googler, with permission from and assignment to Google, under the Apache License, version 2.0&rdquo;</p>
<ul>
<li>download and unzip a <a href="https://github.com/google/cayley/releases">binary distribution</a></li>
<li>edit cayley.cfg</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>&#34;database&#34;: &#34;mongo&#34;,
</span></span><span style="display:flex;"><span>&#34;db\_path&#34;: &#34;cayley.redaelli.org:27017&#34;,
</span></span><span style="display:flex;"><span>&#34;read\_only&#34;: false,
</span></span><span style="display:flex;"><span>&#34;host&#34;: &#34;0.0.0.0&#34;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li>./cayley init -config=cayley.cfg</li>
<li>./cayley http -config=cayley.cfg -host=&ldquo;0.0.0.0&rdquo; &amp;</li>
<li>create a file demo.n3</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;/user/matteo&#34; &#34;is\_manager\_of&#34; &#34;/user/ele&#34; .
</span></span><span style="display:flex;"><span>&#34;/user/matteo&#34; &#34;has&#34; &#34;/workstation/wk0002&#34; .
</span></span><span style="display:flex;"><span>&#34;/user/matteo&#34; &#34;lives\_in&#34; &#34;/country/italy&#34; .
</span></span></code></pre></div><ul>
<li>upload data with: curl <a href="http://cayley.redaelli.org:64210/api/v1/write/file/nquad">http://cayley.redaelli.org:64210/api/v1/write/file/nquad</a> -F <a href="mailto:NQuadFile=@demo.n3">NQuadFile=@demo.n3</a></li>
<li>or: ./cayley load &ndash;config=cayley.cfg  -quads=demo.n3</li>
<li>query data with: curl &ndash;data &lsquo;g.V(&quot;/user/matteo&quot;).Out(null,&ldquo;predicate&rdquo;).All()&rsquo; <a href="http://cayley.redaelli.org:64210/api/v1/query/gremlin">http://cayley.redaelli.org:64210/api/v1/query/gremlin</a></li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span> &#34;result&#34;: \[
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>   &#34;id&#34;: &#34;/workstation/wk0002&#34;,
</span></span><span style="display:flex;"><span>   &#34;predicate&#34;: &#34;has&#34;
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>   &#34;id&#34;: &#34;/country/italy&#34;,
</span></span><span style="display:flex;"><span>   &#34;predicate&#34;: &#34;lives\_in&#34;
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>   &#34;id&#34;: &#34;/user/ele&#34;,
</span></span><span style="display:flex;"><span>   &#34;predicate&#34;: &#34;is\_manager\_of&#34;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span> \]
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>A comparison of Hadoop distributions</title>
      <link>https://www.mr70.eu/posts/which-hadoop-distro/</link>
      <pubDate>Thu, 21 May 2015 14:39:17 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/which-hadoop-distro/</guid>
      <description><![CDATA[<p><a href="http://www.hadoop360.com/blog/hadoop-whose-to-choose"><img src="http://api.ning.com/files/pHhBdYiNnuLDQBdUDfdIGEUdajKWuQbhs7HWwyjB43-W0K*J*rtzeM3-nC6SgcRWRhB*T0731FSgHGnQlJ3q2LeDhViqLOJQ/WhichHadooptable1.jpg?width=750" alt=""></a> <img src="http://api.ning.com/files/pHhBdYiNnuLpHSIDZAXzQ-cko-QSMpYPzWt3CsyHorecQ6iTEbJ-RuGlivQWv27S*ikesLHY7hNoXXaWks9Mf*FjQHvVzWRV/WhichHadooptable4.jpg?width=720" alt=""> Read all the article at <a href="http://www.hadoop360.com/blog/hadoop-whose-to-choose">http://www.hadoop360.com/blog/hadoop-whose-to-choose</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto Upgrade, Migrate &amp; Consolidate to Oracle Database 12c</title>
      <link>https://www.mr70.eu/posts/howto-upgrade-migrate-consolidate-to-oracle-database-12c/</link>
      <pubDate>Tue, 12 May 2015 15:00:37 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-upgrade-migrate-consolidate-to-oracle-database-12c/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/05/oracle-support.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/05/oracle-support.jpg" alt="oracle-support"></a> I suggest to visit the site <a href="https://blogs.oracle.com/UPGRADE/">https://blogs.oracle.com/UPGRADE</a> and the attachment pdf <a href="http://apex.oracle.com/pls/apex/f?p=202202:2:::::P2_SUCHWORT:migrate12c" title="Upgrade, Migrate and Consolidate to 12c"><strong>Upgrade, Migrate &amp; Consolidate to Oracle Database 12c</strong></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Powershell: how to retreive service accounts from services for many servers</title>
      <link>https://www.mr70.eu/posts/poweshell-how-to-retreive-service-accounts-from-services-for-many-servers/</link>
      <pubDate>Mon, 11 May 2015 15:28:02 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/poweshell-how-to-retreive-service-accounts-from-services-for-many-servers/</guid>
      <description><![CDATA[<p>Below a sample script```
$hosts = Get-Content &ldquo;hosts.txt&rdquo;
foreach ($myhost in $hosts) {
Get-WmiObject win32_service -ComputerName $myhost|where {$_.StartMode -eq &ldquo;Auto&rdquo;} | where {$_.StartName -like &ldquo;*.*&rdquo;} | foreach {write-host $myhost, $_.Startname}
}</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Spark news from a Spark Summit 2015</title>
      <link>https://www.mr70.eu/posts/apache-spark-news-from-httpspark-summit-org2015/</link>
      <pubDate>Tue, 21 Apr 2015 20:12:00 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-spark-news-from-httpspark-summit-org2015/</guid>
      <description><![CDATA[<p><a href="http://spark-summit.org/wp-content/uploads/2015/03/SSE15-1-Matei-Zaharia.pdf"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/04/spark-2015-from-databricks-pdf.png" alt="spark-2015-from-databricks-pdf"></a></p>
<p><strong>GOAL: unified engine across data sources, workloads and environments.</strong></p>
<p>Highlights: dataframes (1.3), SparkR (1.4), &hellip;</p>
<p>See all video and slides at <a href="http://spark-summit.org">http://spark-summit.org</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Hortonworks, IBM and Pivotal begin shipping standardized Hadoop</title>
      <link>https://www.mr70.eu/posts/hortonworks-ibm-and-pivotal-begin-shipping-standardized-hadoop/</link>
      <pubDate>Wed, 15 Apr 2015 09:49:30 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hortonworks-ibm-and-pivotal-begin-shipping-standardized-hadoop/</guid>
      <description><![CDATA[<p><img src="https://hadoop.apache.org/images/hadoop-logo.jpg" alt=""> &ldquo;Hortonworks, IBM and Pivotal begin shipping standardized Hadoop. The standardization effort is part of the <a href="http://opendataplatform.org/">Open Data Platform</a> initiative, which is an industry effort to ensure all versions of <a href="https://hadoop.apache.org/">Hadoop</a> are based on the same Apache core..&rdquo;. Read all the full <a href="http://www.zdnet.com/article/hortonworks-ibm-and-pivotal-begin-shipping-standardized-hadoop/">zdnet.com article</a>  This is thanks to the <a href="https://ambari.apache.org/">Apache Ambari</a> project!</p>
<ul>
<li><a href="http://www.cloudera.com/">Cloudera</a> still goes alone with its old custom solution.</li>
<li>And <a href="https://www.mapr.com/">MapR</a> bets on <a href="http://mesos.apache.org/">Apache Mesos</a> (see <a href="https://www.linkedin.com/redirect?url=https%3A%2F%2Flnkd%2Ein%2Fe_ZwNn5&amp;urlhash=-Pdy&amp;_t=commentary-share-link&amp;trk=commentary-share-link">https://lnkd.in/e_ZwNn5</a>)</li>
</ul>
<p>I also suggest to install Ambari/Hadoop in a <a href="https://www.docker.com/">Docker</a> container.. the new wave of &ldquo;virtualization&rdquo;. About Docker &amp; Hadoop: Hortonworks to Acquire SequenceIQ to Speed Hadoop Deployments into the Cloud (docker containers) <a href="https://www.linkedin.com/redirect?url=http%3A%2F%2Finvestors%2Ehortonworks%2Ecom%2Fphoenix%2Ezhtml%3Fc%3D253804%26p%3Dirol-newsArticle%26ID%3D2034442&amp;urlhash=GYo0&amp;_t=commentUrl">http://investors.hortonworks.com/phoenix.zhtml?c=253804&amp;p=irol-newsArticle&amp;ID=2034442</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto export Oracle Essbase databases with MaxL / essmsh commands</title>
      <link>https://www.mr70.eu/posts/howto-export-oracle-essbase-databases-with-maxl-essmsh-commands/</link>
      <pubDate>Fri, 10 Apr 2015 08:27:26 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-export-oracle-essbase-databases-with-maxl-essmsh-commands/</guid>
      <description><![CDATA[<p>Manually```
essbase@olap-server:~&gt; /opt/essbase/Oracle/Middleware/EPMSystem11R1/products/Essbase/EssbaseServer/templates/startMaxl.sh</p>
<p> Essbase MaxL Shell 64-bit - Release 11.1.2 (ESB11.1.2.3.505B018)
 Copyright (c) 2000, 2014, Oracle and/or its affiliates.
 All rights reserved.</p>
<p>MAXL&gt; login Hypadmin mypassword on olap-server.redaelli.org;</p>
<p> OK/INFO - 1051034 - Logging in user [Hypadmin@Native Directory].
 OK/INFO - 1241001 - Logged in to Essbase.</p>
<p>MAXL&gt; export database P_BSO.Plan1 level0 data to data_file &lsquo;ExpLev0_P_BSO.Plan1&rsquo;;</p>
<p> OK/INFO - 1054014 - Database Plan1 loaded.
 OK/INFO - 1051061 - Application P_BSO loaded - connection established.
 OK/INFO - 1054027 - Application [P_BSO] started with process id [60396].
 OK/INFO - 1019020 - Writing Free Space Information For Database [Plan1].
 OK/INFO - 1005031 - Parallel export completed for this export thread. Blocks Exported: [2013908]. Elapsed time: [312.35]..
 OK/INFO - 1005002 - Ascii Backup Completed. Total blocks: [2.01391e+06]. Elapsed time: [312.35]..
 OK/INFO - 1013270 - Database export completed [&lsquo;P_BSO&rsquo;.&lsquo;Plan1&rsquo;].</p>
<p><code>Automatically</code>
/opt/essbase/Oracle/Middleware/EPMSystem11R1/products/Essbase/EssbaseServer/templates/startMaxl.sh -u Hypadmin -p mypassword -s localhost backup-databases.msh
<code>with a file backup-databases.msh like</code>
export database P_BSO.Plan1 level0 data to data_file &lsquo;ExpLev0_P_BSO.Plan1&rsquo;;
<code>  BUT if you need to **export both metadata and data**, you should run the command</code>
MAXL&gt; alter database P_BSO_D.Plan1 force archive to file &lsquo;P_BSO_D.Plan1.arc&rsquo;;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Archlinux and Docker for my Raspberry PI2</title>
      <link>https://www.mr70.eu/posts/archlinux-and-docker-for-my-raspberry-pi2/</link>
      <pubDate>Sat, 28 Mar 2015 21:30:49 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/archlinux-and-docker-for-my-raspberry-pi2/</guid>
      <description><![CDATA[<p><a href="http://www.raspberrypi.org/"><img src="http://www.raspberrypi.org/wp-content/uploads/2015/01/Pi2ModB1GB_-comp-500x283.jpeg" alt=""></a> What is the best linux distribution for <a href="www.raspberrypi.org">Raspberry PI2</a>? I started with <a href="http://www.raspbian.org/">Raspian</a> (Debian is my preferred Linux distribution for servers, desktops and laptops) but <a href="https://www.docker.com/">docker</a> didn&rsquo;t work. <img src="http://archlinuxarm.org/sites/default/files/wikilogo_0_0.png" alt="">But with <a href="http://archlinuxarm.org/platforms/armv7/broadcom/raspberry-pi-2">Archlinux</a> it works fine. How to create a docker images with Archlinux &amp; RPI2? See <a href="http://linucc.github.io/docker-arch-rpi2/">http://linucc.github.io/docker-arch-rpi2/</a> <a href="https://www.docker.com/"><img src="http://www.raspbian.org/static/common/raspbian_logo.png" alt=""><img src="https://d3oypxn00j2a10.cloudfront.net/0.16.0/img/homepage/docker-logo-cutoff.png" alt=""></a> <a href="https://github.com/matteoredaelli/docker-karaf-rpi">matteoredaelli/docker-karaf-rpi</a> is the first docker image I have created. Below my docker info output:</p>
<p>[root@raspi1 ~]# docker info Containers: 4 Images: 9 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 17 Execution Driver: native-0.2 Kernel Version: 3.18.10-1-ARCH Operating System: Arch Linux ARM CPUs: 1 Total Memory: 432.8 MiB Name: raspi1 ID: UOFM:E7CP:2OTL:VTTM:QRP2:JNJ7:UFCI:2MDE:AOYQ:MGTM:Q25F:FL37 WARNING: No memory limit support WARNING: No swap limit support</p>
<p>Below some docker survival commands:```
docker run -i -t &ndash;name karaf \
-p 1099:1099 -p 8101:8101 \
-p 44444:44444 -v /apps/karaf-deploy:/deploy \
matteoredaelli/karaf-docker-rpi /bin/bash
docker start karaf
docker stop karaf
docker exec -it karaf bash
docker top
docker ps
docker ps -a
docker images</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>A case study of adopting Bigdata technologies in your company</title>
      <link>https://www.mr70.eu/posts/a-case-study-of-adopting-bigdata-technologies-in-your-company/</link>
      <pubDate>Fri, 13 Mar 2015 20:52:33 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/a-case-study-of-adopting-bigdata-technologies-in-your-company/</guid>
      <description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Big_data">Bigdata</a> projects can be very expensive and can easily fail: I suggest to start with a small, useful but not critical project. Better if it is about unstructured data collection and batch processing. In this case you have time to get practise with the new technologies and the <a href="http://hadoop.apache.org/">Apache Hadoop</a> system can have not critical downtimes. At home I have the following system running on a small <a href="http://www.raspberrypi.org/">Raspberry PI</a>: for sure it is not fast ;-) At work I introduced <a href="http://hadoop.apache.org/">Hadoop</a> just few months ago for collecting web data and generating daily reports. <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/Competitor_Analysis_BigData.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/Competitor_Analysis_BigData.png" alt="Competitor_Analysis_BigData"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>QlikView: how to share bookmarks</title>
      <link>https://www.mr70.eu/posts/qlikview-how-to-share-bookmarks/</link>
      <pubDate>Tue, 10 Mar 2015 16:07:28 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/qlikview-how-to-share-bookmarks/</guid>
      <description><![CDATA[<p>In your <a href="http://www.qlik.com">QlikView</a> report, select the &ldquo;Repository&rdquo; button (the first from the right) <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/qlik-bookmarks-1.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/qlik-bookmarks-1.jpg" alt="qlik-bookmarks-1"></a> and then select &ldquo;Bookmarks&rdquo;&hellip; <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/qlik-bookmarks-2.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/qlik-bookmarks-2.jpg" alt="qlik-bookmarks-2"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Before SQL then NOSQL and BIGDATA: now BIGDATA and SQL again</title>
      <link>https://www.mr70.eu/posts/before-sql-then-nosql-and-bigdata-now-bigdata-and-sql-again/</link>
      <pubDate>Mon, 02 Mar 2015 13:37:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/before-sql-then-nosql-and-bigdata-now-bigdata-and-sql-again/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/drill.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/drill.jpg" alt="drill"></a> <img src="https://spark.apache.org/images/spark-logo.png" alt=""> The trend of these years has been switching from SQL (RDBMS) databases to NoSQL databases like Hadoop, MongoDB, Cassandra, Riak, &hellip; <img src="http://phoenix.apache.org/images/phoenix-logo-small.png" alt=""> SQL is a old but easy and fast way to query data. And people STILL look at it for quering Hadoop and bigdata:</p>
<ul>
<li><a href="http://drill.apache.org/">Apache Drill</a>  (MapR)</li>
<li><a href="http://phoenix.apache.org/">Apache Phoenix</a></li>
<li><a href="https://hive.apache.org/">Apache Hive</a> (see <a href="http://hortonworks.com/labs/stinger/">Stinger initiative</a>)</li>
<li><a href="https://spark.apache.org/sql/">Apache Spark SQL</a></li>
<li><a href="https://prestodb.io/">Presto</a> (Facebook)</li>
<li><a href="http://tajo.apache.org/">Apache Tajo</a> (a datawarehouse)</li>
<li><a href="http://www.cloudera.com/content/cloudera/en/products-and-services/cdh/impala.html">Impala (Cloudera)</a></li>
</ul>
<p><img src="https://hive.apache.org/images/hive_logo_medium.jpg" alt=""> <img src="http://drill.apache.org/images/arc-1.jpg" alt=""> Read details from <a href="http://www.infoworld.com/article/2683729/hadoop/10-ways-to-query-hadoop-with-sql.html">10 ways to query hadoop with sql</a> .. <img src="https://prestodb.io/static/presto-overview.png" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Bigdata on Twitter 2015-02</title>
      <link>https://www.mr70.eu/posts/bigdata-on-twitter-2015-02/</link>
      <pubDate>Mon, 02 Mar 2015 11:00:34 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/bigdata-on-twitter-2015-02/</guid>
      <description><![CDATA[<p>Below the top media (and other statistics) about “bigdata” word in Twitter in February 2015 <img src="https://pbs.twimg.com/media/B0JfBlcCQAITEPs.png" alt=""> <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/bigdata-2015-02.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/bigdata-2015-02.jpg" alt="bigdata-2015-02"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Expo2015 on Twitter 2015-02</title>
      <link>https://www.mr70.eu/posts/expo2015-on-twitter-2015-02/</link>
      <pubDate>Mon, 02 Mar 2015 10:52:53 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/expo2015-on-twitter-2015-02/</guid>
      <description><![CDATA[<p>Below the top media (and other statistics) about “Expo2015” search in Twitter in February 2015 <img src="https://pbs.twimg.com/media/B-TwfI3IAAAl5CP.jpg" alt=""> <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/export2015-2015-02.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/export2015-2015-02.jpg" alt="export2015-2015-02"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Hadoop on Twitter 2015-02</title>
      <link>https://www.mr70.eu/posts/hadoop-on-twitter-2015-02/</link>
      <pubDate>Mon, 02 Mar 2015 10:03:30 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hadoop-on-twitter-2015-02/</guid>
      <description><![CDATA[<p>Below the top media (and other statistics) about &ldquo;Hadoop&rdquo; search in Twitter in February 2015</p>
<p><img src="https://pbs.twimg.com/media/B978KzvIcAEB0Aw.png" alt=""></p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/hadoop-2015-02.jpg"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2015/03/hadoop-2015-02-300x225.jpg" alt="hadoop-2015-02"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Statistics of #Hadoop #Opensource #Expo2015 tweets in January 2015</title>
      <link>https://www.mr70.eu/posts/statistics-of-hadoop-opensource-expo2015-tweets-in-january-2015/</link>
      <pubDate>Thu, 05 Feb 2015 13:05:47 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/statistics-of-hadoop-opensource-expo2015-tweets-in-january-2015/</guid>
      <description><![CDATA[<p>How easy is analyzing json twitter data using <a href="https://spark.apache.org/">Apache Spark</a> and <a href="https://hadoop.apache.org/">Apache Hadoop</a>. Below some examples <strong>Tweets about Expo2015</strong> <img src="http://4.bp.blogspot.com/-kJ9bgVLfC0U/VNNKbk2g8PI/AAAAAAAAGh8/b6Edd8PjhLI/s1600/Expo2015-01.jpg" alt=""> <strong>Tweets about Hadoop</strong> <img src="http://4.bp.blogspot.com/-SZLcjO7ko2Q/VNNKCeiyuJI/AAAAAAAAGh0/lTB-kQN2QWc/s1600/hadoop-2015-01.jpg" alt=""> <strong>Tweets about opensource</strong> <img src="http://1.bp.blogspot.com/-HrJVKCq42es/VNNJSSO83XI/AAAAAAAAGhs/51o4c45_14s/s1600/opensource-2015-01.jpg" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto managing tweets saved in #Hadoop using #Apache #Spark SQL</title>
      <link>https://www.mr70.eu/posts/howto-managing-tweets-saved-in-hadoop-using-apache-spark-sql/</link>
      <pubDate>Thu, 15 Jan 2015 16:35:40 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-managing-tweets-saved-in-hadoop-using-apache-spark-sql/</guid>
      <description><![CDATA[<p>Instead of using the old <a href="http://hadoop.apache.org/">Hadoop</a> way (map/reduce), I suggest using the newer and faster way (<a href="https://spark.apache.org/">Apache Spark</a> on top of Hadoop Yarn): in few lines you can open all tweets (zipped json files saved in several subdirectories hdfs://path/to/YEAR/MONTH/DAY/*gz) and query them in a SQL like language```
sc = SparkContext(appName=&ldquo;extraxtStatsFromTweets.py&rdquo;)
sqlContext = SQLContext(sc)
tweets = sqlContext.jsonFile(&quot;/tmp/twitter/opensource/2014/*/*.gz&quot;)
tweets.registerTempTable(&ldquo;tweets&rdquo;)
t = sqlContext.sql(&ldquo;SELECT distinct createdAt,user.screenName,hashtagEntities FROM tweets&rdquo;)
tweets_by_days = count_items(t.map(lambda t: javaTimestampToString(t[0])))
stats_hashtags = count_items(t.flatMap(lambda t: t[2])\ .map(lambda t: t[2].lower()))</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto managing tweets saved in #Hadoop using #Apache #Spark</title>
      <link>https://www.mr70.eu/posts/howto-managing-tweets-saved-in-hadoop-in-apache-spark/</link>
      <pubDate>Tue, 25 Nov 2014 20:41:10 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-managing-tweets-saved-in-hadoop-in-apache-spark/</guid>
      <description><![CDATA[<p><a href="http://www.datanami.com/2014/11/21/spark-just-passed-hadoop-popularity-web-heres/"><img src="https://spark.apache.org/images/spark-logo.png" alt=""></a> <a href="http://www.datanami.com/2014/11/21/spark-just-passed-hadoop-popularity-web-heres/">Apache Spark has just passed Hadoop in popolarity on the web (google trends)</a> My first <a href="https://spark.apache.org/">Apache Spark</a> usage was extracting texts from tweets I&rsquo;ve been collecting in <a href="http://hadoop.apache.org/">Hadoop</a> HDFS. My <a href="https://www.python.org/">python</a> script tweet-texts.py was```
import json</p>
<p>from pyspark import SparkContext</p>
<p>def valid(tweet):
  return &rsquo;text&rsquo; in tweet</p>
<p>def gettext(line):
  tweet = json.loads(line)
  return tweet[&rsquo;text&rsquo;]</p>
<p>sc = SparkContext(appName=&ldquo;Tweets&rdquo;)
data = sc.textFile(&ldquo;hdfs://hadoop.redaelli.org:9000/user/matteo/staging/twitter/searches/TheCalExperience.json/*/*/*.gz&rdquo;)</p>
<p>result = data.filter(lambda line: valid(line))\
    .map(lambda tweet: gettext(tweet))</p>
<p>output = result.collect()
for text in output:
    print text.encode(&lsquo;utf-8&rsquo;)
<code>And lunched with</code>
spark-1.1.0&gt; bin/spark-submit &ndash;master local[4] tweet-texts.py
<code>I used Apche Spark 1.1.0 and Apache Hadoop 2.5.2. When I compiled Spark with</code>
mvn -Phadoop-2.5 -Dhadoop.version=2.5.2 -DskipTests -Pyarn -Phive package
<code>I got an error related to protocolBuffer jar release when I tried to read files from Hadoop HDFS</code>
org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$CreateSnapshotRequestProto overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet
<code>So I changed the pom.xml adding</code>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->hadoop-2.5<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
&lt;hadoop.version&gt;2.5.2&lt;/hadoop.version&gt;
&lt;protobuf.version&gt;2.5.0&lt;/protobuf.version&gt;
&lt;jets3t.version&gt;0.9.0&lt;/jets3t.version&gt;
<!-- raw HTML omitted -->
<!-- raw HTML omitted --></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Workflows in Apache Hadoop</title>
      <link>https://www.mr70.eu/posts/workflows-in-apache-hadoop/</link>
      <pubDate>Fri, 03 Oct 2014 20:20:43 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/workflows-in-apache-hadoop/</guid>
      <description><![CDATA[<p><a href="http://oozie.apache.org/"><img src="http://oozie.apache.org/images/oozie_200x.png" alt=""></a><img src="https://raw.githubusercontent.com/spotify/luigi/master/doc/luigi.png" alt=""> How to orchestrate your Hadoop Jobs? Possible solutions are:</p>
<ul>
<li><a href="http://oozie.apache.org/">Apache Oziee</a> included in the top Hadoop distributions</li>
<li><a href="http://azkaban.github.io/">Azkaban</a> from <a href="http://data.linkedin.com/opensource/azkaban">LinkedIn</a></li>
<li><a href="https://github.com/spotify/luigi">Luigi</a> from Spotify</li>
<li><a href="https://airflow.apache.org/">Apache Airflow</a> from AirBnb</li>
</ul>
<p>See for instance a comparison among luigi, airflow and pinball at <a href="http://bytepawn.com/luigi-airflow-pinball.html">http://bytepawn.com/luigi-airflow-pinball.html</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>#Hadoop Search with Apache #Solr</title>
      <link>https://www.mr70.eu/posts/hadoop-search-with-apache-solr/</link>
      <pubDate>Fri, 03 Oct 2014 19:35:08 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hadoop-search-with-apache-solr/</guid>
      <description><![CDATA[<p>The two top <a href="http://hadoop.apache.org/">Hadoop</a> distributions (<a href="http://www.cloudera.com">Cloudera</a> and <a href="http://hortonworks.com">Hortonworks</a> but remember that Hadoop is a Free Software and many companies do not pay anything for using it!) include <a href="http://lucene.apache.org/solr/">Apache Solr</a> as Hadoop search tool See <a href="http://hortonworks.com/blog/hdp-2-1-apache-solr-hadoop-search/">apache-solr-hadoop-search</a> article and the following two presentations from the two vendors <a href="http://hadoop.apache.org/"><img src="http://hadoop.apache.org/images/hadoop-logo.jpg" alt=""></a>   [slideshare id=35810888&amp;doc=solr-2-140612162029-phpapp02] [slideshare id=24255985&amp;doc=hadoopplussolrbigdatasearch-130715115557-phpapp02]   See also the <a href="http://hortonworks.com/hadoop-tutorial/nlp-sentiment-analysis-retailers-using-hdp-itc-infotech-radar/">Natural Language Processing and Sentiment Analysis for Retailers using HDP and ITC Infotech Radar</a> article <a href="http://hortonworks.com/hadoop-tutorial/nlp-sentiment-analysis-retailers-using-hdp-itc-infotech-radar/"><img src="http://hortonworks.com/wp-content/uploads/2014/09/RADAR-Framework.png" alt=""></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Adding Google Analytics to Oracle OBIEE</title>
      <link>https://www.mr70.eu/posts/adding-google-analytics-to-oracle-obiee/</link>
      <pubDate>Mon, 29 Sep 2014 11:39:23 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/adding-google-analytics-to-oracle-obiee/</guid>
      <description><![CDATA[<p><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Oracle_logo.svg/663px-Oracle_logo.svg.png" alt=""> I opened a service request to Oracle and they did not provide me an official way to add the Google Analytics javascript code to Oracle OBIEE (release 11.1.1.7): I wanted to add it in only one place and see it in all pages of Oracle Obiee. The solution I found and tested is to add the javascript code (without <!-- raw HTML omitted --> and <!-- raw HTML omitted -->) in the file```
bi_server1/tmp/_WL_user/analytics_11.1.1/7dezjl/war/res/b_mozilla/common.js</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Google uses R: a new open-source package for estimating causal effects in time series</title>
      <link>https://www.mr70.eu/posts/google-uses-r-a-new-open-source-package-for-estimating-causal-effects-in-time-series/</link>
      <pubDate>Tue, 16 Sep 2014 20:25:36 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/google-uses-r-a-new-open-source-package-for-estimating-causal-effects-in-time-series/</guid>
      <description><![CDATA[<p><a href="http://google-opensource.blogspot.de/2014/09/causalimpact-new-open-source-package.html"><img src="http://2.bp.blogspot.com/-EmqnkfLkz48/VBDAnBtrU6I/AAAAAAAAYiU/w23tbIXCCTE/s1600/image00.png" alt=""></a> In this blog post Google confirms its adoption of the opensource statistical environment <a href="http://www.r-project.org/">R</a> (see my <a href="https://docs.google.com/presentation/d/16YdyCKAi-YTEg8r3ox1uIWmt7Sw78BKNSJOAWYvPdTg/present#slide=id.i0">R introduction</a>) releasing a new R package.. &ldquo;How can we measure the number of additional clicks or sales that an AdWords campaign generated? How can we estimate the impact of a new feature on app downloads? How do we compare the effectiveness of publicity across countries? In principle, all of these questions can be answered through <strong>causal inference [</strong>&hellip;] <strong>How the package works</strong> The <em>CausalImpact</em> R package implements a Bayesian approach to estimating the causal effect of a designed intervention on a time series. Given a response time series (e.g., clicks) and a set of control time series (e.g., clicks in non-affected markets, clicks on other sites, or <a href="http://www.google.com/trends/">Google Trends</a> data), the package constructs a Bayesian structural time-series model with a built-in spike-and-slab prior for automatic variable selection. This model is then used to predict the counterfactual, i.e., how the response metric would have evolved after the intervention if the intervention had not occurred.&rdquo; Read the f<a href="http://google-opensource.blogspot.de/2014/09/causalimpact-new-open-source-package.html">ull Google blog post</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Machine learning map</title>
      <link>https://www.mr70.eu/posts/machine-learning-map/</link>
      <pubDate>Fri, 12 Sep 2014 19:28:45 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/machine-learning-map/</guid>
      <description><![CDATA[<p>I found this nice map about Machine Leaning and I wanted to share it. It is taken from <a href="http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html">http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html</a> <img src="http://scikit-learn.org/stable/_static/ml_map.png" alt="Machine learning map"></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Scouting howto collecting and analyzing  sensor data with Hadoop or other NOSQL databases</title>
      <link>https://www.mr70.eu/posts/scouting-howto-collecting-and-analyzing-sensor-data/</link>
      <pubDate>Wed, 10 Sep 2014 19:44:01 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/scouting-howto-collecting-and-analyzing-sensor-data/</guid>
      <description><![CDATA[<p><strong><a href="https://www.slideshare.net/matteoredaelli/collecting-analyzing-sensor-data-with-hadoop-or-other-no-sql-databases" title="Collecting and analyzing sensor data with hadoop or other no sql databases">Collecting and analyzing sensor data with hadoop or other no sql databases</a></strong> from <strong><a href="http://www.slideshare.net/matteoredaelli">Matteo Redaelli</a></strong></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Building a sample (micro) service in Prolog</title>
      <link>https://www.mr70.eu/posts/building-a-sample-micro-service-in-prolog/</link>
      <pubDate>Sun, 07 Sep 2014 19:41:26 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/building-a-sample-micro-service-in-prolog/</guid>
      <description><![CDATA[<p><img src="http://www.swi-prolog.org/icons/swipl.png" alt=""> Sometimes ago I read that some components of <a href="http://www.ibm.com/smarterplanet/us/en/ibmwatson/">IBM Watson</a> were <a href="http://www.cs.nmsu.edu/ALP/wp-content/uploads/2011/03/PrologAndWatson1.pdf">implemented in prolog</a> . So I decided to look at it again after many years&hellip; I like <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a>, I studied <a href="http://en.wikipedia.org/wiki/Prolog">prolog</a> at Computer Science University of Milan and for my thesis I wrote code in <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a> (and Lisp). <a href="https://github.com/matteoredaelli/proloGraph">proloGraph</a> is a simple example of howto exposing a <a href="http://en.wikipedia.org/wiki/Prolog">prolog</a> graph database to other applications,  building a REST web service. I used <a href="http://www.swi-prolog.org/">swi-prolog</a> and its <a href="http://www.swi-prolog.org/pldoc/package/http.html">http library</a> Install the prolog language (I used the fantastic <a href="https://www.debian.org/">Linux Debian</a> distribution) with<code>apt-get install swi-prolog</code>clone my git repository<code>git clone https://github.com/matteoredaelli/proloGraph cd proloGraph</code>Run it with<code>swipl -s webserver.pl -g 'server(8765).'</code>Open the following url with your browser<code>http://localhost:8765/vertex?name=user(matteo)</code>and you will get:```
{
&ldquo;prev&rdquo;: [ {&ldquo;from&rdquo;:&ldquo;user(gabriele)&rdquo;, &ldquo;to&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;rel&rdquo;:&ldquo;follow&rdquo;} ],
&ldquo;next&rdquo;: [
{&ldquo;from&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;to&rdquo;:&ldquo;user(ele)&rdquo;, &ldquo;rel&rdquo;:&ldquo;follow&rdquo;},
{&ldquo;from&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;to&rdquo;:&ldquo;user(gabriele)&rdquo;, &ldquo;rel&rdquo;:&ldquo;follow&rdquo;},
{&ldquo;from&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;to&rdquo;:&ldquo;user(4)&rdquo;, &ldquo;rel&rdquo;:&ldquo;follow&rdquo;},
{&ldquo;from&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;to&rdquo;:&ldquo;country(italy)&rdquo;, &ldquo;rel&rdquo;:&ldquo;lives&rdquo;},
{&ldquo;from&rdquo;:&ldquo;user(matteo)&rdquo;, &ldquo;to&rdquo;:&ldquo;hobby(running)&rdquo;, &ldquo;rel&rdquo;:&ldquo;likes&rdquo;}
]
}</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Pig for batch data analysis over Hadoop</title>
      <link>https://www.mr70.eu/posts/apache-pig-for-batch-data-analysis-over-hadoop/</link>
      <pubDate>Mon, 25 Aug 2014 20:13:24 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-pig-for-batch-data-analysis-over-hadoop/</guid>
      <description><![CDATA[<p><img src="http://hadoop.apache.org/images/hadoop-logo.jpg" alt=""> In these days I&rsquo;m playing with <a href="http://pig.apache.org/">Apache Pig</a> for running data analysis over <a href="http://hadoop.apache.org/">Apache Hadoop</a>. Below a sample wordcloud generated from the top word count of nouns of the Italian translation of the Bible <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2014/08/la-sacra-bibbia-frequenza-parole.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2014/08/la-sacra-bibbia-frequenza-parole.png" alt="la-sacra-bibbia-frequenza-parole"></a>Copy the file book.txt to hadoop distribuited file system (HDFS) with<code>hadoop-2.4.0/bin/hdfs dfs -copyFromLocal -f book.txt</code>Test the pig job locally with<code>pig-0.13.0/bin/pig -x local wordcount.pig</code>Run the pig job in hadoop with<code>pig-0.13.0/bin/pig -x mapreduce wordcount.pig</code>Look at results with<code>hadoop-2.4.0/bin/hdfs dfs -cat book-wordcount/part\*|more</code>Copy the results to a local file with<code>hadoop-2.4.0/bin/hdfs dfs -cat book-wordcount/part\* &gt; frequenza-parole-bibbia.txt</code>  Below the two scripts I used for this short tutorial: Wordcount (pig script):<code>a = load '/user/matteo/book.txt'; b = foreach a {         line = LOWER(REPLACE((chararray)$0, '\[!?\\\\.»«:;,\\'\]', ' '));     generate flatten(TOKENIZE(line)) as word; } c = group b by word; d = foreach c generate group, COUNT(b) as cnt; d\_ordered = ORDER d BY cnt DESC; store d\_ordered into '/user/matteo/book-wordcount';</code>  Wordcloud (<a href="http://www.r-project.org/">R</a> script)```
library(wordcloud)
p = read.table(file=&ldquo;frequenza-parole-bibbia.txt&rdquo;)
png(&quot;/home/matteo/la-sacra-bibbia-frequenza-parole.png&quot;, width=900, height=900)
wordcloud(p$V1, p$V2, scale=c(8,.3),min.freq=2,max.words=200, random.order=T, rot.per=.15)
dev.off()</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Developing applications with a microservice architecture</title>
      <link>https://www.mr70.eu/posts/developing-applications-with-a-microservice-architecture/</link>
      <pubDate>Sat, 09 Aug 2014 19:14:39 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/developing-applications-with-a-microservice-architecture/</guid>
      <description><![CDATA[<p><img src="http://martinfowler.com/articles/microservices/images/sketch.png" alt=""> &ldquo;The microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery.&rdquo; Read the full <a href="http://martinfowler.com/articles/microservices.html">article</a> <img src="https://raw.githubusercontent.com/matteoredaelli/twitter-api-ws/master/doc/microservices-clojure.png" alt="">   This is my first sample microservices written in <a href="http://clojure.org/">clojure</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Free Online Timeseries forecasting tool</title>
      <link>https://www.mr70.eu/posts/free-online-timeseries-forecasting-tool/</link>
      <pubDate>Sat, 09 Aug 2014 11:59:44 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/free-online-timeseries-forecasting-tool/</guid>
      <description><![CDATA[<p><img src="https://raw.githubusercontent.com/matteoredaelli/predictoR/master/doc/predictoR-1.png" alt=""> An Online demo for the Opensource tool (<a href="https://github.com/matteoredaelli/predictoR">predictoR</a> based on <a href="http://ltp.googlecode.com/">ltp R library</a>) about forecasting / long term prediction of time series (any periods: daily, weekly, monthly, semesters, yearly,..) is available at <a href="http://rapid.tips/">rapid.tips</a>! <img src="https://raw.githubusercontent.com/matteoredaelli/predictoR/master/doc/predictoR-2.png" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Docker: moving datacenters/apps from Virtual Machines to containers</title>
      <link>https://www.mr70.eu/posts/docker-moving-datacentersapps-from-virtual-machines-to-containers/</link>
      <pubDate>Mon, 04 Aug 2014 19:02:23 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/docker-moving-datacentersapps-from-virtual-machines-to-containers/</guid>
      <description><![CDATA[<p><a href="http://www.zdnet.com/what-is-docker-and-why-is-it-so-darn-popular-7000032269/"><img src="http://cdn-static.zdnet.com/i/r/story/70/00/032269/docker-vm-container-620x350.png?hash=AmVjAGDlAG&amp;upscale=1" alt=""></a></p>
<p><a href="https://www.docker.com/">&ldquo;Docker</a>, a new container technology, is hotter than hot because it makes it possible to get far more apps running on the same old servers and it also makes it very easy to package and ship programs&hellip;&rdquo; Read the full article at <a href="http://www.zdnet.com/what-is-docker-and-why-is-it-so-darn-popular-7000032269/">zdnet.com</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>#Cascading will support Apache #Tez, #Apache #Spark and Apache #Storm</title>
      <link>https://www.mr70.eu/posts/cascading-will-support-apache-tez-apache-stark-and-apache-storm/</link>
      <pubDate>Mon, 19 May 2014 19:51:27 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/cascading-will-support-apache-tez-apache-stark-and-apache-storm/</guid>
      <description><![CDATA[<p><img src="http://www.cascading.org/wp-content/themes/element-child/images/logo-projects.png" alt=""> In these nights I&rsquo;m playing with <a href="http://cascalog.org/">Cascalog</a>. for running (<a href="http://wiki.apache.org/hadoop/MapReduce">map reduce</a>) jobs over <a href="http://hadoop.apache.org/">Hadoop</a>. A nice news for the future is that &ldquo;<a href="http://www.cascading.org">Cascading</a> 3.0 will initially ship with support for: local in-memory, Apache MapReduce (support for both <a href="http://hadoop.apache.org/">Hadoop</a> 1 and 2 are provided), and <a href="http://www.redaelli.org/matteo-blog/2014/03/12/apache-tez-for-hadoop-2-0/">Apache Tez</a>. Soon thereafter, with community support, <a href="http://spark.apache.org/">Apache Spark</a>™, <a href="http://storm.incubator.apache.org/">Apache Storm</a> and others will be supported through its new pluggable and customizable planner[&hellip;]&rdquo;. Read the full <a href="http://www.infoq.com/news/2014/05/driven">InfoQ article</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Top twitter users statistics</title>
      <link>https://www.mr70.eu/posts/top-twitter-users-statistics/</link>
      <pubDate>Tue, 13 May 2014 19:36:09 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/top-twitter-users-statistics/</guid>
      <description><![CDATA[<p>Starting collecting statistics about top (suggested) twitter users at site <a href="http://top-twitter-users.blogspot.it/">http://top-twitter-users.blogspot.it/</a></p>
<ul>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/sport-statistiche-aprile-2014.html">sport: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/satira-statistiche-aprile-2014.html">satira: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/parlano-di-twitter-statistiche-aprile.html">parlano-di-twitter: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/club-della-serie-tim-statistiche-aprile.html">club-della-serie-a-tim: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/calciatori-statistiche-aprile-2014.html">calciatori: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/scienza-tecnologia-statistiche-aprile.html">scienza-tecnologia: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/programmi-tv-statistiche-aprile-2014.html">programmi-tv: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/spettacolo-statistiche-aprile-2014.html">spettacolo: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/arte-moda-design-statistiche-aprile-2014.html">arte-moda-design: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/governo-istituzioni-statistiche-aprile.html">governo-istituzioni: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/musica-statistiche-aprile-2014.html">musica: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/notizie-statistiche-aprile-2014.html">notizie: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/non-profit-statistiche-aprile-2014.html">non-profit: statistiche aprile 2014</a></li>
<li><a href="http://top-twitter-users.blogspot.it/2014/05/politica-statistiche-aprile-2014.html">politica: statistiche aprile 2014</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Statistiche politici italiani su twitter - aprile 2014</title>
      <link>https://www.mr70.eu/posts/statistiche-politici-italiani-su-twitter-aprile-2014/</link>
      <pubDate>Tue, 13 May 2014 19:33:01 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/statistiche-politici-italiani-su-twitter-aprile-2014/</guid>
      <description><![CDATA[<p><img src="https://pbs.twimg.com/profile_images/378800000815181566/3ed24dbf3c8db3319bb77f0a55f00337_normal.jpeg" alt=""><img src="https://pbs.twimg.com/profile_images/378800000575331911/24c0e7d00b3cfd5bd6aa4fe7b7ae607a_normal.jpeg" alt=""><img src="https://pbs.twimg.com/profile_images/378800000505734500/3a64ac8fb3b5103d49b7823f8c590728_normal.jpeg" alt=""></p>
<p>Dettagli al sito <a href="http://politici-italiani-sul-web.blogspot.it/2014/05/statistiche-twitter-aprile-2014.html" title="http://politici-italiani-sul-web.blogspot.it">http://politici-italiani-sul-web.blogspot.it/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Politici italiani su twitter - marzo 2014</title>
      <link>https://www.mr70.eu/posts/politici-italiani-su-twitter-marzo-2014/</link>
      <pubDate>Wed, 02 Apr 2014 21:09:34 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/politici-italiani-su-twitter-marzo-2014/</guid>
      <description><![CDATA[<p>Playing with <a href="http://cran.r-project.org/">R</a>, I extracted some data from twitter regarding Italian politicians. See the report of <a href="http://www.redaelli.org/politici-italiani/2014/politici-italiani-twitter-2014-03.html" title="report Politici italiani su twitter marzo 2014">Politici Italiani su twitter marzo 2014</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Tez for Hadoop &gt;= 2.0</title>
      <link>https://www.mr70.eu/posts/apache-tez-for-hadoop-2-0/</link>
      <pubDate>Wed, 12 Mar 2014 16:19:16 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-tez-for-hadoop-2-0/</guid>
      <description><![CDATA[<p><a href="http://hortonworks.com/hadoop/tez/"><img src="http://hortonworks.com/wp-content/uploads/2013/10/hadoopstack.png" alt=""></a> The <a href="http://tez.incubator.apache.org/"><strong>Apache Tez</strong></a> project is aimed at building an application framework which allows for a complex directed-acyclic-graph of tasks for processing data. It is currently built atop <a href="http://hadoop.apache.org/">Apache Hadoop</a> <a href="http://hortonworks.com/hadoop/yarn/">YARN</a>. The 2 main design themes for Tez are:</p>
<ul>
<li>Empowering end users by:</li>
</ul>
<blockquote>
<ul>
<li>Expressive dataflow definition APIs</li>
<li>Flexible Input-Processor-Output runtime model</li>
<li>Data type agnostic</li>
<li>Simplifying deployment</li>
</ul>
</blockquote>
<ul>
<li>Execution Performance
<ul>
<li>Performance gains over Map Reduce</li>
<li>Optimal resource management</li>
<li>Plan reconfiguration at runtime</li>
<li>Dynamic physical data flow decisions</li>
</ul>
</li>
</ul>
<p><a href="http://tez.incubator.apache.org/"><img src="http://tez.incubator.apache.org/images/PigHiveQueryOnTez.png" alt=""></a> Old way was: <img src="http://tez.incubator.apache.org/images/PigHiveQueryOnMR.png" alt=""> References:</p>
<ul>
<li><a href="http://tez.incubator.apache.org/">http://tez.incubator.apache.org/</a></li>
<li><a href="http://hortonworks.com/hadoop/tez/">http://hortonworks.com/hadoop/tez/</a></li>
<li><a href="http://hadoop.apache.org/">http://hadoop.apache.org/</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>#Hadoop : lift = #Storm : escalator</title>
      <link>https://www.mr70.eu/posts/hadoop-lift-storm-escalator/</link>
      <pubDate>Sun, 16 Feb 2014 20:14:14 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hadoop-lift-storm-escalator/</guid>
      <description><![CDATA[<p><a href="http://hadoop.apache.org/">Apache Hadoop</a> is not good for realtime computing: please evaluate <a href="http://storm.incubator.apache.org/">Apache Storm</a> (from twitter) or <a href="http://spark.incubator.apache.org/">Apache Spark</a></p>
<p><a href="http://www.slideshare.net/edvorkin/storm-intro-v8"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2014/02/storm-vs-hadoop.png" alt="storm-vs-hadoop"></a></p>
<p>References:</p>
<p><a href="http://www.slideshare.net/edvorkin/storm-intro-v8">http://www.slideshare.net/edvorkin/storm-intro-v8</a></p>
<p><a href="http://www.infoq.com/news/2014/01/Spark-Storm-Real-Time-Analytics">http://www.infoq.com/news/2014/01/Spark-Storm-Real-Time-Analytics</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>#Hadoop 1.X : @Cloudera = #Hadoop 2.X : @Hortonworks</title>
      <link>https://www.mr70.eu/posts/hadoop-1-x-cloudera-hadoop-2-x-hortonworks/</link>
      <pubDate>Sat, 15 Feb 2014 17:19:52 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hadoop-1-x-cloudera-hadoop-2-x-hortonworks/</guid>
      <description><![CDATA[<p><a href="http://hortonworks.com"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2014/02/hadoop22.png" alt="hadoop22"></a></p>
<p><a href="http://hortonworks.com">Hortonworks.com</a></p>
<p><a href="http://www.cloudera.com"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2014/02/cloudera-hadoop.png" alt="cloudera-hadoop"></a></p>
<p><a href="http://www.cloudera.com">cloudera.com</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>dump_tweets.R a tool for saving tweets and user data to a database</title>
      <link>https://www.mr70.eu/posts/dump_tweets-r-a-tool-for-saving-tweets-and-data-to-a-database/</link>
      <pubDate>Mon, 20 Jan 2014 19:57:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dump_tweets-r-a-tool-for-saving-tweets-and-data-to-a-database/</guid>
      <description><![CDATA[<p><a href="https://github.com/matteoredaelli/dump_tweets.R"><img src="http://blogs.knoxnews.com/woodbery/assets_c/2013/01/twitter-logo-bird-thumb-275x251-26039.gif" alt=""></a>   <a href="https://github.com/matteoredaelli/dump_tweets.R">dump_tweets.R</a> is a tool for  searching tweets and (recursively) crawl users from twitter: Data are then saved to a MySQL database and can finally be exported to .RData files dump_tweets.R is sponsorized by <a href="http://associazionerospo.org">Associazione Rospo</a>       Example:</p>
<p>Rscript search.R -q &ldquo;#opensource&rdquo;</p>
<p>2014-01-20 20:53:43 INFO::Connecting to TWITTER&hellip; 2014-01-20 20:53:43 INFO::Connecting to database=twitter, host=localhost with user=root 2014-01-20 20:53:43 INFO::using UTF8 code 2014-01-20 20:53:43 INFO::Searching for q=#opensource, sinceID=0 2014-01-20 20:53:57 INFO::Found 191 tweets 2014-01-20 20:53:57 INFO::maxID=425355265857187841 2014-01-20 20:53:57 INFO::Saving data to tweet table&hellip; 2014-01-20 20:53:58 INFO::saving data to search_results table&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Retreiving and analyzing Facebook data with R</title>
      <link>https://www.mr70.eu/posts/retreiving-and-analyzing-facebook-data-with-r/</link>
      <pubDate>Thu, 21 Nov 2013 20:17:46 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/retreiving-and-analyzing-facebook-data-with-r/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/11/network_plot.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/11/network_plot.png" alt="network_plot"></a>As suggested by <a href="http://thinktostart.wordpress.com/2013/11/19/analyzing-facebook-with-r/">Julianhi&rsquo;s Blog post</a>, I installed the <a href="http://cran.stat.unipd.it/web/packages/available_packages_by_name.html">CRAN</a> <strong><a href="http://cran.r-project.org/web/packages/Rfacebook/index.html">Rfacebook</a></strong> package for the <a href="http://www.r-project.org/">R statistical environment</a> and I created a sample <a href="http://igraph.sourceforge.net/">igraph</a> with 20 of my &ldquo;facebook friends&rdquo;</p>
<p>## See examples for fbOAuth to know how token was created.</p>
<p>## Getting my network of friends</p>
<p>load(&ldquo;fb_oauth&rdquo;)</p>
<p>mat &lt;- getNetwork(token=fb_oauth, format=&ldquo;adj.matrix&rdquo;)</p>
<p>library(igraph)</p>
<p>network &lt;- graph.adjacency(mat, mode=&ldquo;undirected&rdquo;)</p>
<p>pdf(&ldquo;network_plot.pdf&rdquo;)</p>
<p>plot(network)</p>
<h2 id="devoff">dev.off()</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="https://jbovnd.com/" title="aja.stonham@gmail.com">Jbovnd</a> - <!-- raw HTML omitted -->Dec 0, 2019<!-- raw HTML omitted --></p>
<p>I do agree with all of the ideas you&rsquo;ve offered to your post. They are really convincing and will definitely work. Still, the posts are very short for novices. May just you please prolong them a little from next time? Thank you for the post.</p>
<!-- raw HTML omitted -->
<p>Hi there We are so thrilled I discovered yopur website, I definitely found you by error, while I was searching Yahoo for somethhing otherwise, Anyhow I amm below now and would simply like to ssay many thanks for a tremendous article and an all circular exciting blog (I furthdrmore love the theme/design), I actually don&rsquo;t have time to be able to proceed through it all from the minute but My partner and i have saved it as well as added in yoiur RSS OR ATOM feeds, then when I pssess time I will get returning to read more, Remember to do carry on thhe amazikng job.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>State of Linux Development 2013</title>
      <link>https://www.mr70.eu/posts/state-of-linux-development-2013/</link>
      <pubDate>Thu, 21 Nov 2013 15:56:10 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/state-of-linux-development-2013/</guid>
      <description><![CDATA[<p><img src="https://pbs.twimg.com/media/BZi-fN3CQAAOmqG.png:large" alt=""></p>
<p>From twitter @linuxfondation account</p>
<p>10,000 developers from 1,000 companies have contributed to <a href="https://twitter.com/search?q=%23Linux&amp;src=hash">#<strong>Linux</strong></a> since 2005.</p>
<p>Are you one of them? <a href="http://t.co/6BIUgKDhnM">pic.twitter.com/6BIUgKDhnM</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto unlock Alice Gate VoIP router</title>
      <link>https://www.mr70.eu/posts/howto-unlocking-alice-gate-voip-router/</link>
      <pubDate>Wed, 25 Sep 2013 20:43:28 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-unlocking-alice-gate-voip-router/</guid>
      <description><![CDATA[<p><img src="http://www.p2warticles.com/wp-content/uploads/2012/04/alice-gate-voip-2-plus-wifi.jpg" alt=""></p>
<p>Following the suggestions from <a href="http://www.p2warticles.com/2012/04/menu-avanzato-telnet-alice-wifi-voip-2-plus/">http://www.p2warticles.com/2012/04/menu-avanzato-telnet-alice-wifi-voip-2-plus/</a> I unlocked my Pirelli Broadband Solutions / Telecom Italia Alice Gate VoIP router <strong>agpf_4.5.2</strong> with the following steps 1) downloading the backdoor tool (for linux and windows) 2) generating the payload using the mach address of my router</p>
<p>matteo@debian:~/backdoor_agpf_4.5.2$ ./backdoor 18:12:2S:E1:A1:B1</p>
<ol start="3">
<li>sending the payload to my router with the linux command (p=XXX where XXX is the payload previously generated)</li>
</ol>
<p>mz -v eth0 -d 0 -t ip &ldquo;proto=255,p=3a:b8:69:57:b6:6c:2a:a1&rdquo;</p>
<p> After these few steps I was able to login via telnet to my router with the account admin/riattizzati and going on&hellip; <a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/09/admin-menu.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/09/admin-menu.png" alt="admin-menu"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Google guides of R</title>
      <link>https://www.mr70.eu/posts/google-guides-of-r/</link>
      <pubDate>Wed, 31 Jul 2013 14:07:16 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/google-guides-of-r/</guid>
      <description><![CDATA[<p>Here you can find google lessons about <a href="http://www.r-project.org/">R</a> statistical language [youtube]http://www.youtube.com/watch?v=YhQOV27pQfg&amp;list=PLOU2XLYxmsIK9qQfztXeybpHvru-TrqAP[/youtube]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>How to Use Hadoop with your SAP Software Landscape</title>
      <link>https://www.mr70.eu/posts/how-to-use-hadoop-with-your-sap-software-landscape/</link>
      <pubDate>Wed, 31 Jul 2013 14:04:08 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/how-to-use-hadoop-with-your-sap-software-landscape/</guid>
      <description><![CDATA[<p><img src="http://de.sap.info/wp-content/uploads/2012/11/powered-by-SAP-HANA.jpg" alt=""></p>
<p>CIO Guide on Big Data “<a href="http://www.saphana.com/docs/DOC-3777">How to Use Hadoop with your SAP Software Landscape</a>” just released</p>
<p><img src="http://hadoop.apache.org/images/hadoop-logo.jpg" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>FirefoxOS on my Sony Xperia Live with Walkman (LWW)</title>
      <link>https://www.mr70.eu/posts/firefoxos-on-my-sony-xperia-live-with-walkman/</link>
      <pubDate>Tue, 30 Jul 2013 19:13:17 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/firefoxos-on-my-sony-xperia-live-with-walkman/</guid>
      <description><![CDATA[<p><img src="http://4.bp.blogspot.com/-KWnbBNGwA0g/UeDwmeaO_JI/AAAAAAAAT14/O3Z29WMYji4/s1600/1.png" alt=""></p>
<p>[update 2013-11-06] how to install <a href="http://www.mozilla.org/en-US/firefox/os/">FireFoxOS</a> 1.3</p>
<p>Unlock your phone,</p>
<p>download &ldquo;flashtool&rdquo; tool</p>
<p>download latest FireFoxOS build from <a href="http://forum.xda-developers.com/showthread.php?t=2422687">here</a></p>
<p>flash boot.img included in the zip</p>
<p>copy the zip to the sdcard</p>
<p>boot in recovery mode and flash the zip</p>
<p>good lucks&hellip; ;-)</p>
<p>-&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;-</p>
<p>First look at <strong><a href="http://www.mozilla.org/en-US/firefox/os/">FirefoxOS</a></strong> on my <strong>Sony XPERIA 2011 Live With Walkman</strong> (LWW, wt19i, coconut) following suggestions from</p>
<p><a href="http://www.galaxy4gaming.in/2013/07/firefox-os-for-xperia-2011-mini-and.html">http://www.galaxy4gaming.in/2013/07/firefox-os-for-xperia-2011-mini-and.html</a></p>
<p>See also</p>
<p><a href="http://forum.xda-developers.com/showthread.php?p=43803195">http://forum.xda-developers.com/showthread.php?p=43803195</a></p>
<p><img src="http://developer-static.se-mc.com/wp-content/blogs.dir/1/files/2013/02/FFOS_arch.jpg" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Dump_tweets.R: how to collect interesting tweets</title>
      <link>https://www.mr70.eu/posts/dump_tweets-r-how-to-collect-interesting-tweets/</link>
      <pubDate>Sat, 06 Jul 2013 08:45:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/dump_tweets-r-how-to-collect-interesting-tweets/</guid>
      <description><![CDATA[<p>Do you need a simple <a href="http://www.r-project.org/">R</a> script for incremental downloading all tweets related an hashtag (or any words) and saving them to a database? If yes, look at <a href="https://github.com/matteoredaelli/dump_tweets.R">dump_tweets.R</a> project: feel free to clone my repository and push any fixes or new features Usage:</p>
<p>./dump_tweets.R &ndash;db /var/www/dump_tweets.R &ndash;add mysearches.csv</p>
<p>./dump_tweets.R &ndash;db /var/www/dump_tweets.R &ndash;show</p>
<p>./dump_tweets.R &ndash;db /var/www/dump_tweets.R</p>
<p>./dump_tweets.R &ndash;db /var/www/dump_tweets.R &ndash;remove opensource</p>
<p>Enjoy</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>How #ictspring 2013 looks like from Internet</title>
      <link>https://www.mr70.eu/posts/how-ictspring-2013-looks-like-from-internet/</link>
      <pubDate>Wed, 19 Jun 2013 20:56:06 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/how-ictspring-2013-looks-like-from-internet/</guid>
      <description><![CDATA[<p>Looking at tweets of day 1 (2013-06-19) of #<a href="http://www.ictspring.com/">ictspring 2013</a> I see</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/who-retweets-whom2.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/who-retweets-whom2.png" alt="who-retweets-whom2"></a></p>
<p>TOP CONTRIBUTORS<a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/who-retweets-whom2.png"></a><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/top-contributors.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/top-contributors.png" alt="top-contributors"></a></p>
<p>MOST USED DEVICES</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/agents.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/agents.png" alt="agents"></a></p>
<p>GIVEN TOPICS</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/given-topics.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/given-topics.png" alt="given-topics"></a></p>
<p>TWEETS DURING THE DAY</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/tot-tweets.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/tot-tweets.png" alt="tot-tweets"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>R for text mining &amp; twitter</title>
      <link>https://www.mr70.eu/posts/r-for-text-mining-twitter/</link>
      <pubDate>Wed, 12 Jun 2013 20:35:49 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/r-for-text-mining-twitter/</guid>
      <description><![CDATA[<p><img src="https://pbs.twimg.com/media/BMkSHVvCcAAsitU.png:medium" alt="">This is a sample report of topics of tweets related to</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/ddaypirelli-who-retweets-whom2.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2013/06/ddaypirelli-who-retweets-whom2.png" alt="ddaypirelli-who-retweets-whom2"></a></p>
<p>#ddaypirelli  as suggested by <a href="https://sites.google.com/site/miningtwitter/">miningtwitter</a> website using the <a href="http://www.r-project.org/">R statistical</a> environment and some of its <a href="http://cran.r-project.org/">thousands libraries</a></p>
<p><img src="https://pbs.twimg.com/media/BMj33OpCEAAoOcT.png:medium" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto Install Android 4.4.2 to my Sony Live with walkman wt19i</title>
      <link>https://www.mr70.eu/posts/howto-install-android-4-2-2-to-my-sony-live-with-walkman-wt19i/</link>
      <pubDate>Mon, 10 Jun 2013 20:04:36 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-install-android-4-2-2-to-my-sony-live-with-walkman-wt19i/</guid>
      <description><![CDATA[<p><img src="http://wiki.cyanogenmod.org/images/thumb/2/2f/Coconut.png/150px-Coconut.png" alt=""></p>
<p>UPDATES:</p>
<p>2014-03-25: look <a href="http://www.androidlegend.com/sony-live-with-walkman-wt19i-android-4-4-2-kitkat-update-carbon-rom/">here at androidlegend.com</a> for newer <a href="https://carbon-rom.com/">CarbonRom</a> 4.4.2 builds</p>
<p><a href="https://carbon-rom.com/wp-content/uploads/2013/12/Black-on-Trans.png"><img src="https://carbon-rom.com/wp-content/uploads/2013/12/Black-on-Trans.png" alt=""></a></p>
<p>2014-01-04: see <a href="http://legacyxperia.github.io/">http://legacyxperia.github.io</a> for unofficial builds of CyanogenMod 11.0 (<strong>Android 4.4.2</strong>)</p>
<p><a href="http://forum.xda-developers.com/showthread.php?t=2545367"><img src="http://i.imgur.com/2JvwZI4.png" alt=""></a></p>
<p>2013-12-11: see <a href="http://legacyxperia.github.io/">http://legacyxperia.github.io</a> for unofficial builds of CyanogenMod 11.0 (<strong>Android 4.4.1</strong>)</p>
<p>2013-09-01: see <a href="http://legacyxperia.github.io/">http://legacyxperia.github.io</a> for unofficial builds of CyanogenMod 10.2 (<strong>Android 4.3</strong>)  for legacy Sony Ericsson msm7x30 devices. It is an effort to join all developer forces to bring a stable cm-10.1 rom on these devices which are dropped from official CM</p>
<p>-.-.-</p>
<p>ORIGINAL_POST</p>
<p>After installing android tools</p>
<p><a href="http://wiki.cyanogenmod.org/w/Doc:_adb_intro">adb</a> and <a href="http://wiki.cyanogenmod.org/w/Doc:_fastboot_intro">fastboot</a></p>
<p>on my Linux desktop,</p>
<p>I installed Android 4.2.2 (<a href="http://www.cyanogenmod.org/">Cyanogenmod</a> distribution) following the steps suggested by the article</p>
<p><a href="http://www.androidgadgematic.com/2012/12/install-sony-live-with-walkman-wt19i-android-4-2.html">install-sony-live-with-walkman-wt19i-android-4-2</a></p>
<p>See also <a href="http://wiki.cyanogenmod.org/w/Coconut_Info">Coconut_Info</a></p>
<p>NB: I also tested an other Android distribution (<a href="http://www.paranoid-rom.com/">Paranoid Android</a>),</p>
<p>but I was not able to switch the setting menu from tablet layout to a smartphone layout</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Varnish for speeding up your websites</title>
      <link>https://www.mr70.eu/posts/varnish-for-speeding-up-your-websites/</link>
      <pubDate>Sat, 08 Jun 2013 19:40:20 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/varnish-for-speeding-up-your-websites/</guid>
      <description><![CDATA[<p><img src="https://www.varnish-cache.org/sites/all/themes/varnish_d7/images/banner_1.png" alt=""></p>
<p>&ldquo;Varnish is able to serve objects out of its cache much faster and using far fewer host resources than a web server application..&rdquo;</p>
<p>Read all the interesting article <a href="http://blog.bigdinosaur.org/adventures-in-varnish/">Adventures in Varnish</a></p>
<p><img src="http://blog.bigdinosaur.org/images/blog-title-varnish-adventure.jpg" alt=""></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>How to setup a multi node Hadoop cluster</title>
      <link>https://www.mr70.eu/posts/how-to-setup-a-multi-node-hadoop-cluster/</link>
      <pubDate>Thu, 07 Mar 2013 20:46:58 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/how-to-setup-a-multi-node-hadoop-cluster/</guid>
      <description><![CDATA[<p><img src="http://www.michael-noll.com/blog/uploads/Hadoop-multi-node-cluster-overview.png" alt=""></p>
<p>Read the interesting articles by Michael G. Noll</p>
<p><a href="http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/">Running Hadoop on Ubuntu Linux (Single-Node Cluster)</a></p>
<p><a href="http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/">Running Hadoop on Ubuntu Linux (Multi-Node Cluster)</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Enterprise search in the cloud (Solr &amp; Amazon VPC)</title>
      <link>https://www.mr70.eu/posts/enterprise-search-in-the-cloud-solr-amazon-vpc/</link>
      <pubDate>Wed, 06 Mar 2013 16:33:32 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/enterprise-search-in-the-cloud-solr-amazon-vpc/</guid>
      <description><![CDATA[<p><img src="http://2.bp.blogspot.com/-NKSMzYuxnEU/UTYI0lNYs6I/AAAAAAAAAxs/k5wEfpBr8Y4/s640/Apache+SolrCloud+Implementation+on+Amazon+EC2+AWS+Cloud.jpg" alt=""></p>
<p>&ldquo;Recently [Harish Ganesan] architected a 13+ EC2 Node(s) SolrCloud Shard built in with HA and scalability inside Amazon Virtual Private Cloud. Since the base product engineered had both on-premise and SAAS edition, we were unfortunately not able to use Amazon CloudSearch as it may cause AWS dependency in this case in product tech stack. This Solr architecture was secured using Amazon VPC, Private subnets, Access controls, AWS Security groups and IAM. The SolrCloud cluster was designed to accommodate index data in memory and some search data overflowing to EBS disk. The Cluster was designed to handle ~100 GB of distributed index data and another 200+ GB of Search data on EBS disks. The Web/App tier, Business and Back ground tier will access the SolrCloud deployed in private subnet. In this post I will be sharing my experience, learning, best practice and tips on architecting SolrCloud on AWS platform.&rdquo;</p>
<p>Read the full articles at</p>
<p><a href="http://harish11g.blogspot.in/2013/03/Introduction-Apache-Solrcloud-on-Amazon-EC2-AWS.html">Introduction to Apache SolrCloud on AWS</a></p>
<p><a href="http://harish11g.blogspot.in/2013/03/Apache-Solr-cloud-on-Amazon-EC2-AWS-VPC-implementation-deployment.html">Apache SolrCloud Implementation on Amazon VPC</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Camel: how to collect data from twitter</title>
      <link>https://www.mr70.eu/posts/apache-camel-how-to-collect-data-from-twitter/</link>
      <pubDate>Sat, 29 Dec 2012 22:13:34 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-camel-how-to-collect-data-from-twitter/</guid>
      <description><![CDATA[<p><img src="http://basementcoders.com/wp-content/uploads/2010/08/camel-logo.png" alt=""></p>
<p>In the article <a href="https://docs.google.com/document/d/1m1NrjtnPF5QPd2l4YzPPkrUGja8oZQzrlUGn1_7jlGQ/edit">Apache Camel: how to collect data from twitter</a>,</p>
<p>I&rsquo;ll show howto save all tweets about Pirelli to files in .json format ..</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>R statistical software in the Enterprise</title>
      <link>https://www.mr70.eu/posts/r-statistical-software-in-the-enterprise/</link>
      <pubDate>Thu, 18 Oct 2012 20:57:29 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/r-statistical-software-in-the-enterprise/</guid>
      <description><![CDATA[<p><a href="https://docs.google.com/present/view?id=dfr68gz6_242f9zn26dw"><img src="http://www.r-project.org/Rlogo.jpg" alt="" title="R"></a>I have updated my R presentation with the latest news (about Oracle, SAP, Tibco, teradata, IBM, ..) &hellip; Look at the presentation <a href="https://docs.google.com/present/view?id=dfr68gz6_242f9zn26dw">An opensource environment and language for statistics </a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Strategico 3.0 released!</title>
      <link>https://www.mr70.eu/posts/strategico-3-0-released/</link>
      <pubDate>Tue, 25 Sep 2012 21:00:32 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/strategico-3-0-released/</guid>
      <description><![CDATA[<p><a href="http://strategico.googlecode.com"><img src="http://strategico.googlecode.com/svn/trunk/doc/strategico-stats.png" alt="" title="forecasting prediction"></a></p>
<p><a href="http://code.google.com/p/strategico/"><img src="http://strategico.googlecode.com/svn/trunk/doc/strategico2.png" alt="" title="Strategico Long Term Prediction"></a></p>
<p><a href="http://code.google.com/p/strategico/">Strategico</a> 3.0 has been released!</p>
<p><strong>Strategico</strong> is an opensource tool for  making **forecasts and Long Term Predictions ** over a (huge) set of <strong>time series</strong></p>
<p>Strategico is written with <a href="http://www.r-project.org/">R</a>, the most famous and used  Statistical programming language</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto quickly setup an interface among systems using Apache Camel / Karaf (OSGI)</title>
      <link>https://www.mr70.eu/posts/howto-quickly-setup-an-interface-among-systems-using-apache-camel-karaf/</link>
      <pubDate>Wed, 25 Jul 2012 18:04:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-quickly-setup-an-interface-among-systems-using-apache-camel-karaf/</guid>
      <description><![CDATA[<p><img src="http://upload.wikimedia.org/wikipedia/commons/9/9c/Apache-camel-logo.png" alt="" title="Apache Camel">In the article <a href="https://docs.google.com/document/d/1oX4RnLWad4b2phlIRluKIZAw9jEakl3Gy61oE1A-AAw/edit">building system integrations with Apache Camel</a> I’ll show how to create in 10 minutes an <strong>integration between two databases</strong> (<strong>without writing any lines of java or c# code</strong>):</p>
<ul>
<li>looking for uses in the database MOODLE (mysql) with missing attributes</li>
<li>for each of that users retreiving the missing attributes from the database UPMS (m$ sql server) and then</li>
<li>adding the missing attributes to the database MOODLE</li>
</ul>
<p>I&rsquo;ll use</p>
<ul>
<li><a href="http://karaf.apache.org/">Apache Karaf</a> 2.2.8</li>
<li><a href="http://camel.apache.org/">Apache Camel</a> 2.10.0</li>
</ul>
<p>under Linux.   Any suggestions and comments are welcome! Matteo</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>London Olympics prediction for the 100m final with R and Strategico</title>
      <link>https://www.mr70.eu/posts/london-olympics-prediction-for-the-100m-final-with-r-and-strategico/</link>
      <pubDate>Mon, 23 Jul 2012 08:03:05 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/london-olympics-prediction-for-the-100m-final-with-r-and-strategico/</guid>
      <description><![CDATA[<p>After reading the interesting article <a href="http://www.r-bloggers.com/london-olympics-and-a-prediction-for-the-100m-final/">London Olympics and a prediction for the 100m final</a>  here you can find an alternative statistical prediction using <a href="http://www.r-project.org/">R</a> and <a href="http://code.google.com/p/strategico/">Strategico</a>. Look at this <a href="https://docs.google.com/spreadsheet/ccc?key=0Ai15RDmCj2SsdF9uLWc2MHhUV0pkY0tNS09GX2F6anc">excel</a> for details <img src="https://docs.google.com/spreadsheet/oimg?key=0Ai15RDmCj2SsdF9uLWc2MHhUV0pkY0tNS09GX2F6anc&amp;oid=1&amp;zx=f5hlwh1v5d3b" alt="" title="olympics prediction 100m final"></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using curl for querying Active Directory / LDAP from command line</title>
      <link>https://www.mr70.eu/posts/using-curl-for-querying-active-directory-ldap-from-command-line/</link>
      <pubDate>Fri, 18 May 2012 10:01:57 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/using-curl-for-querying-active-directory-ldap-from-command-line/</guid>
      <description><![CDATA[<p>For quering Active Directory /LDAP from command line, you can run something like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>curl -u DOMAIN\\\\MYACCOUNT:MYPASSWORD   \\
</span></span><span style="display:flex;"><span> &#34;ldap://dc.redaelli.org:3268/OU=users,DC=redaelli,DC=org?memberOf,sAMAccountName?sub?(sAMAccountName=matteo)&#34;
</span></span></code></pre></div><hr>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="https://hivemined.net" title="docbook.xml@gmail.com">Saqib Ali</a> - <!-- raw HTML omitted -->Dec 1, 2018<!-- raw HTML omitted --></p>
<p>Super thanks for posting this!</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>My first published article SSO Linux Apache Kerberos Active Directory</title>
      <link>https://www.mr70.eu/posts/my-first-published-article-sso-linux-apache-kerberos-active-directory/</link>
      <pubDate>Sun, 22 Apr 2012 09:14:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/my-first-published-article-sso-linux-apache-kerberos-active-directory/</guid>
      <description><![CDATA[<p>You can find my article about Single Sign On, Kerberos and Active Directory in the last number of <a href="http://www.oltrelinux.com/2012/04/20/linuxc-76-in-edicola/">Linux&amp;C</a></p>
<p><a href="http://www.oltrelinux.com/2012/04/20/linuxc-76-in-edicola/"><img src="http://www.oltrelinux.com/wp-content/uploads/LC76_DVD_DEF_001.jpg" alt="" title="Single SIgn On"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>After Oracle also SAP has discovered and integrated R</title>
      <link>https://www.mr70.eu/posts/after-oracle-also-sap-has-discovered-and-integrated-r/</link>
      <pubDate>Sun, 18 Mar 2012 20:06:15 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/after-oracle-also-sap-has-discovered-and-integrated-r/</guid>
      <description><![CDATA[<p>After Oracle with <a href="http://www.oracle.com/technetwork/database/options/advanced-analytics/r-enterprise/index.html">Oracle R Enterprise</a>, now also <a href="http://www.slideshare.net/JitenderAswani/na-6693-r-and-sap-hana-dkom-jitenderaswanijensdoeprmund">SAP has adopted R</a>: SAP HANA provides in-database analytics based on R with its SAP BusinessObjects Predictive Analysis module. For more info about R, please get a look at this <a href="https://docs.google.com/present/view?id=dfr68gz6_242f9zn26dw&amp;revision=_latest&amp;start=0&amp;theme=blank&amp;cwj=true">R introduction</a>&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Sentiment analysis of Tyre competitors from Twitter and R</title>
      <link>https://www.mr70.eu/posts/sentimental-analysis-of-tyre-competitors-from-twitter-and-r/</link>
      <pubDate>Sun, 12 Feb 2012 17:00:19 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/sentimental-analysis-of-tyre-competitors-from-twitter-and-r/</guid>
      <description><![CDATA[<p>Below a simple example of sentiment analyis of tweets about tyre competitors. Notes:</p>
<ul>
<li>x-axes=positive tweets</li>
<li>y-axes=negative tweets</li>
<li>positive and negative words: Hu and Liu’s “opinion lexicon” categorizes nearly 6,800 words as positive or negative and were downloaded from Bing Liu’s web site: <a href="http://www.cs.uic.edu/~liub/FBS/opinion-lexicon-English.rar">http://www.cs.uic.edu/~liub/FBS/opinion-lexicon-English.rar</a></li>
<li>only more positive and worst negative tweets are collected</li>
</ul>
<p><a href="https://github.com/matteoredaelli/twitter-r-utils"><img src="https://github.com/matteoredaelli/twitter-r-utils/raw/master/output/scatter.png" alt="" title="Tyre competitors"></a><a href="https://github.com/matteoredaelli/twitter-r-utils/"><img src="https://github.com/matteoredaelli/twitter-r-utils/raw/master/output/score.png" alt="" title="tyre competitors"></a> The code can be found <a href="https://github.com/matteoredaelli/twitter-r-utils">here</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Happy new year 2012 with R</title>
      <link>https://www.mr70.eu/posts/happy-new-year-2012-with-r/</link>
      <pubDate>Sat, 24 Dec 2011 18:07:55 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/happy-new-year-2012-with-r/</guid>
      <description><![CDATA[<p> </p>
<p><a href="http://yihui.name/en/2011/01/happy-new-year-with-r-2011-fireworks/"><img src="http://yihui.name/en/wp-content/uploads/2011/01/fireworks-in-R-2011.gif" alt="">http://yihui.name/en/2011/01/happy-new-year-with-r-2011-fireworks/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>The 10 Most Important Open Source Projects of 2011</title>
      <link>https://www.mr70.eu/posts/the-10-most-important-open-source-projects-of-2011/</link>
      <pubDate>Mon, 19 Dec 2011 20:13:22 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/the-10-most-important-open-source-projects-of-2011/</guid>
      <description><![CDATA[<p><img src="https://www.linux.com/images/stories/hadoop.jpg" alt="" title="hadoop"></p>
<p><a href="http://hadoop.apache.org/">Hadoop</a></p>
<p><a href="http://git-scm.com/">Git</a></p>
<p><a href="http://cassandra.apache.org/">Cassandra</a></p>
<p><a href="http://www.libreoffice.org/">LibreOffice</a></p>
<p><a href="http://openstack.org/">OpenStack</a></p>
<p><a href="http://jquery.com/">Jquery</a></p>
<p><a href="http://nginx.org/">Nginx</a></p>
<p><a href="http://nodejs.org/">Node.js</a></p>
<p><a href="http://puppetlabs.com/">Puppet</a></p>
<p>See original <a href="https://www.linux.com/news/featured-blogs/196-zonker/524082-the-10-most-important-open-source-projects-of-2011Did">post</a> at linux.com</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>SAP OpenSource NOSQL MongoDB</title>
      <link>https://www.mr70.eu/posts/sap-opensource-nosql-mongodb/</link>
      <pubDate>Sat, 08 Oct 2011 12:03:29 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/sap-opensource-nosql-mongodb/</guid>
      <description><![CDATA[<p><strong>MongoDB Selected as the Core Content Management Component of SAP&rsquo;s Platform-as-a-Service (PaaS) Offering</strong> &ldquo;MongoDB&rsquo;s Flexibility and Scalability Will Enable SAP to Scale Its Content Management Service on Its PaaS to Meet Customer Demand While Managing Data From Different Applications&rdquo; Read the full <a href="http://www.marketwatch.com/story/mongodb-selected-as-the-core-content-management-component-of-saps-platform-as-a-service-paas-offering-2011-09-15">marketWatch article</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Oracle Opensource NoSQL Hadoop R</title>
      <link>https://www.mr70.eu/posts/oracle-nosql-hadoop-r/</link>
      <pubDate>Sat, 08 Oct 2011 10:01:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/oracle-nosql-hadoop-r/</guid>
      <description><![CDATA[<p><strong>Oracle&rsquo;s comprehensive big data strategy includes NoSQL, Hadoop, and R analytics</strong> &ldquo;Oracle&rsquo;s planned distribution of the open-source R statistical environment will be adapted for use on large-scale data within the Oracle database, rather than on desktops and laptops where analysts typically use the software. Oracle R Enterprise will run existing R applications and it will use the R client directly against data stored in Oracle Database 11g. This will vastly increase scalability, performance, and security, according to Oracle, along with the promise of software support. Oracle will ship the open-source distribution along with Linux. Separate R packages with database-specific extensions for Oracle 11g will be bundled with that database&rdquo;. Taken from an <a href="http://www.informationweek.com/news/software/info_management/231700205">Informationweek article</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Are you a good programmer?</title>
      <link>https://www.mr70.eu/posts/are-you-a-good-programmer/</link>
      <pubDate>Sat, 20 Aug 2011 06:24:14 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/are-you-a-good-programmer/</guid>
      <description><![CDATA[<p><img src="http://techiferous.com/wp-content/uploads/2011/08/philosopher.png" alt="" title="http://techiferous.com/wp-content/uploads/2011/08/philosopher.png"><img src="http://techiferous.com/wp-content/uploads/2011/08/inventor.png" alt="" title="http://techiferous.com/wp-content/uploads/2011/08/inventor.png">I have just read a funny article about the kind of good programmers at <a href="http://techiferous.com/2011/08/are-you-a-good-programmer/">techiferous.com</a>: the philosopher, the inventor, the conqueror, the problem solver..</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Twitter data mining with R: generating wordclouds</title>
      <link>https://www.mr70.eu/posts/wordclouds-of-tweets-with-r/</link>
      <pubDate>Mon, 01 Aug 2011 20:06:48 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/wordclouds-of-tweets-with-r/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2011/08/linux.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2011/08/linux.png" alt="" title="linux"></a>This image is a sample <strong>Word cloud</strong> about <strong>tweets</strong> related to the word <strong>linux</strong>. It was generated with <strong>R</strong> (see source code <a href="https://github.com/matteoredaelli/twitter-r-utils">twitter-r-utils</a>) following the examples from:</p>
<ul>
<li><a href="http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/">text data ming with Twitter and R</a></li>
<li><a href="http://onertipaday.blogspot.com/2011/07/word-cloud-in-r.html">wordcloud in R</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache Solr the opensource Enterprise Search Engine</title>
      <link>https://www.mr70.eu/posts/apache-solr-the-opensource-enterprise-search-engine/</link>
      <pubDate>Fri, 15 Jul 2011 20:56:11 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-solr-the-opensource-enterprise-search-engine/</guid>
      <description><![CDATA[]]></description>
      
    </item>
    
    
    
    <item>
      <title>Aboliamo le province, più potere alle regioni!</title>
      <link>https://www.mr70.eu/posts/aboliamo-le-province-piu-potere-alle-regioni/</link>
      <pubDate>Sun, 10 Jul 2011 18:39:07 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/aboliamo-le-province-piu-potere-alle-regioni/</guid>
      <description><![CDATA[<p><img src="http://www.idvpiceno.it/wp-content/uploads/2011/06/Italia-per-regioni-e-provincie.gif" alt="">Riduciamo i costi della politica italiana abolendo le province e dando alle regioni le competenze che oggi spettano alle province!  Di cosa si occupano le province oltre che manutenere le strade provinciali?</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Moodle 2.1 released!</title>
      <link>https://www.mr70.eu/posts/moodle-2-1-released/</link>
      <pubDate>Thu, 07 Jul 2011 19:26:08 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/moodle-2-1-released/</guid>
      <description><![CDATA[<p><img src="http://moodle.org/pluginfile.php/51/mod_forum/post/785432/moodle-2.1.jpg" alt="" title="Moodle"> &ldquo;<a href="http://www.moodle.org">Moodle</a> is a software package for producing Internet-based courses and web sites. It is a global development project designed to support a social constructionist framework of education. Moodle is provided freely as Open Source software (under the GNU Public License).&rdquo; [from <a href="http://docs.moodle.org/20/en/About_Moodle">About_Moodle</a>] &ldquo;You can read more on the <a href="http://docs.moodle.org/dev/Moodle_2.1_release_notes">Moodle 2.1 release notes</a>, but the major new features are:</p>
<ul>
<li>A whole new question engine (used by quizzes, for example), which makes questions more robust and will enable developers to create all kinds of interesting question types in the future. Some interesting new features like Certainty-Based Marking have also been added. Huge thanks are due to Tim Hunt and Open University for all their work on this.</li>
<li>Restoring of Moodle 1.9 backups is now possible! Thanks to Moodlerooms for their help in some of the key parts of the core work and to the HQ team for the rest. This was a very complex thing to build due to the many changes between 1.9 and 2.x. Note that only course content in core modules is restored: if you use other activity modules then you need to ask (or help) the developers of those modules to add the new module restore code (thanks to the design this is not a huge task to implement).</li>
<li>Moodle 2.1 now directly supports mobile apps for some functions. The new Moodle app for iPhone (by Moodle HQ) will be released soon (followed by an Android version later) and these require the secure web services of Moodle 2.1 or later. In addition, there is direct support for mobile-specific Moodle Themes and automatic detection of mobile browsers.</li>
<li><a href="http://docs.moodle.org/dev/Moodle_2.0_release_notes">Moodle 2.0 Release notes</a></li>
</ul>
<p>  There are many other smaller improvements too, but one of the ones I really like is the new and improved configuration interface for blocks. You should find it a lot easier to understand than the one in Moodle 2.0.&rdquo; [from <a href="http://moodle.org/news/">Moodle News</a>]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Digital Identity Mapping: where are you?</title>
      <link>https://www.mr70.eu/posts/digital-identity-mapping-where-are-you/</link>
      <pubDate>Sat, 11 Jun 2011 06:13:07 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/digital-identity-mapping-where-are-you/</guid>
      <description><![CDATA[<p>[caption id=&quot;&quot; align=&ldquo;aligncenter&rdquo; width=&ldquo;500&rdquo; caption=&ldquo;digital identity mapping web 2.0&rdquo;]<img src="http://3.bp.blogspot.com/-ppM7ces8-vg/TdAgdjYlcvI/AAAAAAAAAbQ/xs1C_YkYLcE/s1600/digital_identity_mapping.jpg" alt="" title="digital identity mapping web 2.0">[/caption]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Al via [R]innova di Rante sullo Strategico</title>
      <link>https://www.mr70.eu/posts/al-via-rinnova-di-rante-sullo-strategico/</link>
      <pubDate>Thu, 09 Jun 2011 18:32:01 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/al-via-rinnova-di-rante-sullo-strategico/</guid>
      <description><![CDATA[<p><a href="http://rante.org/2011/06/08/rinnova/" title="[r]innova &amp; rante">&quot;[R]innova</a> vuole essere la prima esperienza di programmazione condivisa per la Web Application Strategico, un progetto open source per l’analisi di serie storiche. L’obiettivo di questa prima edizione di [R]innova è lo sviluppo del layout grafico dei risultati prodotti da <a href="http://www.redaelli.org/matteo-blog/projects/r-strategico/">Strategico</a>&hellip;. Si tratta di un concorso con in palio un <a href="http://rante.org/2011/06/08/rinnova/" title="R &amp; Rante &amp; STrategico">&hellip;&quot;</a> Leggi l&rsquo;articolo sul sito <a href="http://rante.org/2011/06/08/rinnova/">rante.org</a> <a href="http://95.224.253.126/strategico/web/ws.html"><img src="http://rante.org/wp-content/uploads/2011/06/Strategico_Trials1.png" alt="" title="Strategico"></a> See <a href="http://95.224.253.126/strategico/projects/web-ltp/1200/">results</a> of users&rsquo;s tests</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Acqua del rubinetto o in bottiglia?</title>
      <link>https://www.mr70.eu/posts/acqua-del-rubinetto-o-in-bottiglia/</link>
      <pubDate>Wed, 08 Jun 2011 17:43:47 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/acqua-del-rubinetto-o-in-bottiglia/</guid>
      <description><![CDATA[<p>Guardate questo video.. [youtube]http://www.youtube.com/watch?v=3KpbWAAi7n0[/youtube]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Google Predictor API - release 1.2</title>
      <link>https://www.mr70.eu/posts/google-predictor-api-release-1-2/</link>
      <pubDate>Thu, 19 May 2011 19:03:32 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/google-predictor-api-release-1-2/</guid>
      <description><![CDATA[<p>The <a href="http://googlecode.blogspot.com/2011/05/google-prediction-api-helps-all-apps-to.html">Google Predictor API</a> V1.2 is out! &ldquo;The Prediction API provides pattern-matching and machine learning capabilities. Given a set of data examples to train against, you can create applications that can perform the following tasks:</p>
<ul>
<li>Given a user&rsquo;s past viewing habits, predict what other movies or products a user might like.</li>
<li>Categorize emails as spam or non-spam.</li>
<li>Analyze posted comments about your product to determine whether they have a positive or negative tone.</li>
<li>Guess how much a user might spend on a given day, given his spending history.</li>
</ul>
<p>&quot; [see <a href="http://code.google.com/apis/predict/docs/getting-started.html#whatisprediction">more</a>] There are <a href="http://code.google.com/apis/predict/docs/libraries.html">libraries and sample code</a> for Bash, Java, .Net, Python, Ruby, &hellip; For details of samples look at <a href="http://code.google.com/apis/predict/docs/developer-guide.html">guide</a> Links:</p>
<ul>
<li><a href="http://forddealervirginia.com/ford-google-predictor-future-api.html">Ford &amp; Google predictor</a> (also <a href="http://www.businessgreen.com/bg/news/2072141/ford-google-tie-predict-car-trips-optimise-plug-hybrids">here</a>)</li>
<li><a href="http://www.google.com/googleblogs/pdfs/google_predicting_the_present.pdf">Ford &amp; Google Trends</a></li>
</ul>
<p>As alternative, for <a href="http://www.redaelli.org/matteo-blog/projects/r-strategico/">Long Term Prediction over Time Series</a>, you can have a look at <a href="http://www.redaelli.org/matteo-blog/projects/r-strategico/">Strategico</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Natale 2010: riflessioni di un 40enne depresso</title>
      <link>https://www.mr70.eu/posts/natale-2010-riflessioni-di-un-40enne/</link>
      <pubDate>Fri, 24 Dec 2010 18:28:30 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/natale-2010-riflessioni-di-un-40enne/</guid>
      <description><![CDATA[<p>Possibile che nel 2010 ci siano ancora persone che muoiono di freddo a Milano nella quasi totale indifferenza di tutti noi, delle istituzioni e della Chiesa? <a href="http://milano.corriere.it/milano/notizie/cronaca/10_dicembre_14/senzatetto-morta-giardini-18169973434.shtml?fr=correlati"><img src="http://milano.corriere.it/hermes_foto/2010/12/18/0LDMJU1C--180x140.jpg" alt=""></a> <a href="http://milano.corriere.it/milano/notizie/cronaca/10_dicembre_14/senzatetto-morta-giardini-18169973434.shtml?fr=correlati"><img src="http://milano.corriere.it/media/foto/2010/12/14/799907_T--180x140.JPG" alt="" title="a"></a> Ma forse e&rsquo; meglio non pensarci e abbuffarsi nei cenoni e pranzi del Santo Natale.</p>
<p>[youtube]http://www.youtube.com/watch?v=Gup4hQnFWyA[/youtube]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Esempi di utilizzo dei dati e mappe Istat con R</title>
      <link>https://www.mr70.eu/posts/esempi-di-utilizzo-dei-dati-e-mappe-istat-con-r/</link>
      <pubDate>Mon, 20 Dec 2010 20:27:13 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/esempi-di-utilizzo-dei-dati-e-mappe-istat-con-r/</guid>
      <description><![CDATA[<p>[youtube]http://www.youtube.com/watch?v=cUyI6PT7QT4[/youtube] Trovate su <a href="https://github.com/matteoredaelli/r-istat">R-Istat</a> alcuni semplici esempi di utilizzo con <a href="http://www.redaelli.org/matteo-blog/projects/r-statistics/">R</a> dei dati e mappe cartografiche forniti liberamente dall&rsquo;Istat. In questo post un video e un grafico di esempio.. <img src="https://github.com/matteoredaelli/r-istat/raw/master/sample/CarateBrianza_popolazione_vedovi.png" alt="" title="carate brianza dati 2010"><img src="https://github.com/matteoredaelli/r-istat/raw/master/sample/Coniugati-040.png" alt="" title="istat coniugati di 40 anni in italia"> .</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>R at Google</title>
      <link>https://www.mr70.eu/posts/r-at-google/</link>
      <pubDate>Mon, 13 Dec 2010 07:47:45 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/r-at-google/</guid>
      <description><![CDATA[<p>&ldquo;&hellip;One interesting application is the Google Flu Trends project, which uses R to estimate current flu activity based on Google search results. Google Trends aggregates user search queries showing how often a particular word or phrase has been searched. Correlation tests are run on the search results to obtain a manageable data set of potentially relevant variables. Then using R, they massage the data and create models with optimized weights for each search term. From this, they are able to reasonably estimate current flu activity for different regions around the world. Google also announced an R client for the Google Prediction API (a service which accesses Google’s machine learning algorithms to analyze historic data and predict future outcomes). The R client is available here: <a href="http://code.google.com/p/google-prediction-api-r-client/">http://code.google.com/p/google-prediction-api-r-client/</a> Final note, Google has published an R Style Guide which may be of interest for those seeking a set of standards for R coding: <a href="http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html%22">http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html&quot;</a> Read all the article <a href="http://joshpaulson.wordpress.com/2010/12/10/r-at-google-4/">here</a>!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Rante, il sito degli utenti R in Italia</title>
      <link>https://www.mr70.eu/posts/rante-il-sito-degli-utenti-r-in-italia/</link>
      <pubDate>Wed, 15 Sep 2010 19:40:46 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/rante-il-sito-degli-utenti-r-in-italia/</guid>
      <description><![CDATA[<p><a href="http://rante.org"><img src="http://rante.org/wp-content/uploads/2010/08/Rug2.png" alt="R statistica in Italia" title="R statistica in Italia"></a></p>
<p>&ldquo;<a href="http://rante.org/">Rante</a> è una comunità di utenti appassionati di R, un ambiente di programmazione open source ideato principalmente per l’analisi statistica dei dati. Si fonda nella condivisione della filosofia del software libero e nella convinzione che avere un punto di ritrovo e scambio comune, non solo virtuale, possa portare benefici per tutti coloro che sono interessati all’uso di questo ambiente di programmazione&hellip;&rdquo; [<a href="http://rante.org/about/">rante.org</a>]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Geographic maps in R: Italy</title>
      <link>https://www.mr70.eu/posts/geographic-maps-in-r-italy/</link>
      <pubDate>Mon, 13 Sep 2010 19:09:10 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/geographic-maps-in-r-italy/</guid>
      <description><![CDATA[<p>As suggested by this <a href="http://blog.revolutionanalytics.com/2009/10/geographic-maps-in-r.html">post</a>, I created an Italian map</p>
<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/09/italy-with-r.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/09/italy-with-r.png" alt="Italian Map with R and sp package" title="italy-with-r"></a></p>
<p>with the following <a href="http://www.r-project.org/">R</a> code using the <a href="http://cran.r-project.org/web/packages/sp/">sp</a> package and the <a href="http://gadm.org/">GADM</a> maps</p>
<p>library(sp)</p>
<p>con &lt;- url(&ldquo;<a href="http://gadm.org/data/rda/ITA">http://gadm.org/data/rda/ITA</a>_adm1.RData&rdquo;)</p>
<p>print(load(con))</p>
<p>close(con)</p>
<p># giving random values to the Italian regions (1,2,3,5,1,2,3,4,5,&hellip;)</p>
<p>language &lt;- rep(seq(1,5),4)</p>
<p>gadm$language &lt;- as.factor(language)</p>
<p># choosing colors</p>
<p>col = rainbow(length(levels(gadm$language)))</p>
<p>spplot(gadm, &ldquo;language&rdquo;, col.regions=col, main=&ldquo;Italian Regions&rdquo;)</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>E io mi lamento...</title>
      <link>https://www.mr70.eu/posts/e-io-mi-lamentiamo/</link>
      <pubDate>Sat, 28 Aug 2010 12:29:28 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/e-io-mi-lamentiamo/</guid>
      <description><![CDATA[<p>[youtube]http://www.youtube.com/watch?v=lBB8G3Fc6Rk[/youtube]</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Debian celebrates its 17th birthday</title>
      <link>https://www.mr70.eu/posts/debian-celebrates-its-17th-birthday/</link>
      <pubDate>Tue, 24 Aug 2010 11:20:46 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/debian-celebrates-its-17th-birthday/</guid>
      <description><![CDATA[<p><a href="http://www.debian.org/"><img src="http://thank.debian.net/static/cakedebian.png" alt="" title="Debian"></a><a href="http://www.debian.org/">Debian</a> celebrates its 17th birthay! Read the <a href="http://www.debian.org/News/2010/20100816">official news</a>..</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calling soap web services with curl from a unix shell</title>
      <link>https://www.mr70.eu/posts/calling-soap-web-service-with-curl-from-a-unix-shell/</link>
      <pubDate>Fri, 18 Jun 2010 07:41:17 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/calling-soap-web-service-with-curl-from-a-unix-shell/</guid>
      <description><![CDATA[<h2 id="caption-id-alignalignleft-width471-captioncurlhttpcurlhaxxsepixcurl-refinedjpg-curlcaption-how-to-call-soap-web-services-from-a-unix-shell-it-is-easy-with-curl-and-optionally-xsltproc--read-the-tutorialsoap-requests-with-curlhttpdocsgooglecompresentviewiddfr68gz6_200dhctmwg4-">[caption id=&quot;&quot; align=&ldquo;alignleft&rdquo; width=&ldquo;471&rdquo; caption=&ldquo;Curl&rdquo;]<img src="http://curl.haxx.se/pix/curl-refined.jpg" alt="" title="curl">[/caption] How to call soap web services from a unix shell? it is easy with curl and, optionally, xsltproc ! Read the tutorial <a href="http://docs.google.com/present/view?id=dfr68gz6_200dhctmwg4">soap requests with curl</a> !</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="%22MassAirUnits@gmail.com%22">Alias Canterbury</a> - <!-- raw HTML omitted -->Jul 5, 2010<!-- raw HTML omitted --></p>
<p>Thanks for posting this tutorial! I really appreciate it, considering that a lot of other websites posted vaguely similar instructions but I couldn&rsquo;t get them to work.</p>
<!-- raw HTML omitted -->
<p>Thanks for such a nice post. Its a perfect working example. Its a good short guide to get started.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Ebot: an erlang web crawler</title>
      <link>https://www.mr70.eu/posts/ebot/</link>
      <pubDate>Fri, 21 May 2010 17:43:41 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ebot/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/projects/ebot"><img src="http://github.com/matteoredaelli/ebot/raw/master/doc/ebot_small.png" alt="" title="ebot"></a><a href="http://www.redaelli.org/matteo-blog/projects/ebot/">Ebot</a> is a <a href="http://gplv3.fsf.org/">opensource</a> and scalable <a href="http://en.wikipedia.org/wiki/Web_crawler">web crawler</a> written on top of <strong><a href="../archives/297">Erlang</a></strong>, a NOSQL database (<a href="http://couchdb.apache.org/">Apache CouchDB</a> or <a href="http://riak.basho.com/">Riak</a>), <strong><a href="http://www.rabbitmq.com/">RabbitMQ</a></strong>, <a href="http://code.google.com/p/mochiweb/">Mochiweb</a>, <a href="http://bitbucket.org/justin/webmachine">Webmachine</a>, .. See my <a href="http://www.redaelli.org/matteo-blog/projects/erlang/">Erlang info</a> page for more details.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>RabbitMQ acquired by SpringSource/VMWare</title>
      <link>https://www.mr70.eu/posts/rabbitmq-acquired-by-springsourcevmware/</link>
      <pubDate>Tue, 13 Apr 2010 18:48:37 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/rabbitmq-acquired-by-springsourcevmware/</guid>
      <description><![CDATA[<p><img src="http://www.rabbitmq.com/img/rabbitmqlogonostrap.png" alt="" title="rabbitmq">&ldquo;Erlang-based <a href="http://www.rabbitmq.com/">RabbitMQ</a> was acquired today by <a href="http://www.springsource.com/">SpringSource</a>, which is owned by <a href="http://www.vmware.com">VMWare</a>&rdquo; &ldquo;RabbitMQ is a complete and highly reliable enterprise messaging system based on the <a href="http://www.rabbitmq.com/specification.html">emerging AMQP standard</a>. It is licensed under the open source Mozilla Public License and has a platform-neutral distribution, plus platform-specific packages and bundles for easy installation.&rdquo; Sponsors of <a href="http://www.amqp.org"><strong>AMQP</strong></a> are: Bank of America, N.A., Barclays Bank PLC, Cisco Systems, Credit Suisse, Deutsche Börse Systems, Envoy Technologies Inc., Goldman Sachs, iMatix Corporation sprl., INETCO Systems Limited, JPMorgan Chase Bank Inc. N.A, Microsoft Corporation, Novell, Progress Software, Rabbit Technologies Ltd., Red Hat Inc., Solace Systems Inc., Tervela Inc., TWIST Process Innovations Ltd, WS02 Inc. and 29West Inc&hellip; (see <a href="http://www.amqp.org/confluence/display/AMQP/AMQP+Working+Group">here</a>)<img src="http://www.amqp.org/confluence/download/attachments/3178497/global.logo?version=1&amp;modificationDate=1260485198000" alt="" title="amqp"> Go <a href="http://www.springsource.com/newsevents/springsource-acquires-rabbitmq-cloud-messaging">here</a> or <a href="http://erlanginside.com/rabbitmq-acquired-springsource-vmware-162">here</a> for more details&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>The Interactive Internet is quite near... the new facebook chat with XMPP...</title>
      <link>https://www.mr70.eu/posts/the-interactive-internet-is-quite-near-the-new-facebook-chat-with-xmpp/</link>
      <pubDate>Sat, 13 Feb 2010 15:20:22 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/the-interactive-internet-is-quite-near-the-new-facebook-chat-with-xmpp/</guid>
      <description><![CDATA[<h2 id="httpwwwredaelliorgmatteo-blogwp-contentuploads201002aoqokvjcpng-aoqokvjchttpblogfacebookcomblogphppost297991732130after-google-with-gtalk--180-million-users--now-also-facebook-httpwwwredaelliorgmatteo-blogwp-contentuploads201002xmpppng-xmpphttpwwwxmpporg-400-million-users--has-switchedhttpblogfacebookcomblogphppost297991732130-its-chat-protocol-to-jabberhttpwwwjabberorgxmpphttpxmpporg--pdfhttpwwwsaint-andrecomjabberjabber-real-time-internetpdf-introduction-now-you-need-simply-a-generic-xmpp-clienthttpxmpporgsoftwareclientsshtml-like-adium-ichat-miranda-pidginhttpwwwpidginim-and-configure-facebook-gtalk-xmpp-is-now-the-de-facto-the-standard-protocol-for-instant-messaging-we-should-not-use-anymore-chat-systemsoperators-that-use-proprietary-standards-like-skype-ms-messanger-and-communicator-httpwwwpidginimsharedimglogopidginpng-pidginhttpwwwpidginim-we-are-next-to-have-an-interactive-internet-like-emails-that-can-be-sent-out-of-a-domain-well-be-able-to-chat-with-people-outside-our-domain-with-my-gmail-account-ill-be-able-to-chat-with-facebook-people--the-new-facebook-chat-_chatfacebookcom_-runshttpwwwredaelliorgmatteo-blogarchives297-an-opensource-software-witten-in-erlang-ejabberdhttpwwwejabberdim-commercial-support-at-process-onenethttpwwwprocess-onenetenejabberd-that-will-be-also-used-by-the-next-moodlehttpmoodleorg-20httpwwwredaelliorgmatteo-blogwp-contentuploads201002talk_logogif-talk_logohttpwwwredaelliorgmatteo-blogwp-contentuploads201002talk_logogif-see-the-video-set-up-an-enterprise-instant-messaging-server-in-180-secondshttpwwwprocess-onenettutorialsejabberd_setup_linux_en_viewlet_swfhtml"><a href="http://blog.facebook.com/blog.php?post=297991732130"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/02/aoqokvjc.png" alt="" title="aoqokvjc"></a>After Google with GTalk (~ 180 million users) , now also Facebook <a href="http://www.xmpp.org"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/02/xmpp.png" alt="" title="xmpp"></a>(&gt; 400 million users ) has <a href="http://blog.facebook.com/blog.php?post=297991732130">switched</a> its chat protocol to <a href="http://www.jabber.org/">Jabber</a>/<a href="http://xmpp.org/">XMPP</a> ( <a href="http://www.saint-andre.com/jabber/Jabber-Real-Time-Internet.pdf">pdf</a> introduction). Now you need simply a <a href="http://xmpp.org/software/clients.shtml">generic xmpp client</a> (like Adium, iChat, Miranda, <a href="http://www.pidgin.im/">Pidgin</a>) and configure Facebook, Gtalk,.. XMPP is now the de facto the Standard protocol for Instant Messaging <strong>We should not use anymore chat systems/operators that use proprietary standards like Skype, MS Messanger and Communicator, ..</strong><a href="http://www.pidgin.im/"><img src="http://www.pidgin.im/shared/img/logo.pidgin.png" alt="" title="pidgin"></a> We are next to have an <strong>Interactive Internet</strong>: like emails that can be sent out of a domain, we&rsquo;ll be able to chat with people outside our domain: with my gmail account I&rsquo;ll be able to chat with facebook people !!!!!!!!!!!! The new facebook chat (<em>chat.facebook.com)</em> <a href="http://www.redaelli.org/matteo-blog/archives/297">runs</a> an OpenSource software witten in Erlang, <a href="http://www.ejabberd.im/">ejabberd</a> (commercial support at <a href="http://www.process-one.net/en/ejabberd/">process-one.net</a>). That will be also used by the next <a href="http://moodle.org/">moodle</a> 2.0.<a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/02/talk_logo.gif"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2010/02/talk_logo.gif" alt="" title="talk_logo"></a> See the video &ldquo;<a href="http://www.process-one.net/tutorials/ejabberd_setup_linux_en_viewlet_swf.html">Set-up an Enterprise Instant Messaging server in 180 seconds</a>&rdquo;</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://www.redaelli.org/" title="matteo.redaelli@gmail.com">matteo</a> - <!-- raw HTML omitted -->Feb 6, 2010<!-- raw HTML omitted --></p>
<p>Is Yahoo also experimenting XMPP? Look at <a href="http://www.process-one.net/en/blogs/article/after">http://www.process-one.net/en/blogs/article/after</a>_aol_yahoo_is_also_experimenting_with_xmpp</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Do not forget...</title>
      <link>https://www.mr70.eu/posts/do-not-forget/</link>
      <pubDate>Sun, 31 Jan 2010 07:39:57 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/do-not-forget/</guid>
      <description><![CDATA[<p>Sometimes I need to watch this video, it helps me to not forget&hellip;</p>
<p>[youtube]http://www.youtube.com/watch?v=8hOaL6M4SDU[/youtube]</p>
<p>QUESTO SUCCEDE MENTRE NOI SIAMO ACCECATI DALL&rsquo;AVIDITA&rsquo;  E DAL CONSUMISMO&hellip;</p>
<p>E NOI FACCIAMO poco o NULLA PER CAMBIARE&hellip;</p>
<p>Questo video e&rsquo; la mia bussola&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>A new blog for me!</title>
      <link>https://www.mr70.eu/posts/a-new-blog-for-me/</link>
      <pubDate>Tue, 05 Jan 2010 18:31:11 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/a-new-blog-for-me/</guid>
      <description><![CDATA[<p>My blog now lives at <a href="http://www.redaelli.org/matteo/">redaelli.org</a>: new posts will be published automatically also in my facebook and twitter profiles. But I&rsquo;m looking also at blogger: I&rsquo;m playing with <a href="http://redaellicarate.blogspot.com/">http://redaellicarate.blogspot.com/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Do NOT BUY any DVB USB devices with TRIDENT chipsets</title>
      <link>https://www.mr70.eu/posts/do-not-buy-dvb-usb-devices-with-trident-chipsets/</link>
      <pubDate>Fri, 01 Jan 2010 20:04:18 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/do-not-buy-dvb-usb-devices-with-trident-chipsets/</guid>
      <description><![CDATA[<h2 id="httpwwwfreecomcomobjects00007378jpg-dvb-freecom-please-do-not-buy-_any-dvb-usb_-devices-with-tridenthttpwwwtridentmicrocom-trident-chipsets-like-freecom-dvb-t--analog-tv-usb-stickhttpwwwfreecomcomecproduct_detailaspid2823-dvb-t--analog-tv-usb-stick-usb-id-14aa0620-moka-hybrid-tv-receiver-mk-dvbt-dual-usb-id-14aa0620-lifeview-lr535--a-pcie-mini-card-usb-id-10fd0535-ads-tech-mini-dual-tv-ptv-339-usb-id-06e1b339-if-you-are-a-linux-user-please-share-this-news-in-internet-it-is-about-user-generated-contenthttpenwikipediaorgwikiuser-generated_content-user-generated-content-ugc-against-trident-and-other-closed-source-vendors-it-is-important-to-notice-that-the-vendor-trident-doesnt-seem-to-want-helping-with-open-source-development-contacts-with-the-vendor-were-tried-during-2007-and-2008-in-order-to-get-their-help-by-opening-docs-via-linux-foundation-nda-program-without-success--in-brief-while-we-want-to-fix-the-driver-issues-it-is-recommend-to-avoid-buying-any-devices-with-tm5600tm6000tm6010-and-drx-demod-chips-see-httpwwwlinuxtvorgwikiindexphptrident_tm6000httpwwwlinuxtvorgwikiindexphptrident_tm6000-httpwwwlinuxtvorgwikiindexphptrident_tm6000-for-details"><img src="http://www.freecom.com/objects/00007378.jpg" alt="" title="dvb freecom ">Please do <strong>NOT buy</strong> <em>any DVB USB</em> devices with <a href="http://www.tridentmicro.com" title="TRIDENT"><strong>TRIDENT</strong></a> chipsets like <a href="http://www.freecom.com/ecproduct_detail.asp?ID=2823" title="DVB-T &amp; Analog TV USB STICK">Freecom DVB-T &amp; Analog TV USB STICK</a> (USB Id 14aa:0620), Moka Hybrid TV receiver MK-DVBT-DUAL (USB Id 14aa:0620), LifeView LR535 &hellip; a PCIe Mini Card (USB Id 10fd:0535), ADS Tech Mini Dual TV (PTV-339) (USB ID 06e1:b339) If you are a <strong>Linux</strong> User, please share this news in INTERNET: it is about  <strong><a href="http://en.wikipedia.org/wiki/User-generated_content" title="User Generated Content (UGC)">user generated content</a></strong> AGAINST TRIDENT  and other CLOSED source vendors!!! &ldquo;It is important to notice that the vendor (Trident) doesn&rsquo;t seem to want helping with open source development. Contacts with the vendor were tried during 2007 and 2008 in order to get their help by opening docs, via Linux Foundation NDA program, without success [&hellip;] In brief, while we want to fix the driver issues, it is recommend to avoid buying any devices with tm5600/tm6000/tm6010 (and DRX demod) chips.&rdquo;. See <a href="http://www.linuxtv.org/wiki/index.php/Trident_TM6000" title="http://www.linuxtv.org/wiki/index.php/Trident_TM6000">http://www.linuxtv.org/wiki/index.php/Trident_TM6000</a> for details.</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="%22buenoview@ig.com.br%22">Lincoln B. Marcelo</a> - <!-- raw HTML omitted -->Jan 0, 2011<!-- raw HTML omitted --></p>
<p>Of course I want sources to make my own Delphi/Kylix program to control my tv adaptor box. It has tm5600 and I want to write my own controller. I bought a ENUTV-2 USB TV box this month (Dec 2010) and I think I have rights as user and owner of a device that has this chip inside to write computer controls to use it as i want. I need an linux driver to make it work under SuSE, I need the commands to make my Pascal or C++ personal controller for it.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Happy new year 2010</title>
      <link>https://www.mr70.eu/posts/happy-new-year-2010/</link>
      <pubDate>Wed, 30 Dec 2009 10:52:32 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/happy-new-year-2010/</guid>
      <description><![CDATA[<p><a href="http://matteoredaelli.files.wordpress.com/2009/12/buonanno2010.png"><img src="http://matteoredaelli.files.wordpress.com/2009/12/buonanno2010.png" alt="" title="buonanno2010"></a></p>
<p>I hope 2010 will be a better year for all people in the world&hellip;</p>
<p><a href="http://matteoredaelli.files.wordpress.com/2009/12/01-happy-new-year-2010.jpg"><img src="http://matteoredaelli.files.wordpress.com/2009/12/01-happy-new-year-2010.jpg" alt="" title="01-happy-new-year-2010"></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>BRING THE BOYS BACK HOME!!!</title>
      <link>https://www.mr70.eu/posts/bring-the-boys-back-home/</link>
      <pubDate>Tue, 01 Dec 2009 18:29:12 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/bring-the-boys-back-home/</guid>
      <description><![CDATA[<p>[youtube=http://www.youtube.com/watch?v=1_pszQM6AVs]</p>
<p>..ma sI continua ad inviare nuove truppe in una guerra scatenata da prove riconosciute INFONDATE !!!!!!!!!!!!</p>
<p><img src="http://scrapetv.com/News/News%20Pages/Everyone%20Else/images-4/iraq-war-dead-child.jpg" alt="" title="war death"></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Learning Erlang</title>
      <link>https://www.mr70.eu/posts/learning-erlang/</link>
      <pubDate>Sat, 31 Oct 2009 10:40:09 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/learning-erlang/</guid>
      <description><![CDATA[<p><a href="http://learnyousomeerlang.com/"><img src="http://learnyousomeerlang.com/static/img/splash.jpg" alt=""></a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Apache CouchDB ~ Ubuntu</title>
      <link>https://www.mr70.eu/posts/apache-couchdb-ubuntu/</link>
      <pubDate>Sat, 31 Oct 2009 10:14:47 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/apache-couchdb-ubuntu/</guid>
      <description><![CDATA[<p><img src="http://damienkatz.net/pics/ubuntu_couchdb-thumb-400x298.png" alt="" title="CouchDB &amp; Ubuntu">&quot;<a href="http://www.ubuntu.com/">Ubuntu</a> 9.10 Karmic Koala has just been released. This is big news as this version includes Apache CouchDB, used as a replicable database by desktop apps. This means <a href="http://couchdb.apache.org/">CouchDB</a> will be on over 10 million desktops&quot; [from <a href="http://damienkatz.net/2009/10/koala_on_the_loose.html">Damien Katz</a>] <a href="http://learnyousomeerlang.com/">Erlang tutorial</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>oRestE: a REST interface to your databases with Erlang</title>
      <link>https://www.mr70.eu/posts/oreste-a-rest-interface-to-your-databases-with-erlang/</link>
      <pubDate>Wed, 07 Oct 2009 07:24:52 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/oreste-a-rest-interface-to-your-databases-with-erlang/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/wp-content/uploads/2009/10/oreste1.png"><img src="http://www.redaelli.org/matteo-blog/wp-content/uploads/2009/10/oreste1.png" alt="" title="oRestE"></a> <a href="http://code.google.com/p/oreste/">oRestE</a> gives you a fast way to expose your database with a restful interface oRestE is built on top of <a href="http://www.erlang.org/">ERLANG</a> (<a href="http://www.slideshare.net/kenpratt/intro-to-erlang">Introduction</a>), <a href="http://code.google.com/p/mochiweb/">MOCHIWEB</a> and <a href="http://bitbucket.org/justin/webmachine">WEBMACHINE</a> (<a href="http://www.erlang-factory.com/upload/presentations/60/sheehy_factory-webmachine.pdf">webmachine.pdf</a>) oRestE it is light, stable and fast! thanks to ERLANG/OTP and MOCHIWEB</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Some Reasons for Loving Google Apps</title>
      <link>https://www.mr70.eu/posts/my-reasons-for-loving-google-apps/</link>
      <pubDate>Fri, 25 Sep 2009 11:22:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/my-reasons-for-loving-google-apps/</guid>
      <description><![CDATA[<p><a href="http://docs.google.com/present/view?id=dfr68gz6_172gb8q5wgg"><img src="http://docs.google.com/drawings/image?id=stMoHQ71hJ6503vKbvxcz8w&amp;w=571&amp;h=435&amp;rev=1&amp;crop=35814%2C5715%2C217551%2C165735" alt=""></a> A <strong><a href="http://docs.google.com/present/view?id=dfr68gz6_172gb8q5wgg">quick presentation</a></strong> about why people &amp; employees &amp; IT managers &amp; companies should love and adopt <a href="http://www.google.com/apps/"><strong>Google Apps</strong></a> instead of other old style <strong>Intranets</strong> (MS Sharepoint, Sap Portal, .. that require the (not user friendly) programmers&rsquo;s actions checkin/checkout) and <strong>Email Suites</strong> (MS Exchange)</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Ewg: Erlang Wordlist Generator</title>
      <link>https://www.mr70.eu/posts/ewg-erlang-wordlist-generator/</link>
      <pubDate>Tue, 04 Aug 2009 20:01:10 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ewg-erlang-wordlist-generator/</guid>
      <description><![CDATA[<p><a href="http://github.com/matteoredaelli/ewg/"><img src="http://matteoredaelli.files.wordpress.com/2009/08/logo.png" alt="logo" title="logo"></a> <a href="http://github.com/matteoredaelli/ewg/">Ewg</a> is a Wordlist generator written in Erlang. Thanks to this simple project I have been improving my knowledge in Erlang/OTP and Git. I love functional programming and learning more and more&hellip; ;-)</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Erlang at Facebook, SAP, ...</title>
      <link>https://www.mr70.eu/posts/erlang-at-facebook-sap/</link>
      <pubDate>Fri, 26 Jun 2009 09:45:03 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/erlang-at-facebook-sap/</guid>
      <description><![CDATA[<p>Erlang At? Please add a comment if you use it in your company! Erlang at BBC</p>
<ul>
<li><a href="http://www.erlang-factory.com/upload/presentations/147/EndaFarrell-ErlangFactoryLondon2009-ErlangattheBBC.pdf">http://www.erlang-factory.com/upload/presentations/147/EndaFarrell-ErlangFactoryLondon2009-ErlangattheBBC.pdf</a></li>
</ul>
<p>Erlang at Facebook</p>
<ul>
<li><a href="http://cufp.galois.com/2009/slides/PiroLetuchy.pdf">Functional Programming at Facebook by Chris Piro and Eugene Letuchy</a>.</li>
<li><a href="http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf">http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf</a></li>
<li><a href="http://www.process-one.net/en/blogs/article/facebook_chat_supports_xmpp_with_ejabberd/">http://www.process-one.net/en/blogs/article/facebook_chat_supports_xmpp_with_ejabberd/</a></li>
</ul>
<p>Erlang at Github</p>
<ul>
<li><a href="http://github.com/blog/112-supercharged-git-daemon">http://github.com/blog/112-supercharged-git-daemon</a></li>
</ul>
<p>Erlang at SAP</p>
<ul>
<li><a href="http://www.erlang-factory.com/upload/presentations/57/SumeetBajaj_ErlangatSAP.pdf">http://www.erlang-factory.com/upload/presentations/57/SumeetBajaj_ErlangatSAP.pdf</a></li>
</ul>
<p>Erlang at 37Signals</p>
<ul>
<li><a href="http://beebole.com/en/blog/erlang/37signals-dives-into-erlang/">http://beebole.com/en/blog/erlang/37signals-dives-into-erlang/</a></li>
</ul>
<p>Other presentations at</p>
<ul>
<li><a href="http://www.erlang-factory.com/conference/SFBayAreaErlangFactory2009/talks">http://www.erlang-factory.com/conference/SFBayAreaErlangFactory2009/talks</a></li>
<li><a href="http://www.erlang-factory.com/conference/London2009/talks">http://www.erlang-factory.com/conference/London2009/talks</a></li>
<li><a href="http://2009.scandevconf.se/db/Erlang_good_new_bad_news_how_to_win.pdf">http://2009.scandevconf.se/db/Erlang_good_new_bad_news_how_to_win.pdf</a></li>
</ul>
<hr>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://www.redaelli.org/matteo-blog/archives/507" title="">The Interactive Internet is quite near… the new facebook chat with XMPP… « Matteo Redaelli</a> - <!-- raw HTML omitted -->Feb 6, 2010<!-- raw HTML omitted --></p>
<p>[&hellip;] new facebook chat uses an OpenSource software witten in Erlang, ejabberd!! That will be also used by next moodle 2.0 chat [&hellip;]</p>
<!-- raw HTML omitted -->
<p><a href="http://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why">http://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why</a></p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Facebook.com Architecture</title>
      <link>https://www.mr70.eu/posts/facebook-com-architecture/</link>
      <pubDate>Fri, 26 Jun 2009 06:55:24 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/facebook-com-architecture/</guid>
      <description><![CDATA[<p>Do U want to learn something about the architecture of Facebook.Com? See this <a href="http://www.slideshare.net/guest65a0aec/qcon">presentation</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Connecting to a database with a webService (cxf) deployed (osgi) in Servicemix</title>
      <link>https://www.mr70.eu/posts/connecting-to-a-database-with-a-webservice-cxf-deployed-osgi-in-servicemix/</link>
      <pubDate>Sun, 07 Jun 2009 17:37:15 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/connecting-to-a-database-with-a-webservice-cxf-deployed-osgi-in-servicemix/</guid>
      <description><![CDATA[<ol>
<li>Install and start ServiceMix 4.0 2) Add necessary bundles</li>
</ol>
<p>features/install cxf-osgi</p>
<p>osgi/install -s mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-dbcp/1.2.2_3/</p>
<p>osgi/install -s wrap:mvn:org.springframework/spring-jdbc/2.5.6/</p>
<p>osgi/install -s wrap:mvn:mysql/mysql-connector-java/5.1.6</p>
<h2 id="-see-details-in-this-gooole-documenthttpdocsgooglecomviewiddfr68gz6_72684sn9vh-or-download-test-wsdl-first-osgiziphttpwwwredaelliorgmatteodownloadsjavatest-wsdl-first-osgizip">&hellip; See details in this <a href="http://docs.google.com/View?id=dfr68gz6_72684sn9vh">gooole document</a> or download <a href="http://www.redaelli.org/matteo/downloads/java/test-wsdl-first-osgi.zip">test-wsdl-first-osgi.zip</a></h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="%22zzzzzz500@gmail.com%22">Thomas Gill</a> - <!-- raw HTML omitted -->Aug 1, 2009<!-- raw HTML omitted --></p>
<p>Matteo - How do you install an Oracle driver in Servicemix. I have the oracle6.jar. Tried putting in lib dir and also install file:///tmp/ojdbc6.jar Trying to setup Master -Slave using JDBC for ActiveMQ</p>
<!-- raw HTML omitted -->
<p>In smx4 try installing bundle from springsource <a href="http://www.springsource.com/repository/app/bundle/version/detail?name=com.springsource.oracle.jdbc&amp;version=10.2.0.2">http://www.springsource.com/repository/app/bundle/version/detail?name=com.springsource.oracle.jdbc&amp;version=10.2.0.2</a> if you cannot, please ask in servicemix forum, I&rsquo;m not an expert in java/osgi.. Regards</p>
<!-- raw HTML omitted -->
<p>Thanks Matteo - The Spring version is a little old but works. I have the ActiveMQ tables created in DB and everything works. I tried with one Master alone and when running it is all good. But when the Master goes down the DB lock is not removed. Planning to start 2 Brokers and see how it behaves.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Howto sharing (osgi style) a database connection in Servicemix4 / FuseEsb4</title>
      <link>https://www.mr70.eu/posts/howto-sharing-osgi-style-a-database-connection-in-servicemix4-fuseesb4/</link>
      <pubDate>Sun, 07 Jun 2009 12:58:58 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/howto-sharing-osgi-style-a-database-connection-in-servicemix4-fuseesb4/</guid>
      <description><![CDATA[<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>ISTAT is moving from SAS to R</title>
      <link>https://www.mr70.eu/posts/istat-is-moving-from-sas-to-r/</link>
      <pubDate>Fri, 05 Jun 2009 14:49:43 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/istat-is-moving-from-sas-to-r/</guid>
      <description><![CDATA[<p>&ldquo;<a href="http://www.istat.it/english/">Istat</a> [..] helps to develop &lsquo;<a href="http://www.r-project.org/">R Project</a>&rsquo;, a statistical open source application. &ldquo;We have donated software libraries to R, and are moving away from using SAS, the proprietary alternative to R. We contributed to the statistical application Adamsoft, which is being developed at the Caspur computing-lab, just two kilometres away from our institute.&rdquo; Vaccari says <strong>adopting open source</strong> requires institutes to make adjustments in their organisational culture. &ldquo;It <strong>changes how people work, from &lsquo;I&rsquo;m important because I&rsquo;m a bottleneck, to I&rsquo;m important because I share things</strong>&rsquo;.&rdquo; <a href="http://www.osor.eu/news/it-statistics-institute-moving-to-open-source-increases-cooperation">Read it</a>!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Connecting to a database with a webService (cxf) deployed (jbi) in Servicemix</title>
      <link>https://www.mr70.eu/posts/connecting-to-a-database-with-a-webservice-cxf-deployed-jbi-in-servicemix/</link>
      <pubDate>Sat, 30 May 2009 10:53:58 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/connecting-to-a-database-with-a-webservice-cxf-deployed-jbi-in-servicemix/</guid>
      <description><![CDATA[<h1 id="introduction">Introduction</h1>
<p>Apache <a href="http://servicemix.apache.org">ServiceMix</a> at the moment doesn&rsquo;t have a JBI component for connecting to a database (servicemiix-jdbc is in the roadmap): in the meanwhile you have to use servicemix-cxf or servicemix-bean. This example (<a href="http://www.redaelli.org/matteo/downloads/java/cxf-wsdl-first-jdbc.zip">cxf-wsdl-first-jdbc.zip</a>, <a href="http://www.redaelli.org/matteo/downloads/java/cxf-wsdl-first-jdbc.pdf">cxf-wsdl-first.pdf</a>)  is built on top of the example cxf-wsdl-first and can be deployed in apache servicemix 4.0 as JBI sa package.</p>
<h1 id="installing-smx4">Installing smx4</h1>
<p>Download from “<a href="http://servicemix.apache.org/SMX4/download.html">http://servicemix.apache.org/SMX4/download.html</a>”</p>
<p>Unzip it</p>
<p>cd /usr/local</p>
<p>tar xvfz apache-servicemix.tar.gz</p>
<h1 id="starting-smx4">Starting smx4</h1>
<p>cd /usr/local/apache-servicemix-4.0.0/</p>
<p>./bin/servicemix</p>
<h1 id="creating-ws">Creating WS</h1>
<p>cd /usr/local/apache-servicemix-4.0.0/examples</p>
<p>cp -a cxf-wsdl-first cxf-wsdl-first-jdbc</p>
<p><strong>Edit file “wsdl-first-cxfse-su/pom.xml”</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;dependency&gt;
</span></span></code></pre></div><p><!-- raw HTML omitted -->mysql<!-- raw HTML omitted --></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
</span></span></code></pre></div><p><!-- raw HTML omitted -->5.0.8<!-- raw HTML omitted --></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;/dependency&gt;
</span></span></code></pre></div><!-- raw HTML omitted -->
<p><strong>Edit file “wsdl-first-cxfse-su/src/main/resources/xbean.xml”</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;bean id=&#34;moodleDB&#34;
</span></span></code></pre></div><p>class=&ldquo;org.springframework.jdbc.datasource.DriverManagerDataSource&rdquo;&gt;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;property name=&#34;driverClassName&#34; value=&#34;com.mysql.jdbc.Driver&#34; /&gt;
</span></span></code></pre></div><p>&lt;property name=&ldquo;url&rdquo;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>value=&#34;jdbc:mysql://localhost:3306/moodle&#34; /&gt;
</span></span></code></pre></div><!-- raw HTML omitted -->
<p><strong>Edit file “wsdl-first-cxfse-su/src/main/java/org/apache/servicemix/samples/wsdl_first/PersonImpl.java”</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>import java.util.\*;
</span></span><span style="display:flex;"><span>import javax.sql.DataSource;
</span></span><span style="display:flex;"><span>import org.springframework.jdbc.core.JdbcTemplate;
</span></span></code></pre></div><p>..</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>private DataSource dataSource;
</span></span></code></pre></div><p>private JdbcTemplate jdbcTemplate;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>public void setDataSource(DataSource dataSource) {
</span></span></code></pre></div><p>this.dataSource = dataSource;
 this.jdbcTemplate = new JdbcTemplate(dataSource);
}</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>public void getPerson(Holder&lt;String&gt; personId, Holder&lt;String&gt; ssn, Holder&lt;String&gt; name)
</span></span></code></pre></div><p>throws UnknownPersonFault</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>{
</span></span></code></pre></div><p>org.apache.servicemix.samples.wsdl_first.types.UnknownPersonFault fault =
new org.apache.servicemix.samples.wsdl_first.types.UnknownPersonFault();</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>fault.setPersonId(personId.value);
</span></span></code></pre></div><p>if (personId.value == null || personId.value.length() == 0) {</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>   throw new UnknownPersonFault(null, fault);
</span></span></code></pre></div><p>}</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>List result = this.jdbcTemplate.queryForList(&#34;select description, lastname from mdl\_user where username = ?&#34;,
</span></span><span style="display:flex;"><span>   new Object\[\]{personId.value});
</span></span></code></pre></div><p>if(result.size() != 1)
 throw new UnknownPersonFault(null, fault);</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span> Map record=(Map)result.get(0);
</span></span><span style="display:flex;"><span> name.value = record.get(&#34;lastname&#34;).toString();
</span></span><span style="display:flex;"><span> ssn.value = record.get(&#34;description&#34;).toString();
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>```
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Deplying the WS
</span></span><span style="display:flex;"><span>===============
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>mvn clean instal cp wsdl-first-cxf-sa/target/wsdl-first-cxf-sa-4.0.0.zip /usr/local/apache-servicemix-4.0.0/deploy/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Testing WS
</span></span><span style="display:flex;"><span>==========
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Open with your browser the file “file:///usr/local/apache-servicemix-4.0.0/examples/cxf-wsdl-first-jdbc/client.html”
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Http statistics with curl</title>
      <link>https://www.mr70.eu/posts/http-statistics-with-curl/</link>
      <pubDate>Wed, 15 Apr 2009 15:49:43 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/http-statistics-with-curl/</guid>
      <description><![CDATA[<p><a href="http://matteoredaelli.wordpress.com/2009/04/15/http-statistics-with-curl/apache-hourly/"><img src="http://matteoredaelli.files.wordpress.com/2009/04/apache-hourly.png?w=300" alt="apache-hourly" title="apache-hourly"></a>With CURL and RRDTOOL it is possible to collect http request statistics. Below you can find the 2 scripts #************************ #curl-rrdtool.sh #************************ #!/bin/bash # Paths&hellip; adjust as necessary BASE=&quot;/home/matteo/curl&quot; CONFIG=&ldquo;config&rdquo; CURL=&quot;/usr/bin/curl&quot; RRDTOOL=&quot;/usr/bin/rrdtool&quot; # Given a URL, return a file name # ensure we have the needed parameters # Strip out any non alphas, replace with underscores, # and add a host name FILE=apache.rrd # Can only return numeric results, so global $FILE # has the result # Called to create the RRD create_rrd () { # ensure we have the needed parameters # Convert the URL to a name and build the RRD $RRDTOOL create &ldquo;$BASE/$FILE&rdquo; -s 30 \ DS:total:GAUGE:60:0:U DS:dns:GAUGE:60:0:U DS:connect:GAUGE:60:0:U \ DS:pretransfer:GAUGE:60:0:U DS:starttransfer:GAUGE:60:0:U \ RRA:AVERAGE:0.5:1:288 RRA:AVERAGE:0.5:6:336 RRA:AVERAGE:0.5:24:372 \ RRA:AVERAGE:0.5:144:730 RRA:MIN:0.5:1:288 RRA:MIN:0.5:6:336: \ RRA:MIN:0.5:24:372 RRA:MIN:0.5:144:730 RRA:MAX:0.5:1:288 \ RRA:MAX:0.5:6:336 RRA:MAX:0.5:24:372 RRA:MAX:0.5:144:730 \ RRA:LAST:0.5:1:288 } if [ ! -f &ldquo;$BASE/$FILE&rdquo; ]; then create_rrd $URL fi while true ; do $CURL -b /tmp/cookies.txt -c /tmp/cookies.txt -d &ldquo;username=test1&amp;password=XXXXX&rdquo; -s <a href="http://learninglab.group.mysite.com/moodle/login/index.php">http://learninglab.group.mysite.com/moodle/login/index.php</a> OUT=`$CURL -b /tmp/cookies.txt -c /tmp/cookies.txt  -m 30 -w %{time_total}:%{time_namelookup}:%{time_connect}:\ %{time_pretransfer}:%{time_starttransfer} -o /dev/null -s <a href="http://learninglab.group.mysite.com/moodle/">http://learninglab.group.mysite.com/moodle/</a>` $RRDTOOL update  &ldquo;$BASE/$FILE&rdquo; -t &ldquo;total:dns:connect:pretransfer:starttransfer&rdquo; N:$OUT sleep 30 done #************************ #curl-rrdtool-chart.sh #************************ #!/bin/sh MEASUREMENT=&ldquo;matteo&rdquo; SITE=&ldquo;<a href="http://learninglab.group.mysite/moodle/%22">http://learninglab.group.mysite/moodle/&quot;</a> FILE=/home/matteo/curl/apache DEFS=&rdquo; DEF:total=$FILE.rrd:total:AVERAGE \ DEF:dns=$FILE.rrd:dns:AVERAGE \ DEF:connect=$FILE.rrd:connect:AVERAGE \ DEF:pretransfer=$FILE.rrd:pretransfer:AVERAGE \ DEF:starttransfer=$FILE.rrd:starttransfer:AVERAGE&quot; width=800 height=400 rrdtool graph $FILE-hourly.png \ &ndash;width $width &ndash;height $height \ -r -s end-30min \ -t &ldquo;Performance of $SITE from $MEASUREMENT&rdquo; -v &ldquo;Seconds&rdquo; \ $DEFS \ AREA:total#FF0000:&ldquo;Data Transfer&rdquo; \ AREA:starttransfer#CAAA00:&ldquo;First Byte&rdquo; \ AREA:connect#0000FF:&ldquo;Connection&rdquo; \ AREA:dns#00FF00:&ldquo;DNS Lookup&rdquo; \ COMMENT:&quot;\n&quot; COMMENT:&quot;\n&quot; \ GPRINT:total:AVERAGE:&ldquo;Average request time %0.2lf %Ss&rdquo; \ GPRINT:total:MIN:&ldquo;Min/Max %0.2lf %Ss/&rdquo; \ GPRINT:total:MAX:&quot;%0.2lf %Ss&quot; \ COMMENT:&quot;\n&quot; \ GPRINT:total:LAST:&ldquo;Current request time %0.2lf %Ss&rdquo;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>ICA-ATOM (QUBIT), THE OpenSource archival description software</title>
      <link>https://www.mr70.eu/posts/ica-atom-qubit-the-opensource-archival-description-software/</link>
      <pubDate>Wed, 15 Apr 2009 08:51:30 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ica-atom-qubit-the-opensource-archival-description-software/</guid>
      <description><![CDATA[<p><img src="http://ica-atom.org/images/ica-atom-logo-1_0.png" alt="" title="ICA-ATOM"> I&rsquo;ve collected some information about <a href="http://ica-atom.org/">ICA-ATOM</a> (based on <a href="http://code.google.com/p/qubit-toolkit/">QuBit</a>). Please read my <a href="http://docs.google.com/Present?docID=dfr68gz6_42dz43zhdm&amp;revision=_latest&amp;start=0&amp;theme=blank&amp;cwj=true">presentation</a> from Google Docs</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Ruby Wordlist Generator (ruby-wg)</title>
      <link>https://www.mr70.eu/posts/ruby-words-generator/</link>
      <pubDate>Mon, 13 Apr 2009 19:44:02 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/ruby-words-generator/</guid>
      <description><![CDATA[<p><img src="http://ruby-words-generators.googlecode.com/svn/trunk/doc/ruby-words-generators.png" alt="" title="Ruby word generators"> After many years I&rsquo;ve updated my Wordlist Generator project! I&rsquo;ve seen in several forums that some people still use my old perl script <a href="http://www.redaelli.org/matteo/downloads/perl/wg.pl">wg.pl</a> The new ruby project is hosted at <a href="http://code.google.com/p/ruby-words-generators">htt</a><a href="http://code.google.com/p/ruby-words-generators">p://code.google.com/p/ruby-words-generators/</a> ruby-wg can be used to generate wordlist for the famous password cracker <a href="http://www.openwall.com/john/">John the Ripper</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Google si unisce alla battaglia della UE contro Internet Explorer</title>
      <link>https://www.mr70.eu/posts/google-si-unisce-alla-battaglia-della-ue-contro-internet-explorer/</link>
      <pubDate>Fri, 27 Feb 2009 17:52:41 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/google-si-unisce-alla-battaglia-della-ue-contro-internet-explorer/</guid>
      <description><![CDATA[<p>L&rsquo;Antitrust della Comunita&rsquo; Europea continua la sua <a href="http://europa.eu/rapid/pressReleasesAction.do?reference=MEMO/09/15">battaglia contro Microsoft</a> e Google dara&rsquo; il suo contributo. Leggete <a href="http://googlepublicpolicy.blogspot.com/2009/02/browsers-powered-by-user-choice.html">qui</a>'</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Microsoft Tax and Apple tax</title>
      <link>https://www.mr70.eu/posts/microsoft-tax-and-apple-tax/</link>
      <pubDate>Thu, 08 Jan 2009 08:12:20 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/microsoft-tax-and-apple-tax/</guid>
      <description><![CDATA[<h2 id="microsoft-dicehttpwwwcomputerworldcomactionarticledocommandviewarticlebasictaxonomynameknowledge_centerarticleid9124979taxonomyid1intsrckc_top-che-ogni-volta-che-si-compra-un-mac-si-paga-una-tassa-ad-apple-ma-si-puo-dire-analogamente-che-ogni-volta-che-si-compra-un-pc-con-installato-windows-si-paga-una-tassa-a-microsoft-con-linux-e-openoffice-la-stragrande-maggioranza-degli-utenti-di-computer-potrebbero-risparmiare-la-microsoft-tax-e-per-di-piu-non-avere-piu-problemi-di-virus">Microsoft <a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;taxonomyName=knowledge_center&amp;articleId=9124979&amp;taxonomyId=1&amp;intsrc=kc_top">dice</a> che ogni volta che si compra un Mac si paga una tassa ad Apple. Ma si puo&rsquo; dire analogamente che ogni volta che si compra un pc con installato windows, si paga una tassa a Microsoft. Con Linux e OpenOffice la stragrande maggioranza degli utenti di computer potrebbero risparmiare la Microsoft tax e per di piu&rsquo; non avere piu&rsquo; problemi di virus!!!!</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://" title="a.mica29@gmail.com">mika29</a> - <!-- raw HTML omitted -->Jan 5, 2009<!-- raw HTML omitted --></p>
<p>A parte il fatto che comprando Windows i soldi vanno a Microsoft, consideriamo che quando si compra un Mac parte dei soldi va sempre a Microsoft, che possiede alcune azioni della Apple&hellip;.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>N queens problem with erlang</title>
      <link>https://www.mr70.eu/posts/n-queens-solution-with-erlang/</link>
      <pubDate>Mon, 05 Jan 2009 11:41:35 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/n-queens-solution-with-erlang/</guid>
      <description><![CDATA[<p><a href="http://www.redaelli.org/matteo-blog/2009/01/05/n-queens-solution-with-erlang/8queens/"><img src="http://matteoredaelli.files.wordpress.com/2009/01/8queens.png" alt="8queens" title="8queens"></a> <em>&ldquo;The eight queens puzzle is the problem of putting eight chess queens on an 8×8 chessboard such that none of them is able to capture any other using the standard chess queen&rsquo;s moves. The queens must be placed in such a way that no two queens would be able to attack each other. Thus, a solution requires that no two queens share the same row, column, or diagonal. The eight queens puzzle is an example of the more general n queens puzzle of placing n queens on an n×n chessboard, where solutions exist only for n = 1 or n ≥ 4&hellip; &ldquo;</em> [Wikipedia] Below my solution using <strong><a href="http://erlang.org/">ERLANG</a></strong> (very strong for concurrent programming, used by Ericsson, <a href="http://highscalability.com/new-facebook-chat-feature-scales-70-million-users-using-erlang">Facebook</a>, <a href="http://perfdynamics.blogspot.com/2008/07/amazon-and-google-discover-erlang.html">Amazon,Google</a>,..) with <a href="http://en.wikipedia.org/wiki/List_comprehension">List comprehensions</a> and suggestions from other <a href="http://qqzhenyi.blogspot.com/2008/08/erlang-and-eight-queens-puzzle.html">sites</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-prolog" data-lang="prolog"><span style="display:flex;"><span><span style="color:#ff79c6">-</span><span style="color:#50fa7b">module</span>(<span style="color:#f1fa8c">queens</span>).
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">-</span><span style="color:#50fa7b">export</span>(<span style="color:#f1fa8c">\</span>[<span style="color:#f1fa8c">queens</span><span style="color:#ff79c6">/</span><span style="color:#bd93f9">1</span><span style="color:#f1fa8c">\</span>]).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">same_row</span>({<span style="color:#ff79c6">_</span>,<span style="color:#8be9fd;font-style:italic">X</span>},{<span style="color:#ff79c6">_</span>,<span style="color:#8be9fd;font-style:italic">X</span>}) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">true</span>;
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">same_row</span>({<span style="color:#ff79c6">_</span>,<span style="color:#ff79c6">_</span>},{<span style="color:#ff79c6">_</span>,<span style="color:#ff79c6">_</span>}) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">false</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">same_column</span>({<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#ff79c6">_</span>},{<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#ff79c6">_</span>}) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">true</span>;
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">same_column</span>({<span style="color:#ff79c6">_</span>,<span style="color:#ff79c6">_</span>},{<span style="color:#ff79c6">_</span>,<span style="color:#ff79c6">_</span>}) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">false</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">same_diagonal</span>({<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>},{<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>}) <span style="color:#f1fa8c">-&gt;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">DeltaX</span> <span style="color:#ff79c6">=</span> <span style="color:#50fa7b">abs</span>(<span style="color:#8be9fd;font-style:italic">X1</span> <span style="color:#ff79c6">-</span> <span style="color:#8be9fd;font-style:italic">X2</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">DeltaY</span> <span style="color:#ff79c6">=</span> <span style="color:#50fa7b">abs</span>(<span style="color:#8be9fd;font-style:italic">Y1</span> <span style="color:#ff79c6">-</span> <span style="color:#8be9fd;font-style:italic">Y2</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">DeltaX</span> <span style="color:#ff79c6">==</span> <span style="color:#8be9fd;font-style:italic">DeltaY</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">attaccable</span>({<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, {<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>}) <span style="color:#f1fa8c">-&gt;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">same_row</span>( {<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, {<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>} ) <span style="color:#f1fa8c">orelse</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">same_column</span>( {<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, {<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>} ) <span style="color:#f1fa8c">orelse</span>
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">same_diagonal</span>( {<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, {<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>} ).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">safe_cell</span>({<span style="color:#ff79c6">_</span>,<span style="color:#ff79c6">_</span>}, []) <span style="color:#f1fa8c">-&gt;</span> <span style="color:#f1fa8c">true</span>;
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">safe_cell</span>({<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, [{<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>}|<span style="color:#8be9fd;font-style:italic">L</span>]) <span style="color:#f1fa8c">-&gt;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#ff79c6">not</span> <span style="color:#50fa7b">attaccable</span>({<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, {<span style="color:#8be9fd;font-style:italic">X2</span>,<span style="color:#8be9fd;font-style:italic">Y2</span>}) <span style="color:#f1fa8c">andalso</span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">safe_cell</span>({<span style="color:#8be9fd;font-style:italic">X1</span>,<span style="color:#8be9fd;font-style:italic">Y1</span>}, <span style="color:#8be9fd;font-style:italic">L</span>).
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">queens</span>(<span style="color:#8be9fd;font-style:italic">N</span>) <span style="color:#f1fa8c">-&gt;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">S</span> <span style="color:#ff79c6">=</span> <span style="color:#50fa7b">queens</span>(<span style="color:#8be9fd;font-style:italic">N</span>, <span style="color:#8be9fd;font-style:italic">N</span>),
</span></span><span style="display:flex;"><span>	io:<span style="color:#50fa7b">format</span>(<span style="color:#f1fa8c">&#34;~w solutions found!&#34;</span>, [<span style="color:#50fa7b">length</span>(<span style="color:#8be9fd;font-style:italic">S</span>)]),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">S</span>.
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">queens</span>(<span style="color:#bd93f9">0</span>, <span style="color:#ff79c6">_</span>) <span style="color:#f1fa8c">-&gt;</span> [[]];
</span></span><span style="display:flex;"><span><span style="color:#50fa7b">queens</span>(<span style="color:#8be9fd;font-style:italic">X</span>, <span style="color:#8be9fd;font-style:italic">Rows</span>) <span style="color:#f1fa8c">-&gt;</span>
</span></span><span style="display:flex;"><span>	[[{<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#8be9fd;font-style:italic">Y</span>}|<span style="color:#8be9fd;font-style:italic">L</span>] ||
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">L</span> <span style="color:#f1fa8c">&lt;-</span> <span style="color:#50fa7b">queens</span>( <span style="color:#8be9fd;font-style:italic">X</span> <span style="color:#ff79c6">-</span> <span style="color:#bd93f9">1</span>, <span style="color:#8be9fd;font-style:italic">Rows</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#8be9fd;font-style:italic">Y</span> <span style="color:#f1fa8c">&lt;-</span> lists:<span style="color:#50fa7b">seq</span>(<span style="color:#bd93f9">1</span>,<span style="color:#8be9fd;font-style:italic">Rows</span>),
</span></span><span style="display:flex;"><span>	<span style="color:#50fa7b">safe_cell</span>({<span style="color:#8be9fd;font-style:italic">X</span>,<span style="color:#8be9fd;font-style:italic">Y</span>}, <span style="color:#8be9fd;font-style:italic">L</span>)
</span></span><span style="display:flex;"><span>	].
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Basta Portali Intranet Unidirezionali!</title>
      <link>https://www.mr70.eu/posts/basta-portali-intranet-unidirezionali/</link>
      <pubDate>Sat, 27 Dec 2008 13:19:47 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/basta-portali-intranet-unidirezionali/</guid>
      <description><![CDATA[<p>Lavoro per un&rsquo;Azienda che, come altre di vecchio stampo, persiste con un modello di Intranet unidirezionale (dall&rsquo;alto verso il basso dove il dipendente e&rsquo; passivo)  che non stimola e incentiva la collaborazione e la condivisione del know-how. Purtroppo e&rsquo; una questione di mentalita&rsquo; e non di strumenti. Strumenti validi, robusti, gratuiti, e OpenSource ce ne sono&hellip; Leggete <a href="http://matteoredaelli.wordpress.com/2008/12/27/basta-portali-intranet-unidirezionali/wordpress-mu/">qui&rsquo;.</a> <a href="http://www.slideshare.net/matteoredaelli/wordpress-mu-presentation">http://www.slideshare.net/matteoredaelli/wordpress-mu-presentation</a> <a href="http://www.slideshare.net/folletto/wordpress-as-cms">http://www.slideshare.net/folletto/wordpress-as-cms</a> <a href="http://www.slideshare.net/msincome/how-to-use-wordpress-widgets">http://www.slideshare.net/msincome/how-to-use-wordpress-widgets</a> <a href="http://www.slideshare.net/msincome/wordpress-css-editing">http://www.slideshare.net/msincome/wordpress-css-editing</a> <a href="http://www.slideshare.net/bazza/high-performance-wordpress">http://www.slideshare.net/bazza/high-performance-wordpress</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Cambio programma</title>
      <link>https://www.mr70.eu/posts/cambio-programma/</link>
      <pubDate>Fri, 21 Nov 2008 08:26:10 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/cambio-programma/</guid>
      <description><![CDATA[<p>Oggi mi sono svegliato presto, mi sono infilato i pantaloni, vestito lentamente, preparato caffè, preso le mie mazze da golf e sono andato piano verso il garage, ho messo le mazze nell&rsquo;auto e ho tirato fuori la macchina dal garage sotto una pioggia torrenziale. La strada era totalmente inondata e il vento gelido soffiava a 100 km orari. Sono rientrato con l&rsquo;auto in garage, acceso la radio e sentito che le previsioni dicevano che quel tempaccio sarebbe durato tutto il giorno. Che delusione! Sono rientrato in casa, mi sono rispogliato e silenziosamente sono scivolato a letto. Piano mi sono avvicinando a mia moglie stringendola e, mettendole una mano sulla natica, le ho sussurrato all&rsquo;orecchio: &ldquo;il tempo fuori è orribile&rdquo; Lei mezza addormentata mi ha risposto: &ldquo;Sì lo so, e tu pensa a quel cretino di mio marito che è andato a giocare a golf!&rdquo;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Come contribuire alla ricerca donando qualche ora del tuo PC</title>
      <link>https://www.mr70.eu/posts/come-contribuire-alla-ricerca-donando-qualche-ora-del-tuo-pc/</link>
      <pubDate>Wed, 19 Nov 2008 22:15:54 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/come-contribuire-alla-ricerca-donando-qualche-ora-del-tuo-pc/</guid>
      <description><![CDATA[<p>E&rsquo; facile. Scarica un piccolo programma (<a href="http://boinc.berkeley.edu/">boinc</a>) e installalo sul tuo computer. Nei tempi morti o comunque quando vuoi tu, il programma si collega ai centri di ricerca, scarica un job da elaborare e quando ha terminato reinvia i risultati scaicando poi un nuovo job&hellip;. <a href="http://www.worldcommunitygrid.org/">World Community Grid</a> e&rsquo;  un esempio e si occupa di progetti &ldquo;that hold tremendous potential to benefit humanity.</p>
<ul>
<li>Nutritious Rice for the World</li>
<li>Help Conquer Cancer</li>
<li>Discovering Dengue Drugs - Together</li>
<li>Human Proteome Folding - Phase 2 Project</li>
<li>FightAIDS@Home Project</li>
<li>How Grid Computing Works</li>
</ul>
<p>Io personalmente mi sono iscritto al <a href="http://osesassociazione.wordpress.com/2008/11/09/world-community-grid-diamo-un-contributo/">Team di Oses</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Calendario 2009</title>
      <link>https://www.mr70.eu/posts/calendario-2009/</link>
      <pubDate>Sat, 18 Oct 2008 11:48:44 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/calendario-2009/</guid>
      <description><![CDATA[<p>[slideshow id=792633534436779082&amp;w=426&amp;h=320]</p>
<p>Alro che calendario Pirelli!! Ecco il Calendario 2009 di <a href="http://binarioperlafrica.wordpress.com/">Binario per l&rsquo;Africa</a> con le foto scatatte in Kenia l&rsquo;agostro scorso.</p>
<p>Here is the African Calendar 2009!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Using Apache Camel with Ibatis</title>
      <link>https://www.mr70.eu/posts/using-apache-camel-with-ibatis/</link>
      <pubDate>Wed, 08 Oct 2008 20:54:26 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/using-apache-camel-with-ibatis/</guid>
      <description><![CDATA[<p>This is a quick tutorial about the usage of the very powerful Integration tool <a href="http://activemq.apache.org/camel">Apache Camel</a> with <a href="ibatis.apache.org/">Apache Ibatis</a>. Many thanks to Apache Camel forums and <a href="http://www.nabble.com/user/UserProfile.jtp?user=1189612">Claus Ibsen</a>.</p>
<h1 id="requirements">REQUIREMENTS</h1>
<ul>
<li>I used Java version 1.5.0_16</li>
<li><a href="http://maven.apache.org/">Apache Maven</a> version 2.0.9</li>
<li>A database mysql: I used a local db &ldquo;moodle&rdquo;, user &ldquo;moodle&rdquo;, password &ldquo;moodle&rdquo; and a table &ldquo;mdl_user&rdquo; [ create table mdl_user ( id int, firstname varchar(30), lastname varchar(30), email varchar(30) ); ]</li>
</ul>
<h1 id="download">DOWNLOAD</h1>
<p>The full sample project can be download from <a href="http://www.redaelli.org/matteo/downloads/apache-camel/demo-ibatis.tgz">here</a>!</p>
<h1 id="step-by-step">STEP BY STEP</h1>
<p>As suggested by <a href="http://activemq.apache.org/camel/creating-a-new-spring-based-camel-route.html">http://activemq.apache.org/camel/creating-a-new-spring-based-camel-route.html</a> matteo@nowar:~/workspace$ mvn archetype:create \ -DarchetypeGroupId=org.apache.camel \ -DarchetypeArtifactId=camel-router \ -DarchetypeVersion=1.4.0 \ -DgroupId=org.redaelli \ -DartifactId=demo-ibatis matteo@nowar:~/workspace$ cd demo-ibatis matteo@nowar:~/workspace$ mvn eclipse:eclipse matteo@nowar:~/workspace$ mvn install Create iBatis files</p>
<ul>
<li>src/main/resources/SqlMapConfig.xml</li>
<li>src/main/resources/User.xml</li>
<li>src/main/java/org/redaelli/User.java</li>
</ul>
<p>Add the routes and dependences in the files</p>
<ul>
<li>src/main/java/org/redaelli/MyRouteBuilder.java</li>
<li>pom.xml (adding dependencies &ldquo;camel-ibatis&rdquo; e &ldquo;mysql jdbc&rdquo;)</li>
</ul>
<p>And finally run the demo with matteo@nowar:~/workspace$ mvn camel:run</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>The site of St Massimo Parish del Meru Kenya is online</title>
      <link>https://www.mr70.eu/posts/the-site-of-st-massimo-parish-del-meru-kenya-is-online/</link>
      <pubDate>Mon, 25 Aug 2008 08:31:40 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/the-site-of-st-massimo-parish-del-meru-kenya-is-online/</guid>
      <description><![CDATA[<p>Please, go and visit the new website of <a href="http://stmassimoparish.wordpress.com/">St Massimo Parish</a>. I hope it will be reacher and reacher of contents and useful information&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Alcune verita&#39; sugli inceneritori...</title>
      <link>https://www.mr70.eu/posts/alcune-verita-sugli-inceneritori/</link>
      <pubDate>Fri, 01 Aug 2008 12:37:41 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/alcune-verita-sugli-inceneritori/</guid>
      <description><![CDATA[<p><a href="http://matteoredaelli.files.wordpress.com/2008/08/inceneritore.jpg"><img src="http://matteoredaelli.files.wordpress.com/2008/08/inceneritore.jpg?w=300" alt=""></a> Mi e&rsquo; stata girata per email questa <a href="http://matteoredaelli.files.wordpress.com/2008/08/alcuneveritasuirifiuti.pdf">presentazione</a>, non so quanto corrisponda al vero ma e&rsquo; di sicuro un interessante spunto di riflessione&hellip; <strong>Incenerire inquina e&hellip; UCCIDE?</strong></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Set a Guinness World Record Enjoy a Better Web</title>
      <link>https://www.mr70.eu/posts/set-a-guinness-world-record-enjoy-a-better-web/</link>
      <pubDate>Fri, 13 Jun 2008 17:03:58 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/set-a-guinness-world-record-enjoy-a-better-web/</guid>
      <description><![CDATA[<p><a href="http://www.spreadfirefox.com/node&amp;id=0&amp;t=264"><img src="http://www.spreadfirefox.com/files/images/affiliates_banners/dday_badge_fox.png" alt=""></a>Pledge to get Firefox 3 during Download Day to set the Guinness World Record for Most Software Downloaded in 24 Hours!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>OpenID Demand: please go and visit the site...</title>
      <link>https://www.mr70.eu/posts/openid-demand-please-go-and-visit-the-site/</link>
      <pubDate>Fri, 23 May 2008 18:21:03 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/openid-demand-please-go-and-visit-the-site/</guid>
      <description><![CDATA[<p><img src="http://demand.openid.net/static/openid-please.png" alt="">**I&rsquo;m tired of having and remembering so many userid/password for internet sites, aren&rsquo;t you? ** <strong>Please, o and visit the site &ldquo;OpenID Demand</strong>&rdquo;.. <a href="http://demand.openid.net">http://demand.openid.net</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Presentazione Free e Opensource Software (e Linux)</title>
      <link>https://www.mr70.eu/posts/presentazione-free-e-opensource-software-e-linux/</link>
      <pubDate>Mon, 05 May 2008 14:35:16 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/presentazione-free-e-opensource-software-e-linux/</guid>
      <description><![CDATA[<p>Trovate <a href="http://matteoredaelli.files.wordpress.com/2008/05/foss-linux.pdf">qui&rsquo;</a> una presentazione sul Free &amp; Opensource sw che ho fatto. Ho tagliato alcune slide sulla mia azienda per evitare eventuali problemi di sicurezza.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Assegno</title>
      <link>https://www.mr70.eu/posts/assegno/</link>
      <pubDate>Wed, 30 Apr 2008 11:43:40 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/assegno/</guid>
      <description><![CDATA[<p>C&rsquo;era un uomo che aveva lavorato tutta la vita, aveva risparmiato tutti i suoi soldi, e quando si trattava di spenderli era un vero avaro. Poco prima di morire, disse alla moglie&hellip; &ldquo;Quando muoio, voglio che tu prenda tutti i miei soldi e li metta nella bara con me. Me li voglio portare con me nell&rsquo;aldilà.&rdquo; E così si fece promettere con tutto il cuore dalla moglie, che quando sarebbe morto lei avrebbe messo tutti i suoi soldi nella cassa con lui. Al funerale, era steso nella bara con vicino la moglie, vestita di nero, seduta affianco alla sua migliore amica. Quando fu finita la cerimonia, e si preparavano a chiudere la bara, la moglie diss: &ldquo;Aspettate un momento!&rdquo; Aveva una piccola scatola di metallo; si avvicinò con la scatola e la mise nella cassa. Chiusero la bara e la portarono via. E quindi la sua amica le disse: &ldquo;Ragazza, sapevo che non eri così tonta da mettere tutto quel denaro la dentro con tuo marito.&rdquo; La mogie fedele rispose: &ldquo;Senti, io sono una persona credente; non posso tornare sulle mie parole. Gli ho promesso che avrei messo quei soldi nella bara con lui.&rdquo; &ldquo;Vuoi dire che hai messo tutto quel denaro li dentro con lui!?!?!?&rdquo; &ldquo;Certo che l&rsquo;ho fatto&rdquo;, disse la moglie. &ldquo;L&rsquo;ho preso tutto, l&rsquo;ho messo sul mio conto, e gli ho fatto un assegno&hellip;&hellip;. Se riesce a incassarlo se li può spendere tutti.&rdquo;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Test your web site with all browsers &amp; operating systems</title>
      <link>https://www.mr70.eu/posts/test-your-web-site-with-all-browsers-operating-systems/</link>
      <pubDate>Wed, 09 Apr 2008 15:23:21 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/test-your-web-site-with-all-browsers-operating-systems/</guid>
      <description><![CDATA[<p>Go and see the web site <a href="http://browsershots.org/">http://browsershots.org/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Boinc</title>
      <link>https://www.mr70.eu/posts/boinc/</link>
      <pubDate>Tue, 01 Apr 2008 06:33:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/boinc/</guid>
      <description><![CDATA[<h2 id="httpboincberkeleyedulogowww_logogifuse-the-idle-time-on-your-computer-windows-mac-or-linux-to-cure-diseases-study-global-warming-discover-pulsars-and-do-many-other-types-of-scientific-research-its-safe-secure-and-easy-with-boinchttpboincberkeleyedu"><img src="http://boinc.berkeley.edu/logo/www_logo.gif" alt="">Use the idle time on your computer (Windows, Mac, or Linux) to cure diseases, study global warming, discover pulsars, and do many other types of scientific research. It&rsquo;s safe, secure, and easy with <strong><a href="http://boinc.berkeley.edu/">boinc</a></strong></h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://mimo.splinder.com" title="vittorio.re@gmail.com">tramp</a> - <!-- raw HTML omitted -->Apr 3, 2008<!-- raw HTML omitted --></p>
<p>The idea is surely praiseworthy and I was about to subscribe. But suddenly I stopped and some strange thoughts started to surf into my mind. Why should I give my free help to a foreign university / department? I would be happier if I could give this same contribution to an italian organization. Maybe I&rsquo;m wrong and I&rsquo;m a bit selfish, but I think: &ldquo;what would those people do with the results of their studies?&rdquo;; &ldquo;will they make all the other peolple pay for that?&rdquo;. So I say &ldquo;NO, I won&rsquo;t subscribe!&rdquo;</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Amnesty International &amp; Tibet</title>
      <link>https://www.mr70.eu/posts/amnesty-international-tibet/</link>
      <pubDate>Thu, 20 Mar 2008 18:28:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/amnesty-international-tibet/</guid>
      <description><![CDATA[<p><a href="http://matteoredaelli.wordpress.com/2008/03/20/amnesty-international-tibet/68/" title="tibet.jpg"><img src="http://matteoredaelli.files.wordpress.com/2008/03/tibet.jpg" alt="tibet.jpg"></a>&hellip;a seguito delle proteste scoppiate lunedì 10 marzo in Tibet in cui sono stati arrestati numerosi monaci tibetani, Amnesty International ha lanciato oggi un&rsquo;azione urgente in favore di 15 monaci arrestati e scomparsi. Si tratta di Samten, Trulku Tenpa Rigsang, Gelek Pel, Lobsang, Lobsang Thukjey, Tsultrim Palden, Lobsher, Phurden, Thupdon, Lobsang Ngodup, Lodoe, Thupwang, Pema Garwang, Tsegyam e Soepa, in carcere dal 10 marzo per aver preso parte a una manifestazione pacifica a Barkhor, Lhasa, la capitale della Regione autonoma tibetana. Non si hanno ulteriori informazioni sul luogo in cui sono detenuti né su eventuali accuse formulate nei loro confronti e Amnesty International teme rischino di subire torture e altri maltrattamenti. Perchè non firmare e far firmare l&rsquo;appello per la loro scarcerazione? Valli a questa <a href="http://www.amnesty.it/appelli/azioni_urgenti/Tibet?page=azioni_urgenti">pagina</a> !</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Detrazione per gli abbonamenti ai mezzi di trasporto pubblici</title>
      <link>https://www.mr70.eu/posts/detrazione-per-gli-abbonamenti-ai-mezzi-di-trasporto-pubblici-artdetrazione-per-gli-abbonamenti-ai-mezzi-di-trasporto-pubblici/</link>
      <pubDate>Wed, 19 Mar 2008 08:38:42 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/detrazione-per-gli-abbonamenti-ai-mezzi-di-trasporto-pubblici-artdetrazione-per-gli-abbonamenti-ai-mezzi-di-trasporto-pubblici/</guid>
      <description><![CDATA[<p>Finalmente la detrazione per gli abbonamenti ai mezzi di trasporto pubblici: art. 1, comma 309, legge n. 244 del 27 dicembre 2007. Ecco il testo del <a href="http://matteoredaelli.files.wordpress.com/2008/03/rimborso_abbonamenti.pdf" title="rimborso_abbonamenti.pdf">rimborso_abbonamenti.pdf</a>!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>E&#39; la fine della storia</title>
      <link>https://www.mr70.eu/posts/e-la-fine-della-storia/</link>
      <pubDate>Mon, 25 Feb 2008 19:18:22 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/e-la-fine-della-storia/</guid>
      <description><![CDATA[<p><em>&ldquo;E&rsquo; la fine della storia, e non lo sai.</em> <em>Lui e&rsquo; li&rsquo;, in piedi davanti alla finestra, e tu non gli perdoni di schermare la luce.</em> <em>Non e&rsquo; lui che vedi, ma il giorno, cui lui impedisce di entrare. Inizia cosi&rdquo;</em> [Brigitte Giraud], tratto dal quotidiano City, 25-02-2008</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>ATM: collegamento Linate con le stazioni FS o fermate della metropolitana</title>
      <link>https://www.mr70.eu/posts/atm-collegamento-linate-con-stazioni-fs-o-fermate-della-metropolitana/</link>
      <pubDate>Mon, 25 Feb 2008 09:51:39 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/atm-collegamento-linate-con-stazioni-fs-o-fermate-della-metropolitana/</guid>
      <description><![CDATA[<p>ATM, nella sua pagina dedicata sul quotidiano gratuito City, oggi ha fatto pubblicita&rsquo; all&rsquo;UTILE servizio di collegamento tra Linate e San Babila fornito dalla linea 73. La considero una presa in giro e un&rsquo;offesa per tutti i cittadini milanesi e lombardi! E una concessione alla lobby dei tassisti&hellip; La maggior parte di chi parte/arriva a Linate abita in centro a Milano? Oppure quanti hanno la NECESSITA&rsquo; di passare per il centro della citta&rsquo; con le valigie prima o dopo il volo? Quello di cui abbiamo bisogno e&rsquo; un collegamento tra Linate e le stazioni FS (tipo Lambrate e Rogoredo) e del metro&rsquo; (tipo Gobba) della citta&rsquo;. Vergogna!!!!!!!!</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Foto della ciaspolata a S. Caterina con gli Amici della Montagna</title>
      <link>https://www.mr70.eu/posts/foto-della-ciaspolata-a-s-caterina-con-gli-amici-della-montagna-alpini-di-carate/</link>
      <pubDate>Mon, 04 Feb 2008 12:09:54 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/foto-della-ciaspolata-a-s-caterina-con-gli-amici-della-montagna-alpini-di-carate/</guid>
      <description><![CDATA[<p>In questa pagina trovate le <a href="http://www.redaelli.org/pictures/2008/">foto</a> della ciaspolata di ieri a S. Caterina organizzata dagli Amici della Montagna (<a href="http://www.alpinicarate.it">Alpini di Carate Brianza</a>)</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Che vergogna...</title>
      <link>https://www.mr70.eu/posts/che-vergogna/</link>
      <pubDate>Fri, 25 Jan 2008 19:17:27 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/che-vergogna/</guid>
      <description><![CDATA[<h2 id="i-deputati-sono-i-rappresentanti-del-nostro-paese-e-dovrebbero-dare-il-buon-esempio-quanto-successo-al-senato-ieri-prima-e-dopo-lannuncio-della-sfiducia-al-governo-e-pietoso-e-utopia-ma-sarebbe-bello-varare-prima-delle-elezioni-delle-leggi-che-impediscano-la-candidatura-alle-persone-indagate-condannate-o-che-abbiamo-gia-partecipato-almeno-due-legislature-i-deputati-prendono-troppi-soldi-molti-lo-fanno-solo-per-soldi-e-interessi-personali-non-per-amore-per-il-nostro-paese">I deputati sono i rappresentanti del nostro Paese e dovrebbero dare il buon esempio. Quanto successo al Senato ieri prima e dopo l&rsquo;annuncio della sfiducia al Governo e&rsquo; pietoso&hellip; E&rsquo; utopia ma sarebbe bello varare prima delle elezioni delle leggi che impediscano la candidatura alle persone indagate, condannate o che abbiamo gia&rsquo; partecipato almeno due legislature!!! I deputati prendono TROPPI soldi, molti lo fanno SOLO per soldi e interessi personali, non per AMORE per il Nostro Paese&hellip;</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://superbolo.altervista.org" title="stefano.bolognani@gmail.com">superbolo</a> - <!-- raw HTML omitted -->Jan 0, 2008<!-- raw HTML omitted --></p>
<p>Tutti i politici.. da chi sta in alto fino alla fine della filiera nei comuni &hellip; per Esempio, Cuffaro, perchè pensi si sia dimesso? Per onestà? No &hellip; perchè, una volta caduto il governo, il consiglio dei ministri non puo&rsquo; piu&rsquo; firmare il suo allontanamento dal parlamento regionale, e con le nuove elezioni, Toto, potrà diventare senatore e godere dell&rsquo;immunità parlamentare&hellip;.</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>E&#39; morto Bobby Fischer!</title>
      <link>https://www.mr70.eu/posts/e-morto-bobby-fischer/</link>
      <pubDate>Fri, 18 Jan 2008 22:22:17 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/e-morto-bobby-fischer/</guid>
      <description><![CDATA[<p><img src="http://mychessgames.1afm.com/fischer1972u.jpg" alt=""> All&rsquo;eta&rsquo; di 64 anni e&rsquo; morto il mitico scacchista <strong><a href="http://en.wikipedia.org/wiki/Bobby_Fischer">Bobby Fischer</a></strong> divenuto campione nel mondo nel 1972! Links:</p>
<blockquote>
<p>* <a href="http://bobbyfischer.net/">http://bobbyfischer.net/</a></p>
</blockquote>
<blockquote>
<p>* <a href="http://www.bobby-fischer.net/">http://www.bobby-fischer.net/</a></p>
</blockquote>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>One laptop for a child</title>
      <link>https://www.mr70.eu/posts/one-laptop-for-a-child/</link>
      <pubDate>Thu, 27 Dec 2007 19:23:27 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/one-laptop-for-a-child/</guid>
      <description><![CDATA[<p><img src="http://laptopgiving.org/g1g1/logo_v2.gif" alt=""> Per maggiori info andare sui siti</p>
<ul>
<li><a href="http://laptop.org/">http://laptop.org/</a></li>
<li><a href="http://laptopgiving.org/">http://laptopgiving.org/</a></li>
</ul>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Linux in the slum</title>
      <link>https://www.mr70.eu/posts/linux-in-the-slum/</link>
      <pubDate>Sun, 11 Nov 2007 07:59:48 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/linux-in-the-slum/</guid>
      <description><![CDATA[<p><a href="http://www.afrikasi.org/">AfrikaSi</a> ha completato la prima fase del suo progetto pilota &ldquo;Linux in the slum&rdquo;, iniziativa volta a promuovere l&rsquo;alfabetizzazione informatica dei giovani che vivono nelle baraccopoli di Nairobi. Questa iniziativa fa parte di un progetto piu&rsquo; ampio: <a href="http://www.oses.it/cosa-facciamo/progetto-linux-aids-people-1">Linux Aids People</a>! Leggi il resto dell&rsquo;articolo su <a href="http://www.oses.it/cosa-facciamo/progetto-linux-aids-people-1/progetto-pc-in-the-slum/linux-in-the-slum/">Oses.it</a>. Altre info su <a href="http://cissiboy.wordpress.com/2007/10/16/linux-e-le-speranze-africane/">cissiboy linux-e-le-speranze-africane</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Linux Aids People</title>
      <link>https://www.mr70.eu/posts/linux-aids-people/</link>
      <pubDate>Sun, 11 Nov 2007 07:29:50 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/linux-aids-people/</guid>
      <description><![CDATA[<h2 id="nellambito-delle-attività-solidali-di-lotta-al-sottosviluppo-alla-povertà-al-disagio-oseshttpwwwosesit-ha-avviato-il-progetto-permanente-_linux-aids-peoplehttpwwwosesitcosa-facciamoprogramma-linux-aids-peopleprogramma-linux-aids-people_-che-mira-alla-raccolta-e-riconversione-con-soluzioni-open-source-di-personal-computer-da-destinare-ad-uso-didattico-nelle-scuole-dei-paesi-in-via-di-sviluppo">Nell&rsquo;ambito delle attività solidali di lotta al sottosviluppo, alla povertà, al disagio, <a href="http://www.oses.it">OSES</a> ha avviato il progetto permanente <em><a href="http://www.oses.it/cosa-facciamo/programma-linux-aids-people/programma-linux-aids-people">Linux Aids People</a></em> che mira alla raccolta e riconversione, con soluzioni Open Source, di Personal Computer da destinare ad uso didattico nelle scuole dei paesi in via di sviluppo.</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="%22federico.stufa@fastwebnet.it%22">Federico</a> - <!-- raw HTML omitted -->Nov 4, 2007<!-- raw HTML omitted --></p>
<p>Ciao Matteo, mi sono iscritto sul sito di OsES. Potrei sapere come collaborare? Grazie Federico</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>SAP Contributes New Tool to Open Source Eclipse Developer Community</title>
      <link>https://www.mr70.eu/posts/sap-contributes-new-tool-to-open-source-eclipse-developer-community/</link>
      <pubDate>Tue, 06 Nov 2007 20:04:39 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/sap-contributes-new-tool-to-open-source-eclipse-developer-community/</guid>
      <description><![CDATA[<p><em>Advanced Memory Analyzer Capabilities Enable Eclipse Developers to Build Enterprise Applications Within Leading Open Source Development Environment</em> Read the rest f the article at <a href="http://money.cnn.com/news/newsfeeds/articles/prnewswire/AQW04517102007-1.htm">CNN</a>. Sap Wiki at <a href="https://wiki.sdn.sap.com/wiki/x/k2w">https://wiki.sdn.sap.com/wiki/x/k2w</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Avete mai provato OpenOffice?</title>
      <link>https://www.mr70.eu/posts/avete-mai-provato-openoffice/</link>
      <pubDate>Wed, 03 Oct 2007 14:36:55 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/avete-mai-provato-openoffice/</guid>
      <description><![CDATA[<p>OpenOffice e’ una suite office GRATUITA <a href="http://www.openoffice.org/">scaricabile</a> liberamente da internet che legge e scrive documenti di Microsoft Office (doc,xls,ppt,..). Stupisce per le similarita’ di aspetto, funzionalita’ e usabilita’ col suo concorrente commerciale…Su <a href="http://www.linux.com/feature/119513">http://www.linux.com/feature/119513</a> trovate una comparazione tra le due suite circa la creazione di presentazioni… Io da anni uso unicamente OpenOffice per leggere e scrivere documenti di lavoro e uso spesso la funzione di export as PDF…</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>E&#39; notte per l&#39;ultima volta</title>
      <link>https://www.mr70.eu/posts/e-notte-per-lultima-volta/</link>
      <pubDate>Fri, 14 Sep 2007 06:28:08 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/e-notte-per-lultima-volta/</guid>
      <description><![CDATA[<blockquote>
<p>_E&rsquo; notte per l&rsquo;ultima volta._<em>Per l&rsquo;ultima volta le tue mani</em> <em>si raccolgono sul mio corpo.</em> <em>Domani sara&rsquo; autunno.</em> <em>Insieme seduti in terrazza</em> <em>guarderemo le foglie secche spargersi sul villaggio</em> <em>come lettere che bruciano,</em> <em>una per una,</em> <em>in case separate.</em></p>
</blockquote>
<p>Louise Gluck, quotidiano <a href="http://www.city.it">CITY</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CV online</title>
      <link>https://www.mr70.eu/posts/cv-online/</link>
      <pubDate>Wed, 12 Sep 2007 09:54:21 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/cv-online/</guid>
      <description><![CDATA[<p>Ciao Ho messo online il mio curriculum vitae. Se cercate qualcuno che aiuti la vostra Azienda (a Milano, Lecco o Brianza) a traghettare verso un&rsquo;informatizzazione libera e + economica (grazie a Linux e ai programmi OpenSource) io potrei essere la persona giusta per voi&hellip; <a href="http://matteoredaelli.wordpress.com/cv/">http://matteoredaelli.wordpress.com/cv/</a></p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>OpenID for SSO</title>
      <link>https://www.mr70.eu/posts/openid-for-sso/</link>
      <pubDate>Sat, 08 Sep 2007 06:11:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/openid-for-sso/</guid>
      <description><![CDATA[<h2 id="openid-has-been-getting-more-and-more-famous-and-many-opensource-projects-have-already-adopted-it--httpopenidnetpresentationsbmlhttpopenidnetpresentationsbml-httpwwwopenidbookcomchaptersopenidbook-draft-13pdfhttpwwwopenidbookcomchaptersopenidbook-draft-13pdf-there-are-libraries-for-the-most-common-programming-languages-python-ruby-java-perl-net-httpopenidnetwikiindexphplibrarieshttpopenidnetwikiindexphplibraries-how-does-it-work-get-an-openid-userid-from-an-openid-provider-wordpresscom-aol-livejournal-openidservershttpopenidnetwikiindexphpopenidservers29-or-from-your-own-provider-openid-see-run_your_own_identity_serverhttpopenidnetwikiindexphprun_your_own_identity_server-ie-crowdhttpwwwatlassiancomsoftwarecrowd-is-used-by-several-big-companies-but-you-have-to-pay-for-it-if-you-use-it-not-for-opensource-projects-and-then-you-can-use-that-account-if-you-want-to-enter-all-other-openid-enables-sites-httpswwwmyopenidcomdirectoryhttpswwwmyopenidcomdirectory-httpopenidnetpres2007-kveton-openid-5pdfhttpopenidnetpres2007-kveton-openid-5pdf">OpenID has been getting more and more famous and many OpenSource projects have already adopted it &hellip; <a href="http://openid.net/presentations.bml">http://openid.net/presentations.bml</a> <a href="http://www.openidbook.com/chapters/OpenIDBook-Draft-13.pdf">http://www.openidbook.com/chapters/OpenIDBook-Draft-13.pdf</a> There are libraries for the most common programming languages (Python, Ruby, Java, Perl, .Net) <a href="http://openid.net/wiki/index.php/Libraries">http://openid.net/wiki/index.php/Libraries</a> How does it work? Get an OpenID userid from an OpenID provider (wordpress.com, aol, livejournal,.. <a href="http://openid.net/wiki/index.php/OpenIDServers%29">OpenIDServers)</a> or from your own provider OpenID (see <a href="http://openid.net/wiki/index.php/Run_your_own_identity_server">Run_your_own_identity_server</a>, i.e <a href="http://www.atlassian.com/software/crowd">crowd</a> is used by several big companies but you have to pay for it if you use it not for openSource projects) and then you can use that account (if you want) to enter all other OpenID enables sites (<a href="https://www.myopenid.com/directory">https://www.myopenid.com/directory</a>) <a href="http://openid.net/pres/2007-kveton-openid-5.pdf">http://openid.net/pres/2007-kveton-openid-5.pdf</a></h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://www.redaelli.org" title="matteo.redaelli@gmail.com">Matteo</a> - <!-- raw HTML omitted -->Jan 4, 2008<!-- raw HTML omitted --></p>
<p>Anche Google sceglie OpenID come sistema di Identity e SSO. Vedete <a href="http://punto-informatico.it/p.aspx?id=2155653">http://punto-informatico.it/p.aspx?id=2155653</a> e <a href="http://uk.techcrunch.com/2008/01/09/google-ibm-and-verisign-to-join-openid/">http://uk.techcrunch.com/2008/01/09/google-ibm-and-verisign-to-join-openid/</a> Con la sola userid/password di Google (o di wordpress.com, AOL, o qualsiasi altro provider OpenID) sara’ possibile accedere (in SSO) a tutti i siti OpenID enabled.</p>
<!-- raw HTML omitted -->
<p>Anche sourceforge accetta utenze OpenID! <a href="http://openid.net/2008/05/01/sourceforge-allows-openid-logins/">http://openid.net/2008/05/01/sourceforge-allows-openid-logins/</a></p>
<!-- raw HTML omitted -->
<p>Howto Integrating SAP Netveawer and OpenID <a href="http://www.sap.com/mk/get">http://www.sap.com/mk/get</a>?_EC=aVAixZ7ktAaSgYDKqVnHF6</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Cena di beneficenza</title>
      <link>https://www.mr70.eu/posts/cena-di-beneficenza/</link>
      <pubDate>Thu, 06 Sep 2007 14:41:38 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/cena-di-beneficenza/</guid>
      <description><![CDATA[<p>Vi propongo la cena di beneficenza <em>sabato 13 ottobre 2007</em>  alle <em>ore 20</em> presso l’Agriturismo “I LAGHETTI” via Cavamarna (Oasi di Baggero) - Monguzzo (CO) durante la quale verra&rsquo; presentato il gruppo di volontariato <strong>Binario per l&rsquo;Africa</strong>. Per maggiori informazioni andate sul sito <a href="http://binarioperlafrica.wordpress.com/">http://binarioperlafrica.wordpress.com/</a> e se volete ad agosto andare in Kenia nella zona del Meru per vedere con i vostri occhi a cosa servono i contributi raccolti&hellip;</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Irlanda On the Road</title>
      <link>https://www.mr70.eu/posts/irlanda-on-the-road/</link>
      <pubDate>Tue, 07 Aug 2007 06:59:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/irlanda-on-the-road/</guid>
      <description><![CDATA[<p>Le due settimane centrali di agosto sono in Irlanda per 2 settimane con Eleonora, Marino e Paola. Nella sezione <a href="http://www.redaelli.org/pictures/" title="Foto">foto</a> troverete le fotografie fatte da me e Marino.  <strong>Venerdi&rsquo; 10 agosto 2007</strong> Milano - Shannon - Bunratty - Cashel Partenza con Ryanair da Orio al Serio alle 10.40 per Shannon dove abbiamo gia&rsquo; noleggiato la macchina. B&amp;B Ballyknock House, Cashel <strong>Sabato 11 agosto 2007</strong> Cashel - Kinsale - Bandon B&amp;B Derrycool <strong>Domenica 12 agosto 2007</strong> Bandon - Mizen Head - Kenmare B&amp;B Hazelwood, Killaha <strong>Lunedi&rsquo; 13 agosto 2007</strong> Kenmare - Ring of Kerry - Kenmare <strong>Martedi&rsquo; 14 agosto 2007</strong> Kenmare - Castelmaine B&amp;B Castelmaine House <strong>Mercoledi&rsquo; 15 agosto 2007</strong> Castelmain - Dingle - Tarbet - Killimer - Doolin <strong>Giovedi&rsquo; 16 agosto 2007</strong> Doolin - Cliff of Moher - Doolin <strong>Venerdi&rsquo; 17 agosto 2007</strong> Doolin - Galway - Spiddle B&amp;B Kelly&rsquo;s Driftwood <strong>Sabato 18 agosto 2007</strong> Spiddle - Connemara - Castlebar. B&amp;B Primrose Cottage (the best one) <strong>Domenica 19 agosto 2007</strong> Castebar - Achill Island - Sligo B&amp;B Walrey, Rosses Point Road <strong>Lunedi&rsquo; 20 agosto 2007</strong> Sligo - Bunberg B&amp;B An Teach Ban, <a href="mailto:pmcgill@iol.ie">pmcgill@iol.ie</a> <strong>Martedi&rsquo; 21 agosto 2007</strong> Bunberg - Dunfanaghy beach - Boyle <strong>Mercoledi&rsquo; 22 agosto 2007</strong> Boyle - Ennis B&amp;B Brookville (the worst and expensive one) <strong>Giovedi&rsquo; 23 agosto 2007</strong> Ennis - Limerick - Killrush - Shannon airport <strong>Venerdi&rsquo; 24 agosto 2007</strong> Dopo una notte in aeroporto si prende il volo per Orio al Serio alle 6.40 del mattino.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Detassiamo l&#39;abbonamento ai mezzi pubblici!</title>
      <link>https://www.mr70.eu/posts/detassiamo-labbonamento-ai-mezzi-pubblici/</link>
      <pubDate>Fri, 03 Aug 2007 19:00:03 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/detassiamo-labbonamento-ai-mezzi-pubblici/</guid>
      <description><![CDATA[<h2 id="lavoro-per-un-noto-gruppo-industriale-a-milano-citta-decadente-a-causa-del-traffico-dellaria-inquinata-e-limmobilita-politico-ambientale-degli-ultimi-decenni-conosco-diversi-colleghi-che-pur-vivendo-in-citta-vengono-sistematicamente-al-lavoro-ogni-giorno-in-macchina-come-si-potrebbe-incentivare-i-cittadini-e-pendolari-allutilizzo-dei-mezzi-pubblici-oltre-alla-scontato-miglioramento-della-frequenza-dei-mezzi-si-potrebbe-permettere-ai-lavoratori-di-detrarre-dalle-tasse-il-costo-degli-abbonamenti-atm-e-trenitalia-usati-per-recarsi-al-lavoro-che-ne-dite-vi-sembra-unidea-troppo-insensata-o-irrealizzabile">Lavoro per un noto gruppo industriale a Milano, citta&rsquo; decadente a causa del traffico, dell&rsquo;aria inquinata e l&rsquo;immobilita&rsquo; politico ambientale degli ultimi decenni. Conosco diversi colleghi che pur vivendo in citta&rsquo; vengono sistematicamente al lavoro ogni giorno in macchina. Come si potrebbe incentivare i cittadini e pendolari all&rsquo;utilizzo dei mezzi pubblici? Oltre alla scontato miglioramento della frequenza dei mezzi si potrebbe permettere ai lavoratori di detrarre dalle tasse il costo degli abbonamenti ATM e Trenitalia usati per recarsi al lavoro. Che ne dite? VI sembra un&rsquo;idea troppo insensata o irrealizzabile?!?!?!</h2>
<h3 id="comments">Comments:</h3>
<h4 id="heading"></h4>
<p><a href="http://www.superbolo.altervista.org/wp/" title="stefano_bolognani@hotmail.com">superbolo</a> - <!-- raw HTML omitted -->Aug 2, 2007<!-- raw HTML omitted --></p>
<p>I mezzi di trasporto in Italia sono ben lontani dall&rsquo;essere efficenti, puliti e moderni. E quando lo sono, per colpa dei soliti, e quasi impossibile utilizzarli. E poi ci sono gli orari, quasi sempre studiati da chi non ha reale necessità di prenderli. Certo, è facile fare critica, ma purtroppo è anche troppo difficile ottenere qualcosa. E anche per chi utilizza le due ruote per recarsi al lavoro, non è facile e non incentivato. Ecco quindi che tanti preferiscono rintanarsi per ore ed ore in una scatola in coda, pero&rsquo; al fresco dell&rsquo;aria condizionata od al caldo del riscaldamento. Che vita pero&rsquo; &hellip;.</p>
<!-- raw HTML omitted -->
<p>&hellip; a volte arriva qualche buona notizie (anche se c&rsquo;è da vedere se passerà davvero&hellip;). come questa, contenuta nella finanziaria 2008: Trasporto pubblico locale Per le spese, non superiori a 250 euro, sostenute fino al 31 dicembre 2008 per l&rsquo;acquisto di abbonamenti ai servizi di trasporto pubblico locale, regionale e interregionale, è prevista una detrazione del 19 per cento. Per poterne usufruirne è necessario che le spese non siano deducibili dai singoli redditi che concorrono a formare quello complessivo. chissà! speriamo :)</p>
<!-- raw HTML omitted -->
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Benvenuti</title>
      <link>https://www.mr70.eu/posts/hello-world-2/</link>
      <pubDate>Mon, 18 Sep 2006 14:35:56 +0000</pubDate>
      
      <guid>https://www.mr70.eu/posts/hello-world-2/</guid>
      <description><![CDATA[<p>Welcome to my blog! this is my first post&hellip;</p>
]]></description>
      
    </item>
    
    
    
    
    
    
  </channel>
</rss>
