Git – bisect

Hvor i min kode gik det nu galt?

Enhver programmørs udfordring – når der pludselig opstår en uventet fejl.

Enhver seriøs programmør har versionskontrol på sin kildekode. Git nyder stor popularitet og det med god grund.

Git har mange muligheder og når noget går galt – at kunne lokalisere hvor det var det gik galt. Alt hvad der kræves er at du ved hvornår du havde noget der virkede og det seneste commit.

git bisect start
git bisect good 00f49c40
git bisect bad d6917ef4

Git vil nu checke det commit ud der ligger midt mellem den gode version og den dårlige version og du kan checke din kode ved at køre den. Git forventer så at få at vide om det var god eller dårlig kode.

git bisect good | bad

Git vil fortsætte med at checke ud indtil du rammer det commit der indeholder fejlen. Gør et notat med hvilket commit det er og afslut bisect

git bisect reset

Anvendelse af kamera og mikrofon fra HTML

En bekendt har sendt mig et par link til interessant anvendelse af JavaScript og browser API.

De er så interessante at jeg må have dem på opslagstavlen.

Det ene link beskæftiger sig med OCR genkendelse via JavaScript. En anvendelses mulighed er scanning af dokumenttekst med dit smartphone kamera.

Det andet link er et dyk ned i HTML5s API og brugen af de enheder en smartphone har f.eks. GeoLokation, Kamera, Mikrofon og det er jo ikke de eneste enheder den har :). Masser af legale anvendelses muligheder men formentlig også muligheder af den mere lyssky karakter.

Python3, Qt & PyQt5 på macOS

macOS er UNIX, en efterkommer af Darwin

Jeg brygger på en cross-platform app der skal fungere på Linux, Windows og macOS.

Forkælet som man bliver med Arch Linux og alt binært er klar til brug, så er macOS ikke helt så let at gå til.

For en cross-platform app er Python er det åbenlyse valg og når det skal være en grafisk app er der flere valgmuligheder. Valget faldt på Qt men at få det til at falde rigtigt på plads i macOS er ikke lige åbenlyst.

Homebrew er selvskreven da det er en fantastisk måde at få installeret de nødvendige komponenter men at få det til at virke er en ganske anden ting.

Installation

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Afinstallation

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

Installation af PyQt

brew install pyqt

Jeg fandt da heldigvis dette spørgsmål på stackoverflow

LDFLAGS=-L/usr/local/opt/qt/lib CPPFLAGS=-I/usr/local/opt/qt/include pip3 install PyQt5

Så kørte min Linux kode på macOS – Yaii

SQL trigger insert merge update

Ved opdatering af tabel1 skal tabel2 opdateres

Der er andre der har lavet før mig. Et eksempel er fra SQL Blog

MERGE INTO Customers AS c
USING      Moved     AS m
      ON   m.SSN      = c.SSN
WHEN MATCHED
THEN UPDATE
     SET   Street  = m.Street,
           HouseNo = m.HouseNo,
           City    = m.City;

SQL trigger on update

-- =============================================
-- Object : Trigger [dbo].[fcs_itemUpdate]
-- Script Date: 08-10-2016 12:31:10
-- =============================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author : Frede H.
-- Create date: 2016-10-08
-- Description: Trigger when inventable updates
-- =============================================
CREATE TRIGGER [dbo].[fcs_itemUpdate]
  ON [dbo].[INVENTABLE]
  AFTER UPDATE
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;
  -- Update statements for trigger here
  merge into fcs_catalog as c
        using INVENTABLE as i
        on i.ITEMNUMBER = c.itemnumber
  when matched
  then update
      set isBlocked = i.BLOCKED,
          itemGroup = i.GROUP_,
          itemName1 = i.ITEMNAME1,
          itemName2 = i.ITEMNAME2,
          itemName3 = i.ITEMNAME3,
          picture   = i.IMAGEFILE;
END
GO

Ved indsæt i tabel1 kopier til tabel2

SQL trigger on insert

-- =============================================
-- Object : Trigger [dbo].[fcs_itemInsert]
-- Script Date: 07-10-2016 20:16:10
-- =============================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author : Frede H.
-- Create date: 2016-10-07
-- Description: Copy item to fcs_catalog
-- =============================================
CREATE TRIGGER [dbo].[fcs_itemInsert]
  ON [dbo].[INVENTABLE]
  AFTER INSERT
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;
  -- Insert statements for trigger here
  insert into dbo.fcs_catalog(
         isBlocked,
         isOnline,
         itemGroup,
         itemName1,
         itemName2,
         itemName3,
         itemNumber,
         lastModified,
         picture)
  select BLOCKED,
         0,
         GROUP_,
         ITEMNAME1,
         ITEMNAME2,
         ITEMNAME3,
         ITEMNUMBER,
         LASTCHANGED,
         IMAGEFILE
  from inserted
END
GO

URL rewrites for Angular

Apache

.htaccess

RewriteEngine On
  # If an existing asset or directory is requested go to it as it is
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
  RewriteRule ^ - [L]
  # If the requested resource doesn't exist, use index.html
  RewriteRule ^ /index.html

IIS

web.config

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <!-- rewrite to https -->
        <rule name="Redirect to HTTPS" stopProcessing="true">
          <match url="(.*)" negate="false"/>
          <conditions logicalGrouping="MatchAny">
            <add input="{HTTPS}" pattern="^OFF$"/>
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent"/>
        </rule>
        <!-- ignore static files -->
        <rule name="Angular Conditions" stopProcessing="true">
          <match url="(assets/.*|b/.*)"/>
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsFile"/>
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory"/>
          </conditions>
          <action type="None"/>
        </rule>
        <!-- rewrite everything else -->
        <rule name="Angular Wildcard" enabled="true" stopProcessing="true">
          <match url="(.*)"/>
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsFile"/>
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory"/>
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
    <!-- set default document -->
    <defaultDocument>
      <files>
        <clear />
        <add value="index.html" />
      </files>
    </defaultDocument>
  </system.webServer>
</configuration>

Layout skitse

Webside layout skitse funktionalitet

Offentlig
Om Info feature
Kontakt Danmark
Sverige
Norge
Katalog Filter feature
Vare Billede
Navn
Varenummer
HMS/SDS
Video
Book demo Firma feature
Branche
Telefon
Email
Salg
Login Salg Kundeliste feature
Filter
Kunde Stamdata Firmanavn
Adresse
Post By
Lev. adrs
Fakt. adrs
Email Faktura
Notat
Ny ordre
Produkter Varenavn
Varenummer
PrisA
PrisB
Total antal
Til ordre
Ordrerliste Status
Filter
Ordre Status
Ordrehoved
Ordrelinjer
Aktivitet Dato
Person
Demo Produkt(er)
Salg Produkt(er)
Notat
Opret Kunde Firma
Adresse
Post By
Telefon
Attention
Email Faktura
Levering Adresse
Prisliste
Filter
Vare Varenummer
Varenummer
Pris
Rapporter
Filter
Rapport Dagsrapport Dato feature
Distrikt
Fravær
Supervisor
Besøg NY / GB
Navn
Demo Produkt(er)
Salg Produkt(er)
Salg Beløb
Kilometer Stop
Start
Dagen
Privat
Omsætning Dagens Nye
Genbesøg
Total
Månedens Nye
Genbesøg
Total
Statistik feature
Kunde
Login Kunde Stamdata Firmanavn feature
Adresse
Post By
Lev. adr
Email
Telefon
Mobil
Fax
Produkter Varenavn feature
Varenummer
Pris
Total antal
Genbestil
Ordrer Status feature
Ordrehoved
Ordrelinjer