Windows 10 anniversary editions viktigaste feature – bash

Idag släpptes Windows 10 en stor uppdatering – Anniversary edition. Den viktigaste featuren är naturligtvis att man nu får möjlighet att köra Ubuntu userspace på maskinen!

Instruktioner för att slå på här.

För att slå på ska man slå på developer mode och slå på Windows subsystem for Linux (Beta).

Man installerar lämpligen en bra UTF-8 font också. Klicka på länken och ladda hem senaste versionen som zip-fil. Packa upp och gå till ttf katalogen. Dubbelklicka på DejaVuSansMono.ttf Klicka på installeraknappen i fönstret som öppnas.

sudo apt-get install git
git clone https://github.com/ogr3/bash-git-prompt.git ~/.bash-git-prompt --depth=1

Lägg till

GIT_PROMPT_THEME=TruncatedPwd_WindowTitle
source ~/.bash-git-prompt/gitprompt.sh

i ~/.bashrc och starta om Bash on Ubuntu on Windows.

Voilá, nu fungerar bash-git-prompt på windows utan att krångla med Cygwin.

2016-08-02

Publicerad i Linux, Windows

Dynamic programming with Java

Introduction

Dynamic programming is a very powerful tool  for optimization that not all developers have encountered.

So what is dynamic programming? Dynamic programming is a method for solving complex problems by dividing them into simpler subproblems and storing the solution to each subproblem so it can be looked up later. There is another type of algorithm, the ”greedy” algorithm, that also solves problem by dividing them into to subproblem but the difference is that for greedy algorithms you only use the result of the last subproblem when calculating the result for the following problem. The greedy approach will not work for more complicated problems.

Example: Using dynamic programming to attack the death star

Suppose you are the commander of the alliance fleet and you want to attack the death star. Rebel spies have gathered information about potential targets on the death star and calculated the amount of damage that would be caused by attacking these. The problem is how to deal with the protective shield surrounding the death star and the imperial star fleet. Now the alliance fleet has a brand new star ship that is able to penetrate the shield but this still leaves the problem with the imperial fleet, what to do? You come up with the idea that the rest of the rebel fleet should make a diversion by attacking an imperial stronghold on a nearby planet. This will create a window of opportunity for say 10 minutes. So the goal is to make as much possible damage to the death star given these 10 minutes.

You have the following available missions:

Mission nr Estimated time (minutes) Estimated damage on death star (%)
1 2 4
2 4 10
3 6 12
4 7 14

Let T be the total time (10 minutes).
So we have the following inputs:

  • Missions m1,….,m4
  • Each mission takes time t1,…., t4
  • Each mission causes damage d1,…., d4
  • Total time T = 10 minutes

What missions should we choose given the timeframe of 10 minutes to make the most damage?

Initial solution

To make things easier we will initially assume that the missions are ”repeatable” that is it is possible to execute the same mission several times.

A naive and ”greedy” approach would be to always choose the mission that has makes the most damage and is possible to execute given the time left. This would result in the following:

7 m 2 1 m
m4 m1

This results in a total of 18% damage. It is obvious that a better solution would be:

4 m 4 m 2 m
m2 m2 m1

This results in a total of 24% damage.

Now for this simple problem with few items (missions) and a few discrete values (amount of damage) it is pretty easy to find the optimal solution by visual inspection but when the number of items increases it will soon be impossible.

It is obvious that in order to find an optimal solution you must investigate different combinations of items (missions). One way of doing it would be to compare the value for all possible combinations of missions for a given time limit. Say that we have 10 items and that each item can be position in 1 of 20 locations that means 10^20 combinations = it will take more than a lifetime to calculate so we need a better solution. Dynamic programming to rescue!

We will try to find a solution to the problem by dividing it into subproblems.

Lets say we have an optimal solution for total time T and it contains missions m1, mi, mn with their corresponding times of t1, ti, tn:

t1 ti tn
m1 mi mn

Now if we remove mission mi with time ti, clearly what is left is an optimal solution for time T – ti. This implies that if we want to calculate maximal damage for a given time, damage(t), then we can do this by solving damage(t – ti) + di. Here ”i” can denote any mission with time ti and damage di but we dont know which one so we must try all of them.

Lets define the subproblems more formally:
D(t) is the maximal damage for that can be achieved given a timeframe of t.
Then D(t) can be defined using the subproblem: max { D(t – ti) + di}. Where ti <= t


So in order to find maximal D(t) the maximal damage for t – ti must already be known. We will therefore start with the simplest case e.g D(t0) = 0 and then move forward, minute by minute, until we reach t.

For a given timelimit t we will try to add all possible missions with time less or equal to the total available time and then choose the mission that result in greatest damage in total. To calculate the optimal total damage for a given time we need to know the optimal total damage for all cases with less time so that we can compare the net effect for adding a given mission.

An optimal vector for t0,…,t10 will be:

t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
0% 0% 4% 4% 10% 10% 14% 14% 20% 20% 24%

How do we reach this result?

  • For t0, t1 the maximal damage will be 0% since there are no missions that are less than 2 minutes
  • For t2, t3 the maximal damage will be 4% since the only mission that can be executed is m1
  • For t4 things get a little more interesting. We can now choose to execute m1 or m2. To calculate which one will result in most damage for the total solution we will compare these two options. To estimate the total damage for using m1 we will look at the optimal damage for t4-2 = 4% and then add the damage for m1 (4%) which implies a total damage of 8%. To estimate the total damage for using m2 we will look at the optimal damage for t4-4 (0%) and then add the damage for m2 (10%) which implies a total damage of 10%. To get maximal damage we therefore choose m2.

The following values are calculated in a similar way and note how we look up the results of previous subproblems two make the right decision for a given point in time.

The optimal damage given time = 10 minutes will be the value for t10 which is 24% but what missions were involved for reaching this value?

To find the missions we need to backtrack which subproblems were used to arrive at the value of 24% for t10.

  • For t10 we added mission m2 that has time t2 = 4 minutes
  • For t10 – 4 we also added mission m2 that has time t2 = 4 minutes
  • For t10 – 4 – 4 we added mission m1 that has time t1 = 2 minutes
t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
0% 0% 4% 4% 10% 10% 14% 14% 20% 20% 24%

To summarize, the solution included:

  • m2 (d2 = 10%, t2 = 4 minutes)
  • m2 (d2 = 10%, t2 = 4 minutes)
  • m1 (d1 = 4%, t1 = 2 minutes)
  • Total damage 24%, total time = 10 minutes

Below is function in Java that can be used to calculate a vector of damage for a given total time. The function returns a matrix where the first column contains the damage in procent and the second column is a pointer to the mission that was used chosen for the current time.

int[][] optimalForRepeatableMissions(int totalTime, int[] missionTimes, int[] missionDamages) {
   int totalNrOfAvailableMissions = missionTimes.length;
   int damages[][] = new int[totalTime + 1][2]; // add one extra dimension for storing index for used mission

   for (int currentTotalTime = 1; currentTotalTime <= totalTime; currentTotalTime++) {
      damages[currentTotalTime][1] = -1;
      for (int missionNr = 1; missionNr <= totalNrOfAvailableMissions; missionNr++) {
         int missionTime = missionTimes[missionNr - 1];
         int damage = missionDamages[missionNr - 1];
         if (missionTime <= currentTotalTime) {
int damageForAddingCurrentMission = damages[currentTotalTime - missionTime][0] + damage; if (damages[currentTotalTime][0] < damageForAddingCurrentMission) { damages[currentTotalTime][0] = damageForAddingCurrentMission; damages[currentTotalTime][1] = missionNr; } } } } return damages; }

To print the maximal damage for the previous example it can be invoked like this:

int[] missionTimes = new int[] { 2, 4, 6, 7 };
int[] missionDamages = new int[] { 4, 10, 12, 14 };
int[][] damages = optimalForRepeatableMissions(10, missionTimes, missionDamages);
System.out.println(damages[damages.length - 1][0]);

The expected running time for calculating maximal damage is O(Tn) where n is the number of available missions and T is total available time.

Final solution

Now consider a more "realistic" situation where the missions are not repeatable (its only possible to blow up a target once...) what changes must we do to our initial solution?

Previous we defined a subproblem as:

max { D(t - ti) + di}. Where ti <= t

But in the statement above we assumed that mission mi with time ti and damage di could be any mission. This is no longer true since a given mission can only be used once so we can only consider missions that have not been executed. We need to add an additional variable to indicate what missions are being used.

Therefore will use the following definitions:
D(t, i) is the maximal damage that can be achieved given a timeframe of t using missions 1,...,i
Then D(t, i) can be defined using the subproblem: max { D(t - ti, i - 1) + di, D(t, i - 1)}

D(t - ti, i - 1) will be applied when mission i is needed to achieve the optimal solution and D(t, i - 1) will be applied when i is not needed to achieve the optimal solution.

Instead of a vector the result will be a matrix with time on one axis and number of available missions on the other. We will calculate the maximum damage progressively looking up the damage for previous cases.

t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
m0 0 0 0 0 0 0 0 0 0 0 0
m1 0 0 4 4 4 4 4 4 4 4 4
m2 0 0 4 4 10 10 14 14 14 14 14
m3 0 0 4 4 10 10 14 14 16 16 22
m4 0 0 4 4 10 10 14 14 16 18 22

We find that using non repeatable missions leads to a total damage of 22% for time = 10 minutes.

We can find the path taken through the matrix (ie what missions were used) by backtracking from D(t10, m4).

  • We see that moving from D(t10, m4) to D(t10, m3) does not imply any change in damage, this means that m4 was not included in the solution.
  • We see that moving from D(t10, m3) to D(t10, m2) implies a change in damage, this means that m3 was included in the solution.
  • m3 has a mission time of 6 minutes which means that we will move back 6 minutes to find previous solution so we end up on D(t4, m2)
  • Using the same reasoning again we can conlude that m2 was included in the solution.
  • m2 has a mission time of 4 minutes which leads us back to time = 0 and we are finished

To summarize, the final solution included:

  • m3 (d3 = 12%, t3 = 6 minutes)
  • m2 (d2 = 10%, t2 = 4 minutes)
  • Total damage 22%, total time = 10 minutes

Below is the function in Java that is used to calculate the matrix above.

int[][] optimalForNonRepeatableMissions(final int totalTime, final int[] missionTimes, final int[] missionDamages) {
   int totAvailableMissions = missionTimes.length;
   int damages[][] = new int[totalTime + 1][totAvailableMissions + 1];
   for (int missionNr = 1; missionNr <= totAvailableMissions; missionNr++) {
      int missionTime = missionTimes[missionNr - 1];
      int damage = missionDamages[missionNr - 1];
      for (int currentTotTime = 1; currentTotTime <= totalTime; currentTotTime++) {
         damages[currentTotTime][missionNr] = damages[currentTotTime][missionNr - 1];
         if (missionTime <= currentTotTime) {
            int damageAddingCurrentMission = damages[currentTotTime - missionTime][missionNr - 1] + damage;
            if (damages[currentTotTime][missionNr] < damageAddingCurrentMission) {
               damages[currentTotTime][missionNr] = damageAddingCurrentMission;
            }
         }
      }
   }
   return damages;
}

The complete java code example can be downloaded from GitHub

May the force be with you...

 

Publicerad i Java

//Build/ 2016

Bro

Pier Madness

Fail Bail Jail

Fail Bail Jail

Jag har precis gått från Pier 38 till Pier 39, vilket kanske inte låter som någon större bedrift, låt mig förklara.

Jag tar det från början. Min plan för dagen var att först besöka REI som jag varit lite nyfiken på ett tag och sedan ta mig ner till området kring Fisherman’s wharf  för att hitta ett mysigt hak och skriva det ni nu läser. Betyder det att planen gick i lås? Tja, ungefär.

Jag bestämde mig för att fotvandra ner till REI som ligger i SoMa. Jag går sydöst längs 6th street. Ett par kvarter söder om Market börjar stan ändra karaktär och jag får lite känslan av att inte passa in.
Efter ytterligare några kvarter börjar det bli mer nedgångna industrilokaler och den där typen av barer som man mest ser på dåliga polisserier på TV. Hus och trädgårdar, dock inga träd i dom, dekoreras av kilometervis med taggtråd, lite getto-chict.
Jag ser inte längre några andra människor till fots ute på gatorna. Efter att passerat ett par motorvägsöverfarter börjar jag närma mig mitt mål. Jag ska bara gå ner för Bryant street en bit, det visar sig att vägen passerar framför stadens domstolsbyggnad och att området är fullt med härligt nedgångna Bail Bonds-firmor som jag också bara tidigare sätt på film, det ger hela stället en ”skön” känsla av urban desperation. En polisbil glider sakta förbi.

Läst senare på webben, ”The zone around Sixth and Mission can be sketchy if you’re walking alone, and at the very least the unschooled wanderer could come away with an impression of nothing more than highway overpasses and warehouses.” och jag kan bara hålla med.

Efter mitt besök på REI så bestämde jag mig för att prova min första Über, skapade konto, registrerade uppgifter, kort och sånt. Vilket fungerade hyfsat bra från mobilen.  Det blev svårare när jag skulle välja destination, efter ett par försök föreslog appen  Pier 38 och jag tänkte, ”jaja, det är nog ganska nära”. Efter en liten stund kommer Nancy i sin lilla svarta Toyota. Hon körde inte alls den sträckningen som jag föreställt mig men turen var ju förbetald och bara jag kom dit jag skulle så… Vi småpratar lite om allt möjligt, plötsligt stannar Nancy bilen och säger, ”nu är vi framme, Pier 38, det var hit du skulle”.

Jag kliver ur och ser mig om, visserligen är det en pir och vid vattnet men inte alls där jag trott, det var nog inte hit jag skulle.

Ej röd bro

En rejäl bro, men inte röd

Pier 39, Fisherman’s wharfs mest prominenta del, ligger bredvid Pier 35 och ca 4 kilometer därifrån ligger Pier 38. På vägen dit passerar man, i ordning, bland annat pirerna 31, 26, 22 1/2, 14, 3, 7, 15, 22, 31. Kanske inte en av de mer vedertagna talserierna. Så, bara 4 kilometer till på betong i stekande sol innan jag är framme. Det var i alla fall en vacker promenad med staden på ena sidan, vattnet på den andra och den dubbeldäckade motorvägsbron på den tredje.

Retrospektiv Margarita

Margarita

Toppen Margarita

I Fisherman’s wharf hittar jag ganska snabbt en liten Tequilabar, den ligger ett kvarter upp från de riktiga turistfällorna så det är många lediga bord. Snart sitter jag i den Kaliforniska vårsolen med en mycket läskande Margarita framför mig och försöker sammanfatta intrycken från det nyss avlutade //Build/ 2016.

Det började sedvanligt med registreringen, om man utfört sin online anmälan korrekt kunde man registrera sig med hjälp av en streckkod och en terminal, sen var det 90 minuters kö för att få sitt konferenspaket. Det fanns som tur var en alternativ kö, där man fick hjälp med att skanna streckkoden och de delade ut konferenspaketet direkt, den kön tog 10 minuter.

Registrerad och nöjd bär det av till Press Club för kvällens första event, det blir snart ganska fullt, men det är en högklassig tillställning med bra stämning. Därefter blir det Swedes@Build på Jillians, inte riktigt lika snofsigt men en härlig stämning så vi går vidare till Thirsty Bear Brewery för ett par intressanta öl till, bl a en Panda som smakade väldigt mycket choklad. Kanske inte min favorit.

I år hade de valt att göra om konferensen för att leverera mer av det som tidigare års delegater saknat och tagit bort det som de var missnöjda med. Så ingen frukost på konferensen.  Det nya upplägget var till en början ganska förvirrande och blir nog det igen efter ett par Margaritas till.

06.30 bara att tvinga sig upp för att hinna med en väldigt onyttig Diner-frukost innan det är dags att ställa sig i kön till keynoten.

Satya Nadella inleder konferensen med ett inspirerande tal om Microsofts relation med utvecklarna, teknik och öppenhet. Det var inte de riktigt stora nyheternas år men det fanns mycket som var intressant, inspirerande och roligt.

Visual Studio 2015, update 2

Några godbitar:
Xamarin for VS
VS Tools for Apache Cordova
VS Tools for UWA Development
Python Tools for VS

Xamarin har nu integrerats i alla versioner av Visual Studio  2015, ja även community edition, ladda hem update 2 och skapa lite sköna cross-platform appar.

https://www.visualstudio.com/en-us/news/vs2015-update2-vs.aspx

Visual Studio 15 och .NET Core

Om ni känner er lite mer vågade kan ni prova förhandsversionen av Visual Studio 15, käckt namn som säkert inte kommer orsaka några missförstånd 🙂

Stödjer Cross-Platform utveckling med .NET Core som kommer existera parallellt med .NET Framework och Mono.

.NET Core går att köra på Windows, OS X och ett flertal Linux distributioner. .NET Core är mycket mer modulärt än .NET Framework och kan anpassas efter behov.
Källkoden är distribuerad på GitHub så det är bara att sätta igång och skapa sin egen variant eller hjälp MS lite på traven.

https://www.visualstudio.com/news/vs15-preview-vs

Men vad hände med de andra versionerna då?

Jag citerar Scott Hanselman:

  • ASP.NET 5 is now ASP.NET Core 1.0.
  • .NET Core 5 is now .NET Core 1.0.
  • Entity Framework 7 is now Entity Framework Core 1.0 or EF Core 1.0 colloquially.
Målbild

Målbild för .NET

IoT

Vårens utbildningsresa för Microsoftgänget visade sig vara ”spot on”. Under konferensen satsades det mycket på sessioner och labbar kring IoT och Azure IoT Suite. Windows 10 IoT Core stödjer nu Raspberry PI 3 och det marknaden för tillbehör har verkligen exploderat.

Här är en intressant länk Connected Service for Azure IoT Hub

Docker

Docker för .NET finns som beta, vill man testa får man anmäla sig.

https://beta.docker.com/

Även Bash är på gång till windows.

Microsoft Bot Framework

De har ett gäng intressanta och underhållande APIer för kognitiv dataanalys, ”cognitive microservices”. Man kan läsa av ansiktsuttryck, analysera innehållet i bilder, tolka naturligt språk och mycket annat.

Azure Service Fabric

En molnbaserad distribuerad platform för att hantera microservices.

Azure Service Fabric översikt

DocumentDB

DocumentDB Microsofts Azure-baserade NoSQL databas stödjer numera Apache MongoDB drivers vilket innebär att ni som har MongoDB skills kan köra era verktyg och bibliotek mot DocumentDB.

Destination Mars

Mars

Destination Mars!

Microsoft, JPL och NASA har tagit fram ett event för ett av NASA’s besökscenter.  En 3D upplevelse med Hololens på huvudet och Buzz Aldrin som ledsagare. Vi fick mäta avståndet mellan ögonen, jag vann(?) i min besöksgrupp. Därefter slussades vi in i ett rum där vi fick möjlighet att ta på och justera våra Hololens’s innan upplevelsen startade. Det var första gången jag haft möjlighet att testa Hololens, det var en intressant upplevelse, den ser mycket klumpigare ut än vad den känns när man bär den. Därefter fick vi gå runt på Mars yta. Jag lämnar detaljerna av upplevelsen till era besök på Kennedy Space Center. Det var ett mycket populärt event på konferensen och det var långa köer men det var väl värt väntan tycker jag.

MS Build Hackathon 2016

MS Build Hackathon 2016 gick av stapeln i ett av Microsofts kontor i San Francisco och startade strax efter att den sista föreläsningen på konferensen avslutats.

Jag anslöt mig till ett trevligt gäng från ett konkurrerande bolag när det återstod sex timmar av Hackathonet, jag hade tänkt hjälpa dom med den video som enligt reglerna skulle produceras och publiceras på Youtube inom Hackathonet’s 24 timmar. Tyvärr blev det inte mycket tid till att åstadkomma något vettigt då det blev en mycket stressig avlusning in i det sista. Men det var kul att se hur de organiserat det och vad de olika lagen lyckats åstadkomma. Jag tror att Microsoft filmade en del, så kanske ni kan hitta något om ni letar.

Nu är det dags för en avslutande Margarita.

Publicerad i .NET, DevOps, DOcker, Windows

Test av Google Cloud Vision API

I torsdags släppte Google Beta-versionen av Google Cloud Vision API. Via API-et kan man skicka upp bilder och få tillbaka taggar som beskriver vad bilden visar – allt från vilken blomma som finns på bilden till kända landmärken, eller att kategoriera olämpligt innehåll vilket är användbart för tjänster där användare laddar upp bilder. Vidare kan API-et detektera ansikten och deras ansiktsuttryck samt tolka text. Något som explicit undantas är ansiktsigenkänning, en funktion vi vet att Google är bra på redan. Om man vill ha ansiktsigenkänning kan man istället använda Microsofts motsvarande vision-API som har liknande funktioner. Microsofts API har dessutom funktioner relaterade till röst och video.

Tjänsterna öppnar helt klart nya möjligheter men ännu lite oklart om de kommer att ta marknaden med storm eller förbli ett litet API i marginalen bland många andra.

Jag provade att ta en bild ut från kontoret och se vad Google-tjänsten kunde gräva fram ur den. Urvalet objekt är ganska stort: Cykel, bro, väg, buss, hus, vatten, övergångsställe, gångbana. Spännande!

utsikt-kungsbron-small

Jag registrerade mig, skaffade en API-nyckel och curl-ade upp bilden till API-et. Svaret var:

”description”: ”transport”,
”score”: 0.95152622

Ja, den taggen funkar och utgör faktiskt en riktigt kompakt och funktionell beskrivning av hela bilden.

Men jag var nyfiken på mer. Jag hittade en skiss jag undrade om den kunde tolka:

whiteboard

svaret på den frågan blev

”description”: ”sketch”,
”score”: 0.8966288

Hm. ok.

Publicerad i Uncategorized

Code Night #4: Continuous Delivery med Tutum och Docker

I torsdags körde vi workshop hos IDG på Code Night #4 som hade temat Continuous Delivery.

Kvällen blev mycket lyckad och vi fick mingla runt bland många likasinnade.

Kvällen inleddes med korta föredrag på ämnet för att sedan bjuda in till workshop där Kristoffer och jag presenterade och demade våra erfarenheter kring att produktionssätta en tjänst med Docker-teknik på molntjänsten Tutum och AWS.

IMG_4880

Många var intresserade av att höra oss berätta om hur man kan bygga en applikation på det vis man verkligen vill, från scratch, nu 2016.

Syret i lokalen tog fort slut men folk höll ut och fick höra oss berätta om hur vi byggde en systemproduktionslina baserad på Docker, Tutum, GoCD och Amazon EC2, från källkodsrepo till produktionsmiljö. Vi gick igenom hur det är uppbyggt och fungerar och hur man arbetar med det.

Vår story baserades på utvecklingsresan med http://www.welcomeapp.se hösten 2015 där vi på kort tid tog vi fram frontendsystem, backendsystem med klustring, lastbalansering, backup, MQ och webbsajt samt flera pipelines.

Slides från kvällen: http://www.slideshare.net/KristofferVidmo/continuous-delivery-med-tutum-och-docker

Demosystemet (Spring Boot) finns på github: https://github.com/cag-demo/cag-demo-api

Under kvällen utlovade vi en en kvällslabb på temat Java-server med Docker i molnet, inbjudan till den finns här: https://blog.cag.se/?p=1387

Publicerad i Cloud Computing, Continuous Delivery, DevOps, DOcker, Java, Linux, Uncategorized

Labb Java-server med Docker i molnet

Torsdagen den 10:e mars kl 17.00-20.00 c:a kör vi en kvällslabb på kontoret i Kista där vi lär oss installera en Java-server som Docker-container i molnet.

Metoden är också användbar för att bygga tjänstestubbar för REST och SOAP.

Vi kommer att inleda med att installera Docker och clona repos med Git.

Formen är BYOL (Bring Your Own Laptop), men det gör alls inget om bara hälften har laptop så vi kör två på varje.

Labben är kostnadsfri och antalet platser är begränsade.

Vi bjuder på en lättare förtäring.

Anmäl dig till daniel.marell@cag.se

Adressen är
Jan Stenbecks Torg 17
Kista

Varmt välkomna!
Daniel Marell
Kristoffer Vidmo

Publicerad i Uncategorized

Jfokus 2016

Nu är årets Jfokus historia. I ett försök att ge en översiktlig bild av innehållet kategoriserade jag sessionerna enligt följande:
jfokus 2016

Den översta kategorin hamnade allt som är relaterat till “vanlig programutvecking med Java”: Metrics-verktyg, Lambda-knep, concurrency, DDD, JEE, JPA etc. De flesta sessionerna hamnade i detta fack, vilket är naturligt när majoriteten av besökarna är Java-utvecklare.

En stor del av sessionerna handlade som vanligt om Oracles arbete med och planer för Java-plattformen. Detta år var dessa sällsynt oinspirerande. Men ok, det kanske egentligen inte är så dumt om det mest intressanta sker med hjälp av själva Java-plattformen och inte i plattformen själv.

Mikrotjänster är heta och de möjliggör att många team kan jobba effektivt ihop. Bert Ertmans session var suverän där han på ett insiktsfullt och begåvat sätt målade landskapet kring mikrotjänster. En insikt jag bär med mig är att inte falla i återanvändningsfällan när man implementerar mikrotjänster. Hela idén är att tjänsterna ska vara oberoende och inte skapa ett CM-kaos. Kopiera faktiskt hellre koden, och inför absolut inte en gemensam AbstractMicroservice.

En annan insikt är att organisationen du arbetar i bör spegla arkitekturen du har. En mikrotjänstekitektur bör stödjas av en organisation där teamen äger sina tjänster.

Vi återkom ofta till nackdelarna och svårigheterna med mikrotjänster i och med att de drar med sig alla gamla problem som hör till distributed computing (*). En mikrotjänstearkitektur gör bäst ifrån sig i större organisationer med många team. Och kungen av mikrotjänsteramverk är fortfarande Spring Boot. JHipster som stämplar ut en applikation med Spring Boot och AngularJS var föremål för ett par sessioner:

En tydlig uppmaning från flera håll var: “Tänk inte ens tanken att införa mikrotjänster innan ni har DevOps på plats”

Continuous Delivery och Docker är något som de flesta redan accepterat som något åtråvärt, men fortfarande är inte majoriteten av oss där. En mikrotjänstearkitektur gör det enklare att nå Continuous Delivery och Docker passar också som handsken där. Många har provat Docker men få kör det än så länge i produktion. Jag var en av de få som fortfarande höll upp handen när Ray Tsang från Google sade “och håll kvar handen uppe ni som också har Docker i produktion”. Yes! En av få.

kubernetes

Dan North höll som vanligt en suverän session. Jag lyssnade på Beyond Features där Dan sågade modellen “Civil Engineering Shop” för mjukvaruutveckling. Modellen fungerar inte eftersom vi tror att vi vet vad målet är. Det är inga nyheter i den agila världen men ändå värt att återkomma till. Dan liknade vidare mjukvaruutveckling med kirugi, en fungerande liknelse tycker jag. Ingen vill ju egentligen ha kirurgi, men måste man bli opererad vill man bli skuren i så lite som möjligt. Påminner mig när Mattias Karlsson en gång sa något i stil med att “den bästa programvarulösningen är den vi slapp skriva”.

Förvånande lite handlade om automatisk test, vilket på senare år seglat upp i vårt medvetande som en av våra svåraste vardagsnötter att knäcka. Det kanske är så att problemet är så segt och att få eleganta lösningar finns att få föreläsare går igång på det.

På frontend äger AngularJS fortfarande. En session tillägnades uppstickaren React.js. Verktygen på frontendsidan är snabbt på väg upp men är långt ifrån ikapp mognadsmässigt (node, npm, bower). Överhuvudtaget märks det tydligt att frontend är betydligt mer omoget tekniskt än backend. En orsak tror jag är vad jag upplever vara en mer tillbakalutad inställning till beroendehantering, paketversionering och gränssnittkontrakt.

Ingen presenterade en bra lösning på automattestning för frontend.

NoSQL och Big Data var representerat i bara ett par sessioner.

Ämnen som berörde AI dök faktiskt upp i ett par sessioner i år. Det kanske blir fler nästa år.

På sparlåga i år: JEE, icke-Java JVM-språk (Clojure, Scala, Groovy, Ruby, Kotlin)

jfokus avslutning

Tack Mattias och Jfokus-teamet för Jfokus 2016!

Publicerad i Uncategorized

Säkra upp dina tjänster med certifikat från Let’s Encrypt

Nu finns det inte längre några ursäkter att inte ha https påslaget på sina tjänster. Let’s Encrypt (https://letsencrypt.org/) tillhandahåller gratis certifikat som fungerar i alla moderna webbläsare.

Jag roade mig med att sätta upp ett cert på min server hemma och passade på att skapa ett skript som automatiskt förnyar certet innan det går ut. Servern kör CentOS 7 med Apache, men det går lätt att modifiera till annan webbserver/operativ.

Strategin med Let’s Encrypt som jag följde var att låta dem starta en http-lyssnare i samband med att certet skapades. Sedan använder man en ACME-challenge i sin webbroot för uppdateringen för att slippa ta ner webbservern i samband med förnyelsen.

Så här gjorde jag för att skapa certet (man behöver Git och bc installerat på servern):

sudo mkdir /opt/letsencrypt
sudo chown : letsencrypt
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
sudo servicectl stop httpd.service
/opt/letsencrypt/letsencrypt-auto certonly --standalone
sudo servicectl start httpd.service

Let’s Encrypts script kördes interaktivt och där angav jag hostnamn etc (cybermoose.org och www.cybermoose.org).

Nu finns certet under

/etc/letsencrypt/live/cybermoose.org/...

Man behöver sedan peta in lite SSL-relaterad info i sin virtuella host som lyssnar på det namnet:


ServerName cybermoose.org
ServerAlias www.cybermoose.org


SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cybermoose.org/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cybermoose.org/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/cybermoose.org/chain.pem
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"

Nu ska servern svara på https och leverera grönt hänglås i webbläsaren.

En bra sajt som testar kvaliteten på anslutningen är SSL Labs.

När detta ser bra ut kan man lägga till autouppdatering av certifikatet. För det används ett skript – le-renew-certificates.sh med tillhörande konfigurationsfil le-cybermoose.org-webroot.ini

Alla skript och konfigurationen finns på Github

Publicerad i Cloud Computing, DevOps, Linux

Motorvärmarstyrare med raspberry

Problem att lösa

Min fru jobbar skift.  En tidig kall vintermorgon så är det bra för husfriden att motorvärmaren till bilen har gått på.  Som både snål och miljövän så vill jag inte köra motorvärmaren mer än nödvändigt. Att ställa om en timer har vi gjort i flera år.  Det känns sååååå 2009 numera.

Byggstenar

tellstickFör att lösa problemet rotade jag i lådan och tog fram det jag hittade.  Först en Raspberry Pi att använda som en strömsnål enkel dator.  Sedan tog jag fram min Tellstick och en Nexus strömdapter (för att styra starkströmmarna).  Med dessa prylar så är det uppenbart att det kan bli en lösning.

nexaLösning

Raspberry_Pi_-_Model_AAtt styra Tellstick med en raspberry finns på andra forum att hitta.  Mitt problem var snarare hur tiden ska ställas in för när motorvärmaren ska gå i gång.  Till detta utnyttjar jag Google Calendar (som jag och min fru redan använder).  Var 15:e minut hämtar nu raspberryn hem vår delade kalender i ICS-format (Google stödjer att en kalender har en ”hemlig” url så att man får ut händelserna).  Detta får styra när motorvärmaren går på.  Min idé att utgå från fruns schema (som finns i en kalender) och starta värmaren X minuter före hon börjar föll inte i god jord – men det är såklart en enkel match att lägga till vid senare tillfälle.

Dessutom var det enkelt att göra en hemlig (för mig och min fru) webbsida där vi spontant kan starta/stoppa motorvärmaren i 60 minuter.  Med ett curl-anrop från raspberryn så returnerar webbservern ett resultat när man trycker på en knapp på webbsidan.

Kvar att göra

Jag har fortfarande ingen som sätter i kabeln i bilen.  Det har min fru däremot…..  Nästa bil ska nog ha en inbyggd modern motorvärmare som jag hört finns.
WS2801_pixel_node_100node_a_string_IP68

Extra effekt

Om jag nu har en Raspberry Pi påslagen dygnet runt så kan jag använda mina WS2801-lampor som är vattentåliga.  En programerbar julslinga blir fint i vintermörkret.  Jag har tidigare styrt lamporna med Arduino och Raspberry (se video).  Ni fattar nog poängen att man kan göra något trevligt med det.

Publicerad i C/C++, Linux

OS X El Capitan för Javautvecklare

Jag uppdaterade min Macbook till El Capitan idag och stötte bara på några små saker. Precis som vid uppdateringen till Yosemite och Mavericks så avinstallerar Apple Java 6. Det medför att IntelliJ inte startar efteråt, då dess launcher är hårdkodad att använda Java 6. Dessutom ser fonterna ut som skit rent ut sagt om man kör IntelliJ på en modern Java från Oracle.

Lösningen är att återinstallera Java 6 från Apple.

XCode command-line tools behöver installeras om:

xcode-select --install

Sen kommer det roliga – Apple låser numer ner ett antal kataloger så att inte ens root kan editera innehållet, bl.a. /bin och /usr. Dessutom ändrar de ägare av /usr/local till root, vilket ju effektivt förstör Homebrew.

sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local

följt av

brew doctor

Löste det. Enligt uppgift ska man fortfarande få ha tillgång till /usr/local, men det kan hända att kommande uppdateringar ändrar ägarskapet igen.

Mitt gamla trick att ändra /etc/paths att ha /usr/local/bin först för att kunna köra homebrew-installerade verktyg före Apples var orört efter uppdateringen och /etc/hosts går att editera.

Publicerad i Java, OS X

Kategorier

LinkedIn Auto Publish Powered By : XYZScripts.com