Für unsere Beispielanwendung benötigen wir eine Reihe von Python-Paketen. Diese werden mit Hilfe der Datei requirements.txt beim Bauen des Docker Images installiert.
Die aktuelle Verzeichnisstruktur beinhaltet 2 Dateien.
Ordner in einem Container öffnen
Wir wollen nun diese Ordner in einem Container öffnen.
Klicken Sie hierzu in der Statusleiste links unten auf das grüne Symbol (Open a Remote Window)
Wählen Sie dann dein Eintrag Reopen in Container
Um anzugeben, wie der Container initial konfiguriert werden soll, wählen Sie den Eintrag From 'docker-compose.yml'
Anschließen wird der Container erstellt und geöffnet. Als erstes wird das Docker Image erstellt und gestartet
Umgebung im Container
Visual Studio Code hat nun den Container geöffnet und Sie befinden sich innerhalb des Docker Image.
Fehler beim Erstellen der Umbung
Tritt beim Erstellen der Umgebung ein Fehler auf, dann kann es an den Einstellungen in der Datei docker-compose.yml liegen
Die Fehlermeldung besagt, das wir den Namen für unseren “Service” (also die Anwendung, die wir erstellen wollen) noch anpassen müssen.
Schließen Sie das Fenster und öffnen sie den Ordner wieder lokal.
Öffnen sie dann die Datei .devcontainer/docker-compose.yml.
Ändern se den Namen des Servier von your-service-name-here nach app.
Öffnen sie danach den Ordner wieder als Container (Reopen in Container)
Prüfen der Umgebung
Dieses Docker Image würde basierend auf der Linux Distribution Ubuntu erstellt.
Erkunden Sie einfach mal die Umgebung.
DevContainer-Umgebung anpassen
Als nächstes passen wir die Umgebung des DevContainer an. Wir wollen z. B. nur die Dateien unserer Anwendung sehen und nicht die Docker Konfigurationsdateien
Hierzu erstellen wir einen Unterordner workspace und legen diesen als Startverzeichnis fest.
Elixir ist eine dynamische, funktionale Sprache zum Erstellen skalierbarer und wartbarer Anwendungen. Elixir nutzt die Erlang VM, die dafür bekannt ist, verteilte und fehlertolerante Systeme mit geringer Latenz auszuführen.
Außerdem wird Elixir wird erfolgreich in Webentwicklung, eingebetteter Software, Datenaufnahme und Multimediaverarbeitung in einer Vielzahl von Branchen eingesetzt.
Hier folge eine kleine Einführung in die Programmiersprache Elixir
Grundlegende Datentypen
Elixir supports the basic data types that other programming languages have. You can use integers (whole numbers), floats (decimal numbers), booleans (true or false) and strings (which are wrapped in double quotes, are UTF-8 encoded, and support line breaks).
Probieren wir in der Elixit Shell einfach die nachfolgenden Beispiele aus.
Atome sind eine besondere Art von Datentyp, die Konstanten (unveränderlichen Variablen) ähneln, ihr einziger Wert jedoch der ihnen gegebene Name ist.
iex(1)> :my_atom
:my_atom
iex(2)> :my_atom == "my_atom"
false
iex(3)> :my_atom == true
false
iex(4)> :my_atom == :my_atom
true
iex(5)> :my_other_atom = 4
** (MatchError) no match of right hand side value: 4
Im letzten Beispiel sehen wir, dass wir einem Atom keinen bestimmten Wert zuweisen können. Auch hier ist ihr einziger Wert ihr Name!
Lists
Listen in Elixir können jeden Datentyp enthalten und beliebig lang sein. Sie können mit ++ zwei Listen verketten oder mit — eine Liste von einer anderen subtrahieren.
Beachten Sie, dass Elixir eine unveränderliche Sprache (immutable language) ist.
Wenn Sie diese Vorgänge ausführen, wird die ursprüngliche Liste also nie geändert. Stattdessen wird eine neue Liste zurückgegeben, die Sie in einer Variablen speichern können:
Listen in Elixir können auch in zwei Teile aufgeteilt werden: den Kopf (head, der mit der hd-Funktion extrahiert werden kann) und den Schwanz (tail , der mit der tl-Funktion extrahiert werden kann). Der Kopf ist das erste Element der Liste und der Schwanz ist der Rest:
Tupel ähneln Listen, aber sie speichern ihre Elemente zusammenhängend im Speicher. Dadurch wird der Zugriff auf Tupelelemente schneller als auf Listenelemente, jedoch ist deren Änderung langsamer.
Sie können ein Tupel als eine Ansammlung von Werten sehen, um eine Art Ressource zu bilden, während Listen verwendet werden, um Dinge aufzuzählen.
iex(7)> {"Tristan", 24}
{"Tristan", 24}
Sie werden feststellen, dass viele Elixir-Funktionen Tupel zurückgeben, um zwischen Erfolgen und Misserfolgen zu unterscheiden, z. B.: {:ok, value} oder {:error, error_message}
Maps
Karten (Maps) sind der Schlüsselwertspeicher (key-value store) von Elixir. Die Schlüssel können einen beliebigen Typ haben und zeigen mit => auf einen Wert.
Most of the time, you’ll probably want the keys in your map to be atoms, like in the example above. When that’s the case, there’s a nice shorthand syntax where we can use a colon instead of “=>” to point to the values, and omit the :-character at the beginning of our atoms:
iex(3)> company_phones =
Structs
Eine Struktur (struct) ist einer Map sehr ähnlich, bietet jedoch einige zusätzliche Funktionen – Sie können die Anzahl der Schlüssel begrenzen und ihnen Standardwerte zuweisen.
Um Strukturen (structs) auszuprobieren, müssen wir eine Elixir-Datei erstellen, also fahren Sie fort und erstellen Sie eine neue Datei namens user.ex. Darin werden wir ein neues Modul definieren, in dem wir auch unsere Struktur definieren:
defmodule User do
defstruct name: "Tristan", age: 24
end
Gehen Sie nun zurück zur IEx-Shell und führen Sie den Befehl c(“user.ex”) aus.
Sie können jetzt eine neue Benutzerstruktur erstellen, indem Sie
❯ iex.bat -S mix
Compiling 1 file (.ex)
Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("user.ex")
[User]
iex(2)>
iex(3)>
Conditionals
Die grundlegenden if- und else-Anweisungen funktionieren genau so, wie Sie es erwarten. Beachten Sie, dass wir end verwenden müssen, um anzugeben, wo die if-Anweisungen enden.
iex(4)> if 5 > 4 do
...(4)> "It's higher!"
...(4)> else
...(4)> "It's lower"
...(4)> end
"It's higher!"
Sie können sogar die Umkehrung unless verwenden, um Ihren Code lesbarer zu machen:
iex(6)> unless 5 > 6 do
...(6)> "The laws of mathematics still work!"
...(6)> end
"The laws of mathematics still work!"
Was ist mit “else if”?
In Elixir gibt es kein “else if”. Wenn Sie einen Flow mit mehr als nur zwei Ergebnissen haben, sollten Sie stattdessen wahrscheinlich cond verwenden:
iex(5)> cond do
...(5)> 5 > 6 ->
...(5)> "This isn't true"
...(5)> 5 == 8 ->
...(5)> "Neither is this"
...(5)> true ->
...(5)> "But this is!"
...(5)> end
"But this is!"
Wenn in Ihrer cond-Anweisung nichts als wahr ausgewertet wird, wird eine Ausnahme ausgelöst! Daher ist es normalerweise eine gute Praxis, immer eine letzte true-Bedingung ganz am Ende Ihrer Anweisung hinzuzufügen (wie wir es in unserem obigen Beispiel getan haben), um eventuelle Ausnahmen zu behandeln.
Schließlich gibt es noch eine case-Anweisung, die den Kontrollfluss in Elixir behandelt, aber dazu werden wir im nächsten Kapitel mehr erfahren …
Erstellen einer App
Im ersten Schritt erstellen wir die grundlegende Elixir Anwendung mit Hilfe des Komandos mix.
❯ mix new starterapp
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/starterapp.ex
* creating test
* creating test/test_helper.exs
* creating test/starterapp_test.exs
Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:
cd starterapp
mix test
Run "mix help" for more commands.
Durch dieses Kommando wird der Ordner starterapp mit der folgenbden Verzeichnisstruktur erstellt
Ersten Test starten
❯ cd starterapp
❯ mix test
Compiling 1 file (.ex)
Generated starterapp app
..
Finished in 0.07 seconds (0.00s async, 0.07s sync)
1 doctest, 1 test, 0 failures
Randomized with seed 697266
Ersten Programmcode schreiben
Funktion say_hello
defmodule StarterApp do
def hello do
:world
end
def say_hello do
IO.puts("Hello World")
end
end
Interactive Shell mit unserer App starten
iex -S mix
Unter Poweshell gibt es bereits einen Alias iex. Hier nutzen wir diesen Aufruf
iex.bat -S mix
❯ iex.bat -S mix
Compiling 1 file (.ex)
Generated starterapp app
Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
Funktion mit mehrerer, auch optionalen Parametern festlegen
defmodule StarterApp do
def main() do
name = IO.gets("Bitte geben Sie Ihrem Name an: ") |> String.trim
say(name)
end
def say("") do
IO.puts "Sie muessen einen Namen angeben!"
main()
end
def say(name) do
IO.puts "Hallo #{name}!"
end
def say(greeting, name) do
IO.puts "#{greeting} #{name}!"
end
end
In der Elixir Shell das Modul neu laden
iex(2)> r StarterApp
warning: redefining module StarterApp (current version defined in memory)
lib/starterapp.ex:1
{:reloaded, StarterApp, [StarterApp]}
iex(3)>
Aufruf ohne Parameter
iex(3)> StarterApp.say()
** (UndefinedFunctionError) function StarterApp.say/0 is undefined or private. Did you mean one of:
* say/1
* say/2
(starterapp 0.1.0) StarterApp.say()
iex(4)>
iex(4)> StarterApp.say("")
Sie muessen einen Namen angeben!
Bitte geben Sie Ihrem Name an: World
Hallo World!
:ok
iex(5)>
Laravel Breeze ist eine minimale, einfache Implementierung aller Authentifizierungsfunktionen von Laravel, einschließlich Anmeldung, Registrierung, Paßwortzurücksetzung, E-Mail-Bestätigung und Paßwortbestätigung.
Die Standardansichtsebene von Laravel Breeze besteht aus einfachen Blade-Vorlagen, die mit Tailwind CSS gestaltet sind. Breeze bietet einen wunderbaren Ausgangspunkt für den Beginn einer frischen Laravel-Anwendung.
Laravel Breeze bietet auch eine Frontend-Implementierung von Inertia.js die von Vue oder React unterstützt wird.
Laravel Jetstream (Link)
Jetstream bietet ein schön gestaltetes Anwendungsgerüst für Laravel und umfasst Anmeldung, Registrierung, E-Mail-Verifizierung, Zwei-Faktor-Authentifizierung, Sitzungsverwaltung, API-Unterstützung über Laravel Sanctum und optionales Teammanagement.
Jetstream wurde mit Tailwind CSS entwickelt und bietet Ihre Wahl zwischen Livewire oder Inertia.js-gesteuertem Frontend-Gerüst.
Hinweis:
Während Laravel Breeze einen einfachen und minimalen Ausgangspunkt für die Erstellung einer Laravel-Anwendung bietet, erweitert Jetstream diese Funktionalität mit robusteren Funktionen und zusätzlichen Frontend-Technologie-Stacks.
Für Laravel-Neulinge empfehlen wir, sich mit Laravel Breeze vertraut zu machen, bevor sie Laravel Jetstream abschließen.
Jetstream bietet ein wunderschön gestaltetes Anwendungsgerüst für Laravel und umfaßt Anmeldung, Registrierung, E-Mail-Verifizierung, Zwei-Faktor-Authentifizierung, Sitzungsverwaltung, API-Unterstützung über Laravel Sanctum und optionales Teammanagement.
Jetstream wurde mit Tailwind CSS entwickelt und bietet Ihre Wahl zwischen Livewire – oder Inertia.js-gesteuertem Frontend-Scaffolding.
Laravel Fortify ist eine Frontend-agnostische Authentifizierungs-Backend-Implementierung für Laravel.
Fortify registriert die Routen und Controller, die zur Implementierung aller Authentifizierungsfunktionen von Laravel erforderlich sind, einschließlich Anmeldung, Registrierung, Zurücksetzen des Paßworts, E-Mail-Verifizierung und mehr.
Nach der Installation von Fortify können Sie den route:list Artisan-Befehl ausführen, um die von Fortify registrierten Routen anzuzeigen.
Da Fortify keine eigene Benutzeroberfläche bereitstellt, soll es mit Ihrer eigenen Benutzeroberfläche gekoppelt werden, die Anfragen an die registrierten Routen stellt. Wir werden im Rest dieser Dokumentation genau besprechen, wie Anfragen an diese Routen gestellt werden.
Voraussetzung
Voraussetzung für die Verwendung von Laravel ist eine lauffähige Entwicklungsumgebung. Der Aufbau einer solchen Umgebung wird hier beschrieben.
Installation mit Hilfe von Composer
Wenn auf Ihrem Computer bereits PHP und Composer installiert sind, können Sie ein neues Laravel-Projekt erstellen, indem Sie Composer direkt verwenden.
composer create-project laravel/laravel app
cd app
Nachdem die Anwendung erstellt wurde, können Sie den lokalen Entwicklungsserver von Laravel mit dem nachfolgenden Befehl starten:
php artisan serve
Installation mit Hilfe des Laravel Installer
Laravel Installer
Am einfachsten wird eine neuen Anwendung installiert mit Hilfe der Laravel CLI laravel. Sie installieren diese über
composer global require laravel/installer
Der Laravel Installer verwendet für die neue Anwendung die vorgegebenen Standardeinstellungen (z., B. Registrierungsmöglichkeit ohne Mailbestätigung).
Hinweis: Im Laufe diese Posts werden Sie diese anpassen.
Erstellen der Anwendung
laravel new app --stack=livewire --jet --teams
Anwendung erstellen
Konfiguration der Datenbank
Die Konfiguration der Datenbank erfolgt in der bereits vorhandenen Datei .env.
Nach der Installation finden Sie dort die folgenden Einträge für eine MySQL Datenbankanbindung:
Standardeinstellungen für die Datenbankverbindung
Wir wollen uns hier auf die Einrichten der Laravel Anwendung beschränken und nicht noch zusätzlich die Installation einer MySQL Datenbank beschreiben. Hierzu finden Sie mehr Informationen an anderer Stelle.
Datenbank SQLite verwenden
Ändern Sie den nachfolgenden Eintrag (im obigen Beispiel in Zeile 10):
DB_CONNECTION=sqlite
sqlite als Datenbank einstellen
Leere Datenbankdatei erstellen
Im nächsten Schritt erstellen wir eine leeren Datenbank, indem wir im Ordner database eine Datei database.sqlite erstellen
Initiale leere Datenbank-Datei erstellen
Hinweis: Sie können eine leere Datei auch über die Kommandozeile erstellen. Voraussetzung ist das Tool sqlite3 (hier geht’s zum Download)
sqlite3 database\database.sqlite "create table a(f int); drop table a;"
Eine leere SQlite-Datenbank können sie auch mit diesem Kommando erstellen:
touch database/database.sqlite
Tabellen erstellen
Im letzten Schritt werden in der Datenbank die für Laravel notwendigen Tabellen eingerichtet:
php artisan migrate
Migration der Tabellen durchführen
Hinweis: Die vorhandenen Tabellen können Sie sich über die Kommandozeile anzeigen lassen:
sqlite3.exe .\database\database.sqlite ".tables"
Vorhandene Tabellen in der Datenbank
Installation und Konfiguration des Frontend
Um mit dem Frontend arbeiten zu können müssen zu ersten die notwendigen Komponenten installiert und das Frontend erstellt werden:
npm install
npm run dev
Anzeigen der Anwendung
Die grundlegende Installation und Konfiguration ist abgeschlossen. Starten Sie die Anwendung durch das nachfolgende Kommando:
Die erstelle Laravel-Anwendung enthält bereits die Funktionalität, das sich Benutzer Registrieren und Anmelden können. Hierzu finden Sie auf der Startseite rechts oben entsprechende Links.
Mit den verwendeten Standardeinstellungen reicht zum Einrichten des neuen Benutzer der Name, die E-Mail und das Passwort.
Um eine höhere Sicherheit zu erreichen, werden diese Einstellungen so geändert, das einen Bestätigungsmail an den Benutzer gesendet wird. Erst durch den Klick auf den darin enthaltenen Bestätigungslink wird die Einrichtung des Benutzers abgeschlossen.
Aktivieren des Features emailVerification in der Datei config/fortify.php
Einrichten der emailVerification
Hinzufügen eines Interface im Benutzermodels app/Models/User.psp
use Illuminate\Contracts\Auth\MustVerifyEmail;
Erweitern des Klassendefinition im Benutzermodels app/Models/User.psp
class User extends Authenticatable implements MustVerifyEmail
Einrichten der emailVerification
Festlegen der E-Mail Konfiguration
Damit Laravel eine E-Mail versenden kann wird der Zugang zu einem E-Mail Server verwendet. Hier benötigen wir die Zugangsdaten für den SMTP-Versand.
Festgelegt werden diese Parameter wieder in der Datei .env:
Mailkonfiguration
Die entsprechenden Werte hängen vom verwendeten Mailserver ab.
Zuerst müssen Sie bei ihrem Provider ein Mailkonto einrichten (Benutzer und Passwort). Testen Sie am besten diese Daten über den von ihrem Provider bereitgestellten Webmailer.
Die weiteren Werte (Port, Protokoll) entnehmen Sie der Dokumentation ihres Providers.
Nachfolgend zwei Beispiele:
Provider
Strato
United Domains
MAIL_MAILER
smtp
smtp
MAIL_HOST
smtp.strato.de
smtps.udag.de
MAIL_PORT
587
587
MAIL_ENCRYPTION
tls
tls
Beispiele für die E-Mail-Konfiguration
Starten Sie die Anwendung neu und richten Sie einen weiteren Benutzer ein
php artisan serve
Lokalen Webserver starten
Registrierung durchführen
Starten Sie die Registrierung über den Link Register auf der Startseite.
Geben Sie die notwendigen Benutzerdaten ein. Bestätigen Sie ebenfalls die Terms of Services, falls diese aktiviert sind.
Bei erfolgreichen Versand der Bestätigungsmail erscheint diese Anzeige. Sie erhalten ebenfalls eine Bestätigungsmail an die verwendete E-Mail-Adresse.
Öffnen Sie die E-Mail und klicken Sie auf den Bestätigungslink. Achten Sie darauf, das der Link im gleichen Browser geöffnet wird, mit dem Sie die Registrierung durchgeführt haben.
Alternativ kopieren Sie einfach den Link, wechseln wieder zurück in das Registrierungsfenster und fügen den kopierten Link ein.
Danach befinden Sie sich auf dem Dashboard der Anwendung. Die Registrierung hat somit funktioniert.
Mögliche Konfigurationsfehler
E-Mail Server ist falsch
Fehlermeldung: Der angegebene Host ist unbekannt
Port ist falsch
Fehlermeldung: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte
Die erstelle Laravel-Jetstream Anwendung beinhaltet bereits “von Haus aus” einen großen Funktionsumfang. Jede einzelnen Funktionalität wird in den meisten Fällen durch mindestens zwei Dateien realisiert:
eine PHP-Klasse, welche die Funktionalität umsetzt (Programmcode)
eine Blade-Template, das die Ausgabe (Benutzersicht, View) umsetzt
Die Views werden z. B in dem nachfolgendem Ordner gespeichert:
vendor\laravel\jetstream\resources\views
Um diese Views innerhalb unserer Anwendung anpassen zu können, müssen sie an einer anderen Stelle gespeichert werden. Sonst werden unsere Änderungen z. B. nach jedem Update wieder gelöscht.
Wie kopieren diese durch den nachfolgenden Befehl:
php artisan vendor:publish --tag=jetstream-views
Die Kopien finden Sie im Ordner
resources\views\vendor\jetstream
Livewire Views
php artisan livewire:publish
Dadurch werden die nachfolgenden Dateien und Ordner erstellt:
Aktivieren Sie dazu das Feature termsAndPrivacyPolicy in der Datei config/jetstream.php
Dadurch sehen sie im Registrierungsdialog ein zusätzliches Optionsfeld
Ändern der Sprache
Bearbeiten Sie in der Datei config/app.php die Einstellung locale. Ändern Sie den Wert auf 'de'.
Nach einem Neustart der Anwendung werden aber weiterhin die englischen Texte angezeigt.
Die Ursache liegt an der nicht vorhandenen deutschen Übersetzung der verwendeten Texte. Prüfen Sie einfach den Ordner mit den vorhandenen Übersetzungen: resources/lang
Es gibt nur einen Unterordner en für die englischen Texte:
Zusätzlich zu den Übersetzungen muss noch ein weiterer Schritt erfolgen. Um ihre Anwendung komplett auf Mehrsprachlichkeit umzustellen dürfen keine Texte direkt angegeben werden.
Betrachten wir hierzu die Startseite, speziell die Links in der rechten oberen Ecke:
Der View für die Startseite wird in der Datei resources/views/welcome.blade.php definiert:
Wir sehen, das hier der Text direkt in englischer Sprache angegeben wird.
Es ist sehr schwierig, eine automatische Übersetzung für alle Texte durchzuführen, wenn nicht angegeben wird, ob ein bestimmter Text übersetzt werden soll. Einfach alle Texte zu übersetzen kann zu Problemen führen.
Daher wird bei Laravel der Weg gewählt, explizit anzugeben, ob ein Text übersetzt werden soll.
Diese Angabe der nachfolgende Text soll übersetzt werden erfolgt mit Hilfe der Funktion __ (Der Name der Funktion lautet tatsächlich __, als zwei Unterstriche)
Anstatt
Register
schreiben wir nun
{{ __('Register') }}
Dadurch erkennt Laravel (speziell die Blade Template Engine), das hier eine Übersetzung durchgeführt werden soll und sucht eine passenden Übersetzungstext.
Hier kommt nun der bereits angesprochen Ordner resources/lang ins Spiel. Erstellen Sie in diesem Ordner eine Datei de,json und verwenden Sie als Inhalt den nachfolgenden Text:
Nach einen Neustart der Anwendung sehen wir gewünschte Ergebnis:
Den gewünschten Übersetzungstext findet Blades anhand des angegebenen Textes innerhalb der Funktion __:
welcome.blade.php
de.json
Die Übersetzung der Anwendung erfordert somit für alle Texte die gleichen Schritte
Ermitteln des Views mit dem zu übersetzenden Text, z. B. Sample Text
Einbinden des Textes in die Funktion , z. B. {{ ('Sample text') }}
Hinzufügen der Übersetzung in der Datei de.json, z. B. "Sample text“: Beispieltext“
Erstellen einer neue Startseite
Die Startseite entspricht immer noch der Standardanwendung. Der entsprechende View ist welcome.blade.php.
Zur Startseite wird dieser View aber nicht durch den Namen, sondern durch eine Einstellung in der Datei routes/web.php
Mit Hilfe des von Laravel verwendeten Routing, wird festgelegt, welcher View angezeigt wird, wenn eine bestimmte URI aufgerufen wird.
In der vorhandenen Einstellung legt fest, das bei der Uri '/' der View 'welcome' angezeigt wird.
You can register your jetstream blade components in App\Providers\JetstreamServiceProvider.php located in app\Providers folder.
Fügen sie die nachfolgende Funktion hinzu:
protected function registerComponent(string $component) {
\Illuminate\Support\Facades\Blade::component('jetstream::components.'.$component, 'jet-'.$component);
}
Der nachfolgende Programmcode registriert ihre Komponente:
public function register() {
$this->registerComponent('subform');
}
Sie können diese nun wie folgt nutzen:
<x-jet-subform>
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept All”, you consent to the use of ALL the cookies. However, you may visit "Cookie Settings" to provide a controlled consent.
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.