<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>Developer of Charles Proxy, Vee for Video and Camera+. Co-founder of Letterboxd.</description><title>Karl von Randow</title><generator>Tumblr (3.0; @karlvr)</generator><link>https://blog.xk72.com/</link><item><title>Charles Proxy now available on iOS</title><description>&lt;a href="https://itunes.apple.com/app/charles-proxy/id1134218562?mt=8"&gt;Charles Proxy now available on iOS&lt;/a&gt;: &lt;p&gt;We are excited to announce that Charles Proxy is now available on iOS!&lt;/p&gt;&lt;p&gt;With the iOS version of Charles you can capture and inspect network requests and responses on your iOS device. You can view metadata, headers and bodies in the app, so you can finally debug your app’s networking issues without a computer.&lt;/p&gt;&lt;p&gt;Charles for iOS currently supports the following features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Capture HTTP and HTTPS network traffic on your device&lt;/li&gt;&lt;li&gt;SSL Proxying so you can view your SSL / TLS requests in plain text&lt;br/&gt;&lt;/li&gt;&lt;li&gt;View requests and responses in the app, or share each request or a whole session to Charles on your desktop&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Running Charles on your iOS device means you no longer need to fiddle with WiFi network proxy settings. It also means that you can capture and measure network traffic that goes over the Mobile / Cellular data network.&lt;/p&gt;&lt;p&gt;Measuring networking performance over Mobile data is especially important for your mobile apps (as that is how a lot of users experience your app), and it can reveal large or slow requests, as well as opportunities to increase perceived performance by parallelising network calls.&lt;/p&gt;&lt;p&gt;We are thrilled to be able to finally bring Charles to the App Store. If you’d like to know a bit more about the history of Charles, and particularly Charles on iOS, I gave a &lt;a href="https://www.youtube.com/watch?v=RWotEyTeJhc"&gt;presentation to try! Swift Tokyo in March 2018&lt;/a&gt; that you can watch on YouTube.&lt;/p&gt;&lt;p&gt;We plan to bring more of the features that you know and love from Charles on the desktop to the iOS version over the coming months, so watch this space for more announcements.&lt;/p&gt;&lt;p&gt;We hope you enjoy using Charles on iOS!&lt;/p&gt;</description><link>https://blog.xk72.com/post/172324913544</link><guid>https://blog.xk72.com/post/172324913544</guid><pubDate>Wed, 28 Mar 2018 12:50:00 +1300</pubDate><category>charles</category></item><item><title>How do I download an iOS App (IPA) file to my Mac after iTunes 12.7 update?</title><description>&lt;a href="https://apple.stackexchange.com/questions/298391/how-do-i-download-an-ios-app-ipa-file-to-my-mac-after-itunes-12-7-update"&gt;How do I download an iOS App (IPA) file to my Mac after iTunes 12.7 update?&lt;/a&gt;</description><link>https://blog.xk72.com/post/168280465849</link><guid>https://blog.xk72.com/post/168280465849</guid><pubDate>Thu, 07 Dec 2017 18:52:25 +1300</pubDate><category>ios</category></item><item><title>How To Shrink Your Virtualbox VM And Free Up Space For Your Hard Disk - Make Tech Easier</title><description>&lt;a href="https://www.maketecheasier.com/shrink-your-virtualbox-vm/"&gt;How To Shrink Your Virtualbox VM And Free Up Space For Your Hard Disk - Make Tech Easier&lt;/a&gt;</description><link>https://blog.xk72.com/post/159950008279</link><guid>https://blog.xk72.com/post/159950008279</guid><pubDate>Tue, 25 Apr 2017 08:29:54 +1200</pubDate><category>virtualbox</category></item><item><title>Roadwarrior configuration for macOS 10.12, iOS 10 and Windows 10 using strongSwan and user certificates</title><description>&lt;a href="https://gist.github.com/karlvr/34f46e1723a2118bb16190c22dbed1cc"&gt;Roadwarrior configuration for macOS 10.12, iOS 10 and Windows 10 using strongSwan and user certificates&lt;/a&gt;</description><link>https://blog.xk72.com/post/158988034154</link><guid>https://blog.xk72.com/post/158988034154</guid><pubDate>Thu, 30 Mar 2017 16:15:40 +1300</pubDate><category>strongswan</category><category>vpn</category></item><item><title>GeoIP on PostgreSQL 9.5</title><description>&lt;p&gt;This guide is for adding GeoIP functionality to PostgreSQL 9.5 (and earlier) using MaxMind’s GeoLite2 CSV files.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://dev.maxmind.com/geoip/geoip2/geoip2-city-country-csv-databases/"&gt;read about the MaxMind GeoIP2 CSV files&lt;/a&gt;, and &lt;a href="http://dev.maxmind.com/geoip/geoip2/geolite2/"&gt;download free versions&lt;/a&gt;. You’ll need the CSV files to continue.&lt;/p&gt;

&lt;p&gt;I create two tables; &lt;code&gt;geoip_blocks&lt;/code&gt; and &lt;code&gt;geoip_locations&lt;/code&gt; to contain the data. I load the English country names, but you could choose the language you want when you populate the &lt;code&gt;geoip_locations&lt;/code&gt; table. I have copied the relevant GeoLite2 CSV files into the &lt;code&gt;/tmp&lt;/code&gt; directory in the example below, but you could read them from anywhere.&lt;/p&gt;

&lt;p&gt;You can use the index support for cidr addresses built in to PostgreSQL 9.4 and later, but you get much better performance using ip4r instead.&lt;/p&gt;

&lt;p&gt;I have examples of both approaches here:
&lt;a href="https://gist.github.com/karlvr/8ff1900bfc9cba36468640c26ae3b2bb"&gt;https://gist.github.com/karlvr/8ff1900bfc9cba36468640c26ae3b2bb&lt;/a&gt;&lt;/p&gt;</description><link>https://blog.xk72.com/post/156250168114</link><guid>https://blog.xk72.com/post/156250168114</guid><pubDate>Mon, 23 Jan 2017 17:53:56 +1300</pubDate><category>postgres</category><category>postgresql</category><category>geoip</category></item><item><title>AWS CloudFormation UserData for Ubuntu 16.04 LTS</title><description>&lt;p&gt;I use CloudFormation to create EC2 instances on AWS. I use this UserData script to install the CloudFormation scripts on the EC2 instance and then to run the init and signal steps.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;        &amp;quot;UserData&amp;quot;: {&lt;br/&gt;          &amp;quot;Fn::Base64&amp;quot;: {&lt;br/&gt;            &amp;quot;Fn::Join&amp;quot;: [&lt;br/&gt;              &amp;quot;&amp;ldquo;,&lt;br/&gt;              [&lt;br/&gt;                &amp;rdquo;#!/bin/bash -x\n&amp;quot;,&lt;br/&gt;                &amp;quot;apt-get update\n&amp;quot;,&lt;br/&gt;                &amp;quot;apt-get install -y python-pip\n&amp;quot;,&lt;br/&gt;                &amp;quot;pip install &lt;a href="https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz%5Cn"&gt;https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n&lt;/a&gt;&amp;ldquo;,&lt;br/&gt;                &amp;quot;cfn-init -v &amp;ndash;resource &amp;lt;RESOURCE NAME CONTAINING INIT CFG&amp;gt;&amp;rdquo;,&lt;br/&gt;                &amp;quot; &amp;ndash;stack &amp;ldquo;,&lt;br/&gt;                {&lt;br/&gt;                  &amp;quot;Ref&amp;rdquo;: &amp;ldquo;AWS::StackName&amp;rdquo;&lt;br/&gt;                },&lt;br/&gt;                &amp;quot; &amp;ndash;region &amp;ldquo;,&lt;br/&gt;                {&lt;br/&gt;                  &amp;quot;Ref&amp;rdquo;: &amp;ldquo;AWS::Region&amp;rdquo;&lt;br/&gt;                },&lt;br/&gt;                &amp;quot;\n&amp;quot;,&lt;br/&gt;                &amp;quot;cfn-signal -e $? &amp;ndash;resource &amp;lt;RESOURCE NAME CONTAINING CREATION POLICY&amp;gt;&amp;ldquo;,&lt;br/&gt;                &amp;rdquo; &amp;ndash;stack &amp;ldquo;,&lt;br/&gt;                {&lt;br/&gt;                  &amp;quot;Ref&amp;rdquo;: &amp;ldquo;AWS::StackName&amp;rdquo;&lt;br/&gt;                },&lt;br/&gt;                &amp;quot; &amp;ndash;region &amp;ldquo;,&lt;br/&gt;                {&lt;br/&gt;                  &amp;quot;Ref&amp;rdquo;: &amp;ldquo;AWS::Region&amp;rdquo;&lt;br/&gt;                },&lt;br/&gt;                &amp;quot;\n&amp;quot;&lt;br/&gt;              ]&lt;br/&gt;            ]&lt;br/&gt;          }&lt;br/&gt;        }&lt;br/&gt;      }&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You then need to add the CloudFormation init configuration to the resource named above. I put it in the instance resource, but I don’t think it has to be.&lt;/p&gt;&lt;p&gt;For example:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;ldquo;Metadata&amp;rdquo;: {&lt;br/&gt;        &amp;quot;AWS::CloudFormation::Init&amp;quot;: {&lt;br/&gt;          &amp;quot;config&amp;quot;: {&lt;br/&gt;          	&amp;ldquo;packages&amp;rdquo;: {&lt;br/&gt;          		&amp;ldquo;apt&amp;rdquo;: {&lt;br/&gt;          			&amp;ldquo;awscli&amp;rdquo;: []&lt;br/&gt;          		}&lt;br/&gt;          }&lt;br/&gt;        }&lt;br/&gt;     }&lt;br/&gt;   }&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You can also add a &lt;a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html"&gt;CreationPolicy&lt;/a&gt; onto a resource; usually the instance or the auto-scaling group. Creation policies have replaced WaitConditions.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;      &amp;quot;CreationPolicy&amp;quot;: {&lt;br/&gt;        &amp;quot;ResourceSignal&amp;quot;: {&lt;br/&gt;          &amp;quot;Timeout&amp;quot;: &amp;ldquo;PT5M&amp;rdquo;&lt;br/&gt;        }&lt;br/&gt;      }&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://blog.xk72.com/post/155816849629</link><guid>https://blog.xk72.com/post/155816849629</guid><pubDate>Sat, 14 Jan 2017 08:17:24 +1300</pubDate><category>ubuntu</category><category>aws</category><category>cloudformation</category></item><item><title>AWS VPC VPN Strongswan configuration</title><description>&lt;p&gt;Create the VPN Connection in the VPC Management console on AWS, using static routing, then download the Generic configuration. The downloaded text file contains some values that you’ll need. There are two VPN configurations in it. I just hook up one on the server. Perhaps if you have two VPN servers you could set up one VPN on each.&lt;/p&gt;&lt;p&gt;These are the values of interest in the downloaded text file:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Pre-Shared Key&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Outside IP Addresses&lt;br/&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Customer Gateway&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Virtual Private Gateway&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Inside IP Addresses&lt;br/&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Customer Gateway&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Virtual Private Gateway&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;My server has an internal IP address, and sits behind a router, which has a public IP address. AWS VPC supports NAT-T so this is no problem. You just set “left” (below) to your internal IP and “leftid” (also below) to your public IP.&lt;/p&gt;&lt;p&gt;Here is the example /etc/ipsec.conf:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;conn vpc&lt;br/&gt;        mobike=no&lt;br/&gt;        type=tunnel&lt;br/&gt;        compress=no&lt;br/&gt;        keyexchange=ikev1&lt;br/&gt;        ike=aes128-sha1-modp1024!&lt;br/&gt;        ikelifetime=28800s&lt;br/&gt;        esp=aes128-sha1-modp1024!&lt;br/&gt;        lifetime=3600s&lt;br/&gt;        rekeymargin=3m&lt;br/&gt;        keyingtries=3&lt;br/&gt;        installpolicy=yes&lt;br/&gt;        dpdaction=restart&lt;br/&gt;        authby=psk&lt;br/&gt;        left=&amp;lt;ip address of your server&amp;gt;&lt;br/&gt;        leftid=&amp;lt;public ip address of your server&amp;gt;&lt;/p&gt;&lt;p&gt;conn vpc1&lt;br/&gt;        also=vpc&lt;br/&gt;        auto=add&lt;br/&gt;        right=&amp;lt;Outside IP Addresses: Virtual Private Gateway&amp;gt;&lt;br/&gt;        leftsubnet=&amp;lt;your subnet&amp;gt;&lt;br/&gt;        rightsubnet=&amp;lt;VPC subnet&amp;gt;&lt;/p&gt;&lt;p&gt;conn vpc1a&lt;br/&gt;        also=vpc&lt;br/&gt;        auto=add&lt;br/&gt;        right=&amp;lt;Outside IP Addresses: Virtual Private Gateway&amp;gt;&lt;br/&gt;        leftsubnet=&amp;lt;Inside IP Addresses: Customer Gateway&amp;gt;&lt;br/&gt;        rightsubnet=&amp;lt;Inside IP Addresses: Virtual Private Gateway&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Here is the example /etc/ipsec.secrets:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;Outside IP Addresses: Virtual Private Gateway&amp;gt; : PSK &amp;ldquo;&amp;lt;Pre-Shared Key&amp;gt;&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then in your AWS VPC configuration edit the route table and add a static route for your internal subnet to the Virtual Gateway device.&lt;/p&gt;&lt;p&gt;Check your security groups on your instances to make sure they allow connectivity from your internal subnet IPs. It can be useful to allow ICMP so you can test using ping.&lt;/p&gt;&lt;p&gt;Restart Strongswan:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;service strongswan restart&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then try to bring up the VPN interface:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ipsec up vpc1&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If all is going well you should see a successful connection result in a second or two. If not, something is wrong :-(&lt;/p&gt;&lt;p&gt;Try to connect to one of the servers in your VPC. If you can’t, check the security groups on them, or perhaps any firewall rules on your own machine.&lt;/p&gt;&lt;p&gt;Then bring up the vpc1a connection. This should result in the VPN showing as UP on the AWS VPC VPC Connection configuration page.&lt;/p&gt;&lt;p&gt;Once you’re happy, change “auto=add” to “auto=start” in /etc/ipsec.conf and restart Strongswan and the VPN would come up automatically.&lt;/p&gt;</description><link>https://blog.xk72.com/post/155816502544</link><guid>https://blog.xk72.com/post/155816502544</guid><pubDate>Sat, 14 Jan 2017 08:07:08 +1300</pubDate><category>aws</category><category>strongswan</category><category>vpn</category><category>vpc</category></item><item><title>Cocoapods and Swift 3</title><description>&lt;p&gt;Cocoapods supports Swift 3 as of 1.1.0. Cocoapods sets the SWIFT_VERSION of the pod targets to match the SWIFT_VERSION set on your &lt;b&gt;project&lt;/b&gt;. This is a pretty clever solution to Swift evolution, and you can read more about it in the &lt;a href="http://blog.cocoapods.org/CocoaPods-1.1.0/"&gt;Cocoapods 1.1.0 announcement blog&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Note the bold text on &lt;i&gt;project&lt;/i&gt; in the previous paragraph. You need to set the SWIFT_VERSION Build Setting on your project, not just on your project’s targets.&lt;/p&gt;</description><link>https://blog.xk72.com/post/153959897204</link><guid>https://blog.xk72.com/post/153959897204</guid><pubDate>Sat, 03 Dec 2016 10:10:51 +1300</pubDate><category>cocoapods</category><category>swift</category><category>swift3</category></item><item><title>Setup exim4 and DKIM</title><description>&lt;p&gt;I have setup exim4 to sign outgoing email using DKIM, with the goal of improving deliverability. I have setup exim4 to handle multiple outgoing domains with different keys.&lt;/p&gt;&lt;p&gt;The key to use is chosen based on the domain name of the From header, not the envelope mail from. This is because I believe DKIM verification uses the From header (&lt;a href="https://dmarc.org/wiki/FAQ"&gt;https://dmarc.org/wiki/FAQ&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;I based my approach on instructions from &lt;a href="https://debian-administration.org/article/718/DKIM-signing_outgoing_mail_with_exim4"&gt;https://debian-administration.org/article/718/DKIM-signing_outgoing_mail_with_exim4&lt;/a&gt;, but they appeared to be either slightly incorrect or out of date.&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;Configure exim4&lt;/h2&gt;&lt;p&gt;First you need to make up a DKIM selector. This is the part of the domain name that goes on the front of the ._domainkey.example.com DNS entry you’ll later make. I configure one DKIM selector for all of the domains, so I choose one that identifies the box or the entity that owns the box. If you set up DKIM for the same domain on another box with different keys, the selector is what identifies which keys to use.&lt;/p&gt;&lt;p&gt;Say you choose the selector “mydkim”.&lt;/p&gt;&lt;p&gt;If you have split configuration, edit /etc/exim4/conf.d/main/00_exim4-local_options and append the following to the end of that file. If you are not split, edit /etc/exim4/exim4.conf.template and insert the following after the MAIN CONFIGURATION title comment near the top of the file.&lt;/p&gt;&lt;p&gt;DKIM_CANON=relaxed&lt;br/&gt;DKIM_SELECTOR=mydkim&lt;br/&gt;DKIM_DOMAIN = ${sg{${lc:${domain:$h_from:}}}{^www.}{}}&lt;br/&gt;DKIM_FILE = /etc/exim4/dkim/$dkim_domain.pem&lt;br/&gt;DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}&lt;/p&gt;&lt;p&gt;Run update-exim4.conf to update your configuration. Restart exim4 and check that you can still send email. I suggest sending email to another email account, not on your server. Check that /var/log/exim4/paniclog remains empty after successfully sending email.&lt;/p&gt;&lt;p&gt;Congratulations you’ve successfully setup exim4.&lt;/p&gt;&lt;p&gt;Exim4 will look in /etc/exim4/dkim/DOMAIN.pem for a private key to use to send email with a From address domain of DOMAIN.&lt;/p&gt;&lt;h2&gt;Generate DKIM keys&lt;/h2&gt;&lt;p&gt;Now you need to generate keys for exim4 to use. In the example below, replace “example.com” with your domain name.&lt;/p&gt;&lt;p&gt;cd /etc/exim4/dkim&lt;br/&gt;openssl genrsa -out example.com.pem 1024 -outform PEM&lt;br/&gt;openssl rsa -in example.com.pem -out example.com.pub -pubout -outform PEM&lt;/p&gt;&lt;p&gt;Don’t send any email yet. Exim4 will start using this private key immediately, and it will sign your email. But you haven’t setup your DNS yet.&lt;/p&gt;&lt;h2&gt;Add DKIM public key to your DNS&lt;/h2&gt;&lt;p&gt;You need to add your DKIM public key to your domain’s DNS. This is how a remote server can lookup the public key to check the signature your server has added to your email.&lt;/p&gt;&lt;p&gt;Open the example.com.pub file generated above. &lt;/p&gt;&lt;p&gt;Now if you send email to an email account not on your server, you should see a Dkim-Signature header in it. It will start with &amp;mdash;&amp;ndash;BEGIN PUBLIC KEY&amp;mdash;&amp;ndash; and end with &amp;mdash;&amp;ndash;END PUBLIC KEY&amp;mdash;&amp;ndash;. The line in between are your public key!&lt;/p&gt;&lt;p&gt;Create a new DNS record on your domain using the DKIM selector you chose above. In my example this is mydkim, so the record we add is for mydkim._domainkey.example.com.&lt;/p&gt;&lt;p&gt;The DNS record type is TXT. You should already have an SPF record of type TXT. If you don’t, google SPF records.&lt;/p&gt;&lt;p&gt;The value of the TXT record starts with:&lt;/p&gt;&lt;p&gt;v=DKIM1; k=rsa; p=&lt;/p&gt;&lt;p&gt;Directly after the last =, paste each line of your public key with no new lines. So it all ends up on one line.&lt;/p&gt;&lt;p&gt;e.g. v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAPUE4hEV7wSh7v9s/NrhbJu7k1/Jqr3Mt7pspT6o7c/Q+GFP1Ko7VA0I12RYB+PeFUE+3i3yu1fsmzGn92GdhKd2nObZbs06Rynm48yVPmzXV2pEptebfOTfAdsJh3rryB0HQnPx+H1gKww1/nUagYlUjktBL7sRDGdjNqTIxYwIDAQAB&lt;/p&gt;&lt;p&gt;Save that DNS record.&lt;/p&gt;&lt;p&gt;If you want to verify that it worked, try this command-line tool:&lt;br/&gt;&lt;/p&gt;&lt;p&gt;dig txt mydkim._domainkey.example.com&lt;/p&gt;&lt;p&gt;Of course you probably need to wait for your DNS to update. If you know the primary DNS server for your domain, try querying that directly if you’re impatient.&lt;/p&gt;&lt;h2&gt;Testing&lt;/h2&gt;&lt;p&gt;Now exim4 is signing your email, and you’ve setup your domain, so it’s time to send a test email.&lt;/p&gt;&lt;p&gt;Send an email to check-auth@verifier.port25.com and in a few seconds you’ll receive an email back summarising the findings about your email. With luck you’ll have passed the DKIM check. If the DKIM check failed, scroll down to read why. If it is because the _domainkey subdomain we added doesn’t exist, perhaps you need to wait a little longer for the DNS to propagate. Check though that it reports the same subdomain that you added! This will confirm that you have set your DKIM selector correctly.&lt;/p&gt;&lt;p&gt;Now send an email to yourself on another email server, e.g. a gmail address. Check that the received email contains a Dkim-Signature header. That’s the magic bit.&lt;/p&gt;&lt;h2&gt;Adding additional domains&lt;/h2&gt;&lt;p&gt;When you want to add DKIM signing for additional domains, repeat the Generate DKIM keys, Add DKIM public keys to your DNS and Testing steps. You don’t need to configure exim4 anymore as it’s setup for as many domains as you like.&lt;/p&gt;</description><link>https://blog.xk72.com/post/153660745869</link><guid>https://blog.xk72.com/post/153660745869</guid><pubDate>Sat, 26 Nov 2016 12:47:54 +1300</pubDate><category>ubuntu</category><category>linux</category><category>exim4</category><category>DKIM</category></item><item><title>How to prevent updating of a specific package?</title><description>&lt;a href="http://askubuntu.com/questions/18654/how-to-prevent-updating-of-a-specific-package"&gt;How to prevent updating of a specific package?&lt;/a&gt;: &lt;p&gt;Hold a package to prevent it from being upgraded unless you specifically upgrade it. I use this to hold postgresql packages, as installing upgrades results in a restart of the database server and a micro-outage that I want to better manage.&lt;/p&gt;&lt;p&gt;apt-mark hold postgresql-9.5&lt;/p&gt;&lt;p&gt;Then the postgresql and postgresql-contrib (and sometimes client) packages appear as “held back” when you run apt-get upgrade.&lt;/p&gt;&lt;p&gt;You can force them to upgrade when you’re ready by explicitly installing: apt-get install postgresql-9.5&lt;/p&gt;</description><link>https://blog.xk72.com/post/153529337209</link><guid>https://blog.xk72.com/post/153529337209</guid><pubDate>Wed, 23 Nov 2016 09:55:06 +1300</pubDate><category>ubuntu</category><category>apt-get</category></item><item><title>Setup Ruby on macOS without sudo</title><description>&lt;a href="https://gorails.com/setup/osx/10.11-el-capitan"&gt;Setup Ruby on macOS without sudo&lt;/a&gt;: &lt;p&gt;Setup ruby on macOS without sudo and with the latest version!&lt;/p&gt;

&lt;p&gt;It’s clear that using sudo to install gems is a bad idea. And you’re stuck with an older version of ruby and gem. But is it a lot of work to change your ways? I thought so. But it isn’t.&lt;/p&gt;

&lt;p&gt;First I nuke my gems from orbit (it’s the only way to be sure). Some of the gems are default gems so we can’t uninstall them and you might see error messages for them.&lt;/p&gt;

&lt;pre&gt;for i in $(gem list | awk '{print $1}') ; do gem uninstall -a -I "$i" ; done&lt;/pre&gt;

&lt;p&gt;After this, &lt;code&gt;gem list&lt;/code&gt; returns nothing, or just the default gems.&lt;/p&gt;

&lt;p&gt;Then you can install rbenv, and a new version of ruby in its own little environment just for you, so no sudo:&lt;/p&gt;

&lt;pre&gt;brew install rbenv ruby-build

# Add rbenv to bash so that it loads every time you open a terminal
echo 'if which rbenv &gt; /dev/null; then eval "$(rbenv init -)"; fi' &gt;&gt; ~/.bash_profile
source ~/.bash_profile
# Install Ruby
rbenv install 2.3.1
rbenv global 2.3.1
ruby -v&lt;/pre&gt;

&lt;p&gt;Then you’re gem installing with no sudo 4eva. Of course you need to reinstall all the gems you’ve lost. I found it rather refreshing as I didn’t really know whether I still needed any of the ones I had installed!&lt;/p&gt;</description><link>https://blog.xk72.com/post/148851976689</link><guid>https://blog.xk72.com/post/148851976689</guid><pubDate>Sat, 13 Aug 2016 09:18:26 +1200</pubDate><category>ruby</category><category>gem</category></item><item><title>Charles 4</title><description>&lt;p&gt;At long last, Charles 4 has been released! Charles 1 was released in 2002, nearly 14 years ago. Since then we’ve been through Charles 2 and Charles 3, both big upgrades. But for the past 11 months we’ve been hard at work on the biggest upgrade we’ve ever made to Charles!&lt;/p&gt;&lt;p&gt;Charles 4 includes an upgrade to the latest and greatest HTTP standard, the latest and greatest IP standard, and the biggest UI update ever for Charles. It is also the first paid upgrade in Charles&amp;rsquo;s long history.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;HTTP 2 is all around you. It’s sneaky and you might not have noticed. Both the client and server need to support HTTP 2, otherwise they will downgrade automatically to HTTP 1.1. So with Charles 3 you would just have seen HTTP 1.1 everywhere. No more! With Charles 4 you can now see HTTP 2 working, and you can use all of your familiar tools; Repeat, Breakpoints, and so on. You’ll spot HTTP 2 hosts in Charles as they use a different icon—with a lightning bolt!&lt;/p&gt;&lt;p&gt;IPv6 is also all around you! If you’re lucky enough to have an IPv6 network and ISP you can turn on “Prefer IPv6 addresses when connecting to dual-stack hosts” on the &lt;i&gt;Options&lt;/i&gt; tab in the &lt;i&gt;Proxy Settings&lt;/i&gt;. Then you’ll see IPv6 addresses being used in Charles. Feel the modern IP networking (first published in 1998) flow through you!&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;With Charles 4 we’ve also taken the opportunity to spruce up the look of Charles, starting with the familiar, enigmatic and much-loved app icon.&lt;/p&gt;&lt;p&gt;I’ll let that sit by itself for a moment.&lt;/p&gt;&lt;p&gt;Fear not! It&amp;rsquo;s still the Charles jug, we&amp;rsquo;re not crazy! It&amp;rsquo;s just had a big polish, and we think it&amp;rsquo;s more beautiful than ever! We hope you do too.&lt;/p&gt;&lt;figure data-orig-width="256" data-orig-height="256"&gt;&lt;img src="https://64.media.tumblr.com/c40e81596f30adf8690ee26aa12e888f/tumblr_inline_ob8z21ogTu1r2onau_540.png" alt="image" data-orig-width="256" data-orig-height="256"/&gt;&lt;/figure&gt;&lt;p&gt;We&amp;rsquo;ve also designed a completely new custom set of icons, giving Charles a more unified and refined appearance. Thank you to the wonderful &lt;a href="http://www.bartelme.at"&gt;Wolfgang Bartelme&lt;/a&gt; for all of his painstaking work on these icons and on our beloved Charles Jug 4.0.&lt;/p&gt;&lt;p&gt;Finally we&amp;rsquo;ve improved the native platform stylings on Mac OS X (soon to be macOS) and Windows; we&amp;rsquo;ve reduced border chrome and tweaked most of the dialog layouts in the app so that Charles looks more modern than ever.&lt;/p&gt;&lt;p&gt;On Mac OS X we’re using the brand new &lt;a href="http://violetlib.org"&gt;VAqua&lt;/a&gt; library by the excellent Alan Snyder. VAqua provides better graphical accuracy and higher performance, especially on retina screens. The keenest eyes amongst you may also notice that Charles 4 now uses sub-pixel antialiasing! Zoom in to check it out. And on the latest versions of Mac OS X, Charles 4 uses the new San Francisco typeface. Finally, for my Charlesitans with dark menu bars—there’s a little something for you in Charles 4 too.&lt;/p&gt;&lt;p&gt;On Windows we’re using the latest version of &lt;a href="http://www.jgoodies.com/"&gt;JGoodies&lt;/a&gt;, with support for Windows 8 and Windows 10. No more will your menus be odd colours! We’ve also fixed the egregious aliased text that previously appeared whenever you looked at XML responses.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;There are lots of other little changes and improvements in Charles 4. We’ll be documenting these and updating the website over the coming weeks. Reach out to us on Twitter &lt;a href="https://twitter.com/charlesproxy"&gt;@charlesproxy&lt;/a&gt; if you have any questions or comments!&lt;/p&gt;&lt;p&gt;Don’t forget to &lt;a href="https://www.charlesproxy.com/download/"&gt;download Charles 4&lt;/a&gt; and check it out!&lt;/p&gt;</description><link>https://blog.xk72.com/post/148311808729</link><guid>https://blog.xk72.com/post/148311808729</guid><pubDate>Tue, 02 Aug 2016 08:15:00 +1200</pubDate><category>charles</category></item><item><title>How to install a specific version of a ruby gem?</title><description>&lt;a href="http://stackoverflow.com/questions/17026441/how-to-install-a-specific-version-of-a-ruby-gem"&gt;How to install a specific version of a ruby gem?&lt;/a&gt;: &lt;p&gt;Say you need to run the pre 1.0 Cocoapods?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;sudo gem install cocoapods -v 0.39.0&lt;/p&gt;&lt;p&gt;pod _0.39.0_ install&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://blog.xk72.com/post/147373950504</link><guid>https://blog.xk72.com/post/147373950504</guid><pubDate>Thu, 14 Jul 2016 15:10:07 +1200</pubDate><category>gem</category><category>cocoapods</category><category>ruby</category></item><item><title>Disable documentation generation for gem update</title><description>&lt;a href="http://stackoverflow.com/questions/1381725/how-to-make-no-ri-no-rdoc-the-default-for-gem-install"&gt;Disable documentation generation for gem update&lt;/a&gt;: &lt;p&gt;gem update is the slowest thing my computer does. This makes it not so slow. Put it in your ~/.gemrc and never look back:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;gem: –no-document&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://blog.xk72.com/post/147271595424</link><guid>https://blog.xk72.com/post/147271595424</guid><pubDate>Tue, 12 Jul 2016 15:49:41 +1200</pubDate><category>gem</category><category>ruby</category></item><item><title>letterboxd:


App.

This week we launched our Letterboxd iPhone...</title><description>&lt;img src="https://64.media.tumblr.com/943ad8fee97449ac5cd53cb424c68ba3/tumblr_o47ojxB2Zb1qzeraeo2_r1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://letterboxd.tumblr.com/post/141232393323"&gt;letterboxd&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1 class="post-title"&gt;&lt;a href="http://news.letterboxd.com/post/141232393323/app"&gt;&lt;strong&gt;App.&lt;/strong&gt;&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;This week we launched our &lt;a href="http://letterboxd.com/app/"&gt;Letterboxd iPhone app&lt;/a&gt; as a free download through Apple’s App Store. We’re ecstatic to put this app in your pocket (18,000 of you have grabbed it already!), and tremendously excited about how it will evolve the way we use Letterboxd. This was a monumental achievement for the team at HQ (particular hat tips to &lt;a href="http://letterboxd.com/grantyb/"&gt;Grant&lt;/a&gt;, &lt;a href="http://letterboxd.com/ryan/"&gt;Ryan&lt;/a&gt; and &lt;a href="http://letterboxd.com/karl/"&gt;Karl&lt;/a&gt;); the scope of the API + app development turned out to be comparable to the amount of work we did in 2011 while preparing our initial public beta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://itunes.apple.com/app/id1054271011"&gt;Download from the App Store&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The launch was covered by &lt;a href="http://techcrunch.com/2016/03/15/letterboxd-launches-its-movie-social-network-on-the-iphone/"&gt;TechCrunch&lt;/a&gt;, &lt;a href="http://www.indiewire.com/article/letterboxd-app-iphone-apple-film-social-network-20160315"&gt;IndieWire&lt;/a&gt;, &lt;a href="http://thenextweb.com/insider/2016/03/15/letterboxd-finally-comes-iphone-help-track-find-movies/"&gt;The Next Web&lt;/a&gt; and many others, and the response from those who’ve installed it has been overwhelmingly positive. Today I’d like to share a little insight into the process and tell you about what we’ve built.&lt;/p&gt;

&lt;h2&gt;Process&lt;/h2&gt;

&lt;p&gt;After committing to build an iPhone app for Letterboxd, we first needed to add an API layer to our server infrastructure, to handle the transfer of data between external clients and the site. We’d piloted a small portion of the required work for &lt;a href="http://filmfestbuzz.com"&gt;Film Fest Buzz&lt;/a&gt;, and over the course of the past year we’ve built out the remainder of the API, which today comprises 40 individual endpoints.&lt;/p&gt;

&lt;p&gt;The app’s interface represents an iOS-friendly take on the site’s aesthetic, and some parts of it may influence the future direction of the site. The majority of the app’s screens were designed in late 2014 — our prototype extended to 63 individual layouts, a large proportion of which have made it into the app we shipped this week.&lt;/p&gt;

&lt;p&gt;API and iOS development was done concurrently for much of last year, and in November we invited Patron members to install and test an alpha version of the app. As always, we’re indebted to everyone who helped us to test the various builds over the past four months. (If you’ve been testing the app, please install the App Store version and we’ll get in touch when there are future betas to look at.)&lt;/p&gt;

&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="832" data-orig-width="1280" data-orig-src="https://64.media.tumblr.com/6299cf5b241d0e024778e41fb96548cb/tumblr_inline_o47p0kHRMd1qz6izh_1280.jpg"&gt;&lt;img src="https://64.media.tumblr.com/7c06abe526b5d1fcce5375ea30418d43/tumblr_inline_p7gputXTqw1r2onau_540.jpg" alt="" data-orig-height="832" data-orig-width="1280" data-orig-src="https://64.media.tumblr.com/6299cf5b241d0e024778e41fb96548cb/tumblr_inline_o47p0kHRMd1qz6izh_1280.jpg"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;h2&gt;What can it do?&lt;/h2&gt;

&lt;p&gt;Version 1.0 of the iPhone app supports:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Sign in and account creation (with 1Password support)&lt;/li&gt;
&lt;li&gt;Browsing of popular, highly rated and most anticipated films&lt;/li&gt;
&lt;li&gt;Film info including poster, trailer, cast, crew, studio and genre data, plus popular lists and reviews&lt;/li&gt;
&lt;li&gt;Film actions: rate, like, mark as watched, add to watchlist, add/remove from a list&lt;/li&gt;
&lt;li&gt;Logging of films with date, rating, review and tags (plus flags for spoilers and rewatches, and Facebook sharing if your account is connected via the site)&lt;/li&gt;
&lt;li&gt;Viewing (and filtering) of your activity feed&lt;/li&gt;
&lt;li&gt;Viewing and commenting on lists and reviews&lt;/li&gt;
&lt;li&gt;Viewing of member profiles&lt;/li&gt;
&lt;li&gt;Following and blocking of members&lt;/li&gt;
&lt;li&gt;Searching for films, reviews, lists and people&lt;/li&gt;
&lt;li&gt;Profile editing (including favorite films)&lt;/li&gt;
&lt;li&gt;Reporting of content and members&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;What can’t it do (yet)?&lt;/h2&gt;

&lt;p&gt;Some items from our wishlist didn’t make it into the first version but will be added in future updates. These include:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;More browsing options, including decade/year and genre&lt;/li&gt;
&lt;li&gt;Sorting and visibility filters&lt;/li&gt;
&lt;li&gt;List creation/deletion, editing and re-ordering&lt;/li&gt;
&lt;li&gt;Availability on streaming services&lt;/li&gt;
&lt;li&gt;Detail views for more screens (such as watched films and liked content)&lt;/li&gt;
&lt;li&gt;Completion percentages for lists and cast/crew&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;And there’s some OS-level integrations we plan to add as well:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Notifications for follows, likes, comments, etc.&lt;/li&gt;
&lt;li&gt;A URL scheme so the app is able to open relevant web links natively&lt;/li&gt;
&lt;li&gt;3D Touch support&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Reactions&lt;/h2&gt;

&lt;p&gt;We &lt;a href="https://twitter.com/letterboxd/status/709705179365412864"&gt;asked&lt;/a&gt; on Twitter and Facebook for your reactions to the app news, and boy did you come through with flying colors. The three recipients of a year’s Pro subscription are Jennifer MacDougall for this delightful depiction of &lt;a href="https://s-media-cache-ak0.pinimg.com/originals/18/4c/18/184c18b426b71ce447d1dc21c49d61b5.gif"&gt;app love&lt;/a&gt;, Pedro Strazza for Jonah Hill’s delayed &lt;a href="https://twitter.com/pedrosazevedo/status/709722584561094661"&gt;fist pump&lt;/a&gt;, and poor Niall Murphy who expressed his disappointment on behalf of the entire Android community in a &lt;a href="https://twitter.com/NiallXMurphy/status/709729710964609025"&gt;single word&lt;/a&gt;. (“[We]’ve never seen such devotion in a droid before.”)&lt;/p&gt;

&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="832" data-orig-width="1280" data-orig-src="https://64.media.tumblr.com/c3c56e8f36f58da72b546f0068addbd3/tumblr_inline_o47p01kbfF1qz6izh_1280.jpg"&gt;&lt;img src="https://64.media.tumblr.com/80e51192293d480060ea8b7bc49f84c3/tumblr_inline_p7gputM48H1r2onau_540.jpg" alt="" data-orig-height="832" data-orig-width="1280" data-orig-src="https://64.media.tumblr.com/c3c56e8f36f58da72b546f0068addbd3/tumblr_inline_o47p01kbfF1qz6izh_1280.jpg"/&gt;&lt;/figure&gt;&lt;/p&gt;

&lt;h2&gt;SSL&lt;/h2&gt;

&lt;p&gt;The API requires all communication with our servers to be made over an SSL connection. Prior to the launch of the first alpha version last year, we also enabled SSL as an option for site traffic (&lt;a href="https://letterboxd.com"&gt;try it&lt;/a&gt;). We intend this to become the only way to access the website as well.&lt;/p&gt;

&lt;h2&gt;What’s next&lt;/h2&gt;

&lt;p&gt;As alluded to above, we weren’t able to make this a dual release with an accompanying Android version. We’ll be putting some focus on the public API and Android next (we’ll let you know as soon as we have something to announce), along with more site and app improvements. And if you have any app feedback, we’d love to hear it through the usual channels.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>https://blog.xk72.com/post/141329443239</link><guid>https://blog.xk72.com/post/141329443239</guid><pubDate>Sun, 20 Mar 2016 10:08:12 +1300</pubDate><category>ios</category></item><item><title>varnishlog queries</title><description>&lt;p&gt;I always have to look up how to do queries on varnishlog. This is a good link for brief docs on the query language: &lt;a href="https://www.varnish-cache.org/docs/trunk/reference/vsl-query.html"&gt;https://www.varnish-cache.org/docs/trunk/reference/vsl-query.html&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;varnishlog -q &amp;lsquo;ReqURL ~ &amp;ldquo;^/about/&amp;rdquo; and ReqHeader:User-Agent ~ &amp;ldquo;Safari&amp;rdquo;&amp;rsquo;&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://blog.xk72.com/post/141124487214</link><guid>https://blog.xk72.com/post/141124487214</guid><pubDate>Wed, 16 Mar 2016 15:55:52 +1300</pubDate><category>varnish</category></item><item><title>How to Downgrade a Package via apt-get?</title><description>&lt;a href="http://askubuntu.com/questions/138284/how-to-downgrade-a-package-via-apt-get"&gt;How to Downgrade a Package via apt-get?&lt;/a&gt;</description><link>https://blog.xk72.com/post/141124260624</link><guid>https://blog.xk72.com/post/141124260624</guid><pubDate>Wed, 16 Mar 2016 15:51:22 +1300</pubDate><category>apt</category><category>linux</category><category>ubuntu</category></item><item><title>Keychain Access: This certificate has an invalid issuer</title><description>&lt;a href="http://stackoverflow.com/a/35433554/1951952"&gt;Keychain Access: This certificate has an invalid issuer&lt;/a&gt;</description><link>https://blog.xk72.com/post/139902907159</link><guid>https://blog.xk72.com/post/139902907159</guid><pubDate>Wed, 24 Feb 2016 23:01:10 +1300</pubDate><category>ios</category></item><item><title>Debugging Makefiles</title><description>&lt;a href="http://www.oreilly.com/openbook/make3/book/ch12.pdf"&gt;Debugging Makefiles&lt;/a&gt;: &lt;p&gt;Particularly &lt;code&gt;$(warning Say some stuff)&lt;/code&gt; or &lt;code&gt;$(warning Value of $(this_variable))&lt;/code&gt;.&lt;/p&gt;</description><link>https://blog.xk72.com/post/139802525079</link><guid>https://blog.xk72.com/post/139802525079</guid><pubDate>Tue, 23 Feb 2016 08:29:18 +1300</pubDate><category>Makefile</category></item><item><title>Solve screen error "Cannot open your terminal '/dev/pts/0' - please check" - makandropedia</title><description>&lt;a href="http://makandracards.com/makandra/2533-solve-screen-error-cannot-open-your-terminal-dev-pts-0-please-check"&gt;Solve screen error "Cannot open your terminal '/dev/pts/0' - please check" - makandropedia&lt;/a&gt;</description><link>https://blog.xk72.com/post/138900090764</link><guid>https://blog.xk72.com/post/138900090764</guid><pubDate>Mon, 08 Feb 2016 16:11:17 +1300</pubDate><category>linux</category></item></channel></rss>
