- Chocolaty ist eine Windows Umgebung um Anwendungen über Kommandozeile zu installieren:
- https://chocolatey.org/install
- GO installieren
- https://golang.org/dl/
- cmd öffnen und echo %GOPATH% eingeben. Wenn als Ergebnis wieder %GOPATH% steht, Windows neustarten und nochmal prüfen. Andernfalls unter Systemsteurung -> System -> Erweitert -> Umgebungsvariablen die GOPATH Variable setzen
- cmd als Admin starten und folgende Befehle eingeben:
-
12345678910111213141516171819202122232425262728293031323334353637383940#Git installieren bei Abfrage mit A und Enter bestätigenchoco install git#NodeJs installierenchoco install nodejs#Make installierenchoco install make#Cmd Neustarten um Umgebungsvariablen zu ladenrefreshenv#Neuste Version updatengit clone https://github.com/git/git#Go Verzeichnis erstellenmkdir %GOPATH%#Zu Go Verzeichnis navigierencd %GOPATH%#Gitea herunterladengo get -d -u code.gitea.io/gitea#Gitea Verzeichnis navigierencd "%GOPATH%/src/code.gitea.io/gitea"#Gitea buildengo build#Gitea Verzeichnis zu c:\gitea kopierenxcopy "%GOPATH%/src/code.gitea.io/gitea" "C:\gitea\" /s/h/e/k/f/c#app.ini kopieren mit F und Enter File bestätigenxcopy "C:\gitea\custom\conf\app.ini.sample" "C:\gitea\custom\conf\app.ini"#Computernamen ausgebenecho %COMPUTERNAME%#Zeile 11 in der app.ini bearbeiten ($ am Ende nicht vergessen): RUN_USER = MEIN_COMPUTERNAME$
- Nun ist der Service unter http://localhost:3000 erreichbar, zeigt aber Fehler an. Daher muss man das Package herunterladen:
- https://dl.gitea.io/gitea/1.11.0/gitea-1.11.0-windows-4.0-amd64.exe
- Diese direkt in das Verzeichnis c:\gitea kopieren
-
12345#Service installieren und startensc create gitea_1_11_0 start= auto binPath= ""C:\gitea\gitea-1.11.0-windows-4.0-amd64.exe" web --config "C:\gitea\custom\conf\app.ini""#Service starten, falls nicht bereits gestartet (stop stoppt ihn wieder)net start gitea
MS SQL Server vorbereiten
- Im SQL Management Studio nun eine Neue Datenbank mit dem Namen „Gitea“ erstellen
- Unter Security -> Logins einen Neuen SQL User „gitea-user“ erstellen.
- R. Maustaste auf den User -> Properties -> Server Roles und nur die neue Gitea Datenbank zuweisen
- Mindestens einmal als dieser User einlogen und das neue Passwort setzen
- Wieder mit Properties -> Global die Haken bei Enforce Password expiration raus nehmen
SSH Server einrichten
- PowerShell als Admin öffnen
1234567891011121314151617## Install OpenSSH.ServerAdd-WindowsCapability -Online -Name OpenSSH.Server## Install OpenSSH.ClientAdd-WindowsCapability -Online -Name OpenSSH.Client## Change server start-up to AutomaticSet-Service -Name sshd -StartupType ‘Automatic’## Start the Server and change start-up to AutomaticStart-Service sshd## Change server start-up to AutomaticSet-Service -Name ssh-agent -StartupType ‘Automatic’## Start the Server and change start-up to AutomaticStart-Service ssh-agent - Zum SSH Test einloggen eingeben. Standard Port ist 22 und sollte in der Firewall freigeschaltet sein
12ssh [Windows User]@Hostname bzw. Ip AdresseDanach das Passwort
Step 1: Gitea installieren
Microservices mit .Net Framework und Core ohne Docker
Momentan liest man überall von Microservices und welche Vorteile diese Architektur mit sich bringt. Zwar wird immer wieder aufgeführt, dass Microservices Polyglot (Eine Architektur mit unterschiedlichen Programmiersprachen) unterstützen können. Tatsächlich findet man aber nur Anleitungen (In der Microsoft Welt) Zu .Net Core, in Verbindung mit Docker und Azure.
Mein Ziel ist es eine Architektur ohne Docker (Da auf VMs nicht unterstützt wird) und eine Verbindung aus Core und .Net Framework herzustellen. Aus einer Reihe von nachhaltigen Frameworks soll die Entwicklung in CD (Continues Delivery) gestaltet werden. TFS und GitLab scheiden wegen ihren Lizenzmodell aus.
- CodeRepository: Git -> https://git-scm.com/download/win
- Build Server: Jenkins -> https://jenkins.io/download/
- https://www.guru99.com/jenkin-continuous-integration.html
- Api Gateway (Kommunikation ClientApi zu Microservices) Ocelot : https://github.com/ThreeMammals/Ocelot
- Kommunikationsprotokoll zwischen Microservices: gRPC (Da schneller als Http)
- Sicherheit unter Microservices: JWT Token
- Authentifizierung Microservice mit OAuth 2.0 und OWIN Middleware: https://oauth.net/code/dotnet/
- Repository: Implementierung mit Dapper: https://github.com/StackExchange/Dapper
- Repository Cache: https://github.com/MichaCo/CacheManager
- Datenbank Code Migration SSDT: SQL Server Data Tools
- https://www.youtube.com/watch?v=6ass_PYECmM&t
- https://arapaima.uk/post/2017-04-04-jenkins-windows-git-ssdt-profit/
- (Optional) Search Engine: https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html
- https://www.red-gate.com/simple-talk/dotnet/net-development/how-to-build-a-search-page-with-elasticsearch-and-net/
Windows Bug Tooltip bleibt hängen
Wahrscheinlich jeder kennt es, wenn plötzlich irgendwo im Bildschirm ein Tooltip hängt und nicht weg geht.
Dann kann man einfach Windows+D 2x drücken und dann ist der weg
SQL Rekursion Parent zu Child / Child zu Parent
Erster Block im CTE: In der WHERE Bedingung wird die Child-Id übergeben
Zweiter Block: Join auf die CTE, ParentId mit der TabelleId
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
DECLARE @IterationId INT = 4; -- Rekursion Child to Parent ;WITH CTE AS ( SELECT t1.IterationId , t1.ParentId , 0 AS [Level] FROM Messenger.tblIteration t1 WHERE t1.IterationId = @IterationId UNION ALL SELECT t1.IterationId , t1.ParentId , CTE.[Level] + 1 AS [Level] FROM Messenger.tblIteration t1 INNER JOIN CTE ON CTE.ParentId = t1.IterationId ) SELECT * FROM CTE ORDER BY Level |
Erster Block im CTE: In der WHERE Bedingung wird die ParentId mit NULL angegeben
Zweiter Block: Join auf die CTE, Id mit der Tabelle ParentId
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
---- Rekursion Parent to Child ;WITH CTE AS ( SELECT t1.IterationId , t1.ParentId , 0 AS [Level] FROM Messenger.tblIteration t1 WHERE t1.ParentId IS NULL UNION ALL SELECT t1.IterationId , t1.ParentId , CTE.[Level] + 1 AS [Level] FROM Messenger.tblIteration t1 INNER JOIN CTE ON CTE.IterationId = t1.ParentId ) SELECT * FROM CTE ORDER BY Level |
Visual Studio Build Events
Wenn man nach einem Build eine Applikation starten möchte, muss man einen Umweg um eine bat Datei gehen.
R. Maustaste auf das Projekt in Visual Studio, dann auf „Build“ und unter Pre oder Post folgendes eingeben
call meinPfadZurBatDatei\startPublisher.bat
und unter diesen Pfad müssen wir eine bat Datei erstellen, die wiederum eine exe ausführt
einfach start meinPfadZurExe.exe in die bat Datei schreiben
HTML / CSS Container erstellen, der die Zeilen formatiert wie der Inhalt des Containers
einfach <pre> nutzen
Siehe https://www.mediaevent.de/xhtml/pre.html
SQL Server Remote Zugriff
Um auf eine SQL Instanz per Remote (von außen) zugreifen zu können, muss man in der Firewall folgende Ports aufmachen:
InBound (Eingehende): TCP 1433 (für z.B. SSMS), UDP 1434 (für ODBC Verbindungen)
OutBound (Ausgehende): TCP 1433
Zusätzlich die Dynamic aus „SQL Server Network Configuration“ -> „Protocols for [INSTANZ]“ -> „TCP/IP“ -> Reiter „IPAdresses“ -> Im Feld „IPAll“ -> TCP Dynamic Ports
Auserdem muss der TCP/IP Client Protokoll in SQL Configuration eingeschaltet werden:
außerdem muss der SQL Browser Service laufen:
Async await
Wie funktionier await?
Ein Thread ist wie eine Pipeline, die einen bestimmten Code in die CPU gibt.
Mal angenommen Thread 1 (Ui Thread) will etwas downloaden und dann auf der UI darstellen. Während des Http Requests ist die Ui gesperrt. Weil der Thread 1 darauf wartet, bis der Server geantwortet hat.
Mit await wird ein freier Thread genommen und der macht den Request. Thread 1 wird nun freigegeben. Der Benutzer kann z.B. weiter die Ui wie gewohnt nutzen.
Wenn Thread 2 fertig ist, sagt er, ich bin fertig und möchte zu dem Thread zurück kehren, der ihn erzeugt hat: Thread 1.
Thread 1 übernimmt und der Codeblock wird weiter ausgeführt.
Wenn es nun egal ist, welcher Thread den Codeblock weiter ausführen soll, kann man
1 |
await myAsyncMethod().ConfigureAwait(false) |
nutzen.
.Result sollte nicht genutzt werden, da im Exceptio Stacktrace Fehlermeldungen wie „MoveNext()“ erscheinen. Diese kommen aus der kompilierten Statemachine. Besser ist es
1 |
.GetAwaiter().GetResult() |
zu nutzen, da dann unser Typ und unsere Exception zurück gegeben werden.
Handlebars render Funktion wie bei Mustache
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Handlebars.registerHelper('select', function (value, options) { // Create a select element var select = document.createElement('select'); // Populate it with the option HTML select.innerHTML = options.fn(this); // Set the value select.value = value; // Find the selected node, if it exists, add the selected attribute to it if (select.children[select.selectedIndex]) select.children[select.selectedIndex].setAttribute('selected', 'selected'); return select.innerHTML; }); Handlebars.render = Handlebars.render || function(tpl, data) { data = data || {}; var compiled = Handlebars.render.cache[tpl]; if (!compiled) { // Uncached template compiled = Handlebars.compile(tpl); Handlebars.render.cache[tpl] = compiled; } return compiled(data); }; Handlebars.render.cache = {}; |
Eigene Adblock uBlock Filterliste
Surface 2019-05-19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
! 3.5.2019 https://de.malwarebytes.com de.malwarebytes.com##.ce-banner ! 3.5.2019 https://www.kaspersky.de www.kaspersky.de##.bottom.dark.transparent.notification-bar ! 3.5.2019 https://help.kaspersky.com help.kaspersky.com##.js_cookie_policy.cookie-policy ! 4.5.2019 https://notepad-plus-plus.org notepad-plus-plus.org##.cc_container--open.cc_container.cc_banner ! 4.5.2019 https://slyxi.com slyxi.com###yandex_rtb_R-A-388882-3 > .adb-def ! 6.5.2019 https://www.mydealz.de www.mydealz.de##.vAlign--all-b.tGrid-cell ! 9.5.2019 https://www.fcbarcelona.com www.fcbarcelona.com##.cookie-notice--show.js-cookie-notice.cookie-notice--hidden.cookie-notice ! 9.5.2019 https://www.kenwoodworld.com www.kenwoodworld.com##.bannerpadding ! 9.5.2019 https://www.internetworld.de www.internetworld.de##.cc-color-override--227966932.cc-top.cc-theme-block.cc-type-info.cc-banner.cc-window ! 9.5.2019 https://www.ebay.de www.ebay.de###gdpr-banner ! 12.5.2019 https://selbermachen.de selbermachen.de###sliding-popup > div selbermachen.de###zs_next_article ! 12.5.2019 https://www.obi.de www.obi.de##.cookiepolicy__container ! 12.5.2019 https://www.sport.de www.sport.de##.cc-color-override-896100485.cc-bottom.cc-theme-edgeless.cc-type-info.cc-banner.cc-window ! 12.5.2019 https://www.youtube.com ||i.ytimg.com/vi/fMnq5v8yZp4/hqdefault.jpg?sqp=-oaymwEZCNACELwBSFXyq4qpAwsIARUAAIhCGAFwAQ==&rs=AOn4CLCjYTrHeYEdlRyirmTM-tqQfhTokA$image ! 13.5.2019 https://www.beitsarshalom.org www.beitsarshalom.org##.cookie-notice-container ! 14.5.2019 https://www.ikea.com www.ikea.com##.cookie-info__panel--show.js-cookie-info__panel.cookie-info__panel ! 14.5.2019 https://www.sitepoint.com www.sitepoint.com##.qc-cmp-ui-content www.sitepoint.com###qcCmpUi www.sitepoint.com##.qc-cmp-showing.qc-cmp-ui-container ! 18.5.2019 https://www.dasheimwerkerforum.de www.dasheimwerkerforum.de##.noticeContent.baseHtml ! 19.5.2019 https://www.wohntec.de www.wohntec.de##.page-wrap--cookie-permission www.wohntec.de###BadgeContent_db8d3657bdbe440c985ae127463eaad4 www.wohntec.de##.etrusted-tb-footer__content www.wohntec.de###BottomSlantBadge_db8d3657bdbe440c985ae127463eaad4 > svg www.wohntec.de###BadgeFooter_db8d3657bdbe440c985ae127463eaad4 |
Login