<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on widerin</title><link>http://widerin.net/posts/</link><description>Recent content in Posts on widerin</description><generator>Hugo</generator><language>en</language><atom:link href="http://widerin.net/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Gitlab Security Products with Java and Gradle</title><link>http://widerin.net/posts/2020/gitlab-security-products-with-java-and-gradle/</link><pubDate>Sun, 08 Mar 2020 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2020/gitlab-security-products-with-java-and-gradle/</guid><description>&lt;p&gt;GitLab security products have been constantly improving support for different
build tools and programming languages.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://gitlab.com/gitlab-org/security-products/license-management/merge_requests/7"&gt;recent contribution&lt;/a&gt;
to &lt;a href="https://docs.gitlab.com/ee/user/compliance/license_compliance/#license-compliance"&gt;License compliance&lt;/a&gt; allows now to inject commands &lt;code&gt;SETUP_CMD&lt;/code&gt; environment
variable to the core to bypass the package manager auto-detection and make use
of the &lt;code&gt;./gradlew&lt;/code&gt; &lt;a href="https://gradle.org"&gt;Gradle&lt;/a&gt; wrapper script.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;include:
- template: Security/License-Scanning.gitlab-ci.yml
variables:
SETUP_CMD: sh my-custom-install-script.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example, my-custom-install-script.sh is a shell script at the root
directory of your project.&lt;/p&gt;</description></item><item><title>Java versions on macOS</title><link>http://widerin.net/posts/2020/java-versions-on-macos/</link><pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2020/java-versions-on-macos/</guid><description>&lt;p&gt;On macOS you can use &lt;code&gt;/usr/libexec/java_home&lt;/code&gt; command to control your used Java
version. As a lot of applications and/or projects still require Java 1.8 or you
might want to use an alternative JDK/JRE let&amp;rsquo;s look into managing those
different versions.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ /usr/libexec/java_home -h
Usage: java_home [options...]
Returns the path to a Java home directory from the current user&amp;#39;s settings.
Options:
[-v/--version &amp;lt;version&amp;gt;] Filter Java versions in the &amp;#34;JVMVersion&amp;#34; form 1.X(+ or *).
[-a/--arch &amp;lt;architecture&amp;gt;] Filter JVMs matching architecture (i386, x86_64, etc).
[-d/--datamodel &amp;lt;datamodel&amp;gt;] Filter JVMs capable of -d32 or -d64
[-t/--task &amp;lt;task&amp;gt;] Use the JVM list for a specific task (Applets, WebStart, BundledApp, JNI, or CommandLine)
[-F/--failfast] Fail when filters return no JVMs, do not continue with default.
[ --exec &amp;lt;command&amp;gt; ...] Execute the $JAVA_HOME/bin/&amp;lt;command&amp;gt; with the remaining arguments.
[-R/--request] Request installation of a Java Runtime if not installed.
[-X/--xml] Print full JVM list and additional data as XML plist.
[-V/--verbose] Print full JVM list with architectures.
[-h/--help] This usage information.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="manual-installation"&gt;Manual installation&lt;/h2&gt;
&lt;p&gt;For this post I&amp;rsquo;ve decided to use &lt;a href="https://adoptopenjdk.net/installation.html"&gt;AdoptOpenJDK&lt;/a&gt; as it&amp;rsquo;s actively maintained.&lt;/p&gt;</description></item><item><title>Gitlab License Management with Java 11</title><link>http://widerin.net/posts/2018/gitlab-license-management-with-java-11/</link><pubDate>Fri, 21 Dec 2018 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2018/gitlab-license-management-with-java-11/</guid><description>&lt;p&gt;If built-in &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/license_management.html"&gt;License Management&lt;/a&gt; functionality does not support the programming
language requirements you have, you can customize the &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/license_management.html"&gt;License Management&lt;/a&gt;
docker image.&lt;/p&gt;
&lt;p&gt;This guide shows you how to use &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/license_management.html"&gt;License Management&lt;/a&gt; with &lt;a href="https://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt; 11 or
later.&lt;/p&gt;
&lt;h2 id="license-management-definition"&gt;License Management definition&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/license_management.html"&gt;License Management&lt;/a&gt; helps you find what licenses your project uses in its
dependencies and decide for each of then whether to allow it or forbid it.&lt;/p&gt;
&lt;div class="gallery shadow" itemscope itemtype="https://schema.org/ImageGallery"&gt;
&lt;figure itemprop="associatedMedia" itemscope itemtype="https://schema.org/ImageObject"&gt;
&lt;a class="glightbox" href="https://docs.gitlab.com/ee/user/compliance/license_compliance/img/license_compliance_v13_0.png" data-gallery="gallery-0" data-glightbox="description: License Compliance report under pipelines" itemprop="contentUrl"&gt;
&lt;img loading="lazy" src="https://docs.gitlab.com/ee/user/compliance/license_compliance/img/license_compliance_v13_0.png" alt="License Compliance report under pipelines" itemprop="thumbnail"&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;p&gt;License Compliance report under pipelines&lt;/p&gt;</description></item><item><title>GitLab SAST and Java 11</title><link>http://widerin.net/posts/2018/gitlab-sast-and-java-11/</link><pubDate>Wed, 19 Dec 2018 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2018/gitlab-sast-and-java-11/</guid><description>&lt;p&gt;If built-in &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/sast.html"&gt;Static Application Security Testing&lt;/a&gt;
functionality does not support the programming language requirements you have,
you can customize the analyzer docker images in [GitLab]&amp;rsquo;s &lt;code&gt;sast&lt;/code&gt; pipeline job.&lt;/p&gt;
&lt;p&gt;This guide shows you how to use &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/sast.html"&gt;SAST&lt;/a&gt; with &lt;a href="https://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt; 11 or later.&lt;/p&gt;
&lt;h2 id="sast-definition"&gt;SAST definition&lt;/h2&gt;
&lt;p&gt;Static Application Security Testing provides you information if&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your application is vulnerable by using an external library in a specific
version which is known to be vulnerable or&lt;/li&gt;
&lt;li&gt;your code has a potentially dangerous attribute in a class, or unsafe code
that can lead to unintended code execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="gallery shadow" itemscope itemtype="https://schema.org/ImageGallery"&gt;
&lt;figure itemprop="associatedMedia" itemscope itemtype="https://schema.org/ImageObject"&gt;
&lt;a class="glightbox" href="https://docs.gitlab.com/ee/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_3.png" data-gallery="gallery-0" data-glightbox="description: Project Security Dashboard" itemprop="contentUrl"&gt;
&lt;img loading="lazy" src="https://docs.gitlab.com/ee/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_3.png" alt="Project Security Dashboard" itemprop="thumbnail"&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;p&gt;Project Security Dashboard&lt;/p&gt;</description></item><item><title>How to run Mikrotik's Winbox on macOS</title><link>http://widerin.net/posts/2018/how-to-run-mikrotiks-winbox-on-macos/</link><pubDate>Wed, 24 Jan 2018 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2018/how-to-run-mikrotiks-winbox-on-macos/</guid><description>&lt;p&gt;Some time ago &lt;a href="https://m0n0.ch/"&gt;m0n0wall&lt;/a&gt; burried their project and my
firewall went out of maintenance. Back in 2008
&lt;a href="https://m0n0.ch/"&gt;m0n0wall&lt;/a&gt; really had its great time but unfortunately the
recommended successor project &lt;a href="https://opnsense.org/"&gt;opnsense&lt;/a&gt; required more
hardware (cpu/memory) than my &lt;a href="https://pcengines.ch"&gt;alix&lt;/a&gt; routerboard alix2c3
was equipped with.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want to invest or assemble a new &lt;a href="https://pcengines.ch"&gt;alix&lt;/a&gt;
routerboard with encosure and antennas. So after doing some research
online I decided &lt;a href="https://mikrotik.com/"&gt;Mikrotik&lt;/a&gt; would be my next
internet entry point.
&lt;div class="gallery col2" itemscope itemtype="https://schema.org/ImageGallery"&gt;
&lt;figure itemprop="associatedMedia" itemscope itemtype="https://schema.org/ImageObject"&gt;
&lt;a class="glightbox" href="https://i.mt.lv/cdn/rb_images/1169_l.jpg" data-gallery="gallery-0" itemprop="contentUrl"&gt;
&lt;img loading="lazy" src="https://i.mt.lv/cdn/rb_images/1169_l.jpg" alt="" itemprop="thumbnail"&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
So I got a &lt;a href="https://mikrotik.com/product/RB962UiGS-5HacT2HnT"&gt;hAP AC from Mikrotik&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Official Grafana docker image on OpenShift 3.x</title><link>http://widerin.net/posts/2017/official-grafana-docker-image-on-openshift-3.x/</link><pubDate>Sun, 10 Sep 2017 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2017/official-grafana-docker-image-on-openshift-3.x/</guid><description>&lt;p&gt;Running offical docker images from &lt;a href="https://hub.docker.com"&gt;Docker hub&lt;/a&gt; on &lt;a href="https://www.openshift.com/"&gt;OpenShift&lt;/a&gt; can be
painful as it uses &lt;a href="https://docs.openshift.org/latest/creating_images/guidelines.html#openshift-origin-specific-guidelines"&gt;arbitrary user ids&lt;/a&gt;
by default. Often you end up building your own or using 3rd party
forks/clones of the offical image, which leds to additional effort to
keep it up to date in terms of security and/or version upgrades.&lt;/p&gt;
&lt;div class="callout callout-default"&gt;
&lt;p class="callout-title"&gt;Background&lt;/p&gt;
Technically speaking, [OpenShift] generates a dynamic &lt;code&gt;uid&lt;/code&gt; to launch a
container which will not have an associated entry in the containers
&lt;code&gt;/etc/passwd&lt;/code&gt; file. At docker image build time this user does not exist so
&lt;code&gt;chown&lt;/code&gt; files and/or directories to this &lt;code&gt;uid&lt;/code&gt; is not possible.
&lt;/div&gt;
&lt;h2 id="grafanas-docker-image"&gt;Grafana&amp;rsquo;s docker image&lt;/h2&gt;
&lt;h3 id="gosu"&gt;gosu&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; runs its service as &lt;code&gt;grafana&lt;/code&gt; user and uses an &lt;em&gt;entrypoint
script&lt;/em&gt; which runs as &lt;code&gt;root&lt;/code&gt; and launches &lt;code&gt;grafana-server&lt;/code&gt; as &lt;code&gt;grafana&lt;/code&gt;
user by using &lt;a href="https://github.com/tianon/gosu"&gt;gosu&lt;/a&gt;, see &lt;a href="https://github.com/grafana/grafana-docker/blob/b1fbad4afe22f88931d0b632d9a3c0df4221345c/run.sh#L42-L49"&gt;run.sh on
github.com&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hashing algorithms in Python 3</title><link>http://widerin.net/posts/2017/hashing-algorithms-in-python-3/</link><pubDate>Wed, 17 May 2017 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2017/hashing-algorithms-in-python-3/</guid><description>&lt;p&gt;While working on a larger project there was a need to detect some
changes happened in given data structures. Usually, you immediately
start over using the default hashing algorithm &lt;code&gt;md5&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Python 3.4.5 (default, Jan 14 2017, 22:06:30)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&amp;rsquo;s compare 2 strings:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; aa = &amp;quot;Hello World&amp;quot;
&amp;gt;&amp;gt;&amp;gt; bb = &amp;quot;Hello World&amp;quot;
&amp;gt;&amp;gt;&amp;gt; aa == bb
True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So obviouly, these strings are equal. So also &lt;code&gt;hashlib&lt;/code&gt; should confirm this:&lt;/p&gt;</description></item><item><title>Continuous integration with GitLab and Docker</title><link>http://widerin.net/posts/2016/continuous-integration-with-gitlab-and-docker/</link><pubDate>Tue, 11 Oct 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/continuous-integration-with-gitlab-and-docker/</guid><description>&lt;p&gt;I&amp;rsquo;ve given a talk about continuous integration with &lt;a href="https://about.gitlab.com"&gt;GitLab&lt;/a&gt; and &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt; on
Developer Meetup &lt;a href="https://twitter.com/VlbgWebDev"&gt;VlbgWebDev&lt;/a&gt;. The Meetup takes
place every second Tuesday every Month and i&amp;rsquo;ve met some old colleagues there.&lt;/p&gt;
&lt;p&gt;It was a nice Meetup with lots of discussions, that&amp;rsquo;s why i published my sample
code to GitLab and my slides to Speakerdeck. First intention was to do some
&lt;a href="http://www.pylonsproject.org/"&gt;Pyramid&lt;/a&gt; demo but after I&amp;rsquo;ve heard there are
some &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; people, I&amp;rsquo;ve added
&lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; demos as well :-)&lt;/p&gt;</description></item><item><title>Weblate and i18next json files</title><link>http://widerin.net/posts/2016/weblate-and-i18next-json-files/</link><pubDate>Fri, 29 Apr 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/weblate-and-i18next-json-files/</guid><description>&lt;p&gt;There&amp;rsquo;s a &lt;a href="https://github.com/nijel/weblate/issues/775"&gt;bug report on github&lt;/a&gt; about JSON format breaks &lt;a href="http://i18next.com/"&gt;i18next&lt;/a&gt; files due to automatic restructuring. Actually it flattens your &lt;a href="http://i18next.com/"&gt;i18next&lt;/a&gt; JSON file and makes it unusable for further usage.&lt;/p&gt;
&lt;p&gt;So after starting with a JSON file like:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
&amp;#34;navbar&amp;#34;: {
&amp;#34;reward&amp;#34;: &amp;#34;Rewards&amp;#34;,
&amp;#34;about&amp;#34;: &amp;#34;About&amp;#34;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;you end up with a committed file which was transformed into this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
&amp;#34;navbar.reward&amp;#34;: &amp;#34;Rewards&amp;#34;,
&amp;#34;navbar.about&amp;#34;: &amp;#34;About&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="use-weblate-pre_commit_scripts"&gt;Use Weblate PRE_COMMIT_SCRIPTS&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://weblate.org"&gt;Weblate&lt;/a&gt; offers script hooks before or after a repository action happens. I&amp;rsquo;m using &lt;a href="https://docs.weblate.org/en/latest/admin/config.html#std:setting-PRE_COMMIT_SCRIPTS"&gt;one of those hooks&lt;/a&gt; to execute a short &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; script which reformats JSON again to be usable in &lt;a href="http://i18next.com/"&gt;i18next&lt;/a&gt; translation tools again. The script below is &lt;a href="https://gist.github.com/saily/f8a9f72c6b064d51f09040d66e981240"&gt;also available on Github&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>GitLab as OAuth provider for Weblate</title><link>http://widerin.net/posts/2016/gitlab-as-oauth-provider-for-weblate/</link><pubDate>Thu, 28 Apr 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/gitlab-as-oauth-provider-for-weblate/</guid><description>&lt;p&gt;&lt;a href="http://weblate.org"&gt;Weblate&lt;/a&gt; is built on &lt;a href="https://www.djangoproject.com"&gt;Django&lt;/a&gt; and you can use a lot of authentication plugins.
After &lt;a href="https://github.com/pennersr/django-allauth/pull/1231"&gt;my contribution&lt;/a&gt;
to &lt;a href="https://github.com/pennersr/django-allauth"&gt;django-allauth&lt;/a&gt; and the
backporting work of &lt;a href="https://github.com/python-social-auth/social-core/issues/2"&gt;glensc and omab&lt;/a&gt;
to &lt;a href="https://github.com/python-social-auth/social-core"&gt;django-social-auth&lt;/a&gt; it&amp;rsquo;s very easy
to integrate [GitLab]&amp;rsquo;s &lt;a href="http://doc.gitlab.com/ce/integration/oauth_provider.html"&gt;authentication provider&lt;/a&gt;
with &lt;a href="http://weblate.org"&gt;Weblate&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="gitlab"&gt;GitLab&lt;/h2&gt;
&lt;p&gt;All you have to do on &lt;a href="http://about.gitlab.com"&gt;GitLab&lt;/a&gt; is configuration
through webinterface. Go to &lt;a href="https://gitlab.com/profile/applications"&gt;https://gitlab.com/profile/applications&lt;/a&gt;
and register a new application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: Weblate&lt;/li&gt;
&lt;li&gt;Redirect URI: `&lt;a href="https://weblate.yourdomain.tld/accounts/complete/GitLab/%60%60"&gt;https://weblate.yourdomain.tld/accounts/complete/GitLab/``&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure itemprop="associatedMedia" itemscope itemtype="https://schema.org/ImageObject"&gt;
&lt;a class="glightbox" href="http://widerin.net/posts/2016/weblate_gitlab_register_application.png" data-gallery="gallery-page" itemprop="contentUrl"&gt;
&lt;img loading="lazy" src="http://widerin.net/posts/2016/weblate_gitlab_register_application.png" alt="" itemprop="thumbnail"&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;After registering your new application you&amp;rsquo;ll get your &lt;strong&gt;Application
Key&lt;/strong&gt; and &lt;strong&gt;Secret&lt;/strong&gt;. You&amp;rsquo;ll need this later for configuration&lt;/p&gt;</description></item><item><title>Change umask in Docker containers</title><link>http://widerin.net/posts/2016/change-umask-in-docker-containers/</link><pubDate>Mon, 25 Jan 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/change-umask-in-docker-containers/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re mounting volumes into &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt; containers and running into permission
issues while accessing volume from other &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt; containers.&lt;/p&gt;
&lt;div class="callout callout-info"&gt;
&lt;p class="callout-title"&gt;Docker installation required&lt;/p&gt;
&lt;a href="https://docs.docker.com/engine/installation/"&gt;Docker&lt;/a&gt; must be installed on your system.
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; docker version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Client: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:22:34 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: darwin/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Server: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Engine:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40 (minimum version 1.12)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:29:19 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; containerd:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: v1.2.10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; runc:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 1.0.0-rc8+dev
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; docker-init:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 0.18.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: fec3683
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="umask"&gt;umask&lt;/h2&gt;
&lt;p&gt;umask is set to &lt;code&gt;0022&lt;/code&gt; on most linux sytems by default. This umask allows group
and others to &lt;strong&gt;read&lt;/strong&gt; but &lt;strong&gt;not write&lt;/strong&gt; your files, see below:&lt;/p&gt;</description></item><item><title>Connect devpi to your docker container</title><link>http://widerin.net/posts/2016/connect-devpi-to-your-docker-container/</link><pubDate>Thu, 07 Jan 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/connect-devpi-to-your-docker-container/</guid><description>&lt;p&gt;You&amp;rsquo;re running &lt;a href="http://pypi.python.org/pypi/pip"&gt;pip install&lt;/a&gt;,
&lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;buildout&lt;/a&gt; or your automated
tests within a &lt;a href="https://www.docker.com"&gt;docker&lt;/a&gt; container and after
running it multiple times you&amp;rsquo;ve become tired of waiting for it to
finally complete? Then it&amp;rsquo;s time to connect a
&lt;a href="http://doc.devpi.net"&gt;devpi&lt;/a&gt; server.&lt;/p&gt;
&lt;div class="callout callout-info"&gt;
&lt;p class="callout-title"&gt;Docker installation required&lt;/p&gt;
&lt;a href="https://docs.docker.com/engine/installation/"&gt;Docker&lt;/a&gt; must be installed on your system.
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; docker version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Client: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:22:34 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: darwin/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Server: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Engine:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40 (minimum version 1.12)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:29:19 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; containerd:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: v1.2.10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; runc:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 1.0.0-rc8+dev
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; docker-init:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 0.18.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: fec3683
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll need a working directory where &lt;code&gt;docker-compose.yml&lt;/code&gt; file and
certificates are stored in, so please create a folder &lt;code&gt;my-devpi&lt;/code&gt; as
shown below:&lt;/p&gt;</description></item><item><title>Private docker-registry within docker</title><link>http://widerin.net/posts/2016/private-docker-registry-within-docker/</link><pubDate>Thu, 07 Jan 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/private-docker-registry-within-docker/</guid><description>&lt;p&gt;Sometimes you need your own &lt;a href="https://github.com/docker/distribution"&gt;docker-registry&lt;/a&gt; to just try out new things or to avoid downloading stuff again and again from the internet. I tried to build a &lt;a href="https://github.com/docker/compose/releases"&gt;docker-compose&lt;/a&gt; recipe to setup my own private registry.&lt;/p&gt;
&lt;div class="callout callout-info"&gt;
&lt;p class="callout-title"&gt;Docker installation required&lt;/p&gt;
&lt;a href="https://docs.docker.com/engine/installation/"&gt;Docker&lt;/a&gt; must be installed on your system.
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; docker version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Client: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:22:34 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: darwin/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Server: Docker Engine - Community
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Engine:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 19.03.5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; API version: 1.40 (minimum version 1.12)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Go version: go1.12.12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Git commit: 633a0ea
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Built: Wed Nov 13 07:29:19 2019
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; OS/Arch: linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Experimental: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; containerd:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: v1.2.10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; runc:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 1.0.0-rc8+dev
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; docker-init:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Version: 0.18.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; GitCommit: fec3683
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll need a working directory where &lt;code&gt;docker-compose.yml&lt;/code&gt; file and certificates are stored in, so please create a folder &lt;code&gt;my-registry&lt;/code&gt; as shown below:&lt;/p&gt;</description></item><item><title>Maintaining manual gitlab installation with ansible</title><link>http://widerin.net/posts/2016/maintaining-manual-gitlab-installation-with-ansible/</link><pubDate>Sun, 03 Jan 2016 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2016/maintaining-manual-gitlab-installation-with-ansible/</guid><description>&lt;p&gt;A long time ago we started using &lt;a href="http://about.gitlab.com"&gt;GitLab&lt;/a&gt;. It was a greate step forward and definitly the right decision to switch from SVN to a distributed version control system. If you want to try &lt;a href="http://about.gitlab.com"&gt;GitLab&lt;/a&gt; you should definitly install it using &lt;a href="https://about.gitlab.com/downloads/"&gt;GitLab Omnibus distribution&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="manual-installation"&gt;Manual installation&lt;/h2&gt;
&lt;p&gt;But this long time ago there was no omnibus installation available so we installed &lt;a href="http://about.gitlab.com"&gt;GitLab&lt;/a&gt; with a manual &lt;code&gt;git&lt;/code&gt; checkout. Their monthly release cycle brought some upgrade effort every month - there was an upgrade tool available which was &lt;a href="https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md#gitlab-upgrader-deprecated"&gt;marked as discontinued&lt;/a&gt; - so i started to write some anisble scripts to handle the upgrade process.&lt;/p&gt;</description></item><item><title>Plone 6.0: What I expect</title><link>http://widerin.net/posts/2015/plone-6.0-what-i-expect/</link><pubDate>Tue, 31 Mar 2015 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2015/plone-6.0-what-i-expect/</guid><description>&lt;p&gt;We&amp;rsquo;re still working on &lt;a href="https://plone.org"&gt;Plone&lt;/a&gt; 5.0 but for &lt;a href="http://abstract-technology.com/plog-event-plone-italy"&gt;PLOG 2015&lt;/a&gt; I put all my thoughts together and want to share with you what I expect &lt;a href="https://plone.org"&gt;Plone&lt;/a&gt; 6.0 to include.&lt;/p&gt;
&lt;h2 id="legacy-redundancy-and-why-forcing-a-style-guide"&gt;Legacy, redundancy and why forcing a style guide&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://plone.org"&gt;Plone&lt;/a&gt; has a lot of legacy code and this results in several different ways of doing things. Some developers prefer the old style some try to figure out a new way. Since we had no style guides in the past (we&amp;rsquo;re working hard on that) it was up to the developers themselves how to implement a piece of code.&lt;/p&gt;</description></item><item><title>Using SVN in eclipse on Mac OS X</title><link>http://widerin.net/posts/2014/using-svn-in-eclipse-on-mac-os-x/</link><pubDate>Mon, 03 Feb 2014 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2014/using-svn-in-eclipse-on-mac-os-x/</guid><description>&lt;p&gt;After upgrading subversion client my eclipse could not find javahl bindings any more, because i previously installed the &lt;a href="http://www.open.collab.net"&gt;CollabNet&lt;/a&gt; ones, which are currently available for subversion 1.6.x only. The bad thing about this is Subclipse does not work any more, until you&amp;rsquo;ll install these libraries using the following solutions.&lt;/p&gt;
&lt;p&gt;There may be one for macports as well, but i&amp;rsquo;m using &lt;a href="http://brew.sh"&gt;homebrew&lt;/a&gt; and nothing else any more :-)&lt;/p&gt;
&lt;p&gt;Installing through &lt;a href="http://brew.sh"&gt;homebrew&lt;/a&gt; is not as easy as
installing through macports because they are not available as single
package, but you can add a &lt;code&gt;--java&lt;/code&gt; option to the
&lt;a href="http://brew.sh"&gt;homebrew&lt;/a&gt; command to build required javahlbinding
together with subversion. This will show up the following warning,
because you should use a universal build.&lt;/p&gt;</description></item><item><title>Image filesize validator for dexterity content types in Plone</title><link>http://widerin.net/posts/2013/image-filesize-validator-for-dexterity-content-types-in-plone/</link><pubDate>Fri, 31 May 2013 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2013/image-filesize-validator-for-dexterity-content-types-in-plone/</guid><description>&lt;p&gt;When using &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; 4.3 with &lt;a href="https://pypi.python.org/pypi/plone.app.contenttypes"&gt;plone.app.contenttypes&lt;/a&gt;
you might want to limit max filesize for images by implementing a custom
&lt;a href="https://pypi.python.org/pypi/z3c.form"&gt;z3c.form&lt;/a&gt; validator. In ATCT we
were able to limit max image filesize by overwriting ATCT config file or
setting in &lt;code&gt;portal_atct&lt;/code&gt; tool.&lt;/p&gt;
&lt;h2 id="using-webserver"&gt;Using webserver&lt;/h2&gt;
&lt;p&gt;The simplest way to achieve a max-upload size is to just limit
&lt;code&gt;client_max_body_size&lt;/code&gt; in &lt;a href="http://nginx.org"&gt;nginx&lt;/a&gt; webserver (or
simliar in apache).&lt;/p&gt;
&lt;p&gt;But my current solution is really different. It creates a validator for
a special fieldtype, in our special case a &lt;code&gt;INamedBlobImageField&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Use Babel to translate your python package</title><link>http://widerin.net/posts/2013/use-babel-to-translate-your-python-package/</link><pubDate>Mon, 01 Apr 2013 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2013/use-babel-to-translate-your-python-package/</guid><description>&lt;p&gt;I use egg-containing &lt;a href="http://www.buildout.org/"&gt;buildout&lt;/a&gt;s for all my &lt;a href="https://plone.org"&gt;Plone&lt;/a&gt; packages. Since &lt;a href="https://pypi.org/project/i18ndude/"&gt;i18ndude&lt;/a&gt;
does not extract msgids from zcml files, i tried &lt;a href="http://babel.pocoo.org/"&gt;Babel&lt;/a&gt; and succeeded.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;You want to translate titles in &lt;a href="https://plone.org"&gt;Plone&lt;/a&gt;&amp;rsquo;s diplay menu by adding &lt;code&gt;browser:menuItem&lt;/code&gt; in your zcml file as &lt;a href="http://developer.plone.org/content/dynamic_views.html#registering-a-dynamic-view-menu-item"&gt;shown here&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;configure
xmlns=&amp;#34;http://namespaces.zope.org/zope&amp;#34;
xmlns:browser=&amp;#34;http://namespaces.zope.org/browser&amp;#34;
xmlns:plone=&amp;#34;http://namespaces.plone.org/plone&amp;#34;
xmlns:i18n=&amp;#34;http://namespaces.zope.org/i18n&amp;#34;
i18n:domain=&amp;#34;my.package&amp;#34;&amp;gt;
&amp;lt;browser:page
for=&amp;#34;plone.folder.interfaces.IOrderableFolder&amp;#34;
name=&amp;#34;a_new_view&amp;#34;
class=&amp;#34;.demo_view.DemoView&amp;#34;
permission=&amp;#34;zope2.View&amp;#34;
template=&amp;#34;templates/demo_view.pt&amp;#34;
/&amp;gt;
&amp;lt;!-- Entry in display menu --&amp;gt;
&amp;lt;browser:menuItem
for=&amp;#34;plone.folder.interfaces.IOrderableFolder&amp;#34;
menu=&amp;#34;plone_displayviews&amp;#34;
title=&amp;#34;A new view&amp;#34;
action=&amp;#34;@@a_new_view&amp;#34;
description=&amp;#34;I want a view with translated title and description&amp;#34;
i18n:attributes=&amp;#34;title; description&amp;#34;
/&amp;gt;
&amp;lt;/configure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://pypi.org/project/i18ndude/"&gt;i18ndude&lt;/a&gt; does not extract message ids from zcml files, so i tried a diffent solution using &lt;a href="http://babel.pocoo.org/"&gt;Babel&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Turbo twitter Bootstrap theming for Plone using Diazo</title><link>http://widerin.net/posts/2012/turbo-twitter-bootstrap-theming-for-plone-using-diazo/</link><pubDate>Tue, 11 Dec 2012 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2012/turbo-twitter-bootstrap-theming-for-plone-using-diazo/</guid><description>&lt;p&gt;When building a new &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; theme based on &lt;a href="http://twitter.github.com/bootstrap"&gt;Twitter Bootstrap&lt;/a&gt; without modifying core templates you have to do a lot of xsl-styling. Hopefully this article can help you getting started.&lt;/p&gt;
&lt;h2 id="building-a-diazo-theme"&gt;Building a diazo theme&lt;/h2&gt;
&lt;p&gt;You should have basic knowledge of &lt;a href="http://docs.diazo.org/en/latest/quickstart.html"&gt;how to build a diazo theme&lt;/a&gt; in &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt;. So you will have a file called &lt;code&gt;rules.xml&lt;/code&gt; and hopefully your &lt;a href="http://twitter.github.com/bootstrap"&gt;Twitter Bootstrap&lt;/a&gt; javascript and css code already plugged into Plone resource registries. An installable Plone product is available &lt;a href="http://plone.org/products/diazotheme.bootstrap"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Plone test development with robotframework and RIDE</title><link>http://widerin.net/posts/2012/plone-test-development-with-robotframework-and-ride/</link><pubDate>Thu, 29 Nov 2012 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2012/plone-test-development-with-robotframework-and-ride/</guid><description>&lt;h2 id="running-acceptance-tests-in-plone"&gt;Running acceptance tests in Plone&lt;/h2&gt;
&lt;p&gt;Test driven development (TDD) can be a pain. If you are working with &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt; and
&lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; most of time gets consumed starting up &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt; running &lt;code&gt;setUp&lt;/code&gt; method
and rolling back transaction in &lt;code&gt;tearDown&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;So why not use a running already set-up instance for test-development?
Today I will show you how to reach that goal. It&amp;rsquo;s not as hard as it
seems.&lt;/p&gt;
&lt;h2 id="use-buildout"&gt;Use buildout&lt;/h2&gt;
&lt;p&gt;Of course we use &lt;code&gt;buildout&lt;/code&gt; to get a custom script which we can run
through &lt;a href="https://github.com/robotframework/RIDE"&gt;RIDE&lt;/a&gt;. I configured a
new pybot script, the basic idea has been implemented in
&lt;a href="https://github.com/plone/plone.act"&gt;plone.act&lt;/a&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; module already.&lt;/p&gt;</description></item><item><title>Howto use buildout version pins?</title><link>http://widerin.net/posts/2012/howto-use-buildout-version-pins/</link><pubDate>Wed, 14 Nov 2012 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2012/howto-use-buildout-version-pins/</guid><description>&lt;p&gt;When using &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; with &lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;buildout&lt;/a&gt; you want to be able
to reproduce your environment with the same set of eggs, even if there
were some new releases in between.&lt;/p&gt;
&lt;h2 id="buildout-2x"&gt;buildout 2.x&lt;/h2&gt;
&lt;p&gt;For &lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;buildout&lt;/a&gt; &lt;code&gt;2.x&lt;/code&gt; they implemented a lot of improvements for pinning versions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;allow-picked-versions&lt;/code&gt; allow buildout to download pinned packages
only. Not pinned but required packages will raise an Exception.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show-picked-versions&lt;/code&gt; shows a summary of picked versions after your
first buildout run. You can copy'n'paste this into a
&lt;code&gt;versions.cfg&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="buildout-1x"&gt;buildout 1.x&lt;/h2&gt;
&lt;h3 id="manually"&gt;Manually&lt;/h3&gt;
&lt;p&gt;Without pinning your eggs it will be impossible to reproduce the deployed
&lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;buildout&lt;/a&gt; configuration in future. Use a this &lt;a href="http://pypi.python.org/pypi/zc.buildout"&gt;buildout&lt;/a&gt; extension for future
projects to avoid this pitfall:&lt;/p&gt;</description></item><item><title>Install Robot Framework RIDE through homebrew</title><link>http://widerin.net/posts/2012/install-robot-framework-ride-through-homebrew/</link><pubDate>Tue, 16 Oct 2012 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2012/install-robot-framework-ride-through-homebrew/</guid><description>&lt;p&gt;&lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="https://wxpython.org/"&gt;wxPython&lt;/a&gt; and &lt;a href="https://github.com/robotframework/RIDE"&gt;robotframework RIDE&lt;/a&gt; on your macOS.&lt;/p&gt;
&lt;div class="callout callout-default"&gt;
&lt;p class="callout-title"&gt;Update 2016, 23 Feb&lt;/p&gt;
Fixed &lt;code&gt;wxPython&lt;/code&gt; installation so it works with most recent versions available today.
&lt;/div&gt;
&lt;div class="callout callout-default"&gt;
&lt;p class="callout-title"&gt;Update 2017, 03 Jul&lt;/p&gt;
Seems this installation method no longer works on &amp;gt;= MacOS Sierra.
Please use a &lt;a href="https://hub.docker.com/r/ivonet/robotframework-ride/"&gt;docker image and Ride in browser&lt;/a&gt;.
&lt;/div&gt;
&lt;h2 id="wxpython"&gt;wxPython&lt;/h2&gt;
&lt;p&gt;Since &lt;a href="https://wxpython.org/"&gt;wxPython&lt;/a&gt; is available on &lt;a href="http://brew.sh"&gt;homebrew&lt;/a&gt; you don&amp;rsquo;t have to install the package provided on the &lt;a href="https://wxpython.org/"&gt;wxPython&lt;/a&gt; website.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ brew info wxpython
wxPython: stable 3.0.2.0 (bottled)
Python bindings for wxWidgets
https://www.wxwidgets.org/
/usr/local/Cellar/wxPython/3.0.2.0 (1,107 files, 38.2M)
Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/wxpython.rb
==&amp;gt; Dependencies
Required: wxmac ✔
==&amp;gt; Options
--universal
$ brew install wxpython
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will take some time so be patient.&lt;/p&gt;</description></item><item><title>Secure your Dropbox</title><link>http://widerin.net/posts/2012/secure-your-dropbox/</link><pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2012/secure-your-dropbox/</guid><description>&lt;p&gt;Quick guide howto get an encFs encrypted &lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt; subfolder automounted
on login in macOS and indexed in Spotlight.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;First of all, &lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt; is a really useful piece of software. Your data is
stored unencrypted inside an online storage and in this case it&amp;rsquo;s not suitable
for secret data. You can bypass this disadvantage by encrypting a folder inside
&lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prerequisits"&gt;Prerequisits&lt;/h2&gt;
&lt;p&gt;The following instructions expect you using a macOS but may also inspire Unix
or Linux users.&lt;/p&gt;</description></item><item><title>Change minute_step in Archetypes DateTimeWidget</title><link>http://widerin.net/posts/2010/change-minute_step-in-archetypes-datetimewidget/</link><pubDate>Tue, 31 Aug 2010 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2010/change-minute_step-in-archetypes-datetimewidget/</guid><description>&lt;p&gt;Sometimes you need minutes which could not be divided by 5 which
&lt;a href="http://plone.org"&gt;Plone&lt;/a&gt; doesn&amp;rsquo;t select you by default. You don&amp;rsquo;t
need to rewrite core components in Archetypes &lt;code&gt;DateTimeWidget&lt;/code&gt; to change
this.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;You need your own &lt;code&gt;BrowserLayer&lt;/code&gt; (a skin or theme product) or a
contenttype with at least one marker interface to customize on.&lt;/p&gt;
&lt;h2 id="howto"&gt;Howto&lt;/h2&gt;
&lt;p&gt;Create a file called &lt;code&gt;datecomponents.py&lt;/code&gt; in your &lt;code&gt;browser&lt;/code&gt; directory
with following content:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from plone.app.form.widgets import datecomponents
class DateComponents(datecomponents.DateComponents):
def result(self, date=None, use_ampm=False, starting_year=None,
ending_year=None, future_years=None, minute_step=5):
# Change minute steps to 1
return super(DateComponents, self).result(date, use_ampm,
starting_year, ending_year,
future_years, 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip; and register it for you browserlayer (replace &lt;code&gt;IThemeSpecific&lt;/code&gt; by
your layer interface) or for a type you want to customize its widget
(replace &lt;code&gt;for='*'&lt;/code&gt; with your types interface), thats it.&lt;/p&gt;</description></item><item><title>Howto send mails from localhost through a smarthost on macOS</title><link>http://widerin.net/posts/2010/howto-send-mails-from-localhost-through-a-smarthost-on-macos/</link><pubDate>Wed, 07 Apr 2010 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2010/howto-send-mails-from-localhost-through-a-smarthost-on-macos/</guid><description>&lt;p&gt;You&amp;rsquo;re getting weird errors like &amp;ldquo;Connection refused&amp;rdquo; from your smtp library?
By reconfiguring your local mailer to send mails through a smarthost you can
solve this issue.&lt;/p&gt;
&lt;h2 id="setting-up-a-smarthost"&gt;Setting up a smarthost&lt;/h2&gt;
&lt;p&gt;Setting up your macOS to use a smarthost to forward mails to is not very
hard. I found a nice tutorial on &lt;a href="http://fuerstnet.de/en/sending-email-local-development-machine-using"&gt;fuerstnet.de&lt;/a&gt;
which was the base of this blog post.&lt;/p&gt;
&lt;p&gt;Copy the lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo postconf -e relayhost=your.isps.mailserver smtp_use_tls=yes smtp_sasl_auth_enable=yes smtp_sasl_password_maps=hash:/etc/postfix/smtp_auth tls_random_source=dev:/dev/urandom smtp_sasl_security_options=noanonymous
$ sudo sh -c 'echo &amp;quot;your.isps.mailserver username:password&amp;quot; &amp;gt;&amp;gt; /etc/postfix/smtp_auth'
$ sudo chown root:wheel /etc/postfix/smtp_auth
$ sudo chmod 600 /etc/postfix/smtp_auth
$ sudo postmap hash:/etc/postfix/smtp_auth
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="problems"&gt;Problems&lt;/h2&gt;
&lt;p&gt;I noticed postfix is quitting after &lt;code&gt;60&lt;/code&gt; seconds. So if you send
yourself a test email using: &lt;code&gt;echo &amp;quot;test&amp;quot; | mail -s &amp;quot;test&amp;quot; your@email&lt;/code&gt;
the postfix daemon will quit after &lt;code&gt;60&lt;/code&gt; seconds and you&amp;rsquo;ll get these
errors when trying to send mails through localhost in (for example)
&lt;a href="https://plone.org"&gt;Plone&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Tell svn client to use a proxy-server</title><link>http://widerin.net/posts/2010/tell-svn-client-to-use-a-proxy-server/</link><pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2010/tell-svn-client-to-use-a-proxy-server/</guid><description>&lt;p&gt;If you have or your server has to use a proxy server to access the
internet you may have problems with your svn client although you aready
set your &lt;code&gt;http_proxy&lt;/code&gt; environment variable(s).&lt;/p&gt;
&lt;p&gt;The solution to tell svn to use a proxy server is editing the
&lt;code&gt;~/.subversion/servers&lt;/code&gt; file in your home directory and add the
following lines or uncomment them, if they are already written into it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = my.proxy.server
http-proxy-port = 8080
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
# http-compression = no
# http-auth-types = basic;digest;negotiate
# No http-timeout, so just use the builtin default.
# No neon-debug-mask, so neon debugging is disabled.
# ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Howto use custom color for collective.captcha?</title><link>http://widerin.net/posts/2009/howto-use-custom-color-for-collective.captcha/</link><pubDate>Thu, 23 Apr 2009 00:00:00 +0000</pubDate><guid>http://widerin.net/posts/2009/howto-use-custom-color-for-collective.captcha/</guid><description>&lt;p&gt;How to use your custom color with &lt;a href="http://pypi.python.org/pypi/collective.captcha"&gt;collective.captcha&lt;/a&gt; and &lt;a href="http://plone.org"&gt;Plone&lt;/a&gt;? This
tutorial shows you an easy way to customize it using your own &lt;code&gt;BrowserLayer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/collective.captcha"&gt;collective.captcha&lt;/a&gt; uses a &lt;code&gt;BrowserView&lt;/code&gt; to display it&amp;rsquo;s captcha image.
Therefore it&amp;rsquo;s very easy to customize it for your own theme because you can
subclass that &lt;code&gt;BrowserView&lt;/code&gt; for your own theme layer which is a &lt;code&gt;BrowserLayer&lt;/code&gt;.
You can change colors and/or fonts as you need it for your custom theme without
doing any code change on the original &lt;a href="http://pypi.python.org/pypi/collective.captcha"&gt;collective.captcha&lt;/a&gt; package.&lt;/p&gt;</description></item></channel></rss>