Short holiday in Provence during Corona (COVID-19) times

My trusted Specialized AWOL

This year we all will probably remember as “The Corona year”. Everything we used to has changed in just a few days. Our way of working, how we approach other people and what I like to write about the way we spend holidays.

After a week in south France in early summer we come back somehow unsatisfied. The accommodation was not what we expected and Provence as the rest of World was different. You could not feel like you are on holidays when at every occasion you are reminded about pandemic. Going out to restaurant is not what we used to, having a chat with locals feels awkward sometimes simply not right. Most of good restaurants are booked few days in advance which is difficult if staying only a few days in a place.

Anyways cycling was the general idea for the 2020 summer holidays. We have not cycled to much this time in France (Provence) but one scenic ride will always remind me of this beautiful area. The route goes along the mighty river Rhone.

Rhone at Donzere
River Rhone near Donzere

The GPX track can be downloaded here.

Elapsed Time Moving Time Distance Average Speed Max Speed Elevation Gain
05:06:12 03:43:11 50.23 13.50 38.88 219.00
hours hours km km/h km/h meters

On the road we have passed nice castle few lovely villages and follow a road wher Tour de France was going later in September 2020.

Samen fietsen in Provence

Another interesting place is the bicycle suspension bridge build on remains of older bridge which was bombarded during World War 2. The place is now called “Passerelle himalayenne” and is a bridge especially build for cyclist. After riding it I noticed warning sign informing that it is prohibited to ride a bike on the bridge, you can only walk it with a bike.

The suspension bridge of the type developed by Marc Seguin was built in 1858 and is a listed historic monument. After being severely damaged in the 20th century, it was restored as a Himalayan footbridge in 2013, enabling the ViaRhôna cycle path to cross from Ardèche to Drôme.

Python code to download DMS Task Logs using the AWS DMS Task ID

Surece: https://idk.dev/python-code-to-download-dms-task-logs-using-the-aws-dms-task-id/

Slightly modified script still need to fix the datetime issue and adat for AWS Lambda.

import boto3, json, sys, time
from os import environ
import datetime

def start_time_milliseconds_since_epoch():  #time_string):
    ts = int(time.time()*1000) - 8640000
    print('Start time', ts)
    return(ts)


def end_time_milliseconds_since_epoch():
    ts = int(time.time()*1000)
    print('End time  ', ts)
    return(ts)


def get_replication_tasks():
    client = boto3.client('dms')

    response = client.describe_replication_tasks(Filters=[
        {
            'Name': 'replication-task-id',
            'Values': [
                replication_task_id,
            ]
        },
    ],
    MaxRecords=100,
    Marker='')

    return response['ReplicationTasks']

def get_replication_instance_arn():
    for ReplicationTasks in get_replication_tasks():
        ReplicationInstanceArn = ReplicationTasks['ReplicationInstanceArn']

        return ReplicationInstanceArn

def get_replication_instances():
    client = boto3.client('dms')    
    response = client.describe_replication_instances(Filters=[
        {
            'Name': 'rep-instance-arn',
            'Values': [
                rep_instance_arn,
            ]
        },
    ],
    MaxRecords=100,
    Marker='')
    
    
    return response['ReplicationInstances']

def get_replication_instance_id():
    for ReplicationInstances in get_replication_instances():
     ReplicationInstanceIdentifier = ReplicationInstances['ReplicationInstanceIdentifier']

     return ReplicationInstanceIdentifier

def get_cloudwatch_log_events(log_group):
    
    client = boto3.client('logs')
    kwargs = {
        'logGroupName': log_group,
        'limit': 1000,
        'startTime': start_time,
        'endTime': end_time
    }
    while True:
        response = client.filter_log_events(**kwargs)
        yield from response['events']
        try:
            kwargs['nextToken'] = response['nextToken']
        except KeyError:
            break

replication_task_id = 'celonis-dms-s3publish-part1'
rep_instance_arn = get_replication_instance_arn()

start_time = 1596672000000  #start_time_milliseconds_since_epoch()
end_time = 1596758400000  #end_time_milliseconds_since_epoch()

log_group = "dms-tasks-" + get_replication_instance_id()

# print(end_time - start_time)

def main():
    for event in get_cloudwatch_log_events(log_group):
        sys.stdout.write(event['message'].rstrip() + 'n')

if __name__ == '__main__':
    main()

Flask example 1

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
def my_form():
    return render_template('my-form.html')

@app.route('/', methods=['POST'])
def my_form_post():
    text = request.form['text']
    processed_text = text.upper()
    return processed_text

if __name__ == '__main__':
    app.run(host='localhost', port=80)

Request registration plate data:

import requests

url = "https://opendata.rdw.nl/resource/m9d7-ebf2.json"
plate = 'GB224X' #str(input("Enter registration number plate..."))
querystring = {}
querystring["kenteken"] = plate
#querystring = {"kenteken":"GB224X"}

headers = {
    'User-Agent': "PostmanRuntime/7.20.1",
    'Accept': "*/*",
    'Cache-Control': "no-cache",
    'Postman-Token': "43d07009-34de-4c57-99d9-af76e648cd9b,f85a65e3-2d6f-47df-813e-d4d592abff65",
    'Host': "opendata.rdw.nl",
    'Accept-Encoding': "gzip, deflate",
    'Connection': "keep-alive"
    }

def rdw():
    response = requests.request("GET", url, headers=headers, params=querystring)
    data = response.text
    return data
    
print(rdw())