Running Blazor Web App

My web site is running on Linux/Apache server. So, I wanted Blazor Web App to run on that server too.

Developing Blazor app was quite easy and straight forward process but writing the right .htaccess file was not so easy. I searched the internet and found sample on Microsoft web pages (https://docs.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/?view=aspnetcore-6.0&tabs=visual-studio), but provided .htaccess file sample was not enough.

I think that running Blazor on Apache is interesting for others too, so here is .htaccess file I am using in production (just update string ‘sub-directory’ (2x) with correct directory path of your app on Apache file system).

Link to GitHub gist: Apache .htaccess file for running Blazor Web App (github.com)

<IfModule mod_headers.c>
    # Serve brotli compressed files if they exist and the client accepts brotli.
    RewriteCond "%{HTTP:Accept-encoding}" "br"
    RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
    RewriteRule "^(.*)\.(js|json|css|dll|dat|blat|wasm)$" "$1\.$2\.br" [QSA]

    # Serve gzip compressed files if they exist and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gz"
    RewriteCond "%{REQUEST_FILENAME}\.gz" "-s"
    RewriteRule "^(.*)\.(js|json|css|dll|dat|blat|wasm)$" "$1\.$2\.gz" [QSA]
    
    # Serve correct content types, and prevent double compression.
    RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1]
    RewriteRule "\.js\.br$"  "-" [T=text/javascript,E=no-brotli:1]
    RewriteRule "\.json\.br$"  "-" [T=application/json,E=no-brotli:1]
    RewriteRule "\.dll\.br$"  "-" [T=T=application/octet-stream,E=no-brotli:1]  
    RewriteRule "\.dat\.br$"  "-" [T=application/octet-stream,E=no-brotli:1]  
    RewriteRule "\.blat\.br$"  "-" [T=application/octet-stream,E=no-brotli:1]  
    RewriteRule "\.wasm\.br$"  "-" [T=application/wasm,E=no-brotli:1]  
    
    # Serve correct content types, and prevent double compression.
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.gz$"  "-" [T=text/javascript,E=no-gzip:1]
    RewriteRule "\.json\.gz$"  "-" [T=application/json,E=no-gzip:1]
    RewriteRule "\.dll\.gz$"  "-" [T=T=application/octet-stream,E=no-gzip:1]  
    RewriteRule "\.dat\.gz$"  "-" [T=application/octet-stream,E=no-gzip:1]  
    RewriteRule "\.blat\.gz$"  "-" [T=application/octet-stream,E=no-gzip:1]  
    RewriteRule "\.wasm\.gz$"  "-" [T=application/wasm,E=no-gzip:1]  
    
    <FilesMatch "(\.js\.br|\.css\.br|\.json\.br|\.dll\.br|\.dat\.br|\.blat\.br|\.wasm\.br)$">
      # Serve correct encoding type.
      Header set Content-Encoding br
      # Force proxies to cache brotli & non-brotli
      Header append Vary Accept-Encoding
    </FilesMatch>
    
    <FilesMatch "(\.js\.gz|\.css\.gz|\.json\.gz|\.dll\.gz|\.dat\.gz|\.blat\.gz|\.wasm\.gz)$">
      # Serve correct encoding type.
      Header set Content-Encoding gzip
      # Force proxies to cache gzipped & non-gzipped
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /sub-directory/
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /sub-directory/index.html [L]
</IfModule>

Davčne blagajne

V januarju 2016 bo v Sloveniji obvezna uporaba davčnih blagajn za vse gotovinska plačila. Na spletni strani FURS-a si lahko preberete vse tehnične specifikacije potrebne za davčno potrjevanje računov.

Kako poteka davčno potrjevanje računov

V osnovi je to zelo preprost in uporaben sistem. Pred izpisom (izdajo računa) se morate namreč povezati na strežnik davčne uprave in nanj prenesti podatke o računu, FURS pa vam vrne edinstveno številko EOR (Edinstvena Oznaka Računa), ki jo morate izpisati na računu in s katero dokazujete, da ste račun tudi zares poslali na FURS.

Ozadje

Seveda pa se podrobnosti vedno skrivajo v ozadju in povezava na FURS niti ni tako trivialno preprosta oz. povezava je preprosta, saj gre za standarden internetni protokol, vendar pa je tja potrebno poslati digitalno podpisan račun in tukaj se stvari malce zapletejo.

Zastonj rešitev na dlani

Da bi se ne bilo potrebno vsakumur ukvarjati s:

  • podrobnostmi digitalnega podpisa,
  • podrobnostmi izračuna zaščitne številke (ZOI)
  • podrobnostmi izrisa QR kode

sem na GITHub-u odprl rešitev, ki je vsakomur na voljo povsem brezplačno. Za uporabo rešitve potrebujete le računalnik z operacijskim sistemom Windows. Ker je v SLO še kar nekaj blagajn, ki tečejo na operacijskem sistemu Windows XP, je podprt tudi slednji.

Minimalne zahteve za uporabo te povsem zastonj rešitve je:

  1. Win XP, SP 3, .NET 4.0 – ali seveda katerikoli novejši WIN sistem
  2. Uporaba .NET razvojnega okolja (C#, VB.NET ali pa tudi kakšnega bolj eksotičnega, a teh verjetno ni veliko 🙂 )

Izgled testnega programa
Izgled testnega programa

Kaj pa če ne uporabljate .NET razvojnega okolja

V tem primeru pa seveda ponujene knjižnice ne morete neposredno izkoristiti, a dokler vaš program teče v WIN okolju je problem rešen. Ponudim vam lahko namreč sledeč možnosti povezave:

  1. EXE program, ki ga pokličete iz vašega programa in slednji
    • Pregleda račun ali slednji vsebuje vse zahtevane elemente
    • Izračuna zaščitno kodo (ZOI)
    • Obda račun z zahtevano ovojnico
    • Ga digitalno podpiše in pošlje na FURS
    • Od FURS-a sprejme odgovor in ga posreduje v vaš program
    • Podroben opis EXE programa najdete tukaj.
  2. WIN service, ki nadzoruje dve poljubni mapi in čim vi odložite podatke o računu v prvo mapo, jih program vzame, obdela, pošlje na FURS (enako kot v primeru EXE programa) in rezultat izpiše v izhodno mapo
  3. V kolikor želite uporabiti knjižnico sami in elemente zvezati neposredno v vaš program, vam lahko ponudim ActiveX komponento, ki naredi vse našteto
  4. Če imate zares veliko blagajn pa lahko vse skupaj zavrtite na nekem strežniku in ponudim vam lahko ASP.NET spletne storitve ki izvedejo vse omenjeno.

V kolikor torej potrebujete rešitev pišite na info@matjazev.net in rešitev boste dobili na dlani 😉

XAML DataGrid using one DataTable as lookup

Problem:

I have a DataTable with lookup column into another table. Another table is a small table so all the records can fit in small combobox and the user wants to be able to select lookup record with combobox.

Solution:

XAML has DataGridComboBoxColumn, but it is difficult to bind, because DataGridComboBoxColumn can’’t bind to Windows binding source. It is obviously quite know problem, but I could’n’t find an easy solution.

Test tables:

MAIN_TABLE 
{ 
  ID, 
  SubTableID, 
  ... other fields ...
}

SUB_TABLE 
{ 
  ID, 
  Description 
}

Naive

Naive solution, that doesn’’t work

<DataGrid ItemsSource="{Binding mainTable}">
  <DataGrid.Columns>
    <DataGridTextColumn Header="ID" 
                        Binding="{Binding ID}" />
    <DataGridTextColumn Header="SubID" 
                        Binding="{Binding SubTableID }" />
    <DataGridComboBoxColumn Header="Desc" 
                            ItemsSource="{Binding subTable}}" <!-- can't bind! -->
                            SelectedValueBinding="{Binding SubTableID}"
                            SelectedValuePath="ID" 
                            DisplayMemberPath="Description" />
  </DataGrid.Columns>            
</DataGrid>

The solution doesn’’t work because – for some reason– DataGridComboBoxColumn can’’t bind subTable even if it is defined exactly as mainTable in datasource for the whole xaml window.

Solution

The solution is quite easy. Create a resource that binds to sub table and then use that resurce sa data source 🙂


<DataGrid ItemsSource="{Binding mainTable}">
  <DataGrid.Resources>
    <CollectionViewSource x:Key="cvsSubTable" 
                          Source="{Binding subTable }"/> <!-- can bind! -->
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="ID" 
                        Binding="{Binding ID}" />
    <DataGridTextColumn Header="SubID" 
                        Binding="{Binding SubTableID }" />
    <DataGridComboBoxColumn Header="Desc" 
                            ItemsSource="{Binding Source={StaticResource cvsSubTable }}"  <!-- now it is ok! --> 
                            SelectedValueBinding="{Binding SubTableID}"
                            SelectedValuePath="ID" 
                            DisplayMemberPath="Description" />
  </DataGrid.Columns>            
</DataGrid>         

Lost 4 hours on that! Grrrr..

Številčenje v SQL podatkovnih bazah

V razvoju prej ali slej naletimo na problem, ko moramo zapise številčiti. Vsakemu dokumentu pač moramo določiti edinstveno številko, ki pa mora biti ob tem še zaporedna.

Vse SQL podatkovne baze poznajo avtomatično številčenje primernega ključa – ko torej v tabelo dodamo nov zapis, slednji dobi naslednjo zaporedno številko. To imenujemo tehnično številčenje zapisov. Problem pa se pojavi, ko potrebujemo vsebinsko številko dokumenta.

Za lažje razumevanje problema, si predstavljajmo tipično podatkovno tabelo, v kateri imamo poslovne dokumente – predračune, račune, dobavnice… Vsi različni dokumenti so v isti tabeli, a vsak med njimi mora imeti lastno vsebinsko številko. Primer:

#  DOKUMENT     VSEB. ŠT.   OSTALI PODATKI

1  Predračun    PR-1/2013   ... itd ...
2  Predračun    PR-2/2013   ... itd ...
3  Račun        RA-1/2013   ... itd ...
4  Dobavnica    DO-1/2013   ... itd ...
5  Predračun    PR-3/2013   ... itd ...
6  Predračun    PR-4/2013   ... itd ...
7  Račun        RA-2/2013   ... itd ...
8  Dobavnica    DO-2/2013   ... itd ...
9  Dobavnica    DO-3/2013   ... itd ...

Kot je lepo vidno v tabeli ima vsak tip dokumenta lastno številčenje.

Kako določiti vsebinsko številko?

Opcij je seveda več a nekako jih lahko uredimo v tri sklope:

  1. Sekvence – če jih podatkovna baza podpira.
  2. Lastna tabela za vsak tip številčenja – za vsak tip dokumenta narediti lastno tabelo, ki določi naslednjo številko
  3. Ena tabela za vso številčenje – za vse številčenje uporabiti eno samo tabelo

Sekvence

Dobro

  • Rešitev namenjena temu konkretnemu problemu

Slabo

  • Ne poznajo jo vse podatkovne baze

Lastna tabela za vsako številčenje

Dobro

  • Deluje v vseh SQL bazah
  • Zelo podobna rešitev kot sekvence

Slabo

  • Veliko malih tabel
  • Vse tabele je potrebno ustvariti vnaprej ali pa v programu vedno preverjati ali tabela obstaja ali ne.

Za vso številčenje uporabiti eno samo tabelo

Dobro

  • Deluje v vseh SQL bazah
  • Preprosta rešitev
  • Ni veliko dodatnega dela

Slabo

  • Ni primerna za SQL baze z veliko hkratnimi uporabniki

V naslednjih prispevkih bom podrobneje predstavil vsako izmed možnosti…

Univerzalni temeljni dohodek (UDT)

Zaradi drugih obveznosti mi je malce zmanjkalo časa za vzdrževanje bloga in zato sem razmišljal, da je čas za malce drugačno objavo.

Tako se danes ne bom posvetil računalniški tematiki, temveč socialni. Že nekaj časa se tudi v Sloveniji pogovarjamo o tki. univerzalnem temeljnem dohodeku (UTD). Ideja ni nova, a družba je že tako napredovala, da jo lahko tudi uresničimo.

Kaj je UDT?

Temeljni dohodek je dohodek, brezpogojno dodeljen vsem na individualni osnovi brez preverjanja premoženjskega stanja in brez delovne zahteve. Je oblika zagotovila minimalnega dohodka, ki se od obstoječih oblik v različnih evropskih državah razlikuje na tri pomembne načine:

  1. izplačuje se posameznikom in ne gospodinjstvom;
  2. izplačuje se ne glede na kakršenkoli dohodek iz drugih virov;
  3. izplačuje se brez zahteve po opravljanju kakršnegakoli dela ali pripravljenosti sprejeti ponujeno službo.

Prosim premislite, prebrskajte sami. To ni podpora lenuhom to je pot v boljši in pravičnejši svet.

Če se strinjate z mano (in seveda mnogimi drugimi) vas prosim, da idejo podprete s podpisom, ki bo omogočil vložitev pobude v kolesje EU.

Predstavitveni film (za SLO podnapise kliknite spodaj oznako CC (ob spodnjem desnem robu videa)): https://www.youtube.com/watch?v=zru79jcVTt4

Stran za podporo in podpis: http://basicincome2013.eu/ubi/sl/

Hvala!

Dodatek (31.10.2013 – dan varčevanja!)

Za vse, ki se še niste odločili

Nov zakon o spletnih piškotkih

S  15. junijem je stopil v veljavo spremenjeni Zakon o elektronskih komunikacijah (ZEKom-1), ki zaostruje pravila glede uporabe spletnih piškotkov.

Spletni piškotki so majhne datoteke, ki se shranijo na računalnik obiskovalca spletne strani. Skrbijo za boljšo uporabniško izkušnjo, spremljanje statistik, napredno spletno oglaševanje in še marsikaj.

Po novem zakonu smo upravljalci spletnih strani dolžni opozoriti obiskovalca o piškotkih, ki jih nalagamo na vašo napravo, s katero se povezujete na splet.

Spletišče Matjazev.NET sestavljajo štirje sklopi:

  • Osnovno spletišče Matjazev.NET, s splošnimi informacijami o podjetju, nasveti, zastonj in plačljivo programsko opremo, knjigami….
  • Blog, ki ga trenutno berete
  • Forum, kjer najdete brezplačno pomoč pri uporabi MS Pisarne
  • Spletišče MEXCEL.biz, kjer najdete brezplačne dodatke za vaš MS Excel.

Nekoč smo na omenjenih spletiščih uporabljali programsko opremo Google Analytics, ki nam je omogočila spremljati koliko obiskovalcev se ustavi na naših spletnih straneh ter tudi, kaj vas najbolj zanima.

Z uveljavitvijo tega zakona je omenjena storitev postala brezpredmetna, saj jo ima vsak obiskovalec možnost izključiti in tako postanejo njeni rezultati napačni oz. nenatančni in nimajo več smisla.

S tem razlogom na spletišču ne uporabljamo Google Analytics programske opreme in tudi nobene druge programske opreme s pomočjo katere bi vas kakorkoli spremljali.

Piškotki, ki jih na naših spletnih straneh uporabljamo

MExcel.BIZ

Na spletišču Mexcel.biz uporabljamo dva piškotka, ki sta za delovanje strani nujno potrebna, zato sta dovoljena tudi v novem zakonu o elektronskih komunikacijah:

  • PHPSESSID je piškotek, ki nam omogoča vzdrževanje seje in je standarden PHP piškotek
  • lang je piškotek, s katerim si zapomnimo vašo izbrano jezikovno različico in z njegovo pomočjo se na stran vedno vrnete v izbranem jeziku.

Ker sta oba piškotka dovoljena vas za posebno dovoljenje ne sprašujemo!

Matjazev.NET

  • PHPSESSID je piškotek, ki nam omogoča vzdrževanje seje in je standarden PHP piškotek
  • PREF je piškotek, ki vam omogoča iskanje po spletišču in uporablja google tehnologijo iskanja

Na spletišču pa imate tudi možnost branja in pisanja komentarjev, kar nam zagotavlja tehnologija Disqus, ki pa uporablja lastne piškotke in za uporabo slednjih vas posebej vprašamo.

Matjazev.NET/blog

Na spletišču pa imate možnost deljenja vsebine, kar nam zagotavlja tehnologija ShareThis, ki uporablja lastne piškotke in za uporabo slednjih vas posebej vprašamo.

MExcel.BIZ/forum

Spletišče teče na tehnologiji phpBB3, ki za delovanje potrebuje piškotke, saj brez njih ne more teči, zato vas za uporabo slednjih posebej ne vprašamo.


Skupno delo

Kot že ptički čivkajo je Microsoft v novi različici MS podprl skupinsko delo več uporabnikov na istem dokumentu. Osebno se mi to zdi uporabna možnost in dodatek novi pisarni ki pa ima en velik problem… Vsi ljudje še namreč nimate najnovejše MS pisarne… Pa tudi tako hitro je še ne bodo/boste imeli.

V vmesen času pa lahko podobno – seveda zelo okrnjeno – a vseeno zelo uporabno možnost skupinskega urejanja dokumenta izkusite povsem zastonj in povsem internetno – torej brez potrebe kakršne koli instalacije na lokalni računalnik- kar hkrati pomeni tudi uporabo z različnimi napravami in različnimi operacijskimi sistemi.

Programska oprema se imenuje MoPad in nastaja pod okriljem Mozzila fundacije, dosegljivo pa je na spletni strani https://etherpad.mozilla.org/.

Preizkusite ne bo vam žal…

Dinamični graf

Počasi je, preko prispevkov o dinamičnih območjih in o poimenovanjih območij, zares prišel čas, da si ogledamo izdelavo dinamičnega grafa. To je graf, ki prikaže toliko podatkov, kot jih zapišete.

S pomočjo tega »trika« imate tako možnost ustvariti graf enkrat za vselej in ne vedno, ko se poveča število podatkov. Tipična uporaba je ob prikazu poslovanja, ki prikazuje mesece in vsak mesec se pojavi nova postavka zato je potrebno izrisati nov graf… Ali pač ne ;).

Continue reading Dinamični graf

Manjka podatek?

Včasih se zgodi, da v večji Excelovi tabeli ugotovimo, da nam nek podatek manjka. Največkrat to ugotovimo, ker ima tabela premalo vrstic.

Večina tabel je namreč zgrajenih tako, da imajo v nekem stolpcu (ponavadi na levi strani) pač nek urejen podatke, ki mu na desni strani sledijo podatki. Ta urejen podatek na levi strani je lahko številka, datum, ura…

Problem je torej sledeč: »Kako najti, kateri podatek nam manjka?«

Za lažjo predstavo vzemimo konkreten problem, kjer imate tabelo v katero vsak delovnik vpišete podatke o prodaji. Seveda je to popolnoma enakovredno primeru, ko dobite neke podatke iz centralnega računalnika na osnovi delovnih dni. Ali pa podatke o urah…

Vsem tem tabelam je torej skupno, da imajo nek stolpec, v katerem bi se morali nahajati naraščujoči podatki a eden (ali več) manjka. Da jih nekaj manjka preprosto ugotovite, tako da pogledate velikost tabele. Če bi morali biti v tabeli podatki za delovne dni potem bi v tej tabeli moralo biti toliko vrstic kolikor je delovnih dni.. pa jih ni ?… Kateri manjka?

Dobro, tabelo lahko pregledujete ročno in iščete datum ki manjka a to je zamudno in dokaj vrjetno, da se boste zmotili oz. težko našli vse datume. Zaposliti je torej potrebno računalnik!

Delovni dnevi

Zanalašč sem vzel težji primer, saj vam bom tako prikazal rešitev več problemov hkrati. Najprej moramo najti delovne dneve!

Vpišite torej prvi datum. Z miško razpotegnite datume navzdol in Excel bo v vsako naslednjo celico zapisal nov (naslednji) datum. S tem ste dobili stolpec z naraščujočimi datumi.


Sedaj je potrebno še ugotoviti kateri dnevi so delovni (če bi imeli kje seznam praznikov bi vpletli še te, a danes pač predpostavimo, da so delovni dnevi vsi dnevi razen sobote in nedelje. Dan v tednu nam vrne funkcija WEEKDAY.

Zatorej v sosednji stolpec zapišemo funkcijo =WEEKDAY(<celica z datumom>;2) in razpotegnemo navzdol:

Pridružimo dneve iz naše originalne tabele

S pomočjo dodatka MExcel tem datumom pridružimo datume iz naše tabele. S tem dobimo še eno vrstico z datumi.

Kdo manjka?

Sedaj imamo seznam datumov, oznako za kateri dan v tedni gre in zraven še seznam datumov iz naše originalne tabele. Tukaj lažje že na oko vidimo kateri datum manjka… seveda pa je še mnogo bolje zaposliti Excel in mu reči:

Če je oznaka dneva manjša od 6 (torej ponedeljek – petek) in je sosedna celica prazna (ni datuma) potem je to napaka, sicer je vse OK:

=IF(AND(Q5<6;ISBLANK(R5));"MANJKA";".")

Pa jih imamo – vse packe 😉

MExcel.biz

Vabljeni na premierno otvoritev nove blagovne znamke MExcel, ki se skriva na spletišču www.mexcel.biz. Gre za Excelovega pomočnika, čarovnika, ko vam bo skrajno poenostavil združevanje tabel v Excelu.

Programski dodatek MExcel bo v prihodnosti rastel in pridobival več orodij in čarovnikov a že v prvi izdaji ponuja izjemno orodje za združevanje tabel, s pomočjo katerega lahko podatke združite do 10x hitreje kot to sicer omogočajo vgrajene Excelove tabele.

Prednosti

  • Združevanje po več ključnih podatkih hkrati
  • Združevanje podatkov tako po horizontali kot vertikali
  • Dodajanje nezdruženih podatkov v rezultat
  • Neobčutljivost na format ključnih podatkov
  • Preprostost uporabe – ne potrebujete znanja Excela, saj lahko s pomočjo čarovnika tabeli združi vsak uporabnik
  • Nad veliko množico podatkov (tabele večje od 500.000 zapisov) je združevanje do 10x hitrejše kot v kombinaciji funkcij VLOOKUP ali INDEX in MATCH!

Slabosti

  • “Slabost” čarovnika je samo v dejstvu, da ga Excel ne pozna in ga morate torej naknadno doinstalirati… A instalacija je skrajno preprosta in intuitivna. 🙂

Vabilo

Vabim vas torej, da si orodje naložite, ga preizkusite in napišete svoje mnenje…