Hvordan plotter maskinen en sirkel?

Jeg har grublet på spørsmålet med hvordan en sirkel blir formet i et koordinatsystem x y slik skjermen på en digital enhet er. Jeg fant noe som heter midpoint circle algorithm og jeg forstår ikke helt algoritmen men den tar imot et koordinat for senter av sirkelen som skal tegnes og en radius og tegner åtte punkter av gangen helt til sirkelen er komplett.

Når du lager en sirkel i et tegneprogram så vil jo den vises på skjermen med en gang fordi maskinen er så rask men egentlig så tegner den hvert punkt og sånn jeg forstår det så er det denne algoritmen som er i bruk men det kan hende det finnes andre. Selv begynte jeg å tenke på radianer og polarkoordinater og alt mulig for det naturlige ville jo være å finne hvert punkt i sekvens heller enn å tegne 8 steder på en gang. Men denne er ikke avhengig av radianer eller polarkoordinater.

Sjekk ut en sakte demonstrasjon:

(DU MÅ GÅ INN PÅ BLOGGPOSTEN FOR AT KODEN SKAL KJØRE HER)

Tegner sirkel på x=200 y=200 i et 400×400 felt

Radius:

Operasjoner:0

dx:

dy:

decisionOver2

I artikkelen jeg viser til på wikipedia bruker algoritmen i kode bitshift-operator til venstre. En artig ting jeg lærte her er at bitshifting av et heltall med en plassering er det samme som å gange tallet med to. Så det ble lettere å tenke på diameter som radius ganger 2 enn diameter som radius bitshift 1.

Hvis man har et binærtall: 0110 (4) og bitshifter dette til venstre: 1100 så blir det 8. Bitshifter man en gang til har man 11000 og det er det samme som 16 altså en dobling til. Det er litt stilig og egentlig logisk men jeg har aldri visst det før.

Midpoint circle algorithm er først implementert i Assembly for lenge siden og jeg tenker at å bitshifte radius en gang til venstre for å gange den med to sikkert er mer effektivt fordi en multiplisering antakeligvis inkrementerer noen tall så og så mange ganger og derfor er sikkert multiplikasjon en kostbar operasjon men jeg tror at dagens kode vil lese alle heltall ganger to som en heltall<<1 altså bitshifte heltallet en til venstre for jeg vet at det er gjort mye for å optimalisere. Algoritmen bruker kun heltall og et avvikstall bestemmer hvordan man skal justere x og y slik at det blir en sirkel. Noen variabler i koden forstår jeg ikke ut i fra navngivingen men jeg har refaktorert ut bitshiftoperasjonen:

Det er interessant at algoritmen kun bruker heltall altså ingen flyttall og «decisionOver2» er et avvik definert som 1-diameter i begynnelsen men det endrer seg. Det hele handler om å bestemme x og y og antall operasjoner øker med radius og det er helt sikkert et forholdstall men jeg føler det er så mye å tenke på på grunn av at hver iterasjon tegner utover fra fire punkter.

Jeg husker vi problematiserte sirkelen på barneskolen også med en passer og jeg ser at om man endrer dx i utgangspunktet vekk fra 1 vil man få noe annet enn en sirkel. Samme gjelder endringer i dy. Men sirkelen må være ganske rasjonell ut i fra at dx og dy begynner på 1 og senere i koden endres den hver gang den skal endres med 2.

For hver operasjon bestemmer man på bakgrunn av kriteriet «decisionOver2» i koden (definert som et avvik i C versjonen av koden) både om man skal øke y og om man skal minke x. «decisionOver2» endrer seg også hver gang man tar denne beslutningen og det er forbløffende at det skaper en sirkel for jeg klarer ikke vri hodet rundt konseptene. Ganske stilig.

Første innlegg på norsk hvor jeg snakker litt om Facebook fra mitt synspunkt

Jeg har bestemt meg for å bytte språk på domenet mitt til norsk. Da kan jeg kanskje nå et publikum hvor jeg tidligere har blogget i et intet hvor ingen har lest særlig mye for jeg har ikke fått en eneste seriøs kommentar.

Jeg er masterutdannet innen Informasjonsvitenskap fra Universitetet i Bergen. Etter mastergrad var fullført begynte jeg å jobbe i Oslo som IT-konsulent og dette var en fin tid men jeg bestemte meg for å si opp jobben i forbindelse med at jeg var litt lei av stillingen. Jeg er på utkikk etter ny jobb og veldig åpen for hva jeg skal kunne drive med men håper jeg får en jobb som er relevant for utdannelsen.

For den som ikke vet hva en informasjonsviter gjør så kan jeg fortelle at utdanningen har vært mye sentrert rundt programvareutvikling og ikt generelt. Jeg ser etter jobber som programmerer eller utvikler men lurer litt på om jeg kunne passet i en annen jobb. Jeg har for eksempel jobbet mye med brukerstøtte under utdanningen og kontakt med kunder per telefon og epost er noe jeg kunne ha trivdes med.

Tidligere på bloggen har jeg blant annet vist et privat prosjekt basert på en Tvitter-integrasjon uten at dette har skaffet meg noe ny jobb. Det var fint å være uten jobb i begynnelsen men nå føler jeg at jeg har lyst på en hverdag hvor jeg gjør noe som føles nyttig. Jeg tror jeg skal fortsette å skrive og ser for meg mange emner jeg kan blogge om fremover. Det skjer mye og i media omtales mye jeg kan kommentere.

Jeg har tidligere skrevet om «trolling» på engelsk. Selv har jeg vært dårlig på å takle Facebook som et samfunnsfenomen og omtrent sluttet å bruke det. Facebook driver mange konflikter enten det er trolling, trusler eller sjikane som er i senter og sist uke gikk justisminister Sylvi Listhaug av etter at hun hadde postet et bilde og en kommentar som ble oppfattet som krenkende etter terroraksjonen 22. Juli 2011 på Utøya.

Jeg selv har brukt Facebook ganske ukritisk i perioder og har hatt uheldige mønstre. Det var aldri noe fasit på hvordan man skulle bruke sin Facebook-konto og Facebook utviklet seg etter hvert som vi brukte det. I dag bruker jeg det omtrent ikke i det hele tatt og føler ikke noe tilknytning til nettstedet. Jeg har en profil og jeg mener det kun ligger ett bilde der og det er mitt profilbilde.

Fra helt i begynnelsen da jeg ble medlem i 2007 til jeg slettet kontoen min i 2017 har jeg postet utallige statuser jeg angrer på, jeg har dannet avstand til mennesker jeg helst ville vært gode venner med og jeg har brukt funksjonaliteter på helt feil vis. Jeg er ikke alene. Noen av feilene har ført til at Facebook har blitt utbedret med tanke på funksjonalitet men i dag er mitt bruksmønster sånn at om jeg i det hele tatt sjekker facebook så er det sjelden jeg trykker på like eller kommenterer noe for jeg syns det er en utrolig sårbar ting å gjøre.

Jeg ser at mange som fortsatt ivrig deler i sosiale medier har flyttet seg over på Instagram, som også er eid av Facebook. Det er interessant å se gamle kjente fra skoletiden legge ut bilder av seg selv på reise eller på fjellet for jeg husker jo dem godt men det er lenge siden jeg har delt et bilde selv.

Jeg tror sosiale medier har truffet et behov vi mennesker har for å vise vår egen selvrealisering. Jeg tenker selv på at jeg har postet bilder av meg selv sammen med kjendiser eller foran kjente bygninger og ser mange som gjør det samme. Det minner meg på Maslow sin behovspyramide hvor status er noe vi trenger før vi kan oppnå selvrealisering. Jeg har alltid tenkt på at selvrealiseringen er noe som kunne være å bestige et fjell men her har altså bildet og statusen ved å bestige fjellet blitt grunnen til at vi deler. De sosiale mediene appelerer til vårt statusbehov og kvantifiserer veldig i form av at man kan telle hvor mange som liker, hvor mange som følger og så videre.

I likhet med dette kan jeg i min verden hvor jeg har denne bloggen tenke at jeg ikke mottar en eneste seriøs kommentar og derivere min sosiale person ut av dette. Jeg har ikke noe følgerskare men da jeg var i et forhold fikk jeg veldig mye likerklikk basert på poster som handlet om meg og mitt forhold på Facebook. Etter jeg slettet det og begynte på nytt igjen så hadde jeg aldri nok interesse. Jeg syns egentlig tiden med Facebook har vært veldig skremmende og det å leve i en verden hvor man poster noe og så venter på likes har vært sårbart.

Sist bloggpost jeg skrev skrev jeg på engelsk om trolling. Det er utrolig hvor mye personangrep som gjøres på Facebook. Det var ikke før jeg begynte å bruke LinkedIn at jeg fikk mer konkrete synspunkter på bruk av sosiale medier for mange spesialiserer seg på å være rådgivere men mitt råd får være: Gjør så lite som mulig på Facebook. Alle ser alt der inne og det du opplever som vanvittig morsomt klokken 4 om natten er en katastrofe i andres øyne neste dag. Egentlig burde vi ha brydd oss litt mindre om Facebook men jeg tror etter alt som har vært i media hvor det også blir straffesaker av feil bruk at mitt råd syns jeg er ganske godt.

Blogglistenhits

Status of the Smileyhash project after relaunch

After I deleted Smileyhash I had no hobby project to show I felt. I only had some demo work not working and not available online. Therefore it was a great feeling to relaunch the AWS backend and I am looking into improving the site with server side rendering and live updates on the front page from time to time.

I see that there is some noise involved in my hashtag, especially someone is using the hashtag #smiley2 repeatedly and this affects the main site and the general smileyface but the average of all smileys is not an interesting measure of anything so it does not really matter.

I want you to know that you can create a panel of searches. Here is an example showing a panel of two searches.

I have been thinking of more use cases for the Twitter API and there are lots of potentials for developing apps with Twitter features.

Internet abuse and trolling

I will not by writing on this theme attempt to take ownership to my statements as these are thoughts I have adopted through my LinkedIn connections. I am not a founder of these thoughts but want to share some thoughts on «trolling» and how this is something very many are subject of conducting in online discussions.

I find that my language contains a lot of my emotions and this is a pattern in my behaviour that has given me a lot of challenges.

A statement I agree on in online discussions: «Do not write anything about a person you could not say to the person in real life». Being unemployed, a statement on data science and prerequisite knowledge was presented in my LinkedIn feed. A lot of theories were presented as prerequisite knowledge and none of the theories were in my curriculum as information scientist in my degree. Therefore, one could perhaps based on this person’s opinion derive that I am not a data scientist. I am not able to understand low level concepts and I have to accept that meltdown and spectre is too complex for me to fully understand.

I first wrote a comment stating something like «shame on you, if you interviewed me I would want to throw my coffee at you». I realized, through someone else posting about trolling that I had been a troll in some way, although it depends how you define «trolling» as it is a vague new term. At least I reacted to my language and emotional behaviour and the fact that I was so biased. I redefined my comment in to suggesting that every person he interviews has a different curriculum and I stated that education should be a proof that you are able to learn. I also suggested that instead of labelling this as being a prerequisite that he was more willing to find candidates who had not been presented to these theories, hire them and educate them.

I see many discussions on facebook and very many show traces of my pattern of behaving based on emotions. #metoo have been a great example. I have decided to work on being aware of the pattern of «trolling» online. When I feel like characterising a person as a «pig» or otherwise I try to bear in mind that this is not constructive at all. If you have disagreements, both online and in real life, the discussion is much better if you can be constructive and make a point without poor lingual characteristics. Otherwise, in my opinion, it is best to keep silent.

Ever since Facebook arrived I have been making huge mistakes on usage of social media. I believe most people do or have done in the past or feel the same thin line in the participation of the social media world. There is however no reason prior mistakes should prevent anyone from not improving and that also includes me. I will thrive to improve my language online and become one of those examples I find both in social media and for instance in debates on TV. The ones who really gets their thoughts put up front in a debate are the ones who work on not becoming too emotional in their language and don’t fall into the temptation of verbally attacking the other debaters and really have a well thought out reasoning for their opinion.

Using React for more than an intranet SPA application

Single Page Applications can be written in many ways with many frameworks, I have decided to concentrate on reading about React. In many cases, the standard application where an application is mounted in to a point in an almost empty html document is sufficient. I have previously written about the possibility to include a react app only in a part of a web site.

You should know that the standard SPA React app does not work well online, and server side rendering should be applied if you want to plan a web app based on React that is supposed to work online and get indexed by search engines. What you want is html to be served when the page loads – search engines read this and does not care to wait for JavaScript to populate the site.

Single Page Application written in React are popular in the IT industry and many projects I have seen is about creating an application for use internally in an organisation. It is then fine to use the boilerplate «create-react-app» and just write an API for the app. But if you are creating an online experience today you might want to look into server side rendering.

I have been struggling to find a good architecture but yesterday I found efforts online to server side render using PHP. I have seen efforts on node.js before but let’s face it – most web hotels use PHP and I feel that still using PHP perhaps with a framework is most suitable if you want your code to be reused or sold on a broad scale.

I will look into this more carefully by writing some example code if I have time. It turns out there is a PHPJsV8 extension and there are several ways of rendering React directly with PHP. With the extension installed in React-PHP-V8Js and there is also an effort from the Symfony community that seems not to need the extension called ReactRenderer.

Smileyhash services has been deleted

I have deleted the services for Smileyhash. They were hosted on AWS and I received a bill for some services and was unable to delete these services so I deleted the whole account. I am not sure I will bring it back up again and perhaps I will delete Smileyhash all together.

Using Redux all over is an anti-pattern – why?

I am attending quite a few job interviews these day and we sometimes we discuss React and Redux.

I was presented with the idea of using Redux «all over». To me that sounds like you have no attributes in your components and connect to redux in every component all over your solution.

This is not the way to go. Creating components that takes attributes is the core to Web Components. It is based on the mindset of all of the web and the work of WHATVG and html standard. It makes your component readable and reusable.

You don’t want to connect to Redux store in all of your components. Connect in the container and propagate to your components using props.

An example I discussed in an interview today was a todolist.

See code below…

EDIT: The pastebin is incomplete and one problem in the code is the iteration sequence – the number in row of todolistitems needs to be propagated in my anti-pattern.

The point is – any kind of component that takes data should receive them as attributes/properties. I was just introduced to the idea of using Redux «everywhere» in an interview and my point is that you do not have to connect every component to redux. This will even make your code slower (perhaps) – you iterate over the array and you do not access the values in the loop.

This is really sigletonitis all over again – as a disease where you over-use a pattern. Just on Redux or whatever datastore you might implement.

Lessons learned from developing and introducing the Smileyhash app

At http://smileyhash.perandersen.no you can see a React Web app I have developed myself. But no one uses it. However, at least, I know I am able to make a web app.

I have things on my Trello board that I will look into, unless I start chasing other ideas and I have stopped doing development as I uploaded it to the host and posted about it on LinkedIn, I posted it on Reddit and I posted it on my facebook profile and no one has made any tweets with the hash tag.

For me it is hard to know if it was the idea and concept that didn’t seem appealing to people (what is the use for the tweeter anyway? They don’t benefit from rating their tweet mood using my hashtag) or if I just have not been doing enough to gain mass interest. It is not something I would try to make viral through spending on ads, as I would not see any income from it. And working more on making it indexable for search engines is something I have on my list, but I do risk that people never tweet using the tag even if it is indexable for search engines. So it is hard not to move focus over at developing other apps and ideas.

If I was to make some kind of app and/or web service successful, I think it would have to be concerning something people actually need. And those ideas are hard to get. At least now I know that I have the ability of following thorugh and I know I am technically able to make a solution based on an idea. This is great news.

Upgrading websites with SPA behaviour without destroying search engine readability and design.

I started doing web frameworks a few years ago and have been experimenting both with Angular and React. What I normally think is that the Javascript application is what I design and nothing more. And normally it is designed as a single page app.

Basically what happends when you create an app in a JavaScript framework is that you let the framework take control over the DOM manipulation but it is known that search engines can’t see the content.

In react there is a way past this that is called isomorphic react and this is a good strategy if you are building a new interactive website today that is kind of unique when it comes to functionality. At least it is an option to using a CMS.

But if you already have a website, and you use a CMS that server side renders the content it can be upgraded making parts of it into React or Angular apps. You can even do this with existing parts of a website.

The interesting thing is in the way a single page app is mounted in to your website.

In a Single Page App you have a static html file that usually only contains a div element with a ID such as «root» or «app» and little other. And this is what google sees. An empty element. Everyting else happends in time after this has been loaded and Google doesn’t follow this. It only sees the empty div.

But the beauty is, as an alternative to isomorphic renderToString in react – the mount div does not have to be empty.

This means that the following approach can be taken, both when creating web sites from scratch instead of running node.js on the server, you can place static content in the div.

I think you will find benefits in isomorphic react and building with this as an architecture for web apps and services that exist online, but when upgrading existing sites, this is beautiful. Take the static content and introduce dynamic behaviour with the existing markup and style as base and mount to the div you would like to make into a dynamic application and perhaps if needed design some small services hosted elsewhere or in the scripting language available on the host of the website.

The web is upgradeable and static websites still are major online. They can be upgraded and this does not have to affect search engine readability. Your website can have the same existing design as before, but be extended into having the functionality it lacks without a big affect to the design that might have been carefully done with a colour theme, fonts, a layout etc.

My point on use of reactDOM.render() in SPA templates and scaffolders:

But the beauty of ReactDOM.render is that it sets innerHTML behind the scenes. It doesn’t add the React components to the div with the id «root». It swaps the content. Therefore:

In this way you can make use of react in existing websites leaving the static content in the mount node so that Google and other engines can see some text. Great for use on upgrading existing websites.