Jul 022020
 

Using AWS Lambda with nodejs with Javascript.

Writing own library and use them as a layer.

Combine Lambda and Layer together.

Normally in Lambda, layer is found under /opt/

const shadowLib = require('/opt/shadow-lib');

But how to analyze, if layer is not found?

Try to get a list of all Files in /opt.

But how to get a list of all files from directory /opt? In AWS. In Lambda-function.

It works with nodejs12.

Try ist Lambda

const fs = require('fs');
const path = require('path');

function getFiles(srcpath) {
    return fs.readdirSync(srcpath)
        .map(file => path.join(srcpath, file))
        .filter(path => fs.statSync(path));
}
exports.handler = async(event, context, callback) => {
const files = getFiles("/opt");
    return files;
}

Et voilá – found my tipping error very quickly!

Mai 112020
 

if creating a couple of CloudFormation (cf) skripts and run them in a whole bash-script. How to get output from cf before as input for next cf?

One script runs like this:

aws cloudformation deploy --template-file myTemplate.yaml --stack-name myStackName

Or if need package before like this

aws cloudformation package --template-file template.yaml --s3-bucket my-S3-bucket --output-template-file output.yaml

aws cloudformation deploy --template-file output.yaml.yaml --stack-name myStackName

Override a parameter.

aws cloudformation deploy --template-file output.yaml.yaml --stack-name myStackName --parameter-overrides AppName='my First App' DevAccountId=23456 TestAccountId=98765

Creating bash/shell script for more than one cf is here

#!/usr/bin/env bash
AppName='my First App'
DevAccount=123456
TestAccount=98765
aws cloudformation deploy --template-file output1.yaml.yaml --stack-name myFirstStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
aws cloudformation deploy --template-file output2.yaml.yaml --stack-name mySecondStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
aws cloudformation deploy --template-file output3.yaml.yaml --stack-name myThirdStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount

And now!

How to combine them? How to use export (not export, only output) from one stack as input to another stack, only using bash?

Getting output, use describe-stacks like this

aws cloudformation describe-stacks --stack-name myStackName --output text

Or with –output json or table, but you got whole stackdescription.

Reduce to output-only with this: All outputs

aws cloudformation describe-stacks --stack-name thomas-is-doph --query "Stacks[0].Outputs[].OutputValue"  --output text

or this: one specific output (Outputs[0] or Outputs[1] )

aws cloudformation describe-stacks --stack-name thomas-is-doph --query "Stacks[0].Outputs[0].OutputValue"  --output text 

You have to know the order of outputs!

But it gets better!

You can get a specific output with

aws cloudformation describe-stacks --stack-name myStackName --query "Stacks[0].Outputs[?OutputKey=='SearchTerm'].OutputValue" --output text

Now you get directly your searchTerm!

If you combine them in a script, a function would be nice

try this:

function getOutput { echo -n "function called to find $1" queryParameter="Stacks[0].Outputs[?OutputKey=='$1'].OutputValue" echo -n "Query Paramter= $queryParameter" outputVar='aws cloudformation describe-stacks --stack-name $2 --query $queryParameter - --output text' 
result=$(eval "$outputVar") 
echo "searching variable:> $result"}

In a whole script it looks like this:

#!/usr/bin/env bash

##################################################
## Getting output from CI! ##
## ##
## Needs 3 parameter ##
## $1 name of Output ##
## $2 name of Stack ##
## result name in mandatory ##
## contains result ##
## ##
## Example: ##
## getOutput KMSKey moe-cloud-stack result ##
##################################################
function getOutput {

  echo -n "function called to find $1"
  queryParameter="Stacks[0].Outputs[?OutputKey=='$1'].OutputValue"
  echo -n "Query Paramter= $queryParameter"
  outputVar='aws cloudformation describe-stacks --stack-name $2 --query $queryParameter --profile moe-ci --output text --region eu-central-1'
  result=$(eval "$outputVar")
  echo "searching variable:> $result"
}

AppName='my First App'
DevAccount=123456
TestAccount=98765
aws cloudformation deploy --template-file output1.yaml.yaml --stack-name myFirstStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount

getOutput important myFirstStack result
first=$result

getOutput moreImportant myFirstStack result
second=$result

aws cloudformation deploy --template-file output2.yaml.yaml --stack-name mySecondStack --parameter-overrides AppName=$AppName moreImportant=$second important=$first

very nice, isnt it?

Apr 132019
 

My third app is ready!

You can find the story behind that here: Story

What I have done:

New in this app:

  • Using AWS Polly for sound.
  • Using AWS-SDK locally.
  • Using native Audio from html 5 for playing sound.

I took the “Day2-App” with the same AWS API Gateways and Lambdas and poured in some new features on the client App.

Spending time

While working with Polly I spent much time to find a solution for playing a sound file on the client with the ionic-framework. As the solution should have worked on both Android and iOS, I tried new Plugins (like the native-media or the native-audio-plugin), upgrading and downgrading existing ones but nothing worked out at all.
It could have been so easy as ionic and Cordova support the use of HTML5. As I decided to try that out with a few lines…

let myAudio = new Audio (file);

myAudio.play();

Thats all, thats easy, that was not expected!

Second challenge was to convert javascript example into typescript.

Using the example in JavaScript would have cost me an hour. But as I’m more a fan of typescript, so… converting code was the next step. Took like half a day in the end but was worth the work!

What I learned?

  • Keep it simple (stupid) KISS Pattern.
  • Dont ask the framework, what it can do for you, ask yourself if its neccessary. First learn basics, then learn frameworks.
  • Convert javascript into typescript is possible.

Video

Day Three

Whole Story

Story

Roadmap

Mrz 222019
 

My second app is ready!

You can find the story behind that here: Story

What I have done:

New in this app:

  • AWS Translate for translate founded text.

And from day one:

  • AWS Rekognition Service for finding text in the image supplied by the client
  • AWS APIGateway as endpoint for the app
  • AWS Lambda to combine APIGateway and Rekognition Service
  • CloudFormation for automatic deployings
  • Ionic Framework for the client app on iOS and Android
  • Swagger to generate an Angular Client

Spending time

One train journey from JavaLand (Phantasialand/Brühl) to Braunschweig with delay.

What I learned?

  • AWS is always awesome! Because it is very easy to use and to combine AWS services.
  • My CORS – Problem isn´t automated, yet. I´ll try on.
  • One train journey is enough time for an App in prototype style, maybe change my story title…

Video

http://blog.thomasmichael.de/wp-content/uploads/2019/03/Day-Two-HD-720p.mov

Whole Story

Mrz 212019
 

My first app is complete!

You can find the story behind that here: Story

What I have done:

  • AWS Rekognition Service for finding text in the image supplied by the client
  • AWS APIGateway as endpoint for the app
  • AWS Lambda to combine APIGateway and Rekognition Service
  • CloudFormation for automatic deployings
  • Ionic Framework for the client app on iOS and Android
  • Swagger to generate an Angular Client

What I learned?

  • AWS is awesome! Because it is very easy to use and to combine AWS services.
  • My lambda function is obsolete, because of using Rekognition Service directly from APIGateway (next app, day-two or app-three)
  • Swagger is awesome too! Generate it from APIGateway, then using it to generate a technical client or server (maybe next times). This time I just focused on the domainmodel.
  • With ionic, Android Version works easier then iOS version. That’s a pity.

Video

http://blog.thomasmichael.de/wp-content/uploads/2019/03/40-days-40-apps-day-one.mp4

Apr 142018
 

Mit einem Elektroauto ist man eingeschränkt. Man hat nur eine begrenzte Reichweite, weil das Tanken viel zu lange dauert. Urlaube kann man mit einem Elektroauto vergessen. Stimmt das?

Wieviel Lebenszeit wird für das Tanken verschwendet?

Folgende Annahmen:

Ein Tankvorgang für ein Benziner/Diesel dauert ca. 7 Minuten. 10 Minuten erschien mir zu lang und 5 Minuten ein wenig zu kurz.

Es wird ca. alle 500 Kilometer das Auto vollgetankt.

Daraus ergibt sich je nach Jahreskilometer eine verbauchte Lebenszeit von 12.000Km/168 Min, 24.000Km/336 Min. usw.

Jahreskilometer Tanken ab Km Tankvorgänge Tankdauer in Min. benötigte Lebenszeit in Min.
12000 500 24 7 168
18000 500 36 7 252
24000 500 48 7 336
30000 500 60 7 420
42000 500 84 7 588
60000 500 120 7 840

Wendet man die gleiche Formel bei einem Elektroauto an, bei der Annahme, dass ein E-Auto in 30 Minuten für ca. 300 Km Reichweite tanken kann ergibt sich folgende Tabelle.

Jahreskilometer Tanken ab Km Tankvorgänge Tankdauer in Min. benötigte Lebenszeit in Min.
12000 300 40 30 1200
18000 300 60 30 1800
24000 300 80 30 2400
30000 300 100 30 3000
42000 300 140 31 4340
60000 300 200 32 6400

Es wird also deutlich mehr Lebenszeit beim Tanken eines E-Auto verbraucht. Richtig?

Wenn man es nur so betrachtet, ist es nichts mehr als eine Milchmädchenrechnung!

Nicht, weil 30 Minuten zu kurz für den Tankvorgang zu kurz sind oder die Reichweite mit 300 Kilometern zu optimistisch. Sondern:

Wenn man mit einem E-Auto innerhalb eines Tages innerhalb seiner Reichweite bleibt von 300-500 Km, dann gibt es keinen bewußten Tankvorgang der einem die Lebenszeit verbraucht!

Beispiel: Man pendelt morgens 100 Km zu Arbeit und Abends wieder zurück. Zu Hause kommt das Auto an die Steckdose und ist am nächsten Morgen wieder bereit. Dies bedeuten 0 (in Worten Null) Tankvorgänge, also kein Verbrauch der Lebenszeit.

Um einen angemessenen Vergleich zu haben, werden die langen Fahren (Urlaub) betrachtet. Denn nur bei Fahrten die über Reichweite des E-Autos muss bewußt getankt werden.

Urlaubsentfernung Tanken ab Km Tankvorgänge Tankdauer in Min. benötigte Lebenszeit in Min.
0 300 0 30 0
500 300 2 30 60
1000 300 4 30 120
1500 300 5 30 150
2000 300 7 30 210
3000 300 10 30 300

Die verbrauchte Lebenszeit ist nun deutlich geringer.

Wenn man dann auf langen Fahrten bewußt Pausen einplant um z.B. entspannt zu essen oder zu relaxen und sich nebenbei das Auto dabei auflädt, dann wäre es auch keine unnötig verbrauchte Lebenszeit. Und Pausen sollte man eh auf langen Fahrten einplanen.

Fazit:

Selbst wenn man mit einem E-Auto in den Urlaub fährt, erhält man pro Jahr mehr Lebenszeit. Der Tankvorgang wird nicht mehr bewußt ausgeführt, sondern wird nebenbei erledigt. Entweder abends das Auto an die Steckdose oder bei langen Fahrten, in dem bewußt eine längere Pause eingeplant wird. Meine persönliche Meinung ist, dass die Raststätten in Zukunft darauf ausgelegt sind, dass man sich dort länge als bisher aufhält. Die Anfahrt von besonderen Raststätten wird Teil der Urlaubsplanung, weil es dort die unterschiedlichsten Möglichkeiten zum Zeit verbringen gibt.

 

 

 

 

Jun 152017
 

Die Nutzung von enums in TypeScript ist ein wenig sperrig, aber nicht unmöglich!
Enum in einer TS-Datei definieren:

export enum MeinEnum{
A=1,
B=2,
C=4,
D=8,
D=16,
}

Einbinden in TS:

import {MeinEnum} from 'HierLiegtMeinEnum';

Nutzung in TS:

MeinEnum[MeinEnum.A];

liefert den Wert A als String zurück.

MeinEnum[MeinEnum.A].toLowerCase();

um den String vereinheitlicht zu nutzen, für Stringvergleiche.

Für die Nutzung in HTML benötigt TS noch ein Property auf das Enum:

private meinEnumInTS = MeinEnum;

und dann in HTML:


hatEinesDieserEnumWerte(meinEnumInTS.A, meinEnumInTS.D)

welches in TS zugreift auf:


hatEinesDieserEnumWerte(...e : MeinEnum): boolean{
// some Code
}

Nebenbei die Args – Notation für eine variable Anzahl gleicher Parameter!

Mai 252016
 

Nutzt ihr auch die Call Hierarchy um die Methodenaufrufe zu verfolgen? (strg + alt + h)
Stören euch auch die Testklassen?

Im Call Hierarchy – Fenster lassen sich unter „Filters…“ Klassen ausblenden.

Call Hierarchy

Dort einfach

*.*Test

Eintragen. Da die meisten Testklassen auf Test enden, war das Recht einfach.

Für Suchen geht das leider nicht, da könnte man mit einem Working Set aber ähnliches erreichen.
Ein großes Working Set für ein Projekt, ohne Testklassen erstellen und zukünfig nur noch im Working Set suchen.
Working Set