<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Random thoughts</title><link href="https://blog.almeroth.com/" rel="alternate"></link><link href="https://blog.almeroth.com/feeds/all.atom.xml" rel="self"></link><id>https://blog.almeroth.com/</id><updated>2022-09-13T16:00:00+02:00</updated><entry><title>Fake it 'till you make it</title><link href="https://blog.almeroth.com/fake-it-till-you-make-it.html" rel="alternate"></link><published>2022-09-13T16:00:00+02:00</published><updated>2022-09-13T16:00:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2022-09-13:/fake-it-till-you-make-it.html</id><summary type="html">&lt;p&gt;When &lt;a href="https://ubuntu.com/blog/ubuntu-22-04-lts-released"&gt;Ubuntu 22.04 LTS&lt;/a&gt; was released, I wanted to re-image my &lt;a href="https://twitter.com/almeroth/status/1457113329508536325"&gt;Kubernetes cluster nodes&lt;/a&gt; so they are in a clean state. Unfortunately, this comes with loosing the „age“ (the duration of cluster membership) for each node.&lt;/p&gt;
&lt;p&gt;So &lt;a href="https://twitter.com/almeroth/status/1562394007585656832"&gt;I set out to find where this value comes from&lt;/a&gt; and if …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When &lt;a href="https://ubuntu.com/blog/ubuntu-22-04-lts-released"&gt;Ubuntu 22.04 LTS&lt;/a&gt; was released, I wanted to re-image my &lt;a href="https://twitter.com/almeroth/status/1457113329508536325"&gt;Kubernetes cluster nodes&lt;/a&gt; so they are in a clean state. Unfortunately, this comes with loosing the „age“ (the duration of cluster membership) for each node.&lt;/p&gt;
&lt;p&gt;So &lt;a href="https://twitter.com/almeroth/status/1562394007585656832"&gt;I set out to find where this value comes from&lt;/a&gt; and if it's possible to tamper with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR Yes, it is. 🤓&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Kubernetes&lt;/h2&gt;
&lt;p&gt;Lets see how far we can get with &lt;code&gt;kubectl&lt;/code&gt; itself.&lt;/p&gt;
&lt;h3&gt;kubectl&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# print nodes and their age as a table&lt;/span&gt;
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Editing a node (&lt;code&gt;kubectl edit nodes &amp;lt;nodeName&amp;gt;&lt;/code&gt;) shows the field we are looking for is under the path &lt;code&gt;.metadata.creationTimestamp&lt;/code&gt;, but changing it has no effect.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# print a node&amp;#39;s creationTimestamp&lt;/span&gt;
kubectl get nodes &amp;lt;nodeName&amp;gt; -o json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s2"&gt;&amp;quot;.metadata.creationTimestamp&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lets describe our &lt;code&gt;node.metadata.creationTimestamp&lt;/code&gt; field:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ kubectl explain node.metadata.creationTimestamp
KIND:     Node
VERSION:  v1

FIELD:    creationTimestamp &amp;lt;string&amp;gt;

DESCRIPTION:
     CreationTimestamp is a timestamp representing the server &lt;span class="nb"&gt;time&lt;/span&gt; when this
     object was created. It is not guaranteed to be &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; happens-before order
     across separate operations. Clients may not &lt;span class="nb"&gt;set&lt;/span&gt; this value. It is
     represented &lt;span class="k"&gt;in&lt;/span&gt; RFC3339 form and is &lt;span class="k"&gt;in&lt;/span&gt; UTC.

     Populated by the system. Read-only. Null &lt;span class="k"&gt;for&lt;/span&gt; lists. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

     Time is a wrapper around time.Time which supports correct marshaling to
     YAML and JSON. Wrappers are provided &lt;span class="k"&gt;for&lt;/span&gt; many of the factory methods that
     the &lt;span class="nb"&gt;time&lt;/span&gt; package offers.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Important detail to remember from here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Populated by the system. Read-only.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;API documentation&lt;/h3&gt;
&lt;p&gt;Since &lt;code&gt;kubectl explain&lt;/code&gt; told us to look at the &lt;a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#node-v1-core"&gt;Node v1&lt;/a&gt; API object, we can see it includes &lt;a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#objectmeta-v1-meta"&gt;ObjectMeta&lt;/a&gt; which &lt;a href="https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata"&gt;&lt;em&gt;should&lt;/em&gt;&lt;/a&gt; hold our &lt;code&gt;creationTimestamp&lt;/code&gt;. Alright!&lt;/p&gt;
&lt;h2&gt;etcd&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.redhat.com/en/topics/containers/what-is-etcd"&gt;What is etcd?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As the primary datastore of Kubernetes, etcd stores and replicates all Kubernetes cluster states.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I knew etcd holds all relevant information. So I started to familiarize with it's utilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/etcd-io/etcd/tree/main/etcdctl"&gt;etcdctl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yamamoto-febc/kube-etcd-helper"&gt;kube-etcd-helper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python-etcd3.readthedocs.io/en/latest/"&gt;python-etcd3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;etcdctl&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# lets use etcd API version 3&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="c1"&gt;# pass certs/keys and endpoints to talk to&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ETCD_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\&lt;/span&gt;
&lt;span class="s2"&gt;--cacert /etc/kubernetes/pki/etcd/ca.crt \&lt;/span&gt;
&lt;span class="s2"&gt;--cert /etc/kubernetes/pki/etcd/peer.crt \&lt;/span&gt;
&lt;span class="s2"&gt;--key /etc/kubernetes/pki/etcd/peer.key \&lt;/span&gt;
&lt;span class="s2"&gt;--endpoints https://localhost:2379&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# list all keys stored in etcd&lt;/span&gt;
etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get / --prefix --keys-only
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After being successfully connected the question is: what are we looking for?&lt;/p&gt;
&lt;h4&gt;🍌 Minions 🍌&lt;/h4&gt;
&lt;p&gt;Listing all keys for a control node gave this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get / --prefix --keys-only &lt;span class="p"&gt;|&lt;/span&gt; grep &amp;lt;nodeName&amp;gt;
/registry/csinodes/&amp;lt;nodeName&amp;gt;
/registry/leases/kube-node-lease/&amp;lt;nodeName&amp;gt;
/registry/minions/&amp;lt;nodeName&amp;gt;
/registry/pods/kube-system/etcd-&amp;lt;nodeName&amp;gt;
/registry/pods/kube-system/kube-apiserver-&amp;lt;nodeName&amp;gt;
/registry/pods/kube-system/kube-controller-manager-&amp;lt;nodeName&amp;gt;
/registry/pods/kube-system/kube-scheduler-&amp;lt;nodeName&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Listing all keys for a worker node gave that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get / --prefix --keys-only &lt;span class="p"&gt;|&lt;/span&gt; grep &amp;lt;nodeName&amp;gt;
/registry/csinodes/&amp;lt;nodeName&amp;gt;
/registry/leases/kube-node-lease/&amp;lt;nodeName&amp;gt;
/registry/minions/&amp;lt;nodeName&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Looking at each record it was clear the node parameters are stored under &lt;code&gt;/registry/minions/&amp;lt;nodeName&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The output of the above command includes a lot of garbled (binary) data, lets apply some &lt;code&gt;json&lt;/code&gt; magic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# print json representation of the etcd record&lt;/span&gt;
etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt; -w json
&lt;span class="c1"&gt;# print json representation of the etcd record and decodes the actual value&lt;/span&gt;
etcdctl &lt;span class="nv"&gt;$ETCD_ARGS&lt;/span&gt; get &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt; -w json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s2"&gt;&amp;quot;.kvs[0].value&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; base64 -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Meh, that's still binary data and no timestamp in sight. Lets see, how &lt;code&gt;kube-etcd-helper&lt;/code&gt; might help us here.&lt;/p&gt;
&lt;h3&gt;kube-etcd-helper&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ETCD_HELPER_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\&lt;/span&gt;
&lt;span class="s2"&gt;--cacert /etc/kubernetes/pki/etcd/ca.crt \&lt;/span&gt;
&lt;span class="s2"&gt;--cert /etc/kubernetes/pki/etcd/peer.crt \&lt;/span&gt;
&lt;span class="s2"&gt;--key /etc/kubernetes/pki/etcd/peer.key \&lt;/span&gt;
&lt;span class="s2"&gt;--endpoint https://localhost:2379&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# get value as json&lt;/span&gt;
kube-etcd-helper &lt;span class="nv"&gt;$ETCD_HELPER_ARGS&lt;/span&gt; get &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# get value as json and parse it with jq&lt;/span&gt;
kube-etcd-helper &lt;span class="nv"&gt;$ETCD_HELPER_ARGS&lt;/span&gt; get &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n +2 &lt;span class="p"&gt;|&lt;/span&gt; jq
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;metadata&amp;quot;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;annotations&amp;quot;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;&amp;quot;kubeadm.alpha.kubernetes.io/cri-socket&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;unix:///var/run/containerd/containerd.sock&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;node.alpha.kubernetes.io/ttl&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;volumes.kubernetes.io/controller-managed-attach-detach&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;&amp;quot;creationTimestamp&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;2021-03-12T21:48:27Z&amp;quot;&lt;/span&gt;,
    &lt;span class="s2"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;&amp;quot;beta.kubernetes.io/arch&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;arm64&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;beta.kubernetes.io/os&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;linux&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;kubernetes.io/arch&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;arm64&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;kubernetes.io/hostname&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;k8s-control-01&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;kubernetes.io/os&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;linux&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;node-role.kubernetes.io/control-plane&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
      &lt;span class="s2"&gt;&amp;quot;node.kubernetes.io/exclude-from-external-load-balancers&amp;quot;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Yes! Finally we found a data representation that is somewhat readable. So &lt;code&gt;kube-etcd-helper&lt;/code&gt; knows how to decode that binary data.
But unfortunately, it does not have the ability to &lt;em&gt;put&lt;/em&gt; things back into &lt;code&gt;etcd&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;python-etcd3&lt;/h3&gt;
&lt;p&gt;With &lt;code&gt;python-etcd3&lt;/code&gt; you can easily retrieve a record, do a search/replace and put it back into &lt;code&gt;etcd&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Demo python-etcd3.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;etcd3&lt;/span&gt;

&lt;span class="n"&gt;CA_CERT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/kubernetes/pki/etcd/ca.crt&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CERT_CERT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/kubernetes/pki/etcd/peer.crt&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CERT_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/kubernetes/pki/etcd/peer.key&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Provide main routine.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/registry/minions/&amp;lt;nodeName&amp;gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etcd3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ca_cert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CA_CERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cert_cert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CERT_CERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cert_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CERT_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# retrieve a record&lt;/span&gt;
    &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x08\xf3\xfe\x81\x99\x06\x10\x00&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# 2022-09-13 13:02:43+00:00&lt;/span&gt;
    &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x08\xab\xc3\xaf\x82\x06\x10\x00&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# 2021-03-12 21:48:27+00:00&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# search/replace&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# put it back&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Awesome! But what's this gibberish about?&lt;/p&gt;
&lt;h2&gt;Poking around&lt;/h2&gt;
&lt;p&gt;I have created some disposable objects with similar content and compared their resulting etcd records. Soon I could spot where to look for the &lt;code&gt;creationTimestamp&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl create configmap my-config1 --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
sleep &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
kubectl create configmap my-config2 --from-literal&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;key2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then I tried to use one value for the other configmap and soon I made to actually replace it successfully. But I could not yet calculate those values yet... Googling around brought my attention to these files, where &lt;code&gt;message Node&lt;/code&gt; and &lt;code&gt;message ObjectMeta&lt;/code&gt; were defined:
- https://github.com/kubernetes/api/blob/master/core/v1/generated.proto
- https://github.com/kubernetes/apimachinery/blob/master/pkg/apis/meta/v1/generated.proto&lt;/p&gt;
&lt;p&gt;Entering the world of &lt;code&gt;Protobuf&lt;/code&gt;...&lt;/p&gt;
&lt;h2&gt;Protobuf&lt;/h2&gt;
&lt;p&gt;I have never used Protobuf before so I started with &lt;a href="https://developers.google.com/protocol-buffers/docs/proto"&gt;reading the documentation&lt;/a&gt;. &lt;a href="https://developers.google.com/protocol-buffers/docs/pythontutorial"&gt;Soon I played with my own first &lt;code&gt;.proto&lt;/code&gt; files and some Python&lt;/a&gt;. I copied the &lt;code&gt;Time&lt;/code&gt; definition from the &lt;a href="https://github.com/kubernetes/apimachinery/blob/master/pkg/apis/meta/v1/generated.proto#L1053-L1071"&gt;Kubernetes project&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;syntax&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;proto2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;k8s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io.apimachinery.pkg.apis.meta.v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Represents seconds of UTC time since Unix epoch&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// 9999-12-31T23:59:59Z inclusive.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;seconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Non-negative fractions of a second at nanosecond resolution. Negative&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// second values with fractions must still have non-negative nanos values&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// that count forward in time. Must be from 0 to 999,999,999&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// inclusive. This field may be limited in precision depending on context.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;optional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;nanos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After compiling this definition I could finally create my own &lt;code&gt;creationTimestamp&lt;/code&gt; using Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;protoc --python_out&lt;span class="o"&gt;=&lt;/span&gt;./ objectmeta.proto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Demo protobuf.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;objectmeta_pb2&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Provide main routine.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;objectmeta_pb2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1615585707&lt;/span&gt;  &lt;span class="c1"&gt;# 2021-03-12 21:48:27+00:00&lt;/span&gt;
    &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nanos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;fake_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SerializeToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fake_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The output of this script will be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;b'\x08\xab\xc3\xaf\x82\x06\x10\x00'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we can use this script to &lt;a href="https://twitter.com/almeroth/status/1564896113563410432/photo/1"&gt;generate timestamps as we like&lt;/a&gt; and put these values into etcd using &lt;code&gt;python-etcd3&lt;/code&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="kubernetes"></category><category term="etcd"></category><category term="protobuf"></category></entry><entry><title>Build &amp; Run: Drone (Open Source Edition)</title><link href="https://blog.almeroth.com/build-run-drone-open-source-edition.html" rel="alternate"></link><published>2020-05-12T21:19:00+02:00</published><updated>2020-05-12T21:19:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2020-05-12:/build-run-drone-open-source-edition.html</id><summary type="html">&lt;p&gt;For quite some time I wanted to give &lt;a href="https://drone.io"&gt;Drone&lt;/a&gt; a spin. As I had a &lt;a href="https://gitea.io"&gt;Gitea&lt;/a&gt; running on my Kubernetes cluster already it looked to me like the perfect match. Unfortunately getting started, with the constraints of running the Open Source version on an ARM-based architecture (Raspberry Pis), wasn't as …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For quite some time I wanted to give &lt;a href="https://drone.io"&gt;Drone&lt;/a&gt; a spin. As I had a &lt;a href="https://gitea.io"&gt;Gitea&lt;/a&gt; running on my Kubernetes cluster already it looked to me like the perfect match. Unfortunately getting started, with the constraints of running the Open Source version on an ARM-based architecture (Raspberry Pis), wasn't as easy as I first thought…&lt;/p&gt;
&lt;h2&gt;What is the difference between Open Source and Enterprise?&lt;/h2&gt;
&lt;p&gt;The Open Source Edition is fully capable of executing complex pipelines but is optimized to meet basic needs of individuals and small teams.&lt;/p&gt;
&lt;p&gt;The Enterprise Edition:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supports distributed runners&lt;/li&gt;
&lt;li&gt;Supports kubernetes runners&lt;/li&gt;
&lt;li&gt;Supports organization secrets, vault secrets, etc&lt;/li&gt;
&lt;li&gt;Supports cron scheduling&lt;/li&gt;
&lt;li&gt;Supports scalable storage (postgres, mysql, s3)&lt;/li&gt;
&lt;li&gt;Supports autoscaling&lt;/li&gt;
&lt;li&gt;Supports extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Open Source Edition:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lacks support for extensions&lt;/li&gt;
&lt;li&gt;Lacks support for distributed runners&lt;/li&gt;
&lt;li&gt;Lacks support for kubernetes runners&lt;/li&gt;
&lt;li&gt;Lacks support for organization secrets, vault secrets, etc&lt;/li&gt;
&lt;li&gt;Lacks support for cron scheduling&lt;/li&gt;
&lt;li&gt;Lacks support for autoscaling&lt;/li&gt;
&lt;li&gt;Limited to a single machine&lt;/li&gt;
&lt;li&gt;Limited to an embedded sqlite database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read more about at: &lt;a href="https://docs.drone.io/enterprise/"&gt;https://docs.drone.io/enterprise/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Building Drone&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/drone/drone/blob/master/BUILDING_OSS"&gt;Github&lt;/a&gt; has a good explanation on how to build the Open Source Edition of Drone. Unfortunately they are not releasing the free version as ready-to-use image on &lt;a href="https://hub.docker.com/r/drone/drone/tags"&gt;Docker Hub&lt;/a&gt;. At least there's a &lt;a href="https://github.com/drone/drone/blob/master/docker/Dockerfile.server.linux.arm"&gt;Dockerfile&lt;/a&gt; to build the standard drone-server on ARM. So I came up with my own version of a Dockerfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker build --rm -f docker/Dockerfile -t drone/drone .&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Build stage&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="c1"&gt;###################################&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;# https://hub.docker.com/_/golang?tab=tags&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;FROM golang:1.13-alpine3.11 AS build-env&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ARG DRONE_VERSION&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ARG GOARCH&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ARG GOOS&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV GOARCH=${GOARCH:-arm}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV GOOS=${GOOS:-linux}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Build deps&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;RUN apk --no-cache add build-base ca-certificates git&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Clone repo&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;RUN git clone https://github.com/drone/drone.git /go/src/github.com/drone/drone&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Change Workdir&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;WORKDIR /go/src/github.com/drone/drone&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Checkout version tag if set&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;RUN if [ -n &amp;quot;${DRONE_VERSION}&amp;quot; ]; then git checkout -b &amp;quot;${DRONE_VERSION}&amp;quot; &amp;quot;tags/${DRONE_VERSION}&amp;quot;; fi \&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;amp;&amp;amp; echo &amp;quot;Build Drone (Open Source Edition) for ${GOOS}/${GOARCH} ...&amp;quot; \&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;amp;&amp;amp; GOARCH=&amp;quot;${GOARCH}&amp;quot; GOOS=&amp;quot;${GOOS}&amp;quot; go install -tags &amp;quot;oss nolimit&amp;quot; github.com/drone/drone/cmd/drone-server&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Final stage&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;###################################&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# https://hub.docker.com/_/alpine?tab=tags&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;FROM alpine:3.11&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;EXPOSE 80 443&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;VOLUME /data&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;# Borrowed from&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://github.com/drone/drone/blob/master/docker/Dockerfile.server.linux.arm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;RUN [ ! -e /etc/nsswitch.conf ] &amp;amp;&amp;amp; echo &amp;#39;hosts&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;files dns&amp;#39; &amp;gt; /etc/nsswitch.conf&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV GODEBUG netdns=go&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV XDG_CACHE_HOME /data&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_DATABASE_DRIVER sqlite3&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_DATABASE_DATASOURCE /data/database.sqlite&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_RUNNER_OS=linux&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_RUNNER_ARCH=arm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_SERVER_PORT=:80&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_SERVER_HOST=localhost&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ENV DRONE_DATADOG_ENABLED=false&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;COPY --from=build-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;COPY --from=build-env /go/bin/drone-server /bin/drone-server&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="l l-Scalar l-Scalar-Plain"&gt;CMD [&amp;quot;/bin/drone-server&amp;quot;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: A build takes approximately 11 minutes on a Raspberry Pi 4.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Running Drone&lt;/h2&gt;
&lt;p&gt;The setup guide for &lt;a href="https://docs.drone.io/server/provider/gitea/"&gt;Gitea&lt;/a&gt; is pretty straight forward, but it is written for the Enterprise edition and expects you to install a separate Runner, which isn't supported by the OSS version. After some googling, I found an option called &lt;code&gt;DRONE_AGENTS_DISABLED&lt;/code&gt; that isn't mentioned anywhere in the &lt;a href="https://docs.drone.io/server/reference/"&gt;Server reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But the &lt;a href="https://discourse.drone.io/t/1-5-0-release-notes/5797"&gt;Changelog for version 1.5.0&lt;/a&gt; states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The server has been changed to run in multi-machine mode by default. If you are already running the server in multi-machine mode (e.g. with agents) this does not impact you. If you are running the server in single-machine mode you must set the following configuration parameter moving forward:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DRONE_AGENTS_DISABLED=true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please note that failing to set this parameter will result in your builds sitting in the queue, in a pending state, waiting for agents to connect to the server and process your build.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Putting things together I came up with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
  --volume&lt;span class="o"&gt;=&lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&lt;/span&gt;
  --volume&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/drone:/data &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_SERVER&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_SERVER&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_CLIENT_ID&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_CLIENT_SECRET&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_SERVER_PROTO&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_SERVER_PROTO&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_SERVER_HOST&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_SERVER_HOST&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_AGENTS_DISABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --publish&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;:80 &lt;span class="se"&gt;\&lt;/span&gt;
  --publish&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;:443 &lt;span class="se"&gt;\&lt;/span&gt;
  --restart&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="se"&gt;\&lt;/span&gt;
  --detach&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --name&lt;span class="o"&gt;=&lt;/span&gt;drone &lt;span class="se"&gt;\&lt;/span&gt;
  drone/drone
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: You don't have to specify &lt;code&gt;DRONE_RPC_SECRET&lt;/code&gt; since you are running in single-machine mode. And you need to provide a volume for the docker.sock to server instead of the (not existing) agent.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Everytime I tried to initiate an automated build it got stuck in "Pending…" state.&lt;/p&gt;
&lt;p&gt;I found two valuable options &lt;code&gt;DRONE_LOGS_DEBUG&lt;/code&gt; and &lt;code&gt;DRONE_LOGS_TRACE&lt;/code&gt; in the &lt;a href="https://docs.drone.io/server/reference/"&gt;server reference&lt;/a&gt; to dig into this problem.&lt;/p&gt;
&lt;p&gt;This time running the command with trace logs enabled drone gave me the following output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;drone&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;arch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;machine_id&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;privileged&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;limits&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;memswaplimit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;memlimit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;shmsize&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;cpuquota&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;cpushares&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;cpuset&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After fiddling around, I am now running Drone with the following options:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
  --volume&lt;span class="o"&gt;=&lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&lt;/span&gt;
  --volume&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/drone:/data &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_SERVER&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_SERVER&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_CLIENT_ID&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_GITEA_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_GITEA_CLIENT_SECRET&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_SERVER_PROTO&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_SERVER_PROTO&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_SERVER_HOST&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt;DRONE_SERVER_HOST&lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_AGENTS_DISABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_RUNNER_LOCAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_RUNNER_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux/arm &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_RUNNER_ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_RUNNER_IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;drone/drone-runner-docker:latest &lt;span class="se"&gt;\&lt;/span&gt;
  --env&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;DRONE_RUNNER_CAPACITY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --publish&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;:80 &lt;span class="se"&gt;\&lt;/span&gt;
  --publish&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;:443 &lt;span class="se"&gt;\&lt;/span&gt;
  --restart&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="se"&gt;\&lt;/span&gt;
  --detach&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  --name&lt;span class="o"&gt;=&lt;/span&gt;drone &lt;span class="se"&gt;\&lt;/span&gt;
  drone/drone
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: DRONE_RUNNER_IMAGE has been changed from &lt;code&gt;drone/controller&lt;/code&gt; to &lt;code&gt;drone/drone-runner-docker&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Boy, what a ride…&lt;/p&gt;
&lt;h2&gt;Bonus: Building Drone with Drone&lt;/h2&gt;
&lt;p&gt;Rounding things up, I wanted to build Drone with Drone. Here's my &lt;code&gt;.drone.yml&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;linux-arm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Required form ARM: defaults to Linux amd64&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;arch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;arm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;linux&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Build &amp;amp; Publish&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;plugins/docker:18&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dockerfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker/Dockerfile&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;registry&lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/drone/drone&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;build_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;DRONE_VERSION=v1.7.0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;v1.7.0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;latest&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;push&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;tag&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="drone"></category><category term="open source"></category><category term="ci/cd"></category><category term="raspberry"></category></entry><entry><title>Bose Solo 15 TV Sound System – Script</title><link href="https://blog.almeroth.com/bose-solo-15-tv-sound-system-script.html" rel="alternate"></link><published>2016-03-14T12:40:11+01:00</published><updated>2016-03-14T12:40:11+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2016-03-14:/bose-solo-15-tv-sound-system-script.html</id><summary type="html">&lt;p&gt;After I knew &lt;a href="{filename}/blog/2016-03-11-bose-solo-15-tv-sound-system-cable.md"&gt;how to connect&lt;/a&gt; and &lt;a href="{filename}/blog/2016-03-09-bose-solo-15-tv-sound-system-tap.md"&gt;which commands to run&lt;/a&gt; on my Bose sound system, I wrote a little Python script that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;opens and connects to the serial port&lt;/li&gt;
&lt;li&gt;issues a TAP command of your choice&lt;/li&gt;
&lt;li&gt;and responds with the corresponding result.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Script&lt;/h2&gt;
&lt;script src="https://gist.github.com/jalmeroth/c90fb59ad2e9a8217deb.js"&gt;&lt;/script&gt;

&lt;h2&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;# bose.py [tap command]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Install …&lt;/h2&gt;</summary><content type="html">&lt;p&gt;After I knew &lt;a href="{filename}/blog/2016-03-11-bose-solo-15-tv-sound-system-cable.md"&gt;how to connect&lt;/a&gt; and &lt;a href="{filename}/blog/2016-03-09-bose-solo-15-tv-sound-system-tap.md"&gt;which commands to run&lt;/a&gt; on my Bose sound system, I wrote a little Python script that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;opens and connects to the serial port&lt;/li&gt;
&lt;li&gt;issues a TAP command of your choice&lt;/li&gt;
&lt;li&gt;and responds with the corresponding result.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Script&lt;/h2&gt;
&lt;script src="https://gist.github.com/jalmeroth/c90fb59ad2e9a8217deb.js"&gt;&lt;/script&gt;

&lt;h2&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;# bose.py [tap command]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Install&lt;/h2&gt;
&lt;p&gt;This script requires the &lt;em&gt;pyserial&lt;/em&gt; module, that can easily be installed on Arch Linux ARM like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman -Syu python2-pyserial
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="bose"></category><category term="home automation"></category><category term="serial communications"></category></entry><entry><title>Bose Solo 15 TV Sound System – Cable</title><link href="https://blog.almeroth.com/bose-solo-15-tv-sound-system-cable.html" rel="alternate"></link><published>2016-03-11T17:54:12+01:00</published><updated>2016-03-11T17:54:12+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2016-03-11:/bose-solo-15-tv-sound-system-cable.html</id><summary type="html">&lt;p&gt;In my &lt;a href="{filename}/blog/2016-03-09-bose-solo-15-tv-sound-system-tap.md"&gt;latest blog entry&lt;/a&gt; I covered the list of TAP commands for my Bose Solo TV sound system. But I did not mention how I got a connection to its serial port, which is what this post is all about.&lt;/p&gt;
&lt;p&gt;Let's start with a little quote from the service …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my &lt;a href="{filename}/blog/2016-03-09-bose-solo-15-tv-sound-system-tap.md"&gt;latest blog entry&lt;/a&gt; I covered the list of TAP commands for my Bose Solo TV sound system. But I did not mention how I got a connection to its serial port, which is what this post is all about.&lt;/p&gt;
&lt;p&gt;Let's start with a little quote from the service manual you can find by googling a bit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Equipment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tera&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Term&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;terminal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;emulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sourceforge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ttssh2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TAP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;264565&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TAP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RS232&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Converter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;electronics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;232&lt;/span&gt;&lt;span class="n"&gt;LPTTL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;similar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;elec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;4.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;An&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;5.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Computer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;issue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TAP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;TAP cable 264565&lt;/h2&gt;
&lt;p&gt;I did some research on this ((I even contacted Bose), but could not find that much information about it. An other Bose product's service manual had a picture of it:&lt;/p&gt;
&lt;p&gt;&lt;img alt="TAP cable 264565" src="https://blog.almeroth.com/images/tumblr_inline_o3vgphM2pv1qbnc2r_540.jpg"&gt;&lt;/p&gt;
&lt;p&gt;So we are facing a 3,5 mm 3-pole Jack to a DB-9 port.&lt;/p&gt;
&lt;h2&gt;232LPTTL&lt;/h2&gt;
&lt;p&gt;Reading the &lt;a href="http://www.bb-elec.com/Products/Serial-Connectivity/Serial-Converters/TTL-Converters.aspx"&gt;product page&lt;/a&gt;/datasheet will provide you some interesting details:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;RS-232 to TTL converters make easy connections between your TTL equipment and RS-232 ports.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This device obviously converts RS-232 coming in on one side to TTL going out on the other.&lt;/p&gt;
&lt;p&gt;In an other Bose service manual I found this quote:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;When&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kt"&gt;wire&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sufficient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;communicate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ESP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;although&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CTS&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;RTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;crossover&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;modem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;will&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ESP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;directly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let's keep that in mind and compile a list of cable requirements.&lt;/p&gt;
&lt;h2&gt;Delock 83114 to the rescue&lt;/h2&gt;
&lt;p&gt;Counting one and one together I needed a cable that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;does 3-wire (GND, RDX, TXD) connection&lt;/li&gt;
&lt;li&gt;has a 3,5mm Jack (Klinke) on one side&lt;/li&gt;
&lt;li&gt;is able to convert from RS-232 to TTL&lt;/li&gt;
&lt;li&gt;that is somewhat crossover.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I ordered the &lt;a href="http://www.delock.de/produkte/S_83114/merkmale.html"&gt;Delock 83114&lt;/a&gt;, which looked just perfect on the &lt;a href="http://www.delock.de/produkt/83114/pdf.html"&gt;data sheet&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Making the connection&lt;/h2&gt;
&lt;p&gt;Connecting the Delock 83114 to my Raspberry Pi seemed to work just right:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ftdi_sio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FTDI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Detected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FT232RL&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FTDI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attached&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ttyUSB0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So we have a new device living at /dev/ttyUSB0.&lt;/p&gt;
&lt;p&gt;Checking the service manual again, which has some screenshots of Tera Term to specify the follow connection settings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Baud        115.200
Data bits   8
Parity      None
Stop bits   1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Looks good, let's fire up a screen session:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;screen /dev/ttyUSB0 115200
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately, this did not work right away. I got some strange clicks on the Bose system and the terminal session had no output or anything useful.&lt;/p&gt;
&lt;p&gt;Doing more research I got inspired by &lt;a href="https://hackaday.com/2016/03/07/monitor-a-serial-port-from-anywhere/"&gt;this post&lt;/a&gt; on Hackaday. So I cut off the Delock cable, plugged it into the Bose system and connected it to my Arduino. Playing around with this setup suddenly brought some characters in the Serial Monitor! I had &lt;em&gt;crossed&lt;/em&gt; the connection of RDX/TXD by mistake, but obviously met the last connection requirement.&lt;/p&gt;
&lt;p&gt;The output had some strange characters in it. Digging deeper into this topic I found that it is maybe not the best idea to run a 115.200 Baud serial connection with an Arduino.&lt;/p&gt;
&lt;p&gt;So I re-wired the Delock cable again, this time RDX/TXD crossed like shown in the picture below:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Crossed Delock cable" src="https://blog.almeroth.com/images/tumblr_inline_o3vgofhHQu1qbnc2r_540.jpg"&gt;&lt;/p&gt;
&lt;p&gt;What shall I say: it worked on the Raspberry Pi now. \o/&lt;/p&gt;
&lt;p&gt;The only question left for me is this: Is there a standard cable (3,5 mm Jack to USB) that has the Tip (TXD) &amp;amp; Ring (RXD) crossed?&lt;/p&gt;</content><category term="blog"></category><category term="bose"></category><category term="home automation"></category><category term="serial communications"></category></entry><entry><title>Bose Solo 15 TV Sound System – TAP Commands</title><link href="https://blog.almeroth.com/bose-solo-15-tv-sound-system-tap-commands.html" rel="alternate"></link><published>2016-03-09T19:00:18+01:00</published><updated>2016-03-09T19:00:18+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2016-03-09:/bose-solo-15-tv-sound-system-tap-commands.html</id><summary type="html">&lt;p&gt;I'm one of those not-so-proud owners of a Bose Solo audio systems that simply sits under your TV-set and plays some audio you feed in.&lt;/p&gt;
&lt;p&gt;It ships with a really basic IR-Remote that consists of four keys:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="kr"&gt;To&lt;/span&gt;&lt;span class="n"&gt;ggle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;On&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Off&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Mute …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;I'm one of those not-so-proud owners of a Bose Solo audio systems that simply sits under your TV-set and plays some audio you feed in.&lt;/p&gt;
&lt;p&gt;It ships with a really basic IR-Remote that consists of four keys:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="kr"&gt;To&lt;/span&gt;&lt;span class="n"&gt;ggle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;On&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Off&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;Mute&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Other then that the device has one LED in the front and some ports in the back:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Data (3,5&amp;quot; Jack)    Serial communication
USB (Service)       Firmware updates
TOS-Link            Optical Digital audio
Coaxial             Digital audio
Cinch               Analog stereo audio
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Read more about it in the &lt;a href="http://worldwide.bose.com/productsupport/assets/pdf/guides/solo/en/owg_en_solo.pdf"&gt;user manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While the days were long, dark and cold I discovered that you can update the firmware of this piece of technology.
Some research (&lt;a href="http://flarn2006.blogspot.de/2014/09/hacking-bose-soundtouch-and-its-linux.html"&gt;Hacking the Bose Soundtouch, and its Linux-based OS&lt;/a&gt;)
showed me that this device is probably also running an embedded linux system. So I went on and updated my firmware to the latest version.&lt;/p&gt;
&lt;p&gt;But this little Data-port caught my attention. After some Googling, I found a Bose service manual that stated you can controll this device using so called TAP-commands.
I had no clue how to do that and I have never used a serial terminal before. &lt;a href="{filename}/blog/2016-03-11-bose-solo-15-tv-sound-system-cable.md"&gt;After I fiddled around some weeks with different cables, an Arduino, etc. I finally made it and found a way to talk this device using a serial console&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is the list of commands with their corresponding output. &lt;em&gt;Note&lt;/em&gt;: I haven't run all commands yet, as I don't know their impact yet. Others had no particular output.&lt;/p&gt;
&lt;h2&gt;Describe command&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; DC
dc              (here) Describe command
vr              Version info
sr              Read serial
sw              Write serial
mt              Write test status
mr              Read test status
rd              Read data
wd              Write data
br              BDSP Read data
bw              BDSP Write data
bb              BDSP base addr
xm              BDSP xmodel ver
cpu             CPU control
debug           Debug level
gpio            GPIO control
tap             TAP control
ui              UI control
repeat          Repeat a command
vo              Volume control
reboot          Reboot
bdsp            BDSP control
spdif           S/PDIF read/write
lpsc            lpsc
audio           audio settings
echo            echo
mu              Mute control
bass            Bass control
led             LED control
ir              IR control
remote          Remote control
fd              Factory defaults
persist         Persistent control
flash           SPI flash
usb             USB
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Version info&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; VR
Main 1.0.6.1287 epdbuild.usmahedbldsrv01.2014-05-22T14:40:29
Boot 1.0.0.1211 epdbuild.usmahedbldsrv01.2013-05-09T14:25:14
Mfg  1.0.0.1211 epdbuild.usmahedbldsrv01.2013-05-09T14:25:31
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Read serial&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; SR
M:WBM0141G0743
I:00000000000000000000000
S:057237Z40201505AE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Read test status&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; MR
0x000000F8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;BDSP base addr&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; BB
293731936
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;BDSP xmodel ver&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; XM
1210
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;CPU control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nb"&gt;load&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01F5358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1188&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01F6358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;684&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01F7358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1384&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01F8358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;572&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01F9358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;620&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01FA358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;868&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01FB358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;652&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01FC358&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;876&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC01FCB58&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1104&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Debug level&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; DEBUG
TimerMBX: 0xC01DA150
RenderAudioMBX: 0xC01DA1D0
TAPAppMBX: 0xC01DA0D0
UITaskMBX: 0xC01DA2D0
USBTaskMBX: 0xC01DA350
CodecManagerMBX: 0xC01DA250
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;TAP control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; TAP
RX/TX max usage: 9/301
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;UI control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; UI
state: 2
BDSP mute: 0
BDSP vol: 11
BDSP isNaN: 0
demo layer: 0
idle timer: 1/1
idle timer value: 0
audio silence: 1
audio silence timer value: 123211
power cycles: 28
running from: upgraded main image
Hospitality mode: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;UI control  (while playing)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; UI
state: 2
BDSP mute: 0
BDSP vol: 11
BDSP isNaN: 0
demo layer: 0
idle timer: 1/1
idle timer value: 0
audio silence: 0
audio silence timer value: 0
power cycles: 28
running from: upgraded main image
Hospitality mode: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Volume control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; VO
0/11/100
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Reboot&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; reboot
Bose Solo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Audio settings&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; AUDIO
audio in bypass: no
input auto selection: on
digital source: no
S/PDIF valid: no
Audio type: PCM
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Audio settings (while playing)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; AUDIO
audio in bypass: no
input auto selection: on
digital source: yes
S/PDIF valid: yes
  S/PDIF channel: 1
  S/PDIF frame rate: 44.1 kHz
  S/PDIF IEC Pc: 0xFFFFFFFF
Audio type: PCM
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Mute control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; MU
0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Mute control (while muted)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; MU
1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Bass control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; BASS
0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;LED control (while off)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; LED
Active Layers:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;LED control (while on)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; LED
Active Layers: 14
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;LED control (while blinking)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; LED
Active Layers: 12 14
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;IR control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; IR
echoRemote: 0
ignoreRemote: 0
eventBufferWatermark: 4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Remote&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; remote 0 # Toggle On/Off
&amp;gt; remote 1 # Volume up
&amp;gt; remote 2 # Volume down
&amp;gt; remote 3 # Mute
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Persistent control&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; PERSIST
current block @ 0x00019778
drcSetting: 1
allowDrcSetting: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;USB&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; USB
usbDeviceConnected: 0
usbUpdateLockout: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="bose"></category><category term="home automation"></category><category term="serial communications"></category></entry><entry><title>Chromebit CS10 REV. 1.01A</title><link href="https://blog.almeroth.com/chromebit-cs10-rev-101a.html" rel="alternate"></link><published>2016-02-15T19:16:12+01:00</published><updated>2016-02-15T19:16:12+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2016-02-15:/chromebit-cs10-rev-101a.html</id><summary type="html">&lt;p&gt;I recently ripped apart my newest gadget &lt;a href="https://www.asus.com/Chrome-Devices/Chromebit-CS10/specifications/"&gt;CHROMEBIT CS10&lt;/a&gt; and here is the list of parts/chips I could find:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Rockchip
RK3288-C
SDGKL49001 1521

Rockchip
RK808-C
AFBD7G462 1512

SEC 534
K3QF2F2
OEMAGCE
GGEP20GDU

SKhynix
H26M52103FMR
e-NAND 541Y
M18LNE55QA1

AzureWave B1
AW-CM195NF

ASUS U1603
Board

GBH1529
25Q32CWIG
PP3121

INFENION
SLB9645
VQ12 …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;I recently ripped apart my newest gadget &lt;a href="https://www.asus.com/Chrome-Devices/Chromebit-CS10/specifications/"&gt;CHROMEBIT CS10&lt;/a&gt; and here is the list of parts/chips I could find:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Rockchip
RK3288-C
SDGKL49001 1521

Rockchip
RK808-C
AFBD7G462 1512

SEC 534
K3QF2F2
OEMAGCE
GGEP20GDU

SKhynix
H26M52103FMR
e-NAND 541Y
M18LNE55QA1

AzureWave B1
AW-CM195NF

ASUS U1603
Board

GBH1529
25Q32CWIG
PP3121

INFENION
SLB9645
VQ12 08
9NH1452
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pictures of all the parts can be found here:
&lt;a href="https://drive.google.com/open?id=0B16ur9NKHJwBQ0k2d1RpTENHWVU"&gt;https://drive.google.com/open?id=0B16ur9NKHJwBQ0k2d1RpTENHWVU&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="chromebit"></category><category term="chromeos"></category><category term="hacking"></category></entry><entry><title>On Music (2015 Edition)</title><link href="https://blog.almeroth.com/on-music-2015-edition.html" rel="alternate"></link><published>2015-01-22T12:28:36+01:00</published><updated>2015-01-22T12:28:36+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2015-01-22:/on-music-2015-edition.html</id><summary type="html">&lt;p&gt;Recently I had some time to listen to some good music. Particularly I enjoyed the tunes of &lt;a href="http://www.theblackkeys.com"&gt;The Black Keys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Spotify streams their gorgeous album „&lt;a href="https://play.spotify.com/album/0gVxPZ2tcMgyzLxyw8k1z7"&gt;Brothers&lt;/a&gt;“ in two different flavors (standard &amp;amp; deluxe edition), but provides only two songs of their newest album „&lt;a href="https://play.spotify.com/album/7iuAif3jt2f5DpESNp8MOR"&gt;Turn Blue&lt;/a&gt;“. The bestselling album „El Camino“ is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently I had some time to listen to some good music. Particularly I enjoyed the tunes of &lt;a href="http://www.theblackkeys.com"&gt;The Black Keys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Spotify streams their gorgeous album „&lt;a href="https://play.spotify.com/album/0gVxPZ2tcMgyzLxyw8k1z7"&gt;Brothers&lt;/a&gt;“ in two different flavors (standard &amp;amp; deluxe edition), but provides only two songs of their newest album „&lt;a href="https://play.spotify.com/album/7iuAif3jt2f5DpESNp8MOR"&gt;Turn Blue&lt;/a&gt;“. The bestselling album „El Camino“ is not listed on Spotify at all.&lt;/p&gt;
&lt;p&gt;So I headed over to the Apple iTunes Store, where they obviously had their complete discography available. I decided to purchase:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;„&lt;a href="https://itunes.apple.com/de/album/turn-blue/id841098321"&gt;Turn Blue&lt;/a&gt;“ for 10,99€ and&lt;/li&gt;
&lt;li&gt;„&lt;a href="https://itunes.apple.com/de/album/el-camino/id475545948"&gt;El Camino&lt;/a&gt;“ for 7,99€.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, all I got from iTunes was this error message telling me that I can not purchase both albums at this time:
&lt;img alt="iTunes error message" src="https://blog.almeroth.com/images/tumblr_inline_nikstbfXNg1qbnc2r.png"&gt;
Now I wanted them even more!&lt;/p&gt;
&lt;h3&gt;Google Play Store to the rescue!&lt;/h3&gt;
&lt;p&gt;Also I had an account on Google Play for ages and even had the Google Music Manager installed to upload my iTunes Library, I did not use the service very often.
It was a little bit of a surprise that they had both items I was looking for and an even better price(!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;„&lt;a href="https://play.google.com/store/music/album/The_Black_Keys_Turn_Blue?id=B5hfxx3iiti76d6pmfg2v24lpwi"&gt;Turn Blue&lt;/a&gt;“ for 8,99€&lt;/li&gt;
&lt;li&gt;„&lt;a href="https://play.google.com/store/music/album/The_Black_Keys_El_Camino?id=Bhjajbaxqcxzgvowtazhck5zceq"&gt;El Camino&lt;/a&gt;“ for 6,49€.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I ended up adding my PayPal account to Google Wallet (their payment service) and finally had the chance to listen to those tunes. I saved 3,50€ there. Complete success!&lt;/p&gt;
&lt;h3&gt;Funfact: nonsense prices&lt;/h3&gt;
&lt;p&gt;The Deluxe Edition of the „Brothers“ album includes six live songs on a second disk.
So one would guess: more songs = more value = bigger price. Let's see:&lt;/p&gt;
&lt;h4&gt;Apple iTunes Store&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;„&lt;a href="https://itunes.apple.com/de/album/brothers-deluxe-edition/id920414121"&gt;Brothers (Deluxe)&lt;/a&gt;“ for 13,99€&lt;/li&gt;
&lt;li&gt;„&lt;a href="https://itunes.apple.com/de/album/brothers/id732969612"&gt;Brothers&lt;/a&gt;“ for 9,99€&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obviously Apple knows how to make some good money.&lt;/p&gt;
&lt;h4&gt;Google Play Store&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;„&lt;a href="https://play.google.com/store/music/album/The_Black_Keys_Brothers_Deluxe?id=Bv4dwjzxtmslm5namcvgsvm47fq"&gt;Brothers (Deluxe)&lt;/a&gt;“ for 6,99€&lt;/li&gt;
&lt;li&gt;„&lt;a href="https://play.google.com/store/music/album/The_Black_Keys_Brothers?id=B42tuqnbgkbdfym4lk2hnczrimy"&gt;Brothers&lt;/a&gt;“ for 9,49€.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, where the hell does this difference come from? I do not know.&lt;/p&gt;
&lt;h3&gt;Add to Library&amp;hellip;&lt;/h3&gt;
&lt;p&gt;For historical reasons I collect my songs in iTunes since I digitalized all my CDs. I was happily subsribing to &lt;a href="https://www.apple.com/itunes/itunes-match/"&gt;iTunes Match&lt;/a&gt;, when Apple first announcing this service and upgraded my library of ~10.000 songs.&lt;/p&gt;
&lt;p&gt;So I downloaded my newest goods from Google Play Store and added those tracks (320 kbps MP3 DRM-free) to my iTunes Library. Soon iTunes Match kicked in and matched those songs with the music catalog from Apple.&lt;/p&gt;
&lt;p&gt;The result? A perfect match.&lt;/p&gt;
&lt;p&gt;What does that mean? I can download the iTunes Store version of both albums (256 kbps AAC DRM-free), which I could not purchase earlier and even saved 3,50€ which is 14% of the fee for iTunes Match (24,99€ per year).&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I am not sure, who did not receive those 3,50€ now, but I am pretty sure that it will not be the artist at the end.
Maybe I should cancel my iTunes Match subscription and move my libary to Google Music completely. Or maybe I start with doing this rule of three more often and see how it works out. Anyway, I think saving the money and go to more concerts, will make more people happy at the end&amp;hellip;&lt;/p&gt;</content><category term="blog"></category><category term="music"></category><category term="apple"></category><category term="google"></category><category term="spotify"></category></entry><entry><title>[POC] Things for Gmail</title><link href="https://blog.almeroth.com/poc-things-for-gmail.html" rel="alternate"></link><published>2014-11-30T18:51:00+01:00</published><updated>2014-11-30T18:51:00+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2014-11-30:/poc-things-for-gmail.html</id><summary type="html">&lt;p&gt;I released a contextual gadget for Google Mail, running on Google App Engine. It is a proof of concept and provides quick entry functionality for &lt;a href="https://culturedcode.com"&gt;Culture Codes Things&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See this video for how it works in action:&lt;/p&gt;
&lt;iframe src="https://docs.google.com/a/almeroth.com/file/d/0B16ur9NKHJwBZlVac1FoT3luVjg/preview" width="500" height="390"&gt;&lt;/iframe&gt;

&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/gmail/contextual_gadgets"&gt;Gmail contextual gadgets documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/apps-marketplace/preparing"&gt;Google Apps Marketplace documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/appengine/docs"&gt;Google App Engine documentation …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;I released a contextual gadget for Google Mail, running on Google App Engine. It is a proof of concept and provides quick entry functionality for &lt;a href="https://culturedcode.com"&gt;Culture Codes Things&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See this video for how it works in action:&lt;/p&gt;
&lt;iframe src="https://docs.google.com/a/almeroth.com/file/d/0B16ur9NKHJwBZlVac1FoT3luVjg/preview" width="500" height="390"&gt;&lt;/iframe&gt;

&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/gmail/contextual_gadgets"&gt;Gmail contextual gadgets documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/apps-marketplace/preparing"&gt;Google Apps Marketplace documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/appengine/docs"&gt;Google App Engine documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="blog"></category><category term="Google"></category><category term="Gadget"></category><category term="GAE"></category></entry><entry><title>Google Apps Script Resources</title><link href="https://blog.almeroth.com/google-apps-script-resources.html" rel="alternate"></link><published>2014-11-16T13:44:57+01:00</published><updated>2014-11-16T13:44:57+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2014-11-16:/google-apps-script-resources.html</id><summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/apps-script/overview"&gt;Google Apps Script Overview&lt;/a&gt; on Google Developers&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googleappsdeveloper.blogspot.de/search/label/Apps%20Script"&gt;Label: Apps Script&lt;/a&gt; on Google Apps Developer Blog&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/tagged/google-apps-script"&gt;Google Apps Script Community&lt;/a&gt; on StackOverflow&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/communities/102471985047225101769"&gt;Google Apps Script Community&lt;/a&gt; on Google+&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/communities/116649587096405255956"&gt;Developing Enterprise Apps with Google&lt;/a&gt; on Google+&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Examples &amp;amp; Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/scriptsexamples/home"&gt;Google Apps Script Examples&lt;/a&gt; by Romain Vialard and James Ferreira&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/appsscripttutorial/home"&gt;Apps Script Tutorial&lt;/a&gt; by …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/apps-script/overview"&gt;Google Apps Script Overview&lt;/a&gt; on Google Developers&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googleappsdeveloper.blogspot.de/search/label/Apps%20Script"&gt;Label: Apps Script&lt;/a&gt; on Google Apps Developer Blog&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/tagged/google-apps-script"&gt;Google Apps Script Community&lt;/a&gt; on StackOverflow&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/communities/102471985047225101769"&gt;Google Apps Script Community&lt;/a&gt; on Google+&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/communities/116649587096405255956"&gt;Developing Enterprise Apps with Google&lt;/a&gt; on Google+&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Examples &amp;amp; Tutorials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/scriptsexamples/home"&gt;Google Apps Script Examples&lt;/a&gt; by Romain Vialard and James Ferreira&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/appsscripttutorial/home"&gt;Apps Script Tutorial&lt;/a&gt; by Waqar Ahmad&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ramblings.mcpher.com/Home/excelquirks"&gt;Desktop Liberation Services&lt;/a&gt; by Bruce McPherson&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mashe.hawksey.info/category/google/google-apps-script/"&gt;Google Apps Script Examples&lt;/a&gt; by Martin Hawksey&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.steegle.com/"&gt;Steegly for Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googleappsdeveloper.blogspot.com/2012/02/create-spreadsheet-user-directory-with.html"&gt;Create a Spreadsheet User Directory with Apps Script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Books&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920023210.do"&gt;Google Script: Enterprise Application Essentials&lt;/a&gt; by James Ferreira&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920021810.do"&gt;Getting Started with OAuth 2.0&lt;/a&gt; by Ryan Boyd&lt;/li&gt;
&lt;/ul&gt;</content><category term="blog"></category><category term="Google"></category><category term="Script"></category></entry><entry><title>Kunde ≠ Bittsteller</title><link href="https://blog.almeroth.com/kunde-bittsteller.html" rel="alternate"></link><published>2014-07-14T12:47:43+02:00</published><updated>2014-07-14T12:47:43+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2014-07-14:/kunde-bittsteller.html</id><summary type="html">&lt;p&gt;Ich bin (Privat-)Kunde und kenne meine Rechte (zumindest grob): Ein Jahr Herstellergarantie, zwei Jahre Gewährleistung beim Händler, so will es das Gesetz. Soweit die Theorie. Nun zu Praxis…&lt;/p&gt;
&lt;p&gt;Am 1. Juni 2013 kauften wir ein 13" MacBook Pro in der &lt;a href="http://www.gravis.de/filialen/hamburg/hamburg-city/"&gt;GRAVIS Filiale&lt;/a&gt; an der Steinstraße in Hamburg. Es war …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ich bin (Privat-)Kunde und kenne meine Rechte (zumindest grob): Ein Jahr Herstellergarantie, zwei Jahre Gewährleistung beim Händler, so will es das Gesetz. Soweit die Theorie. Nun zu Praxis…&lt;/p&gt;
&lt;p&gt;Am 1. Juni 2013 kauften wir ein 13" MacBook Pro in der &lt;a href="http://www.gravis.de/filialen/hamburg/hamburg-city/"&gt;GRAVIS Filiale&lt;/a&gt; an der Steinstraße in Hamburg. Es war ein Sonderangebot (&lt;em&gt;nur für kurze Zeit verfügbar&lt;/em&gt;)! Doppelter Arbeitsspeicher (2x 4GB statt 2x 2GB), durch Austausch gegen billigeren RAM von GRAVIS, zum gleichem Preis wie bei der Standard-Konfiguration von Apple. Wir haben zugegriffen, gleichwohl der Angebotspreis von 1099€ brutto für eine Studentin kein Pappenstiel darstellte. Auf die uns angebotene GRAVIS Garantieverlängerung auf drei Jahre haben wir deshalb verzichtet (außerdem, s.o. Rechte und so).&lt;/p&gt;
&lt;p&gt;Ein Jahr und 20 Tage später, fallen plötzlich Teilbereiche der Tastatur aus. Die Tasten A bis L funktionieren nicht mehr. Dabei wurde das Gerät immer wie ein rohes Ei behandelt. Ein Wasser- oder Transportschaden konnte ausgeschlossen werden. Der geneigte Computeranwender denkt sofort an eine Neuinstallation. Gesagt, getan (was bei den fehlenden Tasten jedoch zur Herausforderung wird).&lt;/p&gt;
&lt;p&gt;Auch nach der Neuinstallation blieben die Tasten ohne Funktion. Somit konnte auch ein Software-Fehler ausgeschlossen werden. Da die Herstellergarantie um 20 Tage verstrichen war, machten wir uns auf in die o.g. GRAVIS Filiale. Dort sagte man uns, dass man sich um den Fall kümmern könne. Allerdings, da die Garantie bereits abgelaufen ist und ich als Käufer nicht nachweisen könne, dass der Fehler schon bei der Auslieferung des Geräts bestand, würde der Vorgang kostenpflichtig. Ich fragte nach, was das konkret bedeuten würde.&lt;/p&gt;
&lt;p&gt;Im ersten Schritt würde GRAVIS einen Service-Auftrag eröffnen und eine kostenlose Anfrage beim Hersteller stellen, ob das betroffene Gerät evtl. auf Kulanz repariert werden könne. Je nach Antwort von Apple würde GRAVIS dann einen Kostenvoranschlag erstellen oder die Reparatur durchführen. In jedem Fall müssten hierfür 60€ berechnet werden.&lt;/p&gt;
&lt;p&gt;Mit dieser Aussage schwanger, vereinbarte ich einen Termin an der Genius Bar bei Apple. Dort wurde erstmal ein Apple Hardware Test durchgeführt, um zu prüfen welche Teile in dem Gerät defekt sein könnten. Der Test verlief jedoch positiv ohne Hinweis auf einen Defekt. Der Genius eröffnete mir somit seine Diagnose eines defekten Topcase. Kostenpunkt 110€ netto für das Ersatzteil plus 29€ netto Reparatur-Aufwand. Summa summarum: 165,41€ brutto. Auf mein Nachfragen hin, erstellte er mir hierfür einen kostenlosen KVA bzw. eine sogenannte Genius Bar Arbeitsberechtigung auf der die Teile und Arbeitsstunden vermerkt waren.&lt;/p&gt;
&lt;p&gt;Nächster Schritt: Mit dem Apple KVA zur GRAVIS Filiale und Service-Auftrag erteilen. Da die Unterlagen von Apple nun vorgelegen haben, hat GRAVIS die Reparatur kostenlos eingeleitet. Es folgt eine Odyssee von diversen Besuchen bei unfreundlichen Mitarbeitern vor Ort und Telefonaten mit der Hotline (übrigens, die direkte Rufnummer der Filiale lautet: &lt;a href="tel:04030087288"&gt;040/30087288&lt;/a&gt;), da wir über den Bearbeitungsstatus nicht wie versprochen benachrichtigt wurden. Nach einer Bearbeitungszeit von 14 Tagen, wurde das Gerät nun kostenlos repariert.&lt;/p&gt;
&lt;p&gt;Was lernen wir daraus? Den nächsten Mac kaufen wir direkt im Apple Store, denn die Zeit und die Nerven, die man in solch einem Fall investieren muss, um zu seinem Recht zu kommen, rechtfertigen keinesfalls die vielleicht gesparten 100€ beim Erstkauf.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;TL;DR:&lt;/em&gt; GRAVIS stellt sich bei der Einhaltung der gesetzlichen Gewährleistung quer und will den Kunden doppelt abkassieren. Mit etwas Ehrgeiz, funktioniert's aber auch ohne Zusatzkosten.&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category></entry><entry><title>Time Machine-Server &amp; Active Directory-Authentication</title><link href="https://blog.almeroth.com/time-machine-server-active-directory-authentication.html" rel="alternate"></link><published>2014-04-29T22:41:00+02:00</published><updated>2014-04-29T22:41:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2014-04-29:/time-machine-server-active-directory-authentication.html</id><summary type="html">&lt;p&gt;We had some issues with our corporate Time Machine-Server lately and we possibly found a fix for some.
As troubles arose, we soon scheduled a maintainance downtime and applied all pending software updates.&lt;/p&gt;
&lt;p&gt;All updates went through and we were running a fully patched Mac OS X Server 10.9 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We had some issues with our corporate Time Machine-Server lately and we possibly found a fix for some.
As troubles arose, we soon scheduled a maintainance downtime and applied all pending software updates.&lt;/p&gt;
&lt;p&gt;All updates went through and we were running a fully patched Mac OS X Server 10.9.2 with OS X Server.app 3.1.1.
Unfortunately, when the system came back, authentication was broken somehow and we were greeted with the following message in the Console.app on the client-side:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;backup&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Attempting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;afp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="nv"&gt;@server&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NAConnectToServerSync&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;afp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="nv"&gt;@server&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;correct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keychain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;correct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keychain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;longer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backupd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1916&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Backup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;There&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;authenticating&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After doing some research, we found that this problem came from a combination of com.apple.access-groups and Active Directory-groups.
Our TM-Server is simply bound to the corporate AD-Domain and the privilege to use the backup-service came from three AD-group memberships.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 1" src="https://blog.almeroth.com/images/tumblr_inline_n4t7kr2cQq1qbnc2r.png" title="Figure 1"&gt;&lt;/p&gt;
&lt;p&gt;The error message above states that Time Machine tried to connect via AFP-protocol and got some authentication error.
So we tried to do the same from Finder and it worked flawlessly. &lt;em&gt;hmm, strange...&lt;/em&gt; Let's try Time Machine once again!
What should I say: it worked on the second try. Obviously, something happend while authenticating from the Finder.&lt;/p&gt;
&lt;p&gt;This misbehaviour was reproducible.&lt;/p&gt;
&lt;p&gt;Then I remembered a comment by &lt;a href="http://derflounder.wordpress.com/"&gt;Rich Trouton&lt;/a&gt; on &lt;a href="http://osx.michaellynn.org/freenode-osx-server/freenode-osx-server_2013-03-28.html"&gt;##osx-server&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[13:09:26 UTC] rtrouton: hjlinde: Another fix is to keep the SACL, create a local group that you add to the SACL's list and then stick an AD group with the users you want into that local group.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What Rich recommends is shown in Figure 2:
&lt;img alt="Figure 2" src="https://blog.almeroth.com/images/tumblr_inline_n4t7kyEvvS1qbnc2r.png" title="Figure 2"&gt;&lt;/p&gt;
&lt;p&gt;We implemented this method and tested Time Machine on different clients without any errors.
Now, we only need to find a reason for this strange behaviour! Please use the comments if you have a clue.&lt;/p&gt;</content><category term="blog"></category><category term="Time Machine"></category><category term="Active Directory"></category></entry><entry><title>Sophos Anti-Virus for Mac AutoUpdate Credentials</title><link href="https://blog.almeroth.com/sophos-anti-virus-for-mac-autoupdate-credentials.html" rel="alternate"></link><published>2014-01-02T20:00:06+01:00</published><updated>2014-01-02T20:00:06+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2014-01-02:/sophos-anti-virus-for-mac-autoupdate-credentials.html</id><summary type="html">&lt;p&gt;While I was on vacation I made some annoying observations with running Sophos Anti-Virus 9 on my Mac.
Every time I have been connected to the internet (via mobile-networks preferably #edge or through slow dsl connections) Sophos Anti-Virus tried to update their definitions.&lt;/p&gt;
&lt;p&gt;So I started to dig around and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;While I was on vacation I made some annoying observations with running Sophos Anti-Virus 9 on my Mac.
Every time I have been connected to the internet (via mobile-networks preferably #edge or through slow dsl connections) Sophos Anti-Virus tried to update their definitions.&lt;/p&gt;
&lt;p&gt;So I started to dig around and found an interesting shell-script under:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/Library/Sophos Anti-Virus/remove_v9.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(Running this script unmodified will completely remove your Sophos Anti-Virus installation, &lt;em&gt;be aware&lt;/em&gt;!)&lt;/p&gt;
&lt;p&gt;I modified the script to just disable Sophos (and not delete files). After rebooting the system everything would be back up. Cool.&lt;/p&gt;
&lt;p&gt;But one part of the script got my attention:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;security delete-generic-password -l SophosAUPrimaryServer -D &amp;quot;Sophos AutoUpdate&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
security delete-generic-password -l SophosAUPrimaryProxy -D &amp;quot;Sophos AutoUpdate&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
security delete-generic-password -l SophosAUSecondaryServer -D &amp;quot;Sophos AutoUpdate&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
security delete-generic-password -l SophosAUSecondaryProxy -D &amp;quot;Sophos AutoUpdate&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;They try to find some Keychain item while cleaning up. Interesting! Opening Keychain Access.app made clear that Sophos 9 installs a new keychain-file under:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; /Library/Sophos Anti-Virus/Sophos.keychain
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This keychain is used for storing the AutoUpdate credentials. But does this mean every user can view your Sophos credentials? &lt;strong&gt;No.&lt;/strong&gt;
Unlocking the keychain-file (with something like the company name of a big AV Corp. or so) shows that Sophos is storing hash-values of your passwords. Phew!&lt;/p&gt;
&lt;p&gt;Digging a little deeper clarifies that &lt;a href="http://saju.net.in/code/misc/openssl_aes.c.txt"&gt;AES-Encryption&lt;/a&gt; is used. Ok.
AES is a symmetric encryption, nevertheless it is possible to retrieve the credentials in plaintext. Hmm.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;tl;dr: You better distribute some dedicated credentials for your local Sophos AutoUpdate-Server.&lt;/em&gt;&lt;/p&gt;</content><category term="blog"></category><category term="Sophos"></category><category term="Anti-Virus"></category></entry><entry><title>TimeMachine Exclusions</title><link href="https://blog.almeroth.com/timemachine-exclusions.html" rel="alternate"></link><published>2013-11-29T10:34:00+01:00</published><updated>2013-11-29T10:34:00+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2013-11-29:/timemachine-exclusions.html</id><summary type="html">&lt;p&gt;TimeMachine bietet die Möglichkeit bestimmte Ordner und Dateien aus dem Backup auszuschließen.
Der Benutzer kann dies selbst über die Systemeinstellungen &amp;gt; TimeMachine &amp;gt; Optionen steuern.
Für den programmatischen Zugriff auf TimeMachine liefert Apple das Terminal-Kommando &lt;em&gt;tmutil&lt;/em&gt; mit.&lt;/p&gt;
&lt;p&gt;Um einen bestimmten Ordner oder Dateien aus dem Backup auszuschließen, gibt es zwei Verfahren:
Zum …&lt;/p&gt;</summary><content type="html">&lt;p&gt;TimeMachine bietet die Möglichkeit bestimmte Ordner und Dateien aus dem Backup auszuschließen.
Der Benutzer kann dies selbst über die Systemeinstellungen &amp;gt; TimeMachine &amp;gt; Optionen steuern.
Für den programmatischen Zugriff auf TimeMachine liefert Apple das Terminal-Kommando &lt;em&gt;tmutil&lt;/em&gt; mit.&lt;/p&gt;
&lt;p&gt;Um einen bestimmten Ordner oder Dateien aus dem Backup auszuschließen, gibt es zwei Verfahren:
Zum einen wird die &lt;em&gt;Pfad-unabhängige&lt;/em&gt; ("Sticky") Methode verwendet, die mit Extended Attributes funktioniert.
Oder man benutzt die &lt;em&gt;Pfad-abhängige&lt;/em&gt; ("absolute") Methode, die mit Einträgen in der com.apple.TimeMachine.plist arbeitet.
Es ist möglich beide Verfahren zu kombinieren bzw. Einträge mehrfach für die selbe Datei/Ordner zu setzen.&lt;/p&gt;
&lt;p&gt;Beide Methoden wurden unter Mac OS X Mountain Lion (10.8) und Mac OS X Mavericks (10.9) getestet.&lt;/p&gt;
&lt;h1&gt;Sticky-Methode&lt;/h1&gt;
&lt;p&gt;(Diese Methode kann nach meinem bisherigem Kenntnisstand nur programmatisch genutzt werden.
Der Benutzer hat keine Möglichkeit dieses Verhalten direkt im GUI zu konfigurieren.)
Durch den Aufruf des folgenden Kommandos wird einem Ordner/Datei ein Extended Attribute names "com.apple.metadata:com_apple_backup_excludeItem" angehängt.&lt;/p&gt;
&lt;p&gt;Hinzufügen eines Eintrags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tmutil addexclusion /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dies lässt sich mittels &lt;code&gt;ls -al@&lt;/code&gt; oder &lt;code&gt;xattr -l /path/to/file&lt;/code&gt; überprüfen.&lt;/p&gt;
&lt;p&gt;Überprüfen ob eine Datei ausgeschlossen ist:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tmutil isexcluded /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dateien/Ordner die mit der Sticky-Methode ausgeschlossen wurde, lassen sich mit folgendem Kommando im Spotlight-Index auffinden.&lt;/p&gt;
&lt;p&gt;Anzeigen aller Einträge:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mdfind &amp;quot;com_apple_backup_excludeItem = com.apple.backupd&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Löschen eines Eintrags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tmutil removeexclusion /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mit dem Kommando &lt;code&gt;xattr -p com.apple.metadata:com_apple_backup_excludeItem /path/to/file&lt;/code&gt; kann das Extended Attribute entfernt werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Extended Attributes sind eine Besonderheit von Mac OS und können beim Kopieren und auf nicht HFS+ kompatiblen Dateisystemen verloren gehen.&lt;/p&gt;
&lt;h1&gt;Absolute-Methode&lt;/h1&gt;
&lt;p&gt;Bei der absoluten Methode werden die auszuschließenden Pfade in die &lt;em&gt;/Library/Preferences/com.apple.TimeMachine.plist&lt;/em&gt; geschrieben.
Sie ist der Sticky-Methode vorzuziehen.
Über die GUI vom Benutzer definierte Einträge werden unter dem Key &lt;em&gt;SkipPaths&lt;/em&gt; eingetragen, programmatisch definierte in &lt;em&gt;ExcludeByPath&lt;/em&gt;.
Die Einträge in &lt;em&gt;ExcludeByPath&lt;/em&gt; werden dem Benutzer im GUI nicht angezeigt. Mit dem tmutil ist es nicht möglich &lt;em&gt;SkipPaths&lt;/em&gt; Einträge zu definieren.&lt;/p&gt;
&lt;p&gt;Hinzufügen eines Eintrags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo tmutil addexclusion -p /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Überprüfen ob eine Datei ausgeschlossen ist:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tmutil isexcluded /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Anzeigen aller Einträge:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Benutzer-Eintrag
defaults read /Library/Preferences/com.apple.TimeMachine.plist SkipPaths

# Programme-Eintrag
defaults read /Library/Preferences/com.apple.TimeMachine.plist ExcludeByPath
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Löschen eines Eintrags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo tmutil removeexclusion -p /path/to/file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Bei der Angabe von Pfaden ist auf die spezielle Formatierung zu achten &lt;em&gt;/Users/username/Downloads&lt;/em&gt; ist nicht unbedingt gleichzusetzen mit &lt;em&gt;~username/Downloads&lt;/em&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="Time Machine"></category></entry><entry><title>Moving on</title><link href="https://blog.almeroth.com/moving-on.html" rel="alternate"></link><published>2013-11-23T11:19:23+01:00</published><updated>2013-11-23T11:19:23+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2013-11-23:/moving-on.html</id><summary type="html">&lt;p&gt;For quite a while I had registered and hosted my domains with a cheap hoster (PHP, MySQL-DBs, FTP-Access and no custom DNS-config included).
Now it is time to move forward and I switched all my stuff to &lt;a href="https://www.regfish.de/"&gt;Regfish&lt;/a&gt;, where a friend and I rented a virtual server.&lt;/p&gt;
&lt;p&gt;During the move …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For quite a while I had registered and hosted my domains with a cheap hoster (PHP, MySQL-DBs, FTP-Access and no custom DNS-config included).
Now it is time to move forward and I switched all my stuff to &lt;a href="https://www.regfish.de/"&gt;Regfish&lt;/a&gt;, where a friend and I rented a virtual server.&lt;/p&gt;
&lt;p&gt;During the move I took the chance to try out Google App Engine with their preview of PHP support. I was amazed how easy it is to host my one-page &lt;a href="http://www.almeroth.com/"&gt;website&lt;/a&gt; on a free GAE-instance.
The PHP script my website is made off is basicly a HTML file extended with some request-variables and a mail-function for the contact form.
I had to write an app-config file, change three lines of code for mail() and deploy it to the cloud.
The result can be found here &lt;a href="http://almeroth-com.appspot.com/"&gt;almeroth-com.appspot.com&lt;/a&gt;. Awesome!&lt;/p&gt;
&lt;p&gt;Setting up a &lt;a href="https://developers.google.com/appengine/docs/domain?hl=en"&gt;custom domain&lt;/a&gt; for the app engine was easy too, since I was using Google Apps anyway.&lt;/p&gt;
&lt;p&gt;As everything went so smooth I dont need no stinkin' hosted virtual web server environment anymore. Hello scalable cloud!&lt;/p&gt;</content><category term="blog"></category><category term="Google"></category><category term="GAE"></category><category term="GAPPS"></category></entry><entry><title>Python for SysAdmins links</title><link href="https://blog.almeroth.com/python-for-sysadmins-links.html" rel="alternate"></link><published>2013-11-17T15:39:00+01:00</published><updated>2013-11-17T15:39:00+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2013-11-17:/python-for-sysadmins-links.html</id><summary type="html">&lt;p&gt;I started to learn more on Python and found some useful links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codeacademy: &lt;a href="http://www.codecademy.com/tracks/python"&gt;Python Track&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google: &lt;a href="https://developers.google.com/edu/python/"&gt;Python Class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.diveintopython.net/"&gt;Dive Into Python&lt;/a&gt;, &lt;a href="http://www.diveinto.org/python3/"&gt;Dive Into Python 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.greenteapress.com/thinkpython/"&gt;Think Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Session: &lt;a href="http://macadmins.psu.edu/2013/02/12/practical-python-for-mac-admins-nate-walck-jeremy-reichman/"&gt;"Practical Python for Sysadmins"&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=kWZS1Vlo5NQ&amp;amp;feature=share&amp;amp;list=PLRUboZUQxbyVwBJTi_KFq-FkadSLcAjF1"&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/11466/practical_python_for_mac_admins.pdf"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/11466/practical_python_examples.txt"&gt;Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using PyObjC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MacTech: &lt;a href="http://www.mactech.com/articles/mactech/Vol.25/25.08/2508MacEnterprise-SystemFrameworkScripting/index.html"&gt;System Framework Scripting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;StackOverflow: &lt;a href="http://stackoverflow.com/a/5438416"&gt;Python in Xcode 4 or Xcode 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lethain.com/entry/2008/aug/22/an-epic-introduction-to-pyobjc-and-cocoa/"&gt;An …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;I started to learn more on Python and found some useful links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codeacademy: &lt;a href="http://www.codecademy.com/tracks/python"&gt;Python Track&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google: &lt;a href="https://developers.google.com/edu/python/"&gt;Python Class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.diveintopython.net/"&gt;Dive Into Python&lt;/a&gt;, &lt;a href="http://www.diveinto.org/python3/"&gt;Dive Into Python 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.greenteapress.com/thinkpython/"&gt;Think Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Session: &lt;a href="http://macadmins.psu.edu/2013/02/12/practical-python-for-mac-admins-nate-walck-jeremy-reichman/"&gt;"Practical Python for Sysadmins"&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=kWZS1Vlo5NQ&amp;amp;feature=share&amp;amp;list=PLRUboZUQxbyVwBJTi_KFq-FkadSLcAjF1"&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/11466/practical_python_for_mac_admins.pdf"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/11466/practical_python_examples.txt"&gt;Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using PyObjC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MacTech: &lt;a href="http://www.mactech.com/articles/mactech/Vol.25/25.08/2508MacEnterprise-SystemFrameworkScripting/index.html"&gt;System Framework Scripting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;StackOverflow: &lt;a href="http://stackoverflow.com/a/5438416"&gt;Python in Xcode 4 or Xcode 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lethain.com/entry/2008/aug/22/an-epic-introduction-to-pyobjc-and-cocoa/"&gt;An Epic Introduction to PyObjC and Cocoa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="blog"></category><category term="Python"></category><category term="SysAdmin"></category></entry><entry><title>Exploring Things Cloud Sync API</title><link href="https://blog.almeroth.com/exploring-things-cloud-sync-api.html" rel="alternate"></link><published>2013-10-26T21:10:16+02:00</published><updated>2013-10-26T21:10:16+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2013-10-26:/exploring-things-cloud-sync-api.html</id><summary type="html">&lt;p&gt;As you may know, I am a big fan of Thomas A. Limoncellis &lt;a href="http://www.amazon.com/o/ASIN/0596007833/tomontime-20"&gt;„Time Management for System Administrators“&lt;/a&gt;. Having some simple techniques helping me getting my work done is just great. But knowing good strategies is not enough, you need the right tools for your daily planning/scheduling.&lt;/p&gt;
&lt;p&gt;So I …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As you may know, I am a big fan of Thomas A. Limoncellis &lt;a href="http://www.amazon.com/o/ASIN/0596007833/tomontime-20"&gt;„Time Management for System Administrators“&lt;/a&gt;. Having some simple techniques helping me getting my work done is just great. But knowing good strategies is not enough, you need the right tools for your daily planning/scheduling.&lt;/p&gt;
&lt;p&gt;So I tested virtually any GTD-app out there. For years, I am pretty happy with &lt;a href="http://culturedcode.com/things/"&gt;Cultured Code Things&lt;/a&gt; sitting on my Mac/iOS-devices. Lately, after having some &lt;a href="https://twitter.com/almeroth/status/339262506130345984"&gt;difficulties with the latest version&lt;/a&gt;, I started having a look at their undocumented Cloud Sync API. Here is what I found…&lt;/p&gt;
&lt;p&gt;With &lt;a href="http://mitmproxy.org/doc/mitmproxy.html"&gt;mitmproxy installed&lt;/a&gt; you quickly get some results looking like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;current-item-index&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;292&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;schema&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;{&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;6862ED60-5C1B-48F4-81A0-425FA3AA0EC3&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Task2&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ix&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tr&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;icp&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;do&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;icc&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nt&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tt&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Things rocks.&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;icsd&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rr&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sp&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cd&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1382686359&lt;/span&gt;.&lt;span class="mi"&gt;3546559811&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ar&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[],&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rt&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[],&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pr&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[],&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tg&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[],&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sr&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;acrd&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tp&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ss&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dl&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;[],&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dd&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;null&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;md&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1382686359&lt;/span&gt;.&lt;span class="mi"&gt;3644590378&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ti&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;st&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;}&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;}&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;}&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;]&lt;span class="w"&gt;&lt;/span&gt;
}&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Things is using simple HTTP(S)-request (POST, GET, DELETE, PUT) for communication with their Cloud Sync-Servers. Basicly they are exchanging JSON-objects. Each transaction has some required and optional key/value parts, depending on what the action is.&lt;/p&gt;
&lt;p&gt;Unfortunately the keys like ‘dd’, ‘nt’, ‘tt’ are not that self-describing. Looking around the Mac application-bundle, I found some file called &lt;em&gt;SyncronyPropertiesMapping.plist&lt;/em&gt;. What’s in it?&lt;/p&gt;
&lt;p&gt;It’s a conversion table and looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;‘dd’ : ‘dueDate’&lt;/li&gt;
&lt;li&gt;‘nt’ : ‘notes’&lt;/li&gt;
&lt;li&gt;‘tt’ : ‘title’&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ok, now you slowly get some insight of what is going on here. But wait, there is one more thing. What is this file called &lt;em&gt;Things.sdef&lt;/em&gt; doing here? Yeah right, it is an AppleScript-Library and in case you were not aware of, this is well documented here: &lt;a href="http://downloads.culturedcode.com/things/download/ThingsAppleScriptGuide.pdf"&gt;AppleScript Guide&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="Things"></category></entry><entry><title>Google Script: set status message on a label with ClientHandler</title><link href="https://blog.almeroth.com/google-script-set-status-message-on-a-label-with-clienthandler.html" rel="alternate"></link><published>2012-06-27T14:19:30+02:00</published><updated>2012-06-27T14:19:30+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2012-06-27:/google-script-set-status-message-on-a-label-with-clienthandler.html</id><summary type="html">&lt;p&gt;I wrote a handy &lt;a href="https://developers.google.com/apps-script/"&gt;Google Script&lt;/a&gt; that is useful for time-consuming tasks that run on Google Servers. The script knows four states: Idle, Loading, There was an error, Done and it is triggered if you click on the button. &lt;a href="https://script.google.com/a/macros/almeroth.com/s/AKfycbyVzfZYbxWUhv4wNg12IBEGF3JBWwuq_gOAR2A8VV7DGSagiT3_/exec"&gt;Feel free to test the script here&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Here is my code …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I wrote a handy &lt;a href="https://developers.google.com/apps-script/"&gt;Google Script&lt;/a&gt; that is useful for time-consuming tasks that run on Google Servers. The script knows four states: Idle, Loading, There was an error, Done and it is triggered if you click on the button. &lt;a href="https://script.google.com/a/macros/almeroth.com/s/AKfycbyVzfZYbxWUhv4wNg12IBEGF3JBWwuq_gOAR2A8VV7DGSagiT3_/exec"&gt;Feel free to test the script here&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Here is my code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doGet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UiApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createApplication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createVerticalPanel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Submit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Idle.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusLabel&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sHandler1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createServerHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;submitChange&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;sHandler1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addCallbackElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sHandler2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createServerHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;setOkStatus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;sHandler2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addCallbackElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createCheckBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusCheckbox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusCheckbox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addValueChangeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sHandler2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cHandler1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createClientHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forTargets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Loading…&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cHandler2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createClientHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forTargets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addClickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cHandler1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addClickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cHandler2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addClickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sHandler1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;submitChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UiApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getActiveApplication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusLabel&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Saving…&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusCheckbox&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yourStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yourStatus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;checkbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;There was an error…&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setOkStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UiApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getActiveApplication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusLabel&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statusCheckbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Done.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now discuss! :)&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>Stylectrical</title><link href="https://blog.almeroth.com/stylectrical.html" rel="alternate"></link><published>2011-09-19T10:23:00+02:00</published><updated>2011-09-19T10:23:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-09-19:/stylectrical.html</id><summary type="html">&lt;p&gt;Im Hamburger &lt;a href="http://www.mkg-hamburg.de"&gt;Museum für Kunst und Gewerbe&lt;/a&gt; läuft vom 26. August 2011 bis zum 15. Januar 2012 eine Sonderausstelung unter dem Titel &lt;a href="http://www.stylectrical.de/"&gt;"Stylectrical. Von Elektrodesign, das Geschichte schreibt"&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gezeigt wird eine umfangreiche Sammlung an Apple Produkten, die den Entwicklungsprozess im industriellen Elektrodesign veranschaulichen soll. Bei einer geführten Tour haben wir …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Im Hamburger &lt;a href="http://www.mkg-hamburg.de"&gt;Museum für Kunst und Gewerbe&lt;/a&gt; läuft vom 26. August 2011 bis zum 15. Januar 2012 eine Sonderausstelung unter dem Titel &lt;a href="http://www.stylectrical.de/"&gt;"Stylectrical. Von Elektrodesign, das Geschichte schreibt"&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gezeigt wird eine umfangreiche Sammlung an Apple Produkten, die den Entwicklungsprozess im industriellen Elektrodesign veranschaulichen soll. Bei einer geführten Tour haben wir uns gestern die Fakten, die der fachkundige Besucher schon vorher kannte, noch ein mal bestätigen lassen. Der ein oder andere Hinweis des Tour-Guides musste zwar mit einem skeptischen Blick quittiert werden – alles in allem lohnt sich ein Besuch schon.&lt;/p&gt;
&lt;p&gt;Es gab auch eine kleine Überraschung zu bestaunen:
&lt;img alt="EVE" src="https://blog.almeroth.com/images/tumblr_lrrgk7DoUM1qbnc2r.jpg"&gt;&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category></entry><entry><title>Security Update 2011-003 v1.0</title><link href="https://blog.almeroth.com/security-update-2011-003-v10.html" rel="alternate"></link><published>2011-06-01T07:55:29+02:00</published><updated>2011-06-01T07:55:29+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-06-01:/security-update-2011-003-v10.html</id><summary type="html">&lt;p&gt;Apple hat letzte Nacht ein Security Update bereit gestellt (&lt;a href="http://support.apple.com/kb/DL1387"&gt;Download&lt;/a&gt;),
dass die Malware namens OSX.MacDefender.A entfernen soll.&lt;/p&gt;
&lt;p&gt;Detaillierte Informationen zum Security Update gibt es &lt;a href="http://support.apple.com/kb/HT4657"&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apple löst die Thematik über ein &lt;a href="http://configuration.apple.com/configurations/macosx/xprotect/1/clientConfiguration.plist"&gt;Blacklist-System&lt;/a&gt;, dass sich XProtect nennt. Darin wird die Malware beschreiben und ein Hintergrund-Prozess kümmert sich um das …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Apple hat letzte Nacht ein Security Update bereit gestellt (&lt;a href="http://support.apple.com/kb/DL1387"&gt;Download&lt;/a&gt;),
dass die Malware namens OSX.MacDefender.A entfernen soll.&lt;/p&gt;
&lt;p&gt;Detaillierte Informationen zum Security Update gibt es &lt;a href="http://support.apple.com/kb/HT4657"&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apple löst die Thematik über ein &lt;a href="http://configuration.apple.com/configurations/macosx/xprotect/1/clientConfiguration.plist"&gt;Blacklist-System&lt;/a&gt;, dass sich XProtect nennt. Darin wird die Malware beschreiben und ein Hintergrund-Prozess kümmert sich um das Entfernen der infizierten Dateien.&lt;/p&gt;
&lt;p&gt;Die Blacklist wird regelmäßig über den XProtectUpdater(/usr/libexec/XProtectUpdater) abgefragt und aktualisiert. Wer das nicht möchte, kann es in den System-Einstellungen &amp;gt; Sicherheit deaktivieren.
&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_lm3kesOAwr1qbnc2r.png"&gt;&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category></entry><entry><title>How to disable Flash in Google Chrome</title><link href="https://blog.almeroth.com/how-to-disable-flash-in-google-chrome.html" rel="alternate"></link><published>2011-05-04T09:09:32+02:00</published><updated>2011-05-04T09:09:32+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-05-04:/how-to-disable-flash-in-google-chrome.html</id><summary type="html">&lt;p&gt;&lt;a href="http://mac.finerthingsin.com/post/5170859355" class="tumblr_blog"&gt;finermac&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you want to use Google Chrome but still don&amp;#8217;t want to put up with Flash, you can easily disable the plugin (without having to manually uninstall it) by going to:&lt;/p&gt;

&lt;p&gt;Preferences &amp;gt; Under the Hood &amp;gt; Content Settings &amp;gt; Disable individual plug-ins&lt;/p&gt;

&lt;p&gt;Fortunately, Chrome doesn&amp;#8217;t even need a restart …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://mac.finerthingsin.com/post/5170859355" class="tumblr_blog"&gt;finermac&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If you want to use Google Chrome but still don&amp;#8217;t want to put up with Flash, you can easily disable the plugin (without having to manually uninstall it) by going to:&lt;/p&gt;

&lt;p&gt;Preferences &amp;gt; Under the Hood &amp;gt; Content Settings &amp;gt; Disable individual plug-ins&lt;/p&gt;

&lt;p&gt;Fortunately, Chrome doesn&amp;#8217;t even need a restart; Flash is immediately taken off the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus points&lt;/strong&gt;: Since Chrome exposes your preferences through URL pages, you can bookmark the about:plugins page for easy access.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Cool stuff.&lt;/p&gt;</content><category term="blog"></category><category term="Flash free"></category><category term="Google"></category></entry><entry><title>Probleme mit iOS 4.3 &amp; iPhone 3GS [continued]</title><link href="https://blog.almeroth.com/probleme-mit-ios-43-iphone-3gs-continued.html" rel="alternate"></link><published>2011-03-18T10:19:02+01:00</published><updated>2011-03-18T10:19:02+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-03-18:/probleme-mit-ios-43-iphone-3gs-continued.html</id><summary type="html">&lt;p&gt;&lt;a href="{filename}/blog/2011-03-17-probleme-mit-ios-43-iphone-3gs.md"&gt;Wie gestern bereits erwähnt&lt;/a&gt;, gibt es aktuell Probleme mit iOS 4.3 auf Apples iPhone 3GS in Kombination mit Vodafone.&lt;/p&gt;
&lt;p&gt;Den Hinweis vom &lt;a href="http://www.heise.de/mac-and-i/meldung/iOS-4-3-Problemberichte-von-Vodafone-Kunden-1209385.html"&gt;Heise-Ticker&lt;/a&gt;, dass es sich hierbei evtl. um ein SIM-Karten Problem handeln könnte, kann ich durch ein Gespräch mit unserem Kundenbetreuer bei Vodafone und eigenen Tests nur bestätigen …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="{filename}/blog/2011-03-17-probleme-mit-ios-43-iphone-3gs.md"&gt;Wie gestern bereits erwähnt&lt;/a&gt;, gibt es aktuell Probleme mit iOS 4.3 auf Apples iPhone 3GS in Kombination mit Vodafone.&lt;/p&gt;
&lt;p&gt;Den Hinweis vom &lt;a href="http://www.heise.de/mac-and-i/meldung/iOS-4-3-Problemberichte-von-Vodafone-Kunden-1209385.html"&gt;Heise-Ticker&lt;/a&gt;, dass es sich hierbei evtl. um ein SIM-Karten Problem handeln könnte, kann ich durch ein Gespräch mit unserem Kundenbetreuer bei Vodafone und eigenen Tests nur bestätigen. Im Vodafone-Forum wird nun über &lt;a href="https://www.vodafone.de/forum/posts/list/180/4866.page#46547"&gt;zweifelhafte Lösungsansätze&lt;/a&gt; diskutiert, die in manchen Fällen angeblich geholfen haben.&lt;/p&gt;
&lt;p&gt;Nachdem ich gestern einigen Kollegen durch resetten der Netzwerk-Einstellungen bzw. mit dem kompletten Reset auf Werkseinstellungen helfen konnte, gab es ein Gerät, was sich absolut nicht zum Guten wenden wollte.&lt;/p&gt;
&lt;p&gt;Dabei kam es zu Fehlermeldungen wie dieser in iTunes:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li8o9ltiEb1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Der Versuch eine neue „normale“ Vodafone SIM-Karte auf die Rufnummer schalten zu lassen, schlug in diesem Fall leider auch fehl. Nach langem hin und her mit SIM-Karten von anderen Mobilfunk Anbietern, die reibungslos funktionierten, und diversen Software-Resets, habe ich mich dazu entschlossen eine neue Blanko &lt;em&gt;Micro&lt;/em&gt;-SIM-Karte von Vodafone auf die Rufnummer aktivieren zu lassen. Ohne die Karte aus ihrer Haltung zu brechen, habe ich die normale SIM-Karten-Größe (rot) mit einem Edding auf die Micro-SIM (weiß) gemalt, ausgeschnitten und probiert. &lt;a href="https://twitter.com/#!/almeroth/status/48423185179348992"&gt;(Was soll ich sagen)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li8xucp9PG1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Ein 24-Stunden Test des Kandidaten steht noch aus, jedoch verliefen erste Tests sehr positiv. Dies erklärt auch, warum iPhone 4s nicht betroffen sind (sie verwenden Micro-SIM-Karten).&lt;/p&gt;
&lt;h2&gt;Lösung:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vodafone Micro-SIM besorgen&lt;/li&gt;
&lt;li&gt;SIM-Karte ins richtige Format schneiden&lt;/li&gt;
&lt;li&gt;ins Telefon einlegen&lt;/li&gt;
&lt;li&gt;fertig&lt;/li&gt;
&lt;/ul&gt;</content><category term="blog"></category><category term="Vodafone"></category><category term="iPhone"></category></entry><entry><title>Probleme mit iOS 4.3 &amp; iPhone 3GS</title><link href="https://blog.almeroth.com/probleme-mit-ios-43-iphone-3gs.html" rel="alternate"></link><published>2011-03-17T09:28:49+01:00</published><updated>2011-03-17T09:28:49+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-03-17:/probleme-mit-ios-43-iphone-3gs.html</id><summary type="html">&lt;p&gt;Was &lt;a href="http://www.heise.de/mac-and-i/meldung/iOS-4-3-Problemberichte-von-Vodafone-Kunden-1209385.html"&gt;Heise.de&lt;/a&gt; berichtet, mussten gestern schon ein paar unserer Kollegen am eigenen Leib erfahren. Das neuste iOS-Update 4.3 führt bei Apples iPhone 3GS zu &lt;a href="https://www.vodafone.de/forum/posts/list/135/4866.page#46352"&gt;folgenden Probleme&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Betriebssystem hängt sich nach der Eingabe der PIN auf &lt;/li&gt;
&lt;li&gt;sehr lange Bootzeit des Betriebssystems &lt;/li&gt;
&lt;li&gt;sehr lange Netzsuche beim Bootprozess oder beim Umschalten …&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Was &lt;a href="http://www.heise.de/mac-and-i/meldung/iOS-4-3-Problemberichte-von-Vodafone-Kunden-1209385.html"&gt;Heise.de&lt;/a&gt; berichtet, mussten gestern schon ein paar unserer Kollegen am eigenen Leib erfahren. Das neuste iOS-Update 4.3 führt bei Apples iPhone 3GS zu &lt;a href="https://www.vodafone.de/forum/posts/list/135/4866.page#46352"&gt;folgenden Probleme&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Betriebssystem hängt sich nach der Eingabe der PIN auf &lt;/li&gt;
&lt;li&gt;sehr lange Bootzeit des Betriebssystems &lt;/li&gt;
&lt;li&gt;sehr lange Netzsuche beim Bootprozess oder beim Umschalten von WiFi auf das Vodafone-Netz &lt;/li&gt;
&lt;li&gt;Einzelne Apps lassen sich nicht nutzen (Sprung zurück ins Hauptmenü) &lt;/li&gt;
&lt;li&gt;Hardreset bringt es in der Regel wieder in Betrieb (Home Taste und Ein-/Ausschalter für 5 sek. halten). &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vodafone hat Apple bereits informiert und hofft auf eine baldige Lösung.&lt;/p&gt;</content><category term="blog"></category><category term="Vodafone"></category><category term="iPhone"></category></entry><entry><title>Gastbeitrag: Mac OS X 10.7 (11A390)</title><link href="https://blog.almeroth.com/gastbeitrag-mac-os-x-107-11a390.html" rel="alternate"></link><published>2011-03-13T17:50:39+01:00</published><updated>2011-03-13T17:50:39+01:00</updated><author><name>Alexander P.</name></author><id>tag:blog.almeroth.com,2011-03-13:/gastbeitrag-mac-os-x-107-11a390.html</id><summary type="html">&lt;h2&gt;Einleitung und Anspruch&lt;/h2&gt;
&lt;p&gt;Ich habe mir für einen kurzen Testlauf das neue Mac OS X 10.7 (Lion) in der Entwicklungsversion 11A390 auf einer externen Festplatte installiert.
Da der Test auf meinem &lt;a href="{filename}/blog/2010-12-12-gastbeitrag-macbook-air-13.md"&gt;MacBook Air (Late2010)&lt;/a&gt; erfolgreich verlief, habe ich es kurzum direkt über mein Produktiv-System (10.6) installiert.
Vorher wurde …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Einleitung und Anspruch&lt;/h2&gt;
&lt;p&gt;Ich habe mir für einen kurzen Testlauf das neue Mac OS X 10.7 (Lion) in der Entwicklungsversion 11A390 auf einer externen Festplatte installiert.
Da der Test auf meinem &lt;a href="{filename}/blog/2010-12-12-gastbeitrag-macbook-air-13.md"&gt;MacBook Air (Late2010)&lt;/a&gt; erfolgreich verlief, habe ich es kurzum direkt über mein Produktiv-System (10.6) installiert.
Vorher wurde natürlich ein vollständiges Backup gezogen, denn ein nachträgliches Downgrade zurück auf 10.6, dürfte aufgrund der Veränderungen im Safari- und Mail-Umfeld wohl nicht ohne Weiteres möglich sein.
Seit der Migration setze ich nun die Version 11A390 als reguläres Betriebssystem im täglichen Betrieb ein. Der Anspruch hierbei, ein normaler Betrieb im Office-Umfeld muss möglich sein. Vor diesem Blickwinkel ist dieser Artikel inhaltlich entstanden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li091caOgC1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Die Installation ist von einer externen Festplatte durchgeführt worden. Hierzu wurde das Installations-Image via CarbonCopyCloner auf eine externe Festplatte gecloned und von dieser gebootet.
Die Installation erfolgt wie gewohnt simple und es sind nur wenige Benutzereingaben erforderlich. Die ganze Prozedur war nach 45 Min. abgeschlossen. Es gab keine Schwierigkeiten oder Fehler bei der Installation.
Wie bereits von Apple angekündigt, stehen die Serverkomponenten in jeder OS X 10.7 Version zur Verfügung, es wird nicht mehr zwischen einer Server- oder Client-Version unterschieden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li091sxrGL1qbnc2r.png"&gt;
&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li0928uaiF1qbnc2r.png"&gt;
&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li091y7eiT1qbnc2r.png"&gt;
&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li092kDC0D1qbnc2r.png"&gt;
&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li092t8KKU1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;64-Bit Kernel &amp;amp; TRIM-Support&lt;/h2&gt;
&lt;p&gt;Apple hat im Build 11A390 den 64Bit-Kernel für alle Geräte aktiviert. Die aktuelle Strategie, den 64Bit-Modus nur für die Pro-Serie anzubieten und dies auch nur mit expliziter Aktivierung, ist mit 10.7 (nun endlich) aufgelöst.
Dies lässt darauf schließen, dass der Einsatz von 11A390 nur für Geräte mit 64Bit-EFI vorbehalten ist. Es wird bei der boot.efi auch nicht mehr zwischen 32- und 64-Bit unterschieden, es existiert nur eine!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li0933HmpK1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Des Weiteren wird für SSDs nun der bisher vermisste TRIM-Modus aktiviert, was sich zu mindestens theoretisch, positiv auf die Performance von SSDs auswirken soll.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li093pwPiP1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Speichernutzung (RAM)&lt;/h2&gt;
&lt;p&gt;Nach den ersten Tagen im Dauereinsatz inkl. Multiuser-Betrieb ist kein Unterschied der Arbeitsspeicherauslastung zu 10.6 zu bemerken.&lt;/p&gt;
&lt;h2&gt;Speichernutzung (HDD)&lt;/h2&gt;
&lt;p&gt;Grundsätzlich benötigt das Betriebssystem unwesentlich mehr Speicher auf der Festplatte. Wer allerdings mit TimeMachine arbeitet wird feststellen, dass durch die neue Funktion der Versionierung von Dateien im Filesystem unvermeidlich zusätzlicher Speicher im Filesystem benötigt wird.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li0943Zb3i1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Akkulaufzeit&lt;/h2&gt;
&lt;p&gt;Das Thema Akkulaufzeit ist immer sehr subjektiv zu betrachten. Tatsächliche Mess-Szenarios wurden nicht zur Hilfe heran gezogen. Deshalb beschränke ich mich hierbei nur auf einen direkten Vergleich zu dem Release OS X 10.6.6.
Die Akkulaufzeit ist im Vergleich zu 10.6 unwesentlich schlechter geworden. Auf meinem MacBook Air ist eine negative Auswirkung auf den zusätzlich notwendigen Grafikbedarf zurückzuführen.
Der Laufzeit liegt beispielsweise beim Schreiben dieses Artikels in Word 2011 bei ca. 10h, welches keinen Unterschied zu OS X 10.6 darstellt.&lt;/p&gt;
&lt;h2&gt;Performance &amp;amp; Stabilität&lt;/h2&gt;
&lt;p&gt;Was für ein neues Release, gerade im Entwicklungsumfeld, ungewöhnlich ist, das System bootet in Rekordzeit bis zum Login-Screen (wesentlich schneller als 10.6) und macht auch bei weiterer Nutzung sehr viel Spaß. Die Abläufe sind alles in allem flüssig, die Animationen laufen im Großen und Ganzen bereits stolperfrei.
Die Stabilität des Betriebssystems, hierbei müssen wir differenzieren zu Applikationen, lässt keine Wünsche offen. 11A390 ist bereits für die Nutzung geeignet und läuft nicht nur schnell und flüssig, sondern auch stabil. Ein Absturz ist bei meiner Nutzung noch nicht passiert.&lt;/p&gt;
&lt;h2&gt;Bedienung und neue Features&lt;/h2&gt;
&lt;p&gt;Apple hat versprochen den Spaßfaktor von iPhone, iPad und Co auf den Mac zurückzubringen. Was muss man sich darunter vorstellen?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li094oN0641qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;LaunchPad&lt;/h2&gt;
&lt;p&gt;Eine Übersicht aller installierten Applikationen, gruppiert anhand der Ordnerstruktur unterhalb des Ordners Applications.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li095cvMI91qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;MissionControl&lt;/h2&gt;
&lt;p&gt;Ein echt tolles Feature, mittels 3-Finger-Scrollen wird zwischen den Spaces oder dem Dashboard gewechselt, Zweiteres wird nicht mehr übergeblendet sondern bildet einen eigenen Space. Neu ist auch, Scrollen nach oben blendet alle Spaces im Überblick ein und die für den jeweiligen Space verfügbaren Applikationen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li09635ZDX1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Scrollen wie auf dem iPhone, iPad u. Co&lt;/h2&gt;
&lt;p&gt;Fluch oder Segen – das Scrollen mittels 2-Finger wird nun wie auf dem iPhone durchgeführt, sprich, verkehrt herum. Das ist am Anfang gewöhnungsbedürftig und dürfte gerade bei Usern die Mac &amp;amp; Windows beherrschen müssen eine echte Herausforderung darstellen nicht ständig in die verkehrte Richtung zu scrollen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li096pYoGI1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Internet Accounts&lt;/h2&gt;
&lt;p&gt;Wie bereits vom iOS bekannt, sind nun zentral alle Internetkonten als Profile zentral über die System Preferences zugänglich.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="https://blog.almeroth.com/images/tumblr_li096yw1NJ1qbnc2r.png"&gt;&lt;/p&gt;
&lt;h2&gt;Aktuelle Softwarekompatibelität&lt;/h2&gt;
&lt;p&gt;Anbei eine kurze Liste der Applikationen, die ich getestet habe: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple Remote Desktop&lt;ul&gt;
&lt;li&gt;Funktioniert nicht&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CoolBook&lt;ul&gt;
&lt;li&gt;Funktioniert nicht&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Office 2011&lt;ul&gt;
&lt;li&gt;Ohne Probleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NetNewsWire&lt;ul&gt;
&lt;li&gt;Ohne Probleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Skype&lt;ul&gt;
&lt;li&gt;Ohne Probleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Disco Brennsoftware&lt;ul&gt;
&lt;li&gt;Funktioniert nicht&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Little Snitch&lt;ul&gt;
&lt;li&gt;Funktioniert nicht&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VLC&lt;ul&gt;
&lt;li&gt;Ohne Probleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Burn&lt;ul&gt;
&lt;li&gt;Ohne Probleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bugs &amp;amp; Fehler&lt;/h2&gt;
&lt;p&gt;Es handelt sich um eine Entwicklungsversion, das sollte nicht außer acht gelassen werden. Vor diesem Hintergrund gibt es einige Bugs und Fehler die nach Nacharbeiten schreien. Alles in allem stellen diese für mich aber keinen Showstopper dar und ich werde weiterhin dieses System ohne Einschränkungen einsetzen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Safari: “Top Sites” führen immer zum Einfrieren des Browsers&lt;/li&gt;
&lt;li&gt;Safari: Prozessauslastung stellenweise dauerhaft sehr hoch&lt;/li&gt;
&lt;li&gt;Safari: Seitenaufruf nicht möglich (nicht reproduzierbar)&lt;/li&gt;
&lt;li&gt;Safari: stürzt beim Öffnen ab, Neustart des Rechners ist notwendig (nicht reproduzierbar)&lt;/li&gt;
&lt;li&gt;Bildschirmschoner: lässt sich nicht per Mausbewegung deaktivieren, ein Mausklick ist notwendig&lt;/li&gt;
&lt;li&gt;Benutzerwechsel: die automatische Entsperrung eines weiteren eingelogten Users funktioniert nicht. Nach einem Wechsel landet man in einem schwarzen Bildschirm, ein Mausklick aktiviert das Login-Fenster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Über den Autor&lt;/h2&gt;
&lt;p&gt;Alexander P. arbeitet seit 2003 für die Info AG. In seiner Freizeit ist er Mac Fan, &lt;a href="http://www.saab-cars.de/"&gt;Saab-Fahrer&lt;/a&gt; und ein guter Freund von mir!&lt;/p&gt;</content><category term="blog"></category><category term="Gastbeitrag"></category><category term="Macintosh"></category></entry><entry><title>Wir sind Helden in der Bild</title><link href="https://blog.almeroth.com/wir-sind-helden-in-der-bild.html" rel="alternate"></link><published>2011-02-25T08:20:03+01:00</published><updated>2011-02-25T08:20:03+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-02-25:/wir-sind-helden-in-der-bild.html</id><summary type="html">&lt;p&gt;Getreu der Bild-Kampagne „Jede Wahrheit braucht einen Mutigen, der sie ausspricht“ veröffentlicht &lt;a href="http://www.wirsindhelden.de/2011/02/1069/"&gt;Ju­dith Ho­lo­fer­nes&lt;/a&gt; ihr Antwortschreiben an die Wer­be­agen­tur Jung von Matt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Die Bild­zei­tung ist ein ge­fähr­li­ches po­li­ti­sches In­stru­ment – nicht nur ein stark …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Getreu der Bild-Kampagne „Jede Wahrheit braucht einen Mutigen, der sie ausspricht“ veröffentlicht &lt;a href="http://www.wirsindhelden.de/2011/02/1069/"&gt;Ju­dith Ho­lo­fer­nes&lt;/a&gt; ihr Antwortschreiben an die Wer­be­agen­tur Jung von Matt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Die Bild­zei­tung ist ein ge­fähr­li­ches po­li­ti­sches In­stru­ment – nicht nur ein stark ver­grö­ßern­des Fern­rohr in den Ab­grund, son­dern ein bös­ar­ti­ges Wesen, das Deutsch­land nicht be­schreibt, son­dern macht. Mit einer Agen­da.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="blog"></category><category term="Stuff"></category></entry><entry><title>Wegen Reichtum geschlossen?</title><link href="https://blog.almeroth.com/wegen-reichtum-geschlossen.html" rel="alternate"></link><published>2011-01-17T09:23:03+01:00</published><updated>2011-01-17T09:23:03+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2011-01-17:/wegen-reichtum-geschlossen.html</id><summary type="html">&lt;p&gt;&lt;img alt="Aktuelle Betriebszeiten" src="https://blog.almeroth.com/images/tumblr_lf5r34MkiT1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Aktuelle Betriebszeiten!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dieses Gerät steht Ihnen von Montag 8.00 Uhr bis Freitag 16.00 Uhr zur Verfügung.
Außerhalb der Betriebszeiten können Sie den Geldautomaten in der [...] Filiale [...] nutzen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Da frage ich mich doch, wozu es diesen Geld-Automaten braucht. Hoffentlich kommt nicht bald noch jemand auf die Idee dem Internet …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Aktuelle Betriebszeiten" src="https://blog.almeroth.com/images/tumblr_lf5r34MkiT1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Aktuelle Betriebszeiten!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dieses Gerät steht Ihnen von Montag 8.00 Uhr bis Freitag 16.00 Uhr zur Verfügung.
Außerhalb der Betriebszeiten können Sie den Geldautomaten in der [...] Filiale [...] nutzen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Da frage ich mich doch, wozu es diesen Geld-Automaten braucht. Hoffentlich kommt nicht bald noch jemand auf die Idee dem Internet Öffnungszeiten zu verpassen!&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>App Ausgaben</title><link href="https://blog.almeroth.com/app-ausgaben.html" rel="alternate"></link><published>2010-12-30T13:20:00+01:00</published><updated>2010-12-30T13:20:00+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-12-30:/app-ausgaben.html</id><summary type="html">&lt;p&gt;Ich habe derzeit knapp 100 Apps (iPhone &amp;amp; iPad) in meiner iTunes-Library. Es ist ein bunter Strauß aus sämtlichen Kategorien Produktivität, Navigation, Spiele, etc…&lt;/p&gt;
&lt;p&gt;Passend zum Ende des Jahres, der Zeit der nutzlosen Statistiken, bin ich auf ein kleines Programm namens &lt;a href="http://wetfish.de/software/app-store-expense-monitor/"&gt;App Store Expense Monitor&lt;/a&gt; von Clemens Schulz aufmerksam gemacht worden …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ich habe derzeit knapp 100 Apps (iPhone &amp;amp; iPad) in meiner iTunes-Library. Es ist ein bunter Strauß aus sämtlichen Kategorien Produktivität, Navigation, Spiele, etc…&lt;/p&gt;
&lt;p&gt;Passend zum Ende des Jahres, der Zeit der nutzlosen Statistiken, bin ich auf ein kleines Programm namens &lt;a href="http://wetfish.de/software/app-store-expense-monitor/"&gt;App Store Expense Monitor&lt;/a&gt; von Clemens Schulz aufmerksam gemacht worden [via &lt;a href="http://gigaom.com/apple/how-much-did-you-spend-on-apps-this-year/"&gt;theAppleBlog &lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot App Store Expense Monitor" src="https://blog.almeroth.com/images/tumblr_le8pj4tadi1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Ich habe also ca. 200€ in Apps investiert, wobei die eigentlich Kaufpreise abweichen können, denn der Navigon MobileNavigator Europe hat mich damals noch 74,99€ gekostet. Das macht in Summe rund 2€ pro App. Nicht schlecht bei über 300.000 erhältlichen Apps im Apple App Store.&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category></entry><entry><title>Things - I want to believe</title><link href="https://blog.almeroth.com/things-i-want-to-believe.html" rel="alternate"></link><published>2010-12-22T08:16:00+01:00</published><updated>2010-12-22T08:16:00+01:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-12-22:/things-i-want-to-believe.html</id><summary type="html">&lt;p&gt;Jürgen Schweizer von &lt;a href="http://culturedcode.com"&gt;Cultured Code&lt;/a&gt; schreibt in seinem &lt;a href="http://culturedcode.com/things/blog/2010/12/state-of-sync-part-1.html"&gt;Blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The final release of cloud sync as part of Things is still off by a few months. But we plan to publish more details about what we are doing (and have been doing) every few weeks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Als bekennender Things-Fan ist diese …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jürgen Schweizer von &lt;a href="http://culturedcode.com"&gt;Cultured Code&lt;/a&gt; schreibt in seinem &lt;a href="http://culturedcode.com/things/blog/2010/12/state-of-sync-part-1.html"&gt;Blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The final release of cloud sync as part of Things is still off by a few months. But we plan to publish more details about what we are doing (and have been doing) every few weeks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Als bekennender Things-Fan ist diese Nachricht für mich so etwas wie ein verfrühtes Weihnachtsgeschenk. Ich nutze täglich alle drei Versionen von Things auf meinem Mac, iPad und iPhone exzessiv. Es gibt dabei für mich fast nichts schlimmeres als "out of sync" zu sein.&lt;/p&gt;
&lt;p&gt;Die derzeitige Over-the-Air (OTA) Synchronisierung funktioniert gut - nur leider müssen sich alle drei Geräte dafür im selben Netzwerk befinden und sich gegen einander abgleichen. Cloud-Sync ist dazu natürlich einmassiver Fortschritt!&lt;/p&gt;
&lt;p&gt;Ich bin gespannt, was uns die nächsten Wochen an Neuerungen in Things bescheren und warte deshalb quasi täglich auf eine Einladung zur Vorab-Beta zu erhalten. Vielen Dank auch an das Cultured Code Team für Ihre Transparenz und ihre Liebe zum Detail (oder wann habt das letzte Mal ein Wallpaper zu einem Programm-Feature gesehen?). Weiter so.&lt;/p&gt;</content><category term="blog"></category><category term="Things"></category></entry><entry><title>Gastbeitrag: MacBook Air 13”</title><link href="https://blog.almeroth.com/gastbeitrag-macbook-air-13.html" rel="alternate"></link><published>2010-12-12T08:03:06+01:00</published><updated>2010-12-12T08:03:06+01:00</updated><author><name>Alexander P.</name></author><id>tag:blog.almeroth.com,2010-12-12:/gastbeitrag-macbook-air-13.html</id><summary type="html">&lt;p&gt;Es ist in aller Munde und in jedem Werbeblock des Fernsehens – die neue Generation des MacBook Air ist da. Wir werfen einen Blick auf die 13” Variante, ausgestattet mit einem Intel Core2Duo 1,86GHz (SL9400 – 6MB / 17Watt) und 4GB Ram (DDR3 – 1067MHz) sowie 128GB Flashspeicher.&lt;/p&gt;
&lt;p&gt;Über die Maße und Bilder …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Es ist in aller Munde und in jedem Werbeblock des Fernsehens – die neue Generation des MacBook Air ist da. Wir werfen einen Blick auf die 13” Variante, ausgestattet mit einem Intel Core2Duo 1,86GHz (SL9400 – 6MB / 17Watt) und 4GB Ram (DDR3 – 1067MHz) sowie 128GB Flashspeicher.&lt;/p&gt;
&lt;p&gt;Über die Maße und Bilder wollen wir nicht viele Worte verlieren, mehr über den subjektiven Eindruck. Es ist verdammt dünn, sehr gut verarbeitet und macht trotz des geringen Gewichtes und den geringen Abmaßen einen stabilen Eindruck.&lt;/p&gt;
&lt;p&gt;Die Gummifüße an der Unterseite sind für das Leichtgewicht aus einer zu harten Mischung geraten, es rutscht gerne auf glatten Oberflächen und auch mal vom Tisch.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MacBook Air offen" src="https://blog.almeroth.com/images/tumblr_lda088CWgQ1qbnc2r.jpg"&gt;
&lt;img alt="MacBook Air geschlossen" src="https://blog.almeroth.com/images/tumblr_lda099c1lM1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Display&lt;/h2&gt;
&lt;p&gt;Das 13” Display im Format 16:10 hat die angenehme Auflösung der 15” Modelle von 1440 x 900 Pixel, im Vergleich zu den anderen 13” Modellen ist die Darstellung deutlich kleiner. Sehr angenehm: das Display spiegelt nur mäßig und bei weitem nicht so stark wie die Glasscheiben der Pro-Modelle.&lt;/p&gt;
&lt;p&gt;Eine automatische Helligkeitssteuerung wird nicht angeboten.&lt;/p&gt;
&lt;h2&gt;Tastatur &amp;amp; Trackpad&lt;/h2&gt;
&lt;p&gt;Die Tastatur und das Trackpad haben die von den Pro-Modellen gewohnte Größe und Ergonomie, somit können durchaus auch längere Texte bequem geschrieben werden.
Leider wurde jedoch die Hintergrundbeleuchtung der Tastatur eingespart.&lt;/p&gt;
&lt;p&gt;Dafür wurde das Trackpad auf die neuste Glas-Generation gehoben und unterstützt natürlich alle Gesten und Funktionen (z.B.: wischen, drehen, zoomen).&lt;/p&gt;
&lt;p&gt;Ungewöhnlich ist die Position des On/Off-Schalters – er befindet sich nun als normale Taste auf der Tastatur, oben rechts neben der Eject-Taste.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MacBook Air Power-Taste" src="https://blog.almeroth.com/images/tumblr_lda0ciILMH1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;(Quelle: http://www.ifixit.com/Guide/Image/meta/ys4ljlmUQCd2GHHY)&lt;/p&gt;
&lt;h2&gt;Performance&lt;/h2&gt;
&lt;p&gt;Wir versuchen mal die Performance objektiv zu betrachten. Fakt ist die schwache CPU und damit verbunden Grafikleistung des Geräts. Für CPU-intensive Arbeiten (wie z.B. Foto-/Videobearbeitung) ist das neue Macbook Air nicht zu empfehlen.&lt;/p&gt;
&lt;p&gt;Der von Haus aus verbaute Flashspeicher anstelle eines Magnetdatenträgers hingegen ist vergleichbar mit aktuellen SSD’s und läßt jeden herkömmliche HDD weit hinter sich. Dem ist auch die “Leichtfüßigkeit” im normalen Office-Betrieb (z.B. Mail, Safari, Skype, Office-Pakete) zu verdanken, hier ist das neue Macbook Air flotter unterwegs als die großen Brüder mit HDD’s. Sobald dort auch eine SSD zum Einsatz kommt sieht das natürlich wieder anders aus.&lt;/p&gt;
&lt;p&gt;Wie beim iMac, MacMini und MacBook steht die Nutzung des 64Bit-Modus von OS-X für das MacBook Air nicht zur Verfügung. Hierbei ist eine “Anpassung” der boot64.efi notwendig, aber dazu ein anderes mal mehr.&lt;/p&gt;
&lt;h2&gt;XBench Results&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;Results&lt;/td&gt;
&lt;td&gt;122.65&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Info&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Xbench Version&lt;/td&gt;
&lt;td&gt;1.3&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;System Version&lt;/td&gt;
&lt;td&gt;10.6.5 (10H574)&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Physical RAM&lt;/td&gt;
&lt;td&gt;4096 MB&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;MacBookAir3,2&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Drive Type&lt;/td&gt;
&lt;td&gt;APPLE SSD TS128C&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Test&lt;/td&gt;
&lt;td&gt;113.16&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;GCD Loop&lt;/td&gt;
&lt;td&gt;186.20&lt;/td&gt;
&lt;td&gt;9.82 Mops/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Floating Point Basic&lt;/td&gt;
&lt;td&gt;91.20&lt;/td&gt;
&lt;td&gt;2.17 Gflop/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;vecLib FFT&lt;/td&gt;
&lt;td&gt;75.24&lt;/td&gt;
&lt;td&gt;2.48 Gflop/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Floating Point Library&lt;/td&gt;
&lt;td&gt;174.74&lt;/td&gt;
&lt;td&gt;30.43 Mops/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thread Test&lt;/td&gt;
&lt;td&gt;215.15&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Computation&lt;/td&gt;
&lt;td&gt;294.55&lt;/td&gt;
&lt;td&gt;5.97 Mops/sec, 4 threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Lock Contention&lt;/td&gt;
&lt;td&gt;169.46&lt;/td&gt;
&lt;td&gt;7.29 Mlocks/sec, 4 threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Test&lt;/td&gt;
&lt;td&gt;166.60&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System&lt;/td&gt;
&lt;td&gt;204.27&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Allocate&lt;/td&gt;
&lt;td&gt;272.26&lt;/td&gt;
&lt;td&gt;999.81 Kalloc/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Fill&lt;/td&gt;
&lt;td&gt;163.60&lt;/td&gt;
&lt;td&gt;7954.68 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Copy&lt;/td&gt;
&lt;td&gt;204.04&lt;/td&gt;
&lt;td&gt;4214.26 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream&lt;/td&gt;
&lt;td&gt;140.66&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Copy&lt;/td&gt;
&lt;td&gt;157.41&lt;/td&gt;
&lt;td&gt;3251.32 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;158.55&lt;/td&gt;
&lt;td&gt;3275.68 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;100.93&lt;/td&gt;
&lt;td&gt;2149.96 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Triad&lt;/td&gt;
&lt;td&gt;170.38&lt;/td&gt;
&lt;td&gt;3644.91 MB/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quartz Graphics Test&lt;/td&gt;
&lt;td&gt;121.12&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Line&lt;/td&gt;
&lt;td&gt;110.18&lt;/td&gt;
&lt;td&gt;7.34 Klines/sec [50% alpha]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Rectangle&lt;/td&gt;
&lt;td&gt;138.05&lt;/td&gt;
&lt;td&gt;41.22 Krects/sec [50% alpha]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Circle&lt;/td&gt;
&lt;td&gt;110.48&lt;/td&gt;
&lt;td&gt;9.01 Kcircles/sec [50% alpha]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&gt;Bezier&lt;/td&gt;
&lt;td&gt;123.92&lt;/td&gt;
&lt;td&gt;3.13 Kbeziers/sec [50% alpha]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;
&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;td&gt;127.56&lt;/td&gt;
&lt;td&gt;7.98 Kchars/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
OpenGL Graphics Test&lt;/td&gt;
&lt;td&gt;98.30&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Spinning Squares&lt;/td&gt;
&lt;td&gt;98.30&lt;/td&gt;
&lt;td&gt;124.71 frames/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Interface Test&lt;/td&gt;
&lt;td&gt;68.38&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Elements&lt;/td&gt;
&lt;td&gt;68.38&lt;/td&gt;
&lt;td&gt;313.85 refresh/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk Test&lt;/td&gt;
&lt;td&gt;220.56&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sequential&lt;/td&gt;
&lt;td&gt;143.11&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Write&lt;/td&gt;
&lt;td&gt;175.28&lt;/td&gt;
&lt;td&gt;107.62 MB/sec [4K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Write&lt;/td&gt;
&lt;td&gt;268.63&lt;/td&gt;
&lt;td&gt;151.99 MB/sec [256K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Read&lt;/td&gt;
&lt;td&gt;63.91&lt;/td&gt;
&lt;td&gt;18.70 MB/sec [4K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Read&lt;/td&gt;
&lt;td&gt;347.54&lt;/td&gt;
&lt;td&gt;174.67 MB/sec [256K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Write&lt;/td&gt;
&lt;td&gt;273.31&lt;/td&gt;
&lt;td&gt;28.93 MB/sec [4K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Write&lt;/td&gt;
&lt;td&gt;489.68&lt;/td&gt;
&lt;td&gt;156.77 MB/sec [256K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Read&lt;/td&gt;
&lt;td&gt;1503.29&lt;/td&gt;
&lt;td&gt;10.65 MB/sec [4K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Uncached Read&lt;/td&gt;
&lt;td&gt;511.79&lt;/td&gt;
&lt;td&gt;94.97 MB/sec [256K blocks]&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;Akkulaufzeit&lt;/h2&gt;
&lt;p&gt;Durch den Einsatz der stromsparenden Variante des Intel Core2Duo und dem Flashspeicher sind die von Apple angegebenen 7h Akkulaufzeit völlig realistisch, im Office-Betrieb steht es den mobilen 13” Brüdern nicht nach und kann auch durchaus mehr als 7h Laufzeit mit einer Ladung erreichen. Durch den Einsatz von Tools zur CPU-Steuerung kann die Akkuleistung noch optimiert werden (z.B. Coolbook).&lt;/p&gt;
&lt;h2&gt;Hitzeentwicklung und Lüfter&lt;/h2&gt;
&lt;p&gt;Das Macbook Air bleibt insgesamt angenehm kühl, um das zu ändern und den Einsatz des Lüfters zu provozieren bedarf es schon längerer CPU-Intensiver Anwendungen oder Prozesse.&lt;/p&gt;
&lt;p&gt;Hier wird dann auch ein großer Schwachpunkt des Macbook Air deutlich, der Lüfter ist sehr laut und passt nicht in den Gesamteindruck des Geräts. Wie bei allen Intel-Modellen läuft der Lüfter permanent bei 2000 U/min, ist in diesem Betriebszustand allerdings nicht wahrzunehmen.&lt;/p&gt;
&lt;h2&gt;Skalierbarkeit&lt;/h2&gt;
&lt;p&gt;Skalierbarkeit? Naja, der Vollständigkeit halber:
Der Flashspeicher kann ausgetauscht werden, aktuell stehen 64/128/256GB zur Verfügung, auch von Drittanbieter.&lt;/p&gt;
&lt;p&gt;Die CPU und der Arbeitsspeicher sind fest auf dem Logic-Board verlötet. Schon allein deshalb sollte die Wahl eigentlich immer auf die 4GB-Variante fallen.&lt;/p&gt;
&lt;h2&gt;Über den Autor&lt;/h2&gt;
&lt;p&gt;Alexander P. arbeitet seit 2003 für die Info AG. In seiner Freizeit ist er Mac Fan, &lt;a href="http://www.saab-cars.de/"&gt;Saab-Fahrer&lt;/a&gt; und ein guter Freund von mir!&lt;/p&gt;</content><category term="blog"></category><category term="Gastbeitrag"></category><category term="Macintosh"></category></entry><entry><title>Gastbeitrag: Flash Player 10.2 Beta</title><link href="https://blog.almeroth.com/gastbeitrag-flash-player-102-beta.html" rel="alternate"></link><published>2010-12-11T19:15:39+01:00</published><updated>2010-12-11T19:15:39+01:00</updated><author><name>Alexander P.</name></author><id>tag:blog.almeroth.com,2010-12-11:/gastbeitrag-flash-player-102-beta.html</id><summary type="html">&lt;h2&gt;Was ist neu?&lt;/h2&gt;
&lt;p&gt;Ich denke, gerade für die mobilen MacUser unter uns ist die nun endlich implentierte Hardware-Beschleunigung des Adobe Flash Player 10.2 Beta der größte Mehrwert. Diese soll sich positiv auf die Akkulaufzeit auswirken.&lt;/p&gt;
&lt;h2&gt;Alle Details hier&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://labs.adobe.com/technologies/flashplayer10/"&gt;http://labs.adobe.com/technologies/flashplayer10/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Sourcen&lt;/h2&gt;
&lt;p&gt;Es ist notwendig vor …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Was ist neu?&lt;/h2&gt;
&lt;p&gt;Ich denke, gerade für die mobilen MacUser unter uns ist die nun endlich implentierte Hardware-Beschleunigung des Adobe Flash Player 10.2 Beta der größte Mehrwert. Diese soll sich positiv auf die Akkulaufzeit auswirken.&lt;/p&gt;
&lt;h2&gt;Alle Details hier&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://labs.adobe.com/technologies/flashplayer10/"&gt;http://labs.adobe.com/technologies/flashplayer10/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Sourcen&lt;/h2&gt;
&lt;p&gt;Es ist notwendig vor der Installation des Adobe Flash Player 10.2 Beta den vorhandenen Flash-Player zu deinstallieren, danach kann installiert warden. Ein Neustart ist nicht notwendig.&lt;/p&gt;
&lt;h2&gt;Deinstallation&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p2_32bit_debug_mac_111710.dmg"&gt;http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p2_32bit_debug_mac_111710.dmg&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p2_32bit_mac_111710.dmg"&gt;http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p2_32bit_mac_111710.dmg&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Über den Autor&lt;/h2&gt;
&lt;p&gt;Alexander P. arbeitet seit 2003 für die Info AG. In seiner Freizeit ist er Mac Fan, &lt;a href="http://www.saab-cars.de/"&gt;Saab-Fahrer&lt;/a&gt; und ein guter Freund von mir!&lt;/p&gt;</content><category term="blog"></category><category term="Gastbeitrag"></category><category term="Macintosh"></category></entry><entry><title>iOS 4.2 auf dem iPad</title><link href="https://blog.almeroth.com/ios-42-auf-dem-ipad.html" rel="alternate"></link><published>2010-10-28T16:24:17+02:00</published><updated>2010-10-28T16:24:17+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-10-28:/ios-42-auf-dem-ipad.html</id><content type="html">&lt;p&gt;Sieht gut aus, fühlt sich schon gut an und spart auch noch Platz!
&lt;img alt="Eine Seite Apps reicht nun" src="https://blog.almeroth.com/images/tumblr_lb07sm7AEA1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Das Einzige, was mir fehlt ist der Rotation-Lock, der in der vorliegenden Beta zum Stummschalter wird. Schade auch! Vielleicht gibt's ja bald noch eine softwareseitige Einstellungsmöglichkeit.&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category><category term="iPad"></category></entry><entry><title>Unboxing my iPad</title><link href="https://blog.almeroth.com/unboxing-my-ipad.html" rel="alternate"></link><published>2010-10-18T19:00:50+02:00</published><updated>2010-10-18T19:00:50+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-10-18:/unboxing-my-ipad.html</id><summary type="html">&lt;p&gt;Von nun an fährt man auch gerne mal einen Bus später und bleibt,
&lt;em&gt;nur so&lt;/em&gt;, noch'ne Runde an der Haltestelle stehen... ;-)&lt;/p&gt;
&lt;p&gt;&lt;img alt="iPad 1" src="https://blog.almeroth.com/images/tumblr_lahvjl0vj21qbnc2r.jpg"&gt;
&lt;img alt="iPad 2" src="https://blog.almeroth.com/images/tumblr_lahvjss48m1qbnc2r.jpg"&gt;
&lt;img alt="iPad 3" src="https://blog.almeroth.com/images/tumblr_lahvk6G5rO1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Für so ein tolles Spielzeug braucht man natürlich ein paar Standard-Apps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iWork (&lt;a href="http://itunes.apple.com/de/app/keynote/id361285480?mt=8"&gt;Keynote&lt;/a&gt;, &lt;a href="http://itunes.apple.com/de/app/numbers/id361304891?mt=8"&gt;Numbers&lt;/a&gt;, &lt;a href="http://itunes.apple.com/de/app/pages/id361309726?mt=8"&gt;Pages&lt;/a&gt;) 3x 7,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/things-for-ipad/id364365411?mt=8"&gt;Things for iPad&lt;/a&gt; 15,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/analytics-pro-for-ipad/id383599075?mt=8"&gt;Analytics Pro for iPad&lt;/a&gt; 5,49 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Von nun an fährt man auch gerne mal einen Bus später und bleibt,
&lt;em&gt;nur so&lt;/em&gt;, noch'ne Runde an der Haltestelle stehen... ;-)&lt;/p&gt;
&lt;p&gt;&lt;img alt="iPad 1" src="https://blog.almeroth.com/images/tumblr_lahvjl0vj21qbnc2r.jpg"&gt;
&lt;img alt="iPad 2" src="https://blog.almeroth.com/images/tumblr_lahvjss48m1qbnc2r.jpg"&gt;
&lt;img alt="iPad 3" src="https://blog.almeroth.com/images/tumblr_lahvk6G5rO1qbnc2r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Für so ein tolles Spielzeug braucht man natürlich ein paar Standard-Apps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iWork (&lt;a href="http://itunes.apple.com/de/app/keynote/id361285480?mt=8"&gt;Keynote&lt;/a&gt;, &lt;a href="http://itunes.apple.com/de/app/numbers/id361304891?mt=8"&gt;Numbers&lt;/a&gt;, &lt;a href="http://itunes.apple.com/de/app/pages/id361309726?mt=8"&gt;Pages&lt;/a&gt;) 3x 7,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/things-for-ipad/id364365411?mt=8"&gt;Things for iPad&lt;/a&gt; 15,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/analytics-pro-for-ipad/id383599075?mt=8"&gt;Analytics Pro for iPad&lt;/a&gt; 5,49 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/newsrack/id288815275?mt=8"&gt;NewsRack&lt;/a&gt; 3,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/osmos-for-ipad/id379323382?mt=8"&gt;Osmos for iPad&lt;/a&gt; 3,99 €&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itunes.apple.com/de/app/rowmote-remote-control-for/id300265786?mt=8"&gt;Rowmote&lt;/a&gt; 0,79 €&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... und &lt;em&gt;schwupps&lt;/em&gt; ist ein Fuffi weg. Aber bestimmt gibt's auch dafür 'ne App!&lt;/p&gt;</content><category term="blog"></category><category term="Apple"></category><category term="iPad"></category></entry><entry><title>Call a Bike &amp; StadtRAD Hamburg</title><link href="https://blog.almeroth.com/call-a-bike-stadtrad-hamburg.html" rel="alternate"></link><published>2010-10-13T21:18:00+02:00</published><updated>2010-10-13T21:18:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-10-13:/call-a-bike-stadtrad-hamburg.html</id><content type="html">&lt;p&gt;Die aktualisierte Version des iPhone-Apps „&lt;a href="http://itunes.apple.com/de/app/call-a-bike/id327246982?mt=8"&gt;Call a Bike&lt;/a&gt;“ unterstützt nun auch
die Stationen der roten Hamburger StadtRäder:&lt;/p&gt;
&lt;p&gt;&lt;img alt="StadtRAD Hamburg" src="https://blog.almeroth.com/images/tumblr_la8tieH1qd1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Es wird wohl Zeit den goldenen Herbst noch mal zu „erfahren“...&lt;/p&gt;</content><category term="blog"></category><category term="iPhone"></category></entry><entry><title>Apple iPhone bei Vodafone und O2</title><link href="https://blog.almeroth.com/apple-iphone-bei-vodafone-und-o2.html" rel="alternate"></link><published>2010-10-13T20:58:52+02:00</published><updated>2010-10-13T20:58:52+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-10-13:/apple-iphone-bei-vodafone-und-o2.html</id><summary type="html">&lt;p&gt;Ich habe wirklich lange darauf gewartet und nun ist es endlich soweit!&lt;/p&gt;
&lt;p&gt;Die Telekom (ehem. T-Mobile) verliert ihre Exklusiv-Bindung mit Apple
nach nun fast 3 Jahren. Beruflich habe ich seit Anfang 2010 schon Erfahrungen
mit Vodafone in Kombination mit dem Apple iPhone (3 GS) sammeln dürfen.&lt;/p&gt;
&lt;p&gt;Ich begrüße den Schritt …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ich habe wirklich lange darauf gewartet und nun ist es endlich soweit!&lt;/p&gt;
&lt;p&gt;Die Telekom (ehem. T-Mobile) verliert ihre Exklusiv-Bindung mit Apple
nach nun fast 3 Jahren. Beruflich habe ich seit Anfang 2010 schon Erfahrungen
mit Vodafone in Kombination mit dem Apple iPhone (3 GS) sammeln dürfen.&lt;/p&gt;
&lt;p&gt;Ich begrüße den Schritt von Apple, denn Konkurrenz belebt den Markt und
am Ende genießt der Kunde dadurch (meist) nur Vorteile. So kann man nun
von Visual Voicemail und echten Provider-Profilen (IPCC) bei Vodafone träumen.&lt;/p&gt;</content><category term="blog"></category><category term="Vodafone"></category><category term="iPhone"></category></entry><entry><title>jQuery Mobile Project</title><link href="https://blog.almeroth.com/jquery-mobile-project.html" rel="alternate"></link><published>2010-08-14T12:51:00+02:00</published><updated>2010-08-14T12:51:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-08-14:/jquery-mobile-project.html</id><summary type="html">&lt;p&gt;&lt;a href="http://jquerymobile.com/2010/08/announcing-the-jquery-mobile-project/"&gt;Announcing the jQuery Mobile Project&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The jQuery project is really excited to announce the work that we’ve been doing to bring jQuery to mobile devices. Not only is the core jQuery library being improved to work across all of the major mobile platforms, but we’re also working to …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://jquerymobile.com/2010/08/announcing-the-jquery-mobile-project/"&gt;Announcing the jQuery Mobile Project&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The jQuery project is really excited to announce the work that we’ve been doing to bring jQuery to mobile devices. Not only is the core jQuery library being improved to work across all of the major mobile platforms, but we’re also working to release a complete, unified, mobile UI framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;gepostet vom iPhone&lt;/em&gt;
[via &lt;a href="http://daringfireball.net/"&gt;John Gruber&lt;/a&gt;]&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>US und UK Adresse zum Online-Shopping</title><link href="https://blog.almeroth.com/us-und-uk-adresse-zum-online-shopping.html" rel="alternate"></link><published>2010-06-28T22:19:00+02:00</published><updated>2010-06-28T22:19:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-06-28:/us-und-uk-adresse-zum-online-shopping.html</id><summary type="html">&lt;p&gt;Die Entdeckung des Tages ist für mich heute &lt;a href="https://www.borderlinx.com"&gt;Borderlinx&lt;/a&gt;, die es in Kooperation mit &lt;a href="http://www.dhl.de/de/paket/privatkunden/packstation/borderlinx.html"&gt;DHL&lt;/a&gt; ermöglichen über Grenzen hinaus zu shoppen.&lt;/p&gt;
&lt;p&gt;Nach einer kostenlosen Registrierung bekommt man eine eindeutige (Postkasten–) Adresse zugewiesen, die einen Tracking-Code und die Adresse der Paket-Station im jeweiligen Land (US/UK) enthält.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href="http://www.apfelquak.de/2010/06/15/iphone-4-simlock-frei-aus-uk-frankreich/"&gt;apfelquak.de&lt;/a&gt; wird …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die Entdeckung des Tages ist für mich heute &lt;a href="https://www.borderlinx.com"&gt;Borderlinx&lt;/a&gt;, die es in Kooperation mit &lt;a href="http://www.dhl.de/de/paket/privatkunden/packstation/borderlinx.html"&gt;DHL&lt;/a&gt; ermöglichen über Grenzen hinaus zu shoppen.&lt;/p&gt;
&lt;p&gt;Nach einer kostenlosen Registrierung bekommt man eine eindeutige (Postkasten–) Adresse zugewiesen, die einen Tracking-Code und die Adresse der Paket-Station im jeweiligen Land (US/UK) enthält.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href="http://www.apfelquak.de/2010/06/15/iphone-4-simlock-frei-aus-uk-frankreich/"&gt;apfelquak.de&lt;/a&gt; wird diese Adresse sogar vom Apple Store UK akzeptiert und ermöglicht es ein iPhone 4 in der maximalen Ausstattung für ca. 760,00 EUR zu importieren ohne selbst in den Flieger zu steigen.&lt;/p&gt;
&lt;p&gt;Da sage ich doch Ade zum &lt;a href="http://www.3gstore.de/iphone-4/"&gt;3gStore.de&lt;/a&gt;, wo sich aktuell für kostengünstige 1.199,00 EUR ein iPhone 4 32GB in schwarz vorbestellen lässt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://www.fscklog.com/2010/07/selbstversuch-iphone-4-vertragsfrei-und-entsperrt-bei-apple-in-gro%C3%9Fbritannien-bestellen.html"&gt;fscklog.com&lt;/a&gt; hat es ausprobiert und ist ebenfalls begeistert.&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>Konfigurationsdateien (.ini) mit PHP- und Bash-Skripten auslesen</title><link href="https://blog.almeroth.com/konfigurationsdateien-ini-mit-php-und-bash-skripten-auslesen.html" rel="alternate"></link><published>2010-06-14T21:00:03+02:00</published><updated>2010-06-14T21:00:03+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-06-14:/konfigurationsdateien-ini-mit-php-und-bash-skripten-auslesen.html</id><summary type="html">&lt;p&gt;Während der Programmierung einer Web-Anwendung basierend auf PHP und MySQL,
kam ich letztens in die Verlegenheit eine Konfigurationsdatei auszulesen.
Das kann doch nicht so schwer sein – dachte ich...&lt;/p&gt;
&lt;h1&gt;Fest verdrahtet&lt;/h1&gt;
&lt;p&gt;Meine Aufgabe bestand darin die Daten für den Zugriff auf eine MySQL-Datenbank so abzulegen,
dass sie vor den Augen der …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Während der Programmierung einer Web-Anwendung basierend auf PHP und MySQL,
kam ich letztens in die Verlegenheit eine Konfigurationsdatei auszulesen.
Das kann doch nicht so schwer sein – dachte ich...&lt;/p&gt;
&lt;h1&gt;Fest verdrahtet&lt;/h1&gt;
&lt;p&gt;Meine Aufgabe bestand darin die Daten für den Zugriff auf eine MySQL-Datenbank so abzulegen,
dass sie vor den Augen der Benutzer des Systems möglichst gut und für immer verborgen bleiben.&lt;/p&gt;
&lt;p&gt;Die feste Verdrahtung der Verbindungsdaten in einer Include-Datei kam aus meiner Ansicht nicht in Frage.&lt;/p&gt;
&lt;p&gt;Gute Gründe zu dieser Annahme gibt es allemal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;die Möglichkeit zur Steuerung von verschiedenen Paramtern aus einer zentralen Datei&lt;/li&gt;
&lt;li&gt;der PHP-Interpreter des Apache-Webservers könnte eines Tages durch einen Fehler nicht ausgeführt werden,
was den Apachen dazu verleiten dürfte, die Include-Datei beim Aufruf im Klartext auszugeben&lt;/li&gt;
&lt;li&gt;die .inc-Dateien des Includes-Verzeichnis könnten durch einen Konfigurationsfehler in der httpd.conf plötzlich öffentlich als Text interpretiert werden&lt;/li&gt;
&lt;li&gt;falsche Datei-Berechtigungen könnte dazu führen, dass die Konfigurationsdatei für den Anwender zum Download bereitsteht&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mein Lösungsansatz war eine einfache Text-Datei mit Key-/Value-Paaren &lt;em&gt;ausserhalb&lt;/em&gt; des Webservers/Document-Root abzulegen.
Damit könnte man mit einem Schlag allen genannten Punkten gebührend Rechnung tragen.&lt;/p&gt;
&lt;h1&gt;Selbst ist der Mann&lt;/h1&gt;
&lt;p&gt;Ich machte mir als erstes Gedanken darüber, wie das Format der Steuerungsdatei aussehen könnte.
Müsste man Anführungszeichen für Variablennamen und deren Werte verwenden? Einfache oder doppelt?
Wie füge ich Kommentare ein, müssen die Zeilenenden mit einem Semikolon abgeschlossen werden?
Wie kann man die Konfiguration unterteilen und was schreibe ich in die Dokumentation hierzu?&lt;/p&gt;
&lt;p&gt;Man muss sich so einige Fragen beantworten, bevor man beginnt einen eigenen Parser zu schreiben.&lt;/p&gt;
&lt;p&gt;Eine Marktanalyse von Parsern in verschiedensten Programmiersprachen, hat mir letzten Endes gezeigt,
dass sich viele Entwickler bereits mit dieser Thematik beschäftigt haben. Und so wundert es mich nicht,
dass PHP mit einer tollen built-in Funktion daher kommt: &lt;a href="http://de.php.net/manual/de/function.parse-ini-file.php"&gt;parse_ini_file()&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein kurzer Blick auf die Funktionsweise von parse_ini_file():&lt;/p&gt;
&lt;p&gt;Datei: sample.ini&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ein&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Beispiel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;für&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Konfigurationsdatei&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Kommentare&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;beginnen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;der&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ini&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;benutzer&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;passwort&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;datenbank&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;upload_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./uploads&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Datei: skript.php&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class="nv"&gt;$ini_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parse_ini_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sample.ini&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ini_array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ausgabe: skript.php&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;Array&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Array&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;benutzer&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;passwort&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datenbank&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Array&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;upload_path&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Die Dateifunktion kennt zwei Parameter um 1. den Pfad anzugeben und 2. die Option zu setzen,
dass die Unterteilung in Sektionen berücksichtigt werden soll.&lt;/p&gt;
&lt;h1&gt;Backup&lt;/h1&gt;
&lt;p&gt;Da die Implementierung in PHP so reibungslos geklappt hat, wollte ich nun auch das existierende Bash-Skript,
welches verantwortlich für die Sicherung der MySQL-Datenbank ist, umbauen. Leider fehlt mir das Verständis,
wie die Kommandozeilen-Version von PHP ihren generierten Output an die Shell zurück gibt.&lt;/p&gt;
&lt;p&gt;Ich suchte also nach einer Shell-Alternative zu parse_ini_file() und wurde über diesen Blog-&lt;a href="http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed"&gt;Post&lt;/a&gt; darauf
aufmerksam gemacht, dass es bei den &lt;a href="http://www.debian-administration.org/articles/55#comment_24"&gt;Debian Administratoren&lt;/a&gt; schon eine Lösung hierfür gibt.&lt;/p&gt;
&lt;p&gt;Das ganze in einer Funktion verpackt und mit ein paar Quotes versehen, sieht dann so aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;my_parse_ini_file&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;INI_FILE=&amp;quot;$1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;INI_SECTION=&amp;quot;$2&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`sed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;s/&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]*\=&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]*/=/g&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;s/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt;.*$//&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;s/&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]*$//&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;s/^&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]*//&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;s/^\(.*\)=\(&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="p"&gt;^&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;]*\)$/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;\2\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$INI_FILE&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;-n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;-e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="nx"&gt;my_parse_ini_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sample.ini&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Blickschutz 2.0&lt;/h1&gt;
&lt;p&gt;Um auch auf Datei-Ebene auf Nummer sicher zu gehen und einen Blickschutz zu bieten, könnte ich mir vorstellen in Version 2.0
der Skripte die Verwendung der Base64-Funktionen einzubauen, was sowohl in PHP als auch Bash schnell gemacht ist.&lt;/p&gt;
&lt;p&gt;Mission accomplished.&lt;/p&gt;</content><category term="blog"></category><category term="PHP"></category><category term="Bash"></category></entry><entry><title>Ups, Google hat Daten gesammelt</title><link href="https://blog.almeroth.com/ups-google-hat-daten-gesammelt.html" rel="alternate"></link><published>2010-05-15T18:29:00+02:00</published><updated>2010-05-15T18:29:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-05-15:/ups-google-hat-daten-gesammelt.html</id><summary type="html">&lt;p&gt;In der &lt;a href="http://googleblog.blogspot.com/2010/05/wifi-data-collection-update.html"&gt;Selbstanzeige&lt;/a&gt; publiziert durch Googler Alan Eustace (Senior VP, Engineering &amp;amp; Research) wird gebeichtet, dass Google Street View Wagen doch auch Netzwerk-Daten von öffentlich-zugänglichen WLANs mitgeschnitten haben. Dies wurde in einer internen Untersuchung bzw. Aufbereitung der angefallenen Daten, nach einer &lt;a href="http://www.hamburg.de/datenschutz/aktuelles/nofl/2217396/pressemeldung-2010-04-22.html"&gt;Anfrage durch Hamburger Datenschützer&lt;/a&gt;, bekannt.&lt;/p&gt;
&lt;p&gt;Als Reaktion fordern Datenschützer nun …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In der &lt;a href="http://googleblog.blogspot.com/2010/05/wifi-data-collection-update.html"&gt;Selbstanzeige&lt;/a&gt; publiziert durch Googler Alan Eustace (Senior VP, Engineering &amp;amp; Research) wird gebeichtet, dass Google Street View Wagen doch auch Netzwerk-Daten von öffentlich-zugänglichen WLANs mitgeschnitten haben. Dies wurde in einer internen Untersuchung bzw. Aufbereitung der angefallenen Daten, nach einer &lt;a href="http://www.hamburg.de/datenschutz/aktuelles/nofl/2217396/pressemeldung-2010-04-22.html"&gt;Anfrage durch Hamburger Datenschützer&lt;/a&gt;, bekannt.&lt;/p&gt;
&lt;p&gt;Als Reaktion fordern Datenschützer nun, dass Google diese WLAN-Scans sofort einstellt bzw. die verwendete Hardware aus ihren Fahrzeugen ausbauen. Google rechtfertigt sich damit, dass hier ein Stück Software verwendet wurde, das mehr konnte als es eigentlich sollte. &lt;em&gt;Ups...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tja, manchmal ist es schon komisch, was einem so alles einfällt, wenn mal jemand genauer nachfragt. Ansonsten gilt bei Google wohl eher der Leitsatz: „Wo kein Kläger, da kein Richter“. Google entschuldigt sich natürlich in aller Form, gelobt sofortige Besserung und Zusammenarbeit mit einer externen Firma zur Sicherung der eigenen Qualität.&lt;/p&gt;</content><category term="blog"></category><category term="Google"></category></entry><entry><title>Das Internet ist tot</title><link href="https://blog.almeroth.com/das-internet-ist-tot.html" rel="alternate"></link><published>2010-05-12T14:56:00+02:00</published><updated>2010-05-12T14:56:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-05-12:/das-internet-ist-tot.html</id><summary type="html">&lt;p&gt;Derzeit liefern die 6 DNS-Server der Denic bei Anfragen nach deutschen Domains nur noch, dass die Domain nicht existiert. Das Problem betrifft weitestgehend alle deutschen Internet-Provider, die diese Server nach Antworten befragen. Abhilfe können die DNS-Server von Google (8.8.8.8/8.8.4.4) oder die Server von …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Derzeit liefern die 6 DNS-Server der Denic bei Anfragen nach deutschen Domains nur noch, dass die Domain nicht existiert. Das Problem betrifft weitestgehend alle deutschen Internet-Provider, die diese Server nach Antworten befragen. Abhilfe können die DNS-Server von Google (8.8.8.8/8.8.4.4) oder die Server von OpenDNS (208.67.222.222/208.67.220.220) schaffen.&lt;/p&gt;
&lt;p&gt;Auf Twitter wird dieses Thema derzeit ordentlich diskutiert, was zu temporären Ausfällen derer Server führt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 1:&lt;/strong&gt;
Ein ehemaliger Mitschüler hatte wohl solch Szenario schon im Jahre 2003 geahnt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS ist nur für Leute, die sich keine Zahlen merken können.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt;
&lt;a href="http://twitter.com/JonathansTV/statuses/13849641629"&gt;JonathansTV&lt;/a&gt; trifft den Nagel auf den Kopf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 3 (16:00 Uhr):&lt;/strong&gt;
Das Internet ist nun doch wieder auf den Beinen. &lt;em&gt;puh&lt;/em&gt;&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>NAVIGON select (Telekom Edition)</title><link href="https://blog.almeroth.com/navigon-select-telekom-edition.html" rel="alternate"></link><published>2010-05-02T20:54:16+02:00</published><updated>2010-05-02T20:54:16+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-05-02:/navigon-select-telekom-edition.html</id><summary type="html">&lt;p&gt;Als stolzer Käufer des &lt;a href="http://itunes.apple.com/de/app/navigon-mobilenavigator-europe/id320279293?mt=8"&gt;NAVIGON MobileNavigator (Europe)&lt;/a&gt;, interessierte mich unlängst, was die kostenlose &lt;a href="http://itunes.apple.com/de/app/navigon-select-telekom-edition/id353748243?mt=8"&gt;Navigations-App (sponsored by Telekom)&lt;/a&gt; so alles kann. Hier ein Auszug der Grundfunktionen aus dem iTunes-Store:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Lokale Suche &lt;/li&gt;
&lt;li&gt;Suche nach Sonderzielen&lt;/li&gt;
&lt;li&gt;Präzise Sprachansagen&lt;/li&gt;
&lt;li&gt;Automatische Umstellung zwischen Tag &amp;amp; Nachtmodus&lt;/li&gt;
&lt;li&gt;Automatische Umschaltung zwischen Hoch- &amp;amp; Querformat bei Drehen des iPhones …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Als stolzer Käufer des &lt;a href="http://itunes.apple.com/de/app/navigon-mobilenavigator-europe/id320279293?mt=8"&gt;NAVIGON MobileNavigator (Europe)&lt;/a&gt;, interessierte mich unlängst, was die kostenlose &lt;a href="http://itunes.apple.com/de/app/navigon-select-telekom-edition/id353748243?mt=8"&gt;Navigations-App (sponsored by Telekom)&lt;/a&gt; so alles kann. Hier ein Auszug der Grundfunktionen aus dem iTunes-Store:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Lokale Suche &lt;/li&gt;
&lt;li&gt;Suche nach Sonderzielen&lt;/li&gt;
&lt;li&gt;Präzise Sprachansagen&lt;/li&gt;
&lt;li&gt;Automatische Umstellung zwischen Tag &amp;amp; Nachtmodus&lt;/li&gt;
&lt;li&gt;Automatische Umschaltung zwischen Hoch- &amp;amp; Querformat bei Drehen des iPhones &lt;/li&gt;
&lt;li&gt;Reality View Pro (Grafische Darstellung von Autobahnausfahrten und Autobahnkreuzungen)&lt;/li&gt;
&lt;li&gt;Erweiterte Fußgängernavigation (bei iPhone 3GS wird der interne Kompass unterstützt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Klingt gut – und der Preis ist unschlagbar. Einziges Manko für meine Kollegen mit Vodafone-Verträgen:&lt;/p&gt;
&lt;p&gt;&lt;img alt="NAVIGON select (Telekom Edition) ScreenShot" src="https://blog.almeroth.com/images/tumblr_l1t2gbS85Y1qbnc2r.png"&gt;&lt;/p&gt;
&lt;p&gt;Das Leben ist eben doch kein Ponnyhof.&lt;/p&gt;</content><category term="blog"></category><category term="Vodafone"></category><category term="iPhone"></category><category term="Apple"></category></entry><entry><title>Ein Ausweg in die Anonymität</title><link href="https://blog.almeroth.com/ein-ausweg-in-die-anonymitat.html" rel="alternate"></link><published>2010-04-25T20:11:00+02:00</published><updated>2010-04-25T20:11:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-04-25:/ein-ausweg-in-die-anonymitat.html</id><summary type="html">&lt;p&gt;In Zeiten der (gefühlten) Total-Überwachung ist die Privatsphäre im Internet ein wichtiges Thema geworden.
Es gibt kaum noch einen Dienst, der nicht nach der Angabe einer gültigen E-Mail Adresse und einem Passwort verlangt.
Die bis vor kurzem noch aktive Vorratsdatenspeicherungs-Pflicht seitens der Internet-Service-Provider sorgte zusätzlich
permanent für ein unwohles Gefühl …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In Zeiten der (gefühlten) Total-Überwachung ist die Privatsphäre im Internet ein wichtiges Thema geworden.
Es gibt kaum noch einen Dienst, der nicht nach der Angabe einer gültigen E-Mail Adresse und einem Passwort verlangt.
Die bis vor kurzem noch aktive Vorratsdatenspeicherungs-Pflicht seitens der Internet-Service-Provider sorgte zusätzlich
permanent für ein unwohles Gefühl.&lt;/p&gt;
&lt;p&gt;Wo Daten erhoben werden, werden sie über kurz oder lang auch irgendwo verwendet – wer weiß schon wofür? Internet-Cafés und Wohngemeinschaften sind da ein probates Mittel, um der eindeutigen Identifizierung zu entgehen.&lt;/p&gt;
&lt;p&gt;Doch es geht noch viel einfacher und bequemer...&lt;/p&gt;
&lt;h2&gt;Beschaffungskriminalität&lt;/h2&gt;
&lt;p&gt;Die c't beschrieb in ihrem Artikel „Inkognito“, wie &lt;a href="http://www.heise.de/kiosk/archiv/ct/2010/5/82_kiosk"&gt;Lebensmittel-Discounter bei der Identitätsprüfung für SIM-Karten schlampen&lt;/a&gt;.
Da das mobile Internet sowieso stark auf dem Vormarsch ist, ist das doch die Gelegenheit um sich endlich mal einen UMTS-Stick anzuschaffen. &lt;/p&gt;
&lt;p&gt;Erst vor kurzem schwärmte mir ein Kollege vor, wie er sich seinen Prepaid-Stick inklusive SIM-Karte bei eBay orderte und
sich diesen dann in die Firma schicken ließ. Das Paket wurde wie gewohnt in der Poststelle angeliefert und die Annahme dort
durch eine Unterschrift quittiert. Da er bewusst auf einen Ansprechpartner für die Sendung verzichtet hat, wurde das Paket
geöffnet und nach inhaltlicher Prüfung der Fachabteilung zugestellt. Die eBay-Gebühren wurden per PayPal bezahlt und wer weiß
schon noch, welches Internet-Café zum Anlegen dieser Accounts damals besucht wurde. Mission accomplished.&lt;/p&gt;
&lt;p&gt;Meine Erfahrung war ähnlich: Im Vodafone-Online-Shop habe ich unlängst einen &lt;a href="http://shop.vodafone.de/Shop/privat/handys/mkey-1020-propid-prod233823/websessions-usb-stick-k3565.html"&gt;WebSessions-Stick&lt;/a&gt; bestellt.
Nach Angabe meiner persönlichen Daten (Name, Straße, Wohnort, E-Mail), hatte ich schon nach wenigen Tagen die Benachrichtigung
des Paket-Zustellers GLS im Briefkasten (mit der Bemerkung: keiner da!). Ich bat meine Freundin, die mich am nächsten Tag besuchte,
das Paket für mich anzunehmen und dem Postboten die 29,90€ zu geben. Kein Thema! Sie unterschrieb für die Entgegennahme des Pakets,
zahlte bar und musste keinen Personal-Ausweis oder ähnliches zum Nachweis meiner Identität vorlegen. Nicht auszudenken, was passiert,
wenn man bei der Bestellung seinen Namen nicht ganz korrekt geschrieben hat und einen intelligenten Postboten erwischt, der trotzdem richtig zustellt.
Oder noch besser, man die Möglichkeit nutzt das Paket bei einem Nachbarn/benachbartem Geschäft abgeben zu lassen. Einfach genial!&lt;/p&gt;
&lt;p&gt;Und für die Analogen unter uns, bleibt immer noch ein angeklebter Bart und der Besuch auf einem Flohmarkt der Wahl.&lt;/p&gt;
&lt;h2&gt;Bestandsschutz&lt;/h2&gt;
&lt;p&gt;Wie &lt;a href="http://www.lawblog.de/index.php/archives/2010/04/19/anonym-uber-umts/"&gt;lawblog.de&lt;/a&gt; berichtet, sind (einige) Mobilfunk-Provider nicht in der Lage
den Brückenschlag zwischen geloggter IP-Adresse, Nutzungszeitraum und Nutzungsort zu schlagen. Auf Anfrage wurde dies durch die Verwendung der NAPT-Technik begründet.
Hierbei ist jedoch Vorsicht geboten. Ich vermute, dass die Funkzellen sehr wohl mitloggen welche IP-Adresse (zugeordnet zur verwendeten SIM-Karte),
wann und worauf zugegriffen hat – und es sich bei diesem Fall nur um faktische Anonymität handelt.&lt;/p&gt;
&lt;p&gt;Mit einer SIM-Karte aus dem Internet und einem Platz an der Sonne (im gut-gefüllten Stadtpark) gibt es zum Glück aber kaum Grund zur Sorge.
Wenn man dann noch in unregelmäßigen Abständen eine andere Location wählt, ist der Coup perfekt. Hallo Internet!&lt;/p&gt;
&lt;h2&gt;Auf Nummer sicher gehen&lt;/h2&gt;
&lt;p&gt;Gegeben ist fortan eine anonyme Verbindung ins weltweite Datennetz. Was gibt es jetzt noch zu bedenken?&lt;/p&gt;
&lt;p&gt;Heutige Webanwendungen, wie Java-Applets, Flash-Filme, Java-Skripts, können eine ganze Menge über seine Benutzer in Erfahrung bringen.
Wann war der letzte Besuch der Webseite, wo war der Nutzer vorher und wie hat er auf diese Webseite gefunden. System-Software geht da
noch ein ganzes Stück weiter. Da werden bei Software-Updates gerne schon mal „anonymisierte“ Daten des Hard- und Software-Systems 
an den Entwickler übermittelt oder bei der Produkt-Aktivierung der Benutzername an den Aktivierungs-Server übergeben.&lt;/p&gt;
&lt;p&gt;Diese Daten werden natürlich ausschließlich zu Entwicklungszwecken genutzt!&lt;/p&gt;
&lt;p&gt;Um derartiger Sammelwut aus dem Weg zu gehen, empfiehlt es sich ein Betriebssystem in einer virtuellen Umgebung zu benutzen.
Hierbei kann man Benutzer mit dem Namen „Peter Pan“ anlegen, seine gewünschte Grundkonfiguration einmalig in einem Snap-Shot
einfrieren und ab sofort nach jeder Session zu diesem Punkt zurückkehren.&lt;/p&gt;
&lt;p&gt;Welche Vorteile bringt ein virtuelles Betriebssystem?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sicherheitsbedingte Einstellungen behindern nicht die normale Arbeitsweise am Computer&lt;/li&gt;
&lt;li&gt;Tracking-Cookies à la Google werden immer wieder auf Null zurück gesetzt&lt;/li&gt;
&lt;li&gt;Software hat keine Möglichkeit auf echte Daten, wie Benutzernamen zuzugreifen oder Nutzungsstatistiken zu erstellen&lt;/li&gt;
&lt;li&gt;Hardware wird in virtuellen Maschinen meist imuliert und gibt keine Rückschlüsse auf das tatsächlich verwendete Setup&lt;/li&gt;
&lt;li&gt;im Zweifel ist die virtuelle Umgebung binnen Sekunden vom Computer unwiederbringlich gelöscht&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Nützliche Dienste&lt;/h2&gt;
&lt;p&gt;Um auf Internet-Seiten ein anonymes Konto zu generieren, muss man sich nicht immer mit einem Bein ins Gefängnis stellen.
Es gibt zwei sehr gute Dienste die ich regelmäßig dafür in Anspruch nehme. Bei &lt;a href="http://www.mailinator.com"&gt;Mailinator&lt;/a&gt; bekommt man eine
Wegwerf-E-Mail Adresse ganz ohne Firlefanz. Keine lästige Registrierung, kein wenn und kaum aber. Der einzige Wermutstropfen mit dem man leben muss:
manche Registrierung-Services lassen eine E-Mail Adresse von Mailinator nicht zu. Tja, das Leben ist halt kein Ponnyhof!&lt;/p&gt;
&lt;p&gt;Die Mühe sich persönlich einen Account anzulegen, kann man sich jedoch in vielen Fällen erstmal sparen! &lt;a href="http://www.bugmenot.com"&gt;BugMeNot&lt;/a&gt; hat eine umfangreiche
Liste von Konten für alle möglichen Gelegenheiten. Von adobe.com bis quark.com ist für Jeden etwas dabei. Klasse daran ist, dass man den Login bewerten kann und
so eventuell gesperrte Konten im Ranking schnell nach unten wandern.&lt;/p&gt;
&lt;h2&gt;Warum UMTS-Sticks, es gibt doch auch noch anonyme Proxies?!&lt;/h2&gt;
&lt;p&gt;In der Theorie sind anonyme Proxies eine feine Sache. Man ändert eine Kleinigkeit an seinen Netzwerk-Einstellungen und schwups –
geht sämtlicher Traffic am Ende über die Leitung eines Dienstleisters (vorausgesetzt die verwendete Software unterstüzt Verbindungen über Proxy-Server).&lt;/p&gt;
&lt;p&gt;Wie anonym solche Dienste sind, weiß man jedoch nicht erst seit dem &lt;a href="http://en.wikipedia.org/wiki/Sarah_Palin_email_hack"&gt;Sarah Palin E-Mail-Hack&lt;/a&gt; während des US-amerikanischem Wahlkampfs im Jahre 2008.
Okay, man hätte mehrere Proxies hintereinander hängen können, wie es beim &lt;a href="http://www.torproject.org"&gt;Tor Onion Router&lt;/a&gt; der Fall ist,
jedoch wird man dann sofort ins Zeitalter der 56K-Modems zurück versetzt. Die Geschwindigkeit sinkt exponentiell!&lt;/p&gt;</content><category term="blog"></category><category term="UMTS"></category></entry><entry><title>Vodafone UMTS-Sticks am Mac</title><link href="https://blog.almeroth.com/vodafone-umts-sticks-am-mac.html" rel="alternate"></link><published>2010-04-17T11:33:49+02:00</published><updated>2010-04-17T11:33:49+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-04-17:/vodafone-umts-sticks-am-mac.html</id><summary type="html">&lt;p&gt;Es werden im Folgenden durchaus ein paar Äpfel mit Birnen verglichen.
Dem Technik-Fremden ist es vermutlich jedoch egal, ob der Chip in seinem
"USB-Stick" von ZTE oder Huawei kommt – die Hauptsache ist doch Youtube geht.
Um das Fazit schon mal vorwegzunehmen: Diese Aufgabe meistern beide Sticks bedenkenlos.&lt;/p&gt;
&lt;h2&gt;K3565-Z aus dem …&lt;/h2&gt;</summary><content type="html">&lt;p&gt;Es werden im Folgenden durchaus ein paar Äpfel mit Birnen verglichen.
Dem Technik-Fremden ist es vermutlich jedoch egal, ob der Chip in seinem
"USB-Stick" von ZTE oder Huawei kommt – die Hauptsache ist doch Youtube geht.
Um das Fazit schon mal vorwegzunehmen: Diese Aufgabe meistern beide Sticks bedenkenlos.&lt;/p&gt;
&lt;h2&gt;K3565-Z aus dem Vodafone WebSessions-Paket&lt;/h2&gt;
&lt;p&gt;Der K3565-Z von &lt;a href="http://www.zte-deutschland.de/"&gt;ZTE&lt;/a&gt; ist das Kassengestell von Vodafone – wenn es UMTS-Sticks geht.
Es ist für relativ kleines Geld (aktuell 29,90€), ausgestattet mit einer Prepaid-Karte, im &lt;a href="http://shop.vodafone.de/Shop/privat/handys/mkey-1020-propid-prod233823/websessions-usb-stick-k3565.html"&gt;Vodafone Shop&lt;/a&gt; erhältlich.&lt;/p&gt;
&lt;p&gt;Nach dem ersten Einstöpseln des vorliegenden Sticks, erscheint eine Treiber-CD mit dem „Vodafone MC Installer.app“.
Das geschulte Auge des Mac-Affinen möchte sich beim Betrachten des Installer-Icons direkt schon schließen, um weiteres,
nervöses Zucken zu vermeiden. Es handelt sich um einen Vise-X Installer, der noch aus OS 9-Zeiten stammt. (Ja, er lebt noch – stirbt &lt;em&gt;nicht&lt;/em&gt;!).&lt;/p&gt;
&lt;p&gt;Hat man die Vodafone Mobile Broadband Software (siehe Abschnitt „Software“) installiert, kann man auch schon fast los-surfen.&lt;/p&gt;
&lt;p&gt;Der Verbindungsaufbau mit dem Vodafone-Netz klappte im Test reibungslos und beim Aufruf einer Webseite wird man
direkt auf eine Vodafone Startseite umgelenkt. Hier kann man sich für ein gewünschtes Surf-Kontingent entscheiden.
Zur Auswahl stehen zeitlich begrenzte Optionen (15 Min., 2 Std., etc.), die ein Datenvolumen bis zu 1 GB pro Session erlauben.&lt;/p&gt;
&lt;p&gt;Nähere Informationen zum Thema WebSessions erhält man im &lt;a href="http://www.vodafone.de/infofaxe/379.pdf"&gt;InfoDok 379: Vodafone WebSessions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://shop.vodafone.de/Shop/business/handys/mkey-1075-propid-prod233823/websessions-usb-stick-k3565.html"&gt;Technische Details des Sticks&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
    &lt;td&gt;Downloadgeschwindigkeit&lt;/td&gt;
    &lt;td&gt;Bis zu &lt;strong&gt;3,6 Mbit/s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;Maximale Übertragungsgeschwindigkeit beim Empfang von Daten aus dem Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Uploadgeschwindigkeit&lt;/td&gt;
    &lt;td&gt;Bis zu 384 kbit/s&lt;/td&gt;
    &lt;td&gt;Maximale Übertragungsgeschwindigkeit beim Versand von Daten über das Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Abmessungen&lt;/td&gt;
    &lt;td&gt;70 x 22 x 12 mm&lt;/td&gt;
    &lt;td&gt;Größe der Hardware in Höhe x Breite x Tiefe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Gewicht&lt;/td&gt;
    &lt;td colspan="2"&gt;35 g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Speicher erweiterbar&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Erweiterung des internen Speichers durch eine Speicherkarte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Speicherkarte&lt;/td&gt;
    &lt;td colspan="2"&gt;microSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Kompatible Betriebssysteme&lt;/td&gt;
    &lt;td colspan="2"&gt;Windows 7, Windows Vista, Windows XP (ab SP2), Windows 2000 (ab SP4), MAC OS ab 10.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;UMTS Broadband&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Mit DSL-Geschwindigkeit im Internet surfen oder Daten herunterladen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;UMTS&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Mit bis zu 384 Kbit/s im Internet surfen oder Daten herunterladen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;GPRS&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Standard um mobile Daten zu übertragen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Triband&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Unterstüzt drei GSM-Frequenzen (900, 1800 und 1900 MHz)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;SIM-Lock&lt;/td&gt;
    &lt;td colspan="2"&gt;Ja&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;

&lt;p&gt;Als Anmerkung zur Hardware sei gesagt:
Die SIM-Karten Halterung des K3565-Z ist leider nur billiges Plaste und lässt beim ersten Hinsehen nicht erkennen,
wie herum die SIM nun richtig eingelegt wird. Da hat der K3765-H doch mehr Stil mit seinem herausnehmbaren Metalplättchen.&lt;/p&gt;
&lt;h2&gt;K3765-H im Verbund mit der Mobile Connect Flat&lt;/h2&gt;
&lt;p&gt;Der Huawei K3765-H ist für mich der Beste UMTS-Stick der mir bis jetzt untergekommen ist. Dies hat auch die c't in ihrem Artikel &lt;a href="http://www.heise.de/kiosk/archiv/ct/2010/1/122_kiosk"&gt;"UMTS zum Anstecken"&lt;/a&gt; (Heft 1/2010, Seite 122) bestätigt.
Das Design ist schlicht (weiß mit rotem VF-Logo), die Verarbeitung des Gerätes wirkt hochwertig, die Firmware ist (fast) auf dem aktuellen Stand.&lt;/p&gt;
&lt;p&gt;Der K3765-H ist nicht nur hübscher, sondern dem K3565-Z auch technisch weit voraus, wie die &lt;a href="http://shop.vodafone.de/Shop/privat/handys/mkey-1020-propid-prod394056/vodafone-usb-stick-k3765-hv.html"&gt;Technischen Details&lt;/a&gt; verraten:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
    &lt;td&gt;Downloadgeschwindigkeit&lt;/td&gt;
    &lt;td&gt;Bis zu &lt;strong&gt;7,2 Mbit/s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;Maximale Übertragungsgeschwindigkeit beim Empfang von Daten aus dem Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Uploadgeschwindigkeit&lt;/td&gt;
    &lt;td&gt;Bis zu &lt;strong&gt;5,6 Mbit/s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;Maximale Übertragungsgeschwindigkeit beim Versand von Daten über das Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Abmessungen&lt;/td&gt;
    &lt;td&gt;70 x 22 x 12 mm&lt;/td&gt;
    &lt;td&gt;Größe der Hardware in Höhe x Breite x Tiefe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Gewicht&lt;/td&gt;
    &lt;td colspan="2"&gt;35 g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Speicher erweiterbar&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Erweiterung des internen Speichers durch eine Speicherkarte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Speicherkarte&lt;/td&gt;
    &lt;td colspan="2"&gt;microSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Kompatible Betriebssysteme&lt;/td&gt;
    &lt;td colspan="2"&gt;Windows 7, Windows Vista, Windows XP (ab SP2), Windows 2000 (ab SP4), MAC OS ab 10.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;UMTS Broadband&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Mit DSL-Geschwindigkeit im Internet surfen oder Daten herunterladen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;UMTS&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Mit bis zu 384 Kbit/s im Internet surfen oder Daten herunterladen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;GPRS&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Standard um mobile Daten zu übertragen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Quadband&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Unterstüzt vier GSM-Frequenzen (850, 900, 1800 und 1900 MHz)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Triband&lt;/td&gt;
    &lt;td&gt;Ja&lt;/td&gt;
    &lt;td&gt;Unterstüzt drei GSM-Frequenzen (900, 1800 und 1900 MHz)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;SIM-Lock&lt;/td&gt;
    &lt;td colspan="2"&gt;Ja&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;

&lt;h2&gt;Software&lt;/h2&gt;
&lt;p&gt;Vodafone hat im Vergleich zu anderen (magentafarbenden) Mobilfunkanbietern die beste UMTS-Software für den Mac anzubieten.
Sie bedienen sich hierfür der Kompetenz der Firma nova media MDS GmbH, haben deren Software namens &lt;a href="http://www.novamedia.de/de/mac-launch2net.html"&gt;launch2net&lt;/a&gt; gebrandet und
liefern diese bereits mit einigen Sticks, wie dem K3765-H, aus. Man kann sie jedoch auch für andere Modelle verwenden und direkt von der globalen Vodafone &lt;a href="http://www.business.vodafone.com/site/bus/public/enuk/support/10_productsupport/laptop_connectivity/40_software/software/10_latest/p_mac.jsp"&gt;Support-Seite&lt;/a&gt; bekommen.&lt;/p&gt;
&lt;p&gt;Die Installation ist denkbar einfach und nativ, dank eines Apple-Installationspakets, was sogar mit Software-Deployment-Systemen à la FileWave funktionieren dürfte.
Das Versions-Log verspricht: "New features include: ZTE devices now support 64 bit Kernel mode on 10.6 Snow Leopard". Weitere Informationen zu unterstützen Geräten, etc. gibt es im dazugehörigen &lt;a href="http://www.business.vodafone.com/download/getFmlDoc.do?docId=74c3728e-2817-40de-bc9d-5f48eebeb299"&gt;ReadMe&lt;/a&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="Vodafone"></category><category term="UMTS"></category><category term="Macintosh"></category></entry><entry><title>Das erste Mal [continued]</title><link href="https://blog.almeroth.com/das-erste-mal-continued.html" rel="alternate"></link><published>2010-04-03T00:21:00+02:00</published><updated>2010-04-03T00:21:00+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-04-03:/das-erste-mal-continued.html</id><summary type="html">&lt;p&gt;Da steh ich nun ich armer Thor… Wo fängste an, in diesem Internet!?
Vielleicht ein Kommentar, warum ich mich für einen tumblr-Blog entschied:&lt;/p&gt;
&lt;p&gt;Die Euphorie gegenüber StudiVZ, Facebook, Twitter und Co. ist geradezu spurlos an mir vorüber gegangen. Auf Schubladen-Denken (Gruppen-Zuordnung), elendige soziale Verpflichtungen und Verlinkungen auf Party-Bildern Dritter konnte …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Da steh ich nun ich armer Thor… Wo fängste an, in diesem Internet!?
Vielleicht ein Kommentar, warum ich mich für einen tumblr-Blog entschied:&lt;/p&gt;
&lt;p&gt;Die Euphorie gegenüber StudiVZ, Facebook, Twitter und Co. ist geradezu spurlos an mir vorüber gegangen. Auf Schubladen-Denken (Gruppen-Zuordnung), elendige soziale Verpflichtungen und Verlinkungen auf Party-Bildern Dritter konnte ich bisher sehr gut verzichten. Trotzdem fühle ich mich weder 1.0, noch habe ich dadurch ein dezimiertes soziales Umfeld zu vermelden. Klingt komisch ist aber so.&lt;/p&gt;
&lt;p&gt;Es gibt jedoch Tage an denen auch ich mir wünschte der breiten Masse eine Nachricht zu hinterlassen. Tage an denen man stundenlang mit googlen verbringt, um einem Problem auf die Spur zu kommen, an dem sich sämtliche Foren-Threads die Zähne ausbeißen. Oder eben Tage an denen ein Bild einfach mehr sagt als tausend Worte. Ergo: ein Blog muss her!&lt;/p&gt;
&lt;p&gt;Die Auswahl war schwer. Das selbständige Hosting einer überfrachteten Software à la WordPress, etc. kam aus Sicherheits- und Aufwands-technischer Sicht nicht in Frage.&lt;/p&gt;
&lt;p&gt;Der Fokus fiel auf Tools, die die 140-Zeichen Welt von Twitter und die Grundfunktionen von WordPress ideal vereinen und dabei auch noch sexy (iPhone-App, Usability, etc.) sind. Der Artikel &lt;a href="http://arstechnica.com/business/future-of-collaboration/2010/02/tumblr-vs-posterous-quick-blogging-showdown.ars"&gt;Tumblr vs Posterous: quick blogging showdown&lt;/a&gt; von Ars Technica kam da genau richtig.&lt;/p&gt;
&lt;p&gt;Da ich eh kein großer Freund von E-Mails und vor allem der Formatierung derer bin, hatte Posterous sowieso schlechte Karten. Tja und da bin ich nun, liebes Internet.&lt;/p&gt;</content><category term="blog"></category></entry><entry><title>Das erste Mal</title><link href="https://blog.almeroth.com/das-erste-mal.html" rel="alternate"></link><published>2010-04-02T21:29:06+02:00</published><updated>2010-04-02T21:29:06+02:00</updated><author><name>Jan Almeroth</name></author><id>tag:blog.almeroth.com,2010-04-02:/das-erste-mal.html</id><content type="html">&lt;p&gt;Hallo Welt – Hallo Internet…&lt;/p&gt;</content><category term="blog"></category></entry></feed>