redesign 2023
This commit is contained in:
commit
19bfc7311a
31
.forestry/settings.yml
Normal file
31
.forestry/settings.yml
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
new_page_extension: md
|
||||
auto_deploy: false
|
||||
admin_path:
|
||||
webhook_url:
|
||||
sections:
|
||||
- type: directory
|
||||
path: content
|
||||
label: Pages
|
||||
create: all
|
||||
match: "*"
|
||||
- type: directory
|
||||
path: content/posts
|
||||
label: Posts
|
||||
create: all
|
||||
match: "**/*"
|
||||
upload_dir: static/uploads
|
||||
public_path: "/uploads"
|
||||
front_matter_path: ''
|
||||
use_front_matter_path: false
|
||||
file_template: ":filename:"
|
||||
build:
|
||||
preview_env:
|
||||
- HUGO_ENV=staging
|
||||
- HUGO_VERSION=0.71.1
|
||||
preview_output_directory: public
|
||||
preview_docker_image: forestryio/hugo:latest
|
||||
mount_path: "/srv"
|
||||
working_dir: "/srv"
|
||||
instant_preview_command: hugo server -D -E -F --renderToDisk -d public
|
||||
version: 0.71.1
|
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.env
|
||||
.DS_Store
|
||||
.idea/
|
||||
/vendor
|
||||
/public
|
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
[submodule "themes/FixIt"]
|
||||
path = themes/FixIt
|
||||
url = https://github.com/hugo-fixit/FixIt.git
|
||||
[submodule "themes/themes/FixIt"]
|
||||
path = themes/themes/FixIt
|
||||
url = https://github.com/hugo-fixit/FixIt.git
|
0
.hugo_build.lock
Normal file
0
.hugo_build.lock
Normal file
6
archetypes/default.md
Normal file
6
archetypes/default.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "{{ replace .Name "-" " " | title }}"
|
||||
date: {{ .Date }}
|
||||
draft: true
|
||||
---
|
||||
|
1005
config.toml
Normal file
1005
config.toml
Normal file
File diff suppressed because it is too large
Load Diff
423
content-org/base.org
Normal file
423
content-org/base.org
Normal file
@ -0,0 +1,423 @@
|
||||
#+hugo_base_dir: ../
|
||||
#+hugo_section: ./
|
||||
#+options: author:nil
|
||||
|
||||
* EN
|
||||
|
||||
** Base Pages
|
||||
|
||||
All the basic stuff.
|
||||
|
||||
*** Legal Notice & Privacy Policy
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: legal.en.md
|
||||
:EXPORT_DATE: 2000-01-01
|
||||
:END:
|
||||
|
||||
Welcome to the my Legal Notice page. Here, you'll find all the necessary legal information about my company and our privacy policy. I know legal details can be cumbersome, but it's essential to get these particulars squared away so we can focus on what we both love - technology!
|
||||
|
||||
**** Legal Notice
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Germany
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
**** Privacy Policy
|
||||
|
||||
Privacy Policy
|
||||
We are very delighted that you have shown interest in our enterprise. Data protection is of a particularly high priority for the management of Sascha König. The use of the Internet pages of Sascha König is possible without any indication of personal data; however, if a data subject wants to use special enterprise services via our website, processing of personal data could become necessary. If the processing of personal data is necessary and there is no statutory basis for such processing, we generally obtain consent from the data subject.
|
||||
|
||||
The processing of personal data, such as the name, address, e-mail address, or telephone number of a data subject shall always be in line with the General Data Protection Regulation (GDPR), and in accordance with the country-specific data protection regulations applicable to Sascha König. By means of this data protection declaration, our enterprise would like to inform the general public of the nature, scope, and purpose of the personal data we collect, use and process. Furthermore, data subjects are informed, by means of this data protection declaration, of the rights to which they are entitled.
|
||||
|
||||
As the controller, Sascha König has implemented numerous technical and organizational measures to ensure the most complete protection of personal data processed through this website. However, Internet-based data transmissions may in principle have security gaps, so absolute protection may not be guaranteed. For this reason, every data subject is free to transfer personal data to us via alternative means, e.g. by telephone.
|
||||
|
||||
***** 1. Definitions
|
||||
The data protection declaration of Sascha König is based on the terms used by the European legislator for the adoption of the General Data Protection Regulation (GDPR). Our data protection declaration should be legible and understandable for the general public, as well as our customers and business partners. To ensure this, we would like to first explain the terminology used.
|
||||
|
||||
In this data protection declaration, we use, inter alia, the following terms:
|
||||
|
||||
****** a) Personal data
|
||||
Personal data means any information relating to an identified or identifiable natural person (“data subject”). An identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person.
|
||||
|
||||
****** b) Data subject
|
||||
Data subject is any identified or identifiable natural person, whose personal data is processed by the controller responsible for the processing.
|
||||
|
||||
****** c) Processing
|
||||
Processing is any operation or set of operations which is performed on personal data or on sets of personal data, whether or not by automated means, such as collection, recording, organisation, structuring, storage, adaptation or alteration, retrieval, consultation, use, disclosure by transmission, dissemination or otherwise making available, alignment or combination, restriction, erasure or destruction.
|
||||
|
||||
****** d) Restriction of processing
|
||||
Restriction of processing is the marking of stored personal data with the aim of limiting their processing in the future.
|
||||
|
||||
****** e) Profiling
|
||||
Profiling means any form of automated processing of personal data consisting of the use of personal data to evaluate certain personal aspects relating to a natural person, in particular to analyse or predict aspects concerning that natural person's performance at work, economic situation, health, personal preferences, interests, reliability, behaviour, location or movements.
|
||||
|
||||
****** f)Pseudonymisation
|
||||
Pseudonymisation is the processing of personal data in such a manner that the personal data can no longer be attributed to a specific data subject without the use of additional information, provided that such additional information is kept separately and is subject to technical and organisational measures to ensure that the personal data are not attributed to an identified or identifiable natural person.
|
||||
|
||||
****** g) Controller or controller responsible for the processing
|
||||
Controller or controller responsible for the processing is the natural or legal person, public authority, agency or other body which, alone or jointly with others, determines the purposes and means of the processing of personal data; where the purposes and means of such processing are determined by Union or Member State law, the controller or the specific criteria for its nomination may be provided for by Union or Member State law.
|
||||
|
||||
****** h) Processor
|
||||
Processor is a natural or legal person, public authority, agency or other body which processes personal data on behalf of the controller.
|
||||
|
||||
****** i) Recipient
|
||||
Recipient is a natural or legal person, public authority, agency or another body, to which the personal data are disclosed, whether a third party or not. However, public authorities which may receive personal data in the framework of a particular inquiry in accordance with Union or Member State law shall not be regarded as recipients; the processing of those data by those public authorities shall be in compliance with the applicable data protection rules according to the purposes of the processing.
|
||||
|
||||
****** j) Third party
|
||||
Third party is a natural or legal person, public authority, agency or body other than the data subject, controller, processor and persons who, under the direct authority of the controller or processor, are authorised to process personal data.
|
||||
|
||||
****** k) Consent
|
||||
Consent of the data subject is any freely given, specific, informed and unambiguous indication of the data subject's wishes by which he or she, by a statement or by a clear affirmative action, signifies agreement to the processing of personal data relating to him or her.
|
||||
|
||||
***** 2. Name and Address of the controller
|
||||
Controller for the purposes of the General Data Protection Regulation (GDPR), other data protection laws applicable in Member states of the European Union and other provisions related to data protection is:
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
***** 3. Collection of general data and information
|
||||
The website of Sascha König collects a series of general data and information when a data subject or automated system calls up the website. This general data and information are stored in the server log files. Collected may be (1) the browser types and versions used, (2) the operating system used by the accessing system, (3) the website from which an accessing system reaches our website (so-called referrers), (4) the sub-websites, (5) the date and time of access to the Internet site, (6) an Internet protocol address (IP address), (7) the Internet service provider of the accessing system, and (8) any other similar data and information that may be used in the event of attacks on our information technology systems.
|
||||
|
||||
When using these general data and information, Sascha König does not draw any conclusions about the data subject. Rather, this information is needed to (1) deliver the content of our website correctly, (2) optimize the content of our website as well as its advertisement, (3) ensure the long-term viability of our information technology systems and website technology, and (4) provide law enforcement authorities with the information necessary for criminal prosecution in case of a cyber-attack. Therefore, Sascha König analyzes anonymously collected data and information statistically, with the aim of increasing the data protection and data security of our enterprise, and to ensure an optimal level of protection for the personal data we process. The anonymous data of the server log files are stored separately from all personal data provided by a data subject.
|
||||
|
||||
***** 4. Subscription to our newsletters
|
||||
On the website of Sascha König, users are given the opportunity to subscribe to our enterprise's newsletter. The input mask used for this purpose determines what personal data are transmitted, as well as when the newsletter is ordered from the controller.
|
||||
|
||||
The Sascha König informs its customers and business partners regularly by means of a newsletter about enterprise offers. The enterprise's newsletter may only be received by the data subject if (1) the data subject has a valid e-mail address and (2) the data subject registers for the newsletter shipping. A confirmation e-mail will be sent to the e-mail address registered by a data subject for the first time for newsletter shipping, for legal reasons, in the double opt-in procedure. This confirmation e-mail is used to prove whether the owner of the e-mail address as the data subject is authorized to receive the newsletter.
|
||||
|
||||
During the registration for the newsletter, we also store the IP address of the computer system assigned by the Internet service provider (ISP) and used by the data subject at the time of the registration, as well as the date and time of the registration. The collection of this data is necessary in order to understand the (possible) misuse of the e-mail address of a data subject at a later date, and it therefore serves the aim of the legal protection of the controller.
|
||||
|
||||
The personal data collected as part of a registration for the newsletter will only be used to send our newsletter. In addition, subscribers to the newsletter may be informed by e-mail, as long as this is necessary for the operation of the newsletter service or a registration in question, as this could be the case in the event of modifications to the newsletter offer, or in the event of a change in technical circumstances. There will be no transfer of personal data collected by the newsletter service to third parties. The subscription to our newsletter may be terminated by the data subject at any time. The consent to the storage of personal data, which the data subject has given for shipping the newsletter, may be revoked at any time. For the purpose of revocation of consent, a corresponding link is found in each newsletter. It is also possible to unsubscribe from the newsletter at any time directly on the website of the controller, or to communicate this to the controller in a different way.
|
||||
|
||||
***** 5. Newsletter-Tracking
|
||||
The newsletter of Sascha König contains so-called tracking pixels. A tracking pixel is a miniature graphic embedded in such e-mails, which are sent in HTML format to enable log file recording and analysis. This allows a statistical analysis of the success or failure of online marketing campaigns. Based on the embedded tracking pixel, Sascha König may see if and when an e-mail was opened by a data subject, and which links in the e-mail were called up by data subjects.
|
||||
|
||||
Such personal data collected in the tracking pixels contained in the newsletters are stored and analyzed by the controller in order to optimize the shipping of the newsletter, as well as to adapt the content of future newsletters even better to the interests of the data subject. These personal data will not be passed on to third parties. Data subjects are at any time entitled to revoke the respective separate declaration of consent issued by means of the double-opt-in procedure. After a revocation, these personal data will be deleted by the controller. The Sascha König automatically regards a withdrawal from the receipt of the newsletter as a revocation.
|
||||
|
||||
***** 6. Comments function in the blog on the website
|
||||
The Sascha König offers users the possibility to leave individual comments on individual blog contributions on a blog, which is on the website of the controller. A blog is a web-based, publicly-accessible portal, through which one or more people called bloggers or web-bloggers may post articles or write down thoughts in so-called blogposts. Blogposts may usually be commented by third parties.
|
||||
|
||||
If a data subject leaves a comment on the blog published on this website, the comments made by the data subject are also stored and published, as well as information on the date of the commentary and on the user's (pseudonym) chosen by the data subject. In addition, the IP address assigned by the Internet service provider (ISP) to the data subject is also logged. This storage of the IP address takes place for security reasons, and in case the data subject violates the rights of third parties, or posts illegal content through a given comment. The storage of these personal data is, therefore, in the own interest of the data controller, so that he can exculpate in the event of an infringement. This collected personal data will not be passed to third parties, unless such a transfer is required by law or serves the aim of the defense of the data controller.
|
||||
|
||||
***** 7. Routine erasure and blocking of personal data
|
||||
The data controller shall process and store the personal data of the data subject only for the period necessary to achieve the purpose of storage, or as far as this is granted by the European legislator or other legislators in laws or regulations to which the controller is subject to.
|
||||
|
||||
If the storage purpose is not applicable, or if a storage period prescribed by the European legislator or another competent legislator expires, the personal data are routinely blocked or erased in accordance with legal requirements.
|
||||
|
||||
***** 8. Rights of the data subject
|
||||
****** a) Right of confirmation
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller the confirmation as to whether or not personal data concerning him or her are being processed. If a data subject wishes to avail himself of this right of confirmation, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
****** b) Right of access
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller free information about his or her personal data stored at any time and a copy of this information. Furthermore, the European directives and regulations grant the data subject access to the following information:
|
||||
|
||||
the purposes of the processing;
|
||||
the categories of personal data concerned;
|
||||
the recipients or categories of recipients to whom the personal data have been or will be disclosed, in particular recipients in third countries or international organisations;
|
||||
where possible, the envisaged period for which the personal data will be stored, or, if not possible, the criteria used to determine that period;
|
||||
the existence of the right to request from the controller rectification or erasure of personal data, or restriction of processing of personal data concerning the data subject, or to object to such processing;
|
||||
the existence of the right to lodge a complaint with a supervisory authority;
|
||||
where the personal data are not collected from the data subject, any available information as to their source;
|
||||
the existence of automated decision-making, including profiling, referred to in Article 22(1) and (4) of the GDPR and, at least in those cases, meaningful information about the logic involved, as well as the significance and envisaged consequences of such processing for the data subject.
|
||||
Furthermore, the data subject shall have a right to obtain information as to whether personal data are transferred to a third country or to an international organisation. Where this is the case, the data subject shall have the right to be informed of the appropriate safeguards relating to the transfer.
|
||||
|
||||
If a data subject wishes to avail himself of this right of access, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
****** c) Right to rectification
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller without undue delay the rectification of inaccurate personal data concerning him or her. Taking into account the purposes of the processing, the data subject shall have the right to have incomplete personal data completed, including by means of providing a supplementary statement.
|
||||
|
||||
If a data subject wishes to exercise this right to rectification, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
****** d) Right to erasure (Right to be forgotten)
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller the erasure of personal data concerning him or her without undue delay, and the controller shall have the obligation to erase personal data without undue delay where one of the following grounds applies, as long as the processing is not necessary:
|
||||
|
||||
The personal data are no longer necessary in relation to the purposes for which they were collected or otherwise processed.
|
||||
The data subject withdraws consent to which the processing is based according to point (a) of Article 6(1) of the GDPR, or point (a) of Article 9(2) of the GDPR, and where there is no other legal ground for the processing.
|
||||
The data subject objects to the processing pursuant to Article 21(1) of the GDPR and there are no overriding legitimate grounds for the processing, or the data subject objects to the processing pursuant to Article 21(2) of the GDPR.
|
||||
The personal data have been unlawfully processed.
|
||||
The personal data must be erased for compliance with a legal obligation in Union or Member State law to which the controller is subject.
|
||||
The personal data have been collected in relation to the offer of information society services referred to in Article 8(1) of the GDPR.
|
||||
If one of the aforementioned reasons applies, and a data subject wishes to request the erasure of personal data stored by Sascha König, he or she may, at any time, contact any employee of the controller. An employee of Sascha König shall promptly ensure that the erasure request is complied with immediately.
|
||||
|
||||
Where the controller has made personal data public and is obliged pursuant to Article 17(1) to erase the personal data, the controller, taking account of available technology and the cost of implementation, shall take reasonable steps, including technical measures, to inform other controllers processing the personal data that the data subject has requested erasure by such controllers of any links to, or copy or replication of, those personal data, as far as processing is not required. An employees of Sascha König will arrange the necessary measures in individual cases.
|
||||
|
||||
****** e) Right of restriction of processing
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller restriction of processing where one of the following applies:
|
||||
|
||||
The accuracy of the personal data is contested by the data subject, for a period enabling the controller to verify the accuracy of the personal data.
|
||||
The processing is unlawful and the data subject opposes the erasure of the personal data and requests instead the restriction of their use instead.
|
||||
The controller no longer needs the personal data for the purposes of the processing, but they are required by the data subject for the establishment, exercise or defence of legal claims.
|
||||
The data subject has objected to processing pursuant to Article 21(1) of the GDPR pending the verification whether the legitimate grounds of the controller override those of the data subject.
|
||||
If one of the aforementioned conditions is met, and a data subject wishes to request the restriction of the processing of personal data stored by Sascha König, he or she may at any time contact any employee of the controller. The employee of Sascha König will arrange the restriction of the processing.
|
||||
|
||||
****** f) Right to data portability
|
||||
Each data subject shall have the right granted by the European legislator, to receive the personal data concerning him or her, which was provided to a controller, in a structured, commonly used and machine-readable format. He or she shall have the right to transmit those data to another controller without hindrance from the controller to which the personal data have been provided, as long as the processing is based on consent pursuant to point (a) of Article 6(1) of the GDPR or point (a) of Article 9(2) of the GDPR, or on a contract pursuant to point (b) of Article 6(1) of the GDPR, and the processing is carried out by automated means, as long as the processing is not necessary for the performance of a task carried out in the public interest or in the exercise of official authority vested in the controller.
|
||||
|
||||
Furthermore, in exercising his or her right to data portability pursuant to Article 20(1) of the GDPR, the data subject shall have the right to have personal data transmitted directly from one controller to another, where technically feasible and when doing so does not adversely affect the rights and freedoms of others.
|
||||
|
||||
In order to assert the right to data portability, the data subject may at any time contact any employee of Sascha König.
|
||||
|
||||
****** g) Right to object
|
||||
Each data subject shall have the right granted by the European legislator to object, on grounds relating to his or her particular situation, at any time, to processing of personal data concerning him or her, which is based on point (e) or (f) of Article 6(1) of the GDPR. This also applies to profiling based on these provisions.
|
||||
|
||||
The Sascha König shall no longer process the personal data in the event of the objection, unless we can demonstrate compelling legitimate grounds for the processing which override the interests, rights and freedoms of the data subject, or for the establishment, exercise or defence of legal claims.
|
||||
|
||||
If Sascha König processes personal data for direct marketing purposes, the data subject shall have the right to object at any time to processing of personal data concerning him or her for such marketing. This applies to profiling to the extent that it is related to such direct marketing. If the data subject objects to Sascha König to the processing for direct marketing purposes, Sascha König will no longer process the personal data for these purposes.
|
||||
|
||||
In addition, the data subject has the right, on grounds relating to his or her particular situation, to object to processing of personal data concerning him or her by Sascha König for scientific or historical research purposes, or for statistical purposes pursuant to Article 89(1) of the GDPR, unless the processing is necessary for the performance of a task carried out for reasons of public interest.
|
||||
|
||||
In order to exercise the right to object, the data subject may contact any employee of Sascha König. In addition, the data subject is free in the context of the use of information society services, and notwithstanding Directive 2002/58/EC, to use his or her right to object by automated means using technical specifications.
|
||||
|
||||
****** h) Automated individual decision-making, including profiling
|
||||
Each data subject shall have the right granted by the European legislator not to be subject to a decision based solely on automated processing, including profiling, which produces legal effects concerning him or her, or similarly significantly affects him or her, as long as the decision (1) is not is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) is not authorised by Union or Member State law to which the controller is subject and which also lays down suitable measures to safeguard the data subject's rights and freedoms and legitimate interests, or (3) is not based on the data subject's explicit consent.
|
||||
|
||||
If the decision (1) is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) it is based on the data subject's explicit consent, Sascha König shall implement suitable measures to safeguard the data subject's rights and freedoms and legitimate interests, at least the right to obtain human intervention on the part of the controller, to express his or her point of view and contest the decision.
|
||||
|
||||
If the data subject wishes to exercise the rights concerning automated individual decision-making, he or she may, at any time, contact any employee of Sascha König.
|
||||
|
||||
****** i) Right to withdraw data protection consent
|
||||
Each data subject shall have the right granted by the European legislator to withdraw his or her consent to processing of his or her personal data at any time.
|
||||
|
||||
If the data subject wishes to exercise the right to withdraw the consent, he or she may, at any time, contact any employee of Sascha König.
|
||||
|
||||
***** 9. Legal basis for the processing
|
||||
Art. 6(1) lit. a GDPR serves as the legal basis for processing operations for which we obtain consent for a specific processing purpose. If the processing of personal data is necessary for the performance of a contract to which the data subject is party, as is the case, for example, when processing operations are necessary for the supply of goods or to provide any other service, the processing is based on Article 6(1) lit. b GDPR. The same applies to such processing operations which are necessary for carrying out pre-contractual measures, for example in the case of inquiries concerning our products or services. Is our company subject to a legal obligation by which processing of personal data is required, such as for the fulfillment of tax obligations, the processing is based on Art. 6(1) lit. c GDPR. In rare cases, the processing of personal data may be necessary to protect the vital interests of the data subject or of another natural person. This would be the case, for example, if a visitor were injured in our company and his name, age, health insurance data or other vital information would have to be passed on to a doctor, hospital or other third party. Then the processing would be based on Art. 6(1) lit. d GDPR. Finally, processing operations could be based on Article 6(1) lit. f GDPR. This legal basis is used for processing operations which are not covered by any of the abovementioned legal grounds, if processing is necessary for the purposes of the legitimate interests pursued by our company or by a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the data subject which require protection of personal data. Such processing operations are particularly permissible because they have been specifically mentioned by the European legislator. He considered that a legitimate interest could be assumed if the data subject is a client of the controller (Recital 47 Sentence 2 GDPR).
|
||||
|
||||
***** 10. The legitimate interests pursued by the controller or by a third party
|
||||
Where the processing of personal data is based on Article 6(1) lit. f GDPR our legitimate interest is to carry out our business in favor of the well-being of all our employees and the shareholders.
|
||||
|
||||
***** 11. Period for which the personal data will be stored
|
||||
The criteria used to determine the period of storage of personal data is the respective statutory retention period. After expiration of that period, the corresponding data is routinely deleted, as long as it is no longer necessary for the fulfillment of the contract or the initiation of a contract.
|
||||
|
||||
***** 12. Provision of personal data as statutory or contractual requirement; Requirement necessary to enter into a contract; Obligation of the data subject to provide the personal data; possible consequences of failure to provide such data
|
||||
We clarify that the provision of personal data is partly required by law (e.g. tax regulations) or can also result from contractual provisions (e.g. information on the contractual partner). Sometimes it may be necessary to conclude a contract that the data subject provides us with personal data, which must subsequently be processed by us. The data subject is, for example, obliged to provide us with personal data when our company signs a contract with him or her. The non-provision of the personal data would have the consequence that the contract with the data subject could not be concluded. Before personal data is provided by the data subject, the data subject must contact any employee. The employee clarifies to the data subject whether the provision of the personal data is required by law or contract or is necessary for the conclusion of the contract, whether there is an obligation to provide the personal data and the consequences of non-provision of the personal data.
|
||||
|
||||
***** 13. Existence of automated decision-making
|
||||
As a responsible company, we do not use automatic decision-making or profiling.
|
||||
|
||||
Developed by the specialists for LegalTech at Willing & Able that also developed the system for data protection training. The legal texts contained in our privacy policy generator have been provided and published by Prof. Dr. h.c. Heiko Jonny Maniero from the German Association for Data Protection and Christian Solmecke from WBS law.
|
||||
|
||||
|
||||
* DE
|
||||
|
||||
*** Impressum & Datenschutzerklärung
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: legal.de.md
|
||||
:EXPORT_DATE: 2000-10-03
|
||||
:END:
|
||||
|
||||
Willkommen auf dieser Seite, die die rechtlichen Unternehmensdetails und Datenschutzbestimmungen von Sascha König enthält. Es ist wichtig, dass wir die rechtlichen Aspekte klären, um Transparenz und Vertrauen zu gewährleisten. Vielen Dank für Ihr Verständnis und Ihre Zusammenarbeit.
|
||||
|
||||
**** Impressum
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
**** Datenschutzerklärung
|
||||
|
||||
Wir freuen uns sehr über Ihr Interesse an unserem Unternehmen. Datenschutz hat einen besonders hohen Stellenwert für die Geschäftsleitung der Sascha König. Eine Nutzung der Internetseiten der Sascha König ist grundsätzlich ohne jede Angabe personenbezogener Daten möglich. Sofern eine betroffene Person besondere Services unseres Unternehmens über unsere Internetseite in Anspruch nehmen möchte, könnte jedoch eine Verarbeitung personenbezogener Daten erforderlich werden. Ist die Verarbeitung personenbezogener Daten erforderlich und besteht für eine solche Verarbeitung keine gesetzliche Grundlage, holen wir generell eine Einwilligung der betroffenen Person ein.
|
||||
|
||||
Die Verarbeitung personenbezogener Daten, beispielsweise des Namens, der Anschrift, E-Mail-Adresse oder Telefonnummer einer betroffenen Person, erfolgt stets im Einklang mit der Datenschutz-Grundverordnung und in Übereinstimmung mit den für Sascha König geltenden landesspezifischen Datenschutzbestimmungen. Mittels dieser Datenschutzerklärung möchte unser Unternehmen die Öffentlichkeit über Art, Umfang und Zweck der von uns erhobenen, genutzten und verarbeiteten personenbezogenen Daten informieren. Ferner werden betroffene Personen mittels dieser Datenschutzerklärung über die ihnen zustehenden Rechte aufgeklärt.
|
||||
|
||||
Sascha König hat als für die Verarbeitung Verantwortlicher zahlreiche technische und organisatorische Maßnahmen umgesetzt, um einen möglichst lückenlosen Schutz der über diese Internetseite verarbeiteten personenbezogenen Daten sicherzustellen. Dennoch können Internetbasierte Datenübertragungen grundsätzlich Sicherheitslücken aufweisen, sodass ein absoluter Schutz nicht gewährleistet werden kann. Aus diesem Grund steht es jeder betroffenen Person frei, personenbezogene Daten auch auf alternativen Wegen, beispielsweise telefonisch, an uns zu übermitteln.
|
||||
|
||||
***** 1. Begriffsbestimmungen
|
||||
Die Datenschutzerklärung der Sascha König beruht auf den Begrifflichkeiten, die durch den Europäischen Richtlinien- und Verordnungsgeber beim Erlass der Datenschutz-Grundverordnung (DS-GVO) verwendet wurden. Unsere Datenschutzerklärung soll sowohl für die Öffentlichkeit als auch für unsere Kunden und Geschäftspartner einfach lesbar und verständlich sein. Um dies zu gewährleisten, möchten wir vorab die verwendeten Begrifflichkeiten erläutern.
|
||||
|
||||
Wir verwenden in dieser Datenschutzerklärung unter anderem die folgenden Begriffe:
|
||||
|
||||
****** a) personenbezogene Daten
|
||||
Personenbezogene Daten sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden „betroffene Person“) beziehen. Als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung oder zu einem oder mehreren besonderen Merkmalen, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind, identifiziert werden kann.
|
||||
|
||||
****** b) betroffene Person
|
||||
Betroffene Person ist jede identifizierte oder identifizierbare natürliche Person, deren personenbezogene Daten von dem für die Verarbeitung Verantwortlichen verarbeitet werden.
|
||||
|
||||
****** c) Verarbeitung
|
||||
Verarbeitung ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten wie das Erheben, das Erfassen, die Organisation, das Ordnen, die Speicherung, die Anpassung oder Veränderung, das Auslesen, das Abfragen, die Verwendung, die Offenlegung durch Übermittlung, Verbreitung oder eine andere Form der Bereitstellung, den Abgleich oder die Verknüpfung, die Einschränkung, das Löschen oder die Vernichtung.
|
||||
|
||||
****** d) Einschränkung der Verarbeitung
|
||||
Einschränkung der Verarbeitung ist die Markierung gespeicherter personenbezogener Daten mit dem Ziel, ihre künftige Verarbeitung einzuschränken.
|
||||
|
||||
****** e) Profiling
|
||||
Profiling ist jede Art der automatisierten Verarbeitung personenbezogener Daten, die darin besteht, dass diese personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person beziehen, zu bewerten, insbesondere, um Aspekte bezüglich Arbeitsleistung, wirtschaftlicher Lage, Gesundheit, persönlicher Vorlieben, Interessen, Zuverlässigkeit, Verhalten, Aufenthaltsort oder Ortswechsel dieser natürlichen Person zu analysieren oder vorherzusagen.
|
||||
|
||||
****** f) Pseudonymisierung
|
||||
Pseudonymisierung ist die Verarbeitung personenbezogener Daten in einer Weise, auf welche die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können, sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren natürlichen Person zugewiesen werden.
|
||||
|
||||
****** g) Verantwortlicher oder für die Verarbeitung Verantwortlicher
|
||||
Verantwortlicher oder für die Verarbeitung Verantwortlicher ist die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet. Sind die Zwecke und Mittel dieser Verarbeitung durch das Unionsrecht oder das Recht der Mitgliedstaaten vorgegeben, so kann der Verantwortliche beziehungsweise können die bestimmten Kriterien seiner Benennung nach dem Unionsrecht oder dem Recht der Mitgliedstaaten vorgesehen werden.
|
||||
|
||||
****** h) Auftragsverarbeiter
|
||||
Auftragsverarbeiter ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.
|
||||
|
||||
****** i) Empfänger
|
||||
Empfänger ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, der personenbezogene Daten offengelegt werden, unabhängig davon, ob es sich bei ihr um einen Dritten handelt oder nicht. Behörden, die im Rahmen eines bestimmten Untersuchungsauftrags nach dem Unionsrecht oder dem Recht der Mitgliedstaaten möglicherweise personenbezogene Daten erhalten, gelten jedoch nicht als Empfänger.
|
||||
|
||||
****** j) Dritter
|
||||
Dritter ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle außer der betroffenen Person, dem Verantwortlichen, dem Auftragsverarbeiter und den Personen, die unter der unmittelbaren Verantwortung des Verantwortlichen oder des Auftragsverarbeiters befugt sind, die personenbezogenen Daten zu verarbeiten.
|
||||
|
||||
****** k) Einwilligung
|
||||
Einwilligung ist jede von der betroffenen Person freiwillig für den bestimmten Fall in informierter Weise und unmissverständlich abgegebene Willensbekundung in Form einer Erklärung oder einer sonstigen eindeutigen bestätigenden Handlung, mit der die betroffene Person zu verstehen gibt, dass sie mit der Verarbeitung der sie betreffenden personenbezogenen Daten einverstanden ist.
|
||||
|
||||
***** 2. Name und Anschrift des für die Verarbeitung Verantwortlichen
|
||||
Verantwortlicher im Sinne der Datenschutz-Grundverordnung, sonstiger in den Mitgliedstaaten der Europäischen Union geltenden Datenschutzgesetze und anderer Bestimmungen mit datenschutzrechtlichem Charakter ist die:
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
E-Mail: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
***** 3. Erfassung von allgemeinen Daten und Informationen
|
||||
Die Internetseite Sascha König erfasst mit jedem Aufruf der Internetseite durch eine betroffene Person oder ein automatisiertes System eine Reihe von allgemeinen Daten und Informationen. Diese allgemeinen Daten und Informationen werden in den Logfiles des Servers gespeichert. Erfasst werden können die (1) verwendeten Browsertypen und Versionen, (2) das vom zugreifenden System verwendete Betriebssystem, (3) die Internetseite, von welcher ein zugreifendes System auf unsere Internetseite gelangt (sogenannte Referrer), (4) die Unterwebseiten, welche über ein zugreifendes System auf unserer Internetseite angesteuert werden, (5) das Datum und die Uhrzeit eines Zugriffs auf die Internetseite, (6) eine Internet-Protokoll-Adresse (IP-Adresse), (7) der Internet-Service-Provider des zugreifenden Systems und (8) sonstige ähnliche Daten und Informationen, die der Gefahrenabwehr im Falle von Angriffen auf unsere informationstechnologischen Systeme dienen.
|
||||
|
||||
Bei der Nutzung dieser allgemeinen Daten und Informationen zieht Sascha König keine Rückschlüsse auf die betroffene Person. Diese Informationen werden vielmehr benötigt, um (1) die Inhalte unserer Internetseite korrekt auszuliefern, (2) die Inhalte unserer Internetseite sowie die Werbung für diese zu optimieren, (3) die dauerhafte Funktionsfähigkeit unserer informationstechnologischen Systeme und der Technik unserer Internetseite zu gewährleisten sowie (4) um Strafverfolgungsbehörden im Falle eines Cyberangriffes die zur Strafverfolgung notwendigen Informationen bereitzustellen. Diese anonym erhobenen Daten und Informationen werden durch Sascha König daher einerseits statistisch und ferner mit dem Ziel ausgewertet, den Datenschutz und die Datensicherheit in unserem Unternehmen zu erhöhen, um letztlich ein optimales Schutzniveau für die von uns verarbeiteten personenbezogenen Daten sicherzustellen. Die anonymen Daten der Server-Logfiles werden getrennt von allen durch eine betroffene Person angegebenen personenbezogenen Daten gespeichert.
|
||||
|
||||
***** 4. Abonnement unseres Newsletters
|
||||
Auf der Internetseite der Sascha König wird den Benutzern die Möglichkeit eingeräumt, den Newsletter unseres Unternehmens zu abonnieren. Welche personenbezogenen Daten bei der Bestellung des Newsletters an den für die Verarbeitung Verantwortlichen übermittelt werden, ergibt sich aus der hierzu verwendeten Eingabemaske.
|
||||
|
||||
Sascha König informiert ihre Kunden und Geschäftspartner in regelmäßigen Abständen im Wege eines Newsletters über Angebote des Unternehmens. Der Newsletter unseres Unternehmens kann von der betroffenen Person grundsätzlich nur dann empfangen werden, wenn (1) die betroffene Person über eine gültige E-Mail-Adresse verfügt und (2) die betroffene Person sich für den Newsletterversand registriert. An die von einer betroffenen Person erstmalig für den Newsletterversand eingetragene E-Mail-Adresse wird aus rechtlichen Gründen eine Bestätigungsmail im Double-Opt-In-Verfahren versendet. Diese Bestätigungsmail dient der Überprüfung, ob der Inhaber der E-Mail-Adresse als betroffene Person den Empfang des Newsletters autorisiert hat.
|
||||
|
||||
Bei der Anmeldung zum Newsletter speichern wir ferner die vom Internet-Service-Provider (ISP) vergebene IP-Adresse des von der betroffenen Person zum Zeitpunkt der Anmeldung verwendeten Computersystems sowie das Datum und die Uhrzeit der Anmeldung. Die Erhebung dieser Daten ist erforderlich, um den(möglichen) Missbrauch der E-Mail-Adresse einer betroffenen Person zu einem späteren Zeitpunkt nachvollziehen zu können und dient deshalb der rechtlichen Absicherung des für die Verarbeitung Verantwortlichen.
|
||||
|
||||
Die im Rahmen einer Anmeldung zum Newsletter erhobenen personenbezogenen Daten werden ausschließlich zum Versand unseres Newsletters verwendet. Ferner könnten Abonnenten des Newsletters per E-Mail informiert werden, sofern dies für den Betrieb des Newsletter-Dienstes oder eine diesbezügliche Registrierung erforderlich ist, wie dies im Falle von Änderungen am Newsletterangebot oder bei der Veränderung der technischen Gegebenheiten der Fall sein könnte. Es erfolgt keine Weitergabe der im Rahmen des Newsletter-Dienstes erhobenen personenbezogenen Daten an Dritte. Das Abonnement unseres Newsletters kann durch die betroffene Person jederzeit gekündigt werden. Die Einwilligung in die Speicherung personenbezogener Daten, die die betroffene Person uns für den Newsletterversand erteilt hat, kann jederzeit widerrufen werden. Zum Zwecke des Widerrufs der Einwilligung findet sich in jedem Newsletter ein entsprechender Link. Ferner besteht die Möglichkeit, sich jederzeit auch direkt auf der Internetseite des für die Verarbeitung Verantwortlichen vom Newsletterversand abzumelden oder dies dem für die Verarbeitung Verantwortlichen auf andere Weise mitzuteilen.
|
||||
|
||||
***** 5. Newsletter-Tracking
|
||||
Die Newsletter der Sascha König enthalten sogenannte Zählpixel. Ein Zählpixel ist eine Miniaturgrafik, die in solche E-Mails eingebettet wird, welche im HTML-Format versendet werden, um eine Logdatei-Aufzeichnung und eine Logdatei-Analyse zu ermöglichen. Dadurch kann eine statistische Auswertung des Erfolges oder Misserfolges von Online-Marketing-Kampagnen durchgeführt werden. Anhand des eingebetteten Zählpixels kann Sascha König erkennen, ob und wann eine E-Mail von einer betroffenen Person geöffnet wurde und welche in der E-Mail befindlichen Links von der betroffenen Person aufgerufen wurden.
|
||||
|
||||
Solche über die in den Newslettern enthaltenen Zählpixel erhobenen personenbezogenen Daten, werden von dem für die Verarbeitung Verantwortlichen gespeichert und ausgewertet, um den Newsletterversand zu optimieren und den Inhalt zukünftiger Newsletter noch besser den Interessen der betroffenen Person anzupassen. Diese personenbezogenen Daten werden nicht an Dritte weitergegeben. Betroffene Personen sind jederzeit berechtigt, die diesbezügliche gesonderte, über das Double-Opt-In-Verfahren abgegebene Einwilligungserklärung zu widerrufen. Nach einem Widerruf werden diese personenbezogenen Daten von dem für die Verarbeitung Verantwortlichen gelöscht. Eine Abmeldung vom Erhalt des Newsletters deutet Sascha König automatisch als Widerruf.
|
||||
|
||||
***** 6. Kommentarfunktion im Blog auf der Internetseite
|
||||
Sascha König bietet den Nutzern auf einem Blog, der sich auf der Internetseite des für die Verarbeitung Verantwortlichen befindet, die Möglichkeit, individuelle Kommentare zu einzelnen Blog-Beiträgen zu hinterlassen. Ein Blog ist ein auf einer Internetseite geführtes, in der Regel öffentlich einsehbares Portal, in welchem eine oder mehrere Personen, die Blogger oder Web-Blogger genannt werden, Artikel posten oder Gedanken in sogenannten Blogposts niederschreiben können. Die Blogposts können in der Regel von Dritten kommentiert werden.
|
||||
|
||||
Hinterlässt eine betroffene Person einen Kommentar in dem auf dieser Internetseite veröffentlichten Blog, werden neben den von der betroffenen Person hinterlassenen Kommentaren auch Angaben zum Zeitpunkt der Kommentareingabe sowie zu dem von der betroffenen Person gewählten Nutzernamen (Pseudonym) gespeichert und veröffentlicht. Ferner wird die vom Internet-Service-Provider (ISP) der betroffenen Person vergebene IP-Adresse mitprotokolliert. Diese Speicherung der IP-Adresse erfolgt aus Sicherheitsgründen und für den Fall, dass die betroffene Person durch einen abgegebenen Kommentar die Rechte Dritter verletzt oder rechtswidrige Inhalte postet. Die Speicherung dieser personenbezogenen Daten erfolgt daher im eigenen Interesse des für die Verarbeitung Verantwortlichen, damit sich dieser im Falle einer Rechtsverletzung gegebenenfalls exkulpieren könnte. Es erfolgt keine Weitergabe dieser erhobenen personenbezogenen Daten an Dritte, sofern eine solche Weitergabe nicht gesetzlich vorgeschrieben ist oder der Rechtsverteidigung des für die Verarbeitung Verantwortlichen dient.
|
||||
|
||||
***** 7. Routinemäßige Löschung und Sperrung von personenbezogenen Daten
|
||||
Der für die Verarbeitung Verantwortliche verarbeitet und speichert personenbezogene Daten der betroffenen Person nur für den Zeitraum, der zur Erreichung des Speicherungszwecks erforderlich ist oder sofern dies durch den Europäischen Richtlinien- und Verordnungsgeber oder einen anderen Gesetzgeber in Gesetzen oder Vorschriften, welchen der für die Verarbeitung Verantwortliche unterliegt, vorgesehen wurde.
|
||||
|
||||
Entfällt der Speicherungszweck oder läuft eine vom Europäischen Richtlinien- und Verordnungsgeber oder einem anderen zuständigen Gesetzgeber vorgeschriebene Speicherfrist ab, werden die personenbezogenen Daten routinemäßig und entsprechend den gesetzlichen Vorschriften gesperrt oder gelöscht.
|
||||
|
||||
***** 8. Rechte der betroffenen Person
|
||||
****** a) Recht auf Bestätigung
|
||||
Jede betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber eingeräumte Recht, von dem für die Verarbeitung Verantwortlichen eine Bestätigung darüber zu verlangen, ob sie betreffende personenbezogene Daten verarbeitet werden. Möchte eine betroffene Person dieses Bestätigungsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
****** b) Recht auf Auskunft
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, jederzeit von dem für die Verarbeitung Verantwortlichen unentgeltliche Auskunft über die zu seiner Person gespeicherten personenbezogenen Daten und eine Kopie dieser Auskunft zu erhalten. Ferner hat der Europäische Richtlinien- und Verordnungsgeber der betroffenen Person Auskunft über folgende Informationen zugestanden:
|
||||
|
||||
die Verarbeitungszwecke
|
||||
die Kategorien personenbezogener Daten, die verarbeitet werden
|
||||
die Empfänger oder Kategorien von Empfängern, gegenüber denen die personenbezogenen Daten offengelegt worden sind oder noch offengelegt werden, insbesondere bei Empfängern in Drittländern oder bei internationalen Organisationen
|
||||
falls möglich die geplante Dauer, für die die personenbezogenen Daten gespeichert werden, oder, falls dies nicht möglich ist, die Kriterien für die Festlegung dieser Dauer
|
||||
das Bestehen eines Rechts auf Berichtigung oder Löschung der sie betreffenden personenbezogenen Daten oder auf Einschränkung der Verarbeitung durch den Verantwortlichen oder eines Widerspruchsrechts gegen diese Verarbeitung
|
||||
das Bestehen eines Beschwerderechts bei einer Aufsichtsbehörde
|
||||
wenn die personenbezogenen Daten nicht bei der betroffenen Person erhoben werden: Alle verfügbaren Informationen über die Herkunft der Daten
|
||||
das Bestehen einer automatisierten Entscheidungsfindung einschließlich Profiling gemäß Artikel 22 Abs.1 und 4 DS-GVO und — zumindest in diesen Fällen — aussagekräftige Informationen über die involvierte Logik sowie die Tragweite und die angestrebten Auswirkungen einer derartigen Verarbeitung für die betroffene Person
|
||||
Ferner steht der betroffenen Person ein Auskunftsrecht darüber zu, ob personenbezogene Daten an ein Drittland oder an eine internationale Organisation übermittelt wurden. Sofern dies der Fall ist, so steht der betroffenen Person im Übrigen das Recht zu, Auskunft über die geeigneten Garantien im Zusammenhang mit der Übermittlung zu erhalten.
|
||||
|
||||
Möchte eine betroffene Person dieses Auskunftsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
****** c) Recht auf Berichtigung
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, die unverzügliche Berichtigung sie betreffender unrichtiger personenbezogener Daten zu verlangen. Ferner steht der betroffenen Person das Recht zu, unter Berücksichtigung der Zwecke der Verarbeitung, die Vervollständigung unvollständiger personenbezogener Daten — auch mittels einer ergänzenden Erklärung — zu verlangen.
|
||||
|
||||
Möchte eine betroffene Person dieses Berichtigungsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
****** d) Recht auf Löschung (Recht auf Vergessen werden)
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, von dem Verantwortlichen zu verlangen, dass die sie betreffenden personenbezogenen Daten unverzüglich gelöscht werden, sofern einer der folgenden Gründe zutrifft und soweit die Verarbeitung nicht erforderlich ist:
|
||||
|
||||
Die personenbezogenen Daten wurden für solche Zwecke erhoben oder auf sonstige Weise verarbeitet, für welche sie nicht mehr notwendig sind.
|
||||
Die betroffene Person widerruft ihre Einwilligung, auf die sich die Verarbeitung gemäß Art. 6 Abs. 1 Buchstabe a DS-GVO oder Art. 9 Abs. 2 Buchstabe a DS-GVO stützte, und es fehlt an einer anderweitigen Rechtsgrundlage für die Verarbeitung.
|
||||
Die betroffene Person legt gemäß Art. 21 Abs. 1 DS-GVO Widerspruch gegen die Verarbeitung ein, und es liegen keine vorrangigen berechtigten Gründe für die Verarbeitung vor, oder die betroffene Person legt gemäß Art. 21 Abs. 2 DS-GVO Widerspruch gegen die Verarbeitung ein.
|
||||
Die personenbezogenen Daten wurden unrechtmäßig verarbeitet.
|
||||
Die Löschung der personenbezogenen Daten ist zur Erfüllung einer rechtlichen Verpflichtung nach dem Unionsrecht oder dem Recht der Mitgliedstaaten erforderlich, dem der Verantwortliche unterliegt.
|
||||
Die personenbezogenen Daten wurden in Bezug auf angebotene Dienste der Informationsgesellschaft gemäß Art. 8 Abs. 1 DS-GVO erhoben.
|
||||
Sofern einer der oben genannten Gründe zutrifft und eine betroffene Person die Löschung von personenbezogenen Daten, die bei der Sascha König gespeichert sind, veranlassen möchte, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden. Der Mitarbeiter der Sascha König wird veranlassen, dass dem Löschverlangen unverzüglich nachgekommen wird.
|
||||
|
||||
Wurden die personenbezogenen Daten von der Sascha König öffentlich gemacht und ist unser Unternehmen als Verantwortlicher gemäß Art. 17 Abs. 1 DS-GVO zur Löschung der personenbezogenen Daten verpflichtet, so trifft Sascha König unter Berücksichtigung der verfügbaren Technologie und der Implementierungskosten angemessene Maßnahmen, auch technischer Art, um andere für die Datenverarbeitung Verantwortliche, welche die veröffentlichten personenbezogenen Daten verarbeiten, darüber in Kenntnis zu setzen, dass die betroffene Person von diesen anderen für die Datenverarbeitung Verantwortlichen die Löschung sämtlicher Links zu diesen personenbezogenen Daten oder von Kopien oder Replikationen dieser personenbezogenen Daten verlangt hat, soweit die Verarbeitung nicht erforderlich ist. Der Mitarbeiter der Sascha König wird im Einzelfall das Notwendige veranlassen.
|
||||
|
||||
****** e) Recht auf Einschränkung der Verarbeitung
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, von dem Verantwortlichen die Einschränkung der Verarbeitung zu verlangen, wenn eine der folgenden Voraussetzungen gegeben ist:
|
||||
|
||||
Die Richtigkeit der personenbezogenen Daten wird von der betroffenen Person bestritten, und zwar für eine Dauer, die es dem Verantwortlichen ermöglicht, die Richtigkeit der personenbezogenen Daten zu überprüfen.
|
||||
Die Verarbeitung ist unrechtmäßig, die betroffene Person lehnt die Löschung der personenbezogenen Daten ab und verlangt stattdessen die Einschränkung der Nutzung der personenbezogenen Daten.
|
||||
Der Verantwortliche benötigt die personenbezogenen Daten für die Zwecke der Verarbeitung nicht länger, die betroffene Person benötigt sie jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
|
||||
Die betroffene Person hat Widerspruch gegen die Verarbeitung gem. Art. 21 Abs. 1 DS-GVO eingelegt und es steht noch nicht fest, ob die berechtigten Gründe des Verantwortlichen gegenüber denen der betroffenen Person überwiegen.
|
||||
Sofern eine der oben genannten Voraussetzungen gegeben ist und eine betroffene Person die Einschränkung von personenbezogenen Daten, die bei der Sascha König gespeichert sind, verlangen möchte, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden. Der Mitarbeiter der Sascha König wird die Einschränkung der Verarbeitung veranlassen.
|
||||
|
||||
****** f) Recht auf Datenübertragbarkeit
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, die sie betreffenden personenbezogenen Daten, welche durch die betroffene Person einem Verantwortlichen bereitgestellt wurden, in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten. Sie hat außerdem das Recht, diese Daten einem anderen Verantwortlichen ohne Behinderung durch den Verantwortlichen, dem die personenbezogenen Daten bereitgestellt wurden, zu übermitteln, sofern die Verarbeitung auf der Einwilligung gemäß Art. 6 Abs. 1 Buchstabe a DS-GVO oder Art. 9 Abs. 2 Buchstabe a DS-GVO oder auf einem Vertrag gemäß Art. 6 Abs. 1 Buchstabe b DS-GVO beruht und die Verarbeitung mithilfe automatisierter Verfahren erfolgt, sofern die Verarbeitung nicht für die Wahrnehmung einer Aufgabe erforderlich ist, die im öffentlichen Interesse liegt oder in Ausübung öffentlicher Gewalt erfolgt, welche dem Verantwortlichen übertragen wurde.
|
||||
|
||||
Ferner hat die betroffene Person bei der Ausübung ihres Rechts auf Datenübertragbarkeit gemäß Art. 20 Abs. 1 DS-GVO das Recht, zu erwirken, dass die personenbezogenen Daten direkt von einem Verantwortlichen an einen anderen Verantwortlichen übermittelt werden, soweit dies technisch machbar ist und sofern hiervon nicht die Rechte und Freiheiten anderer Personen beeinträchtigt werden.
|
||||
|
||||
Zur Geltendmachung des Rechts auf Datenübertragbarkeit kann sich die betroffene Person jederzeit an einen Mitarbeiter der Sascha König wenden.
|
||||
|
||||
****** g) Recht auf Widerspruch
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, aus Gründen, die sich aus ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung sie betreffender personenbezogener Daten, die aufgrund von Art. 6 Abs. 1 Buchstaben e oder f DS-GVO erfolgt, Widerspruch einzulegen. Dies gilt auch für ein auf diese Bestimmungen gestütztes Profiling.
|
||||
|
||||
Sascha König verarbeitet die personenbezogenen Daten im Falle des Widerspruchs nicht mehr, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die den Interessen, Rechten und Freiheiten der betroffenen Person überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
|
||||
|
||||
Verarbeitet Sascha König personenbezogene Daten, um Direktwerbung zu betreiben, so hat die betroffene Person das Recht, jederzeit Widerspruch gegen die Verarbeitung der personenbezogenen Daten zum Zwecke derartiger Werbung einzulegen. Dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung in Verbindung steht. Widerspricht die betroffene Person gegenüber der Sascha König der Verarbeitung für Zwecke der Direktwerbung, so wird Sascha König die personenbezogenen Daten nicht mehr für diese Zwecke verarbeiten.
|
||||
|
||||
Zudem hat die betroffene Person das Recht, aus Gründen, die sich aus ihrer besonderen Situation ergeben, gegen die sie betreffende Verarbeitung personenbezogener Daten, die bei der Sascha König zu wissenschaftlichen oder historischen Forschungszwecken oder zu statistischen Zwecken gemäß Art. 89 Abs. 1 DS-GVO erfolgen, Widerspruch einzulegen, es sei denn, eine solche Verarbeitung ist zur Erfüllung einer im öffentlichen Interesse liegenden Aufgabe erforderlich.
|
||||
|
||||
Zur Ausübung des Rechts auf Widerspruch kann sich die betroffene Person direkt an jeden Mitarbeiter der Sascha König oder einen anderen Mitarbeiter wenden. Der betroffenen Person steht es ferner frei, im Zusammenhang mit der Nutzung von Diensten der Informationsgesellschaft, ungeachtet der Richtlinie 2002/58/EG, ihr Widerspruchsrecht mittels automatisierter Verfahren auszuüben, bei denen technische Spezifikationen verwendet werden.
|
||||
|
||||
****** h) Automatisierte Entscheidungen im Einzelfall einschließlich Profiling
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, nicht einer ausschließlich auf einer automatisierten Verarbeitung — einschließlich Profiling — beruhenden Entscheidung unterworfen zu werden, die ihr gegenüber rechtliche Wirkung entfaltet oder sie in ähnlicher Weise erheblich beeinträchtigt, sofern die Entscheidung (1) nicht für den Abschluss oder die Erfüllung eines Vertrags zwischen der betroffenen Person und dem Verantwortlichen erforderlich ist, oder (2) aufgrund von Rechtsvorschriften der Union oder der Mitgliedstaaten, denen der Verantwortliche unterliegt, zulässig ist und diese Rechtsvorschriften angemessene Maßnahmen zur Wahrung der Rechte und Freiheiten sowie der berechtigten Interessen der betroffenen Person enthalten oder (3) mit ausdrücklicher Einwilligung der betroffenen Person erfolgt.
|
||||
|
||||
Ist die Entscheidung (1) für den Abschluss oder die Erfüllung eines Vertrags zwischen der betroffenen Person und dem Verantwortlichen erforderlich oder (2) erfolgt sie mit ausdrücklicher Einwilligung der betroffenen Person, trifft Sascha König angemessene Maßnahmen, um die Rechte und Freiheiten sowie die berechtigten Interessen der betroffenen Person zu wahren, wozu mindestens das Recht auf Erwirkung des Eingreifens einer Person seitens des Verantwortlichen, auf Darlegung des eigenen Standpunkts und auf Anfechtung der Entscheidung gehört.
|
||||
|
||||
Möchte die betroffene Person Rechte mit Bezug auf automatisierte Entscheidungen geltend machen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
****** i) Recht auf Widerruf einer datenschutzrechtlichen Einwilligung
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, eine Einwilligung zur Verarbeitung personenbezogener Daten jederzeit zu widerrufen.
|
||||
|
||||
Möchte die betroffene Person ihr Recht auf Widerruf einer Einwilligung geltend machen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
***** 9. Rechtsgrundlage der Verarbeitung
|
||||
Art. 6 I lit. a DS-GVO dient unserem Unternehmen als Rechtsgrundlage für Verarbeitungsvorgänge, bei denen wir eine Einwilligung für einen bestimmten Verarbeitungszweck einholen. Ist die Verarbeitung personenbezogener Daten zur Erfüllung eines Vertrags, dessen Vertragspartei die betroffene Person ist, erforderlich, wie dies beispielsweise bei Verarbeitungsvorgängen der Fall ist, die für eine Lieferung von Waren oder die Erbringung einer sonstigen Leistung oder Gegenleistung notwendig sind, so beruht die Verarbeitung auf Art. 6 I lit. b DS-GVO. Gleiches gilt für solche Verarbeitungsvorgänge die zur Durchführung vorvertraglicher Maßnahmen erforderlich sind, etwa in Fällen von Anfragen zur unseren Produkten oder Leistungen. Unterliegt unser Unternehmen einer rechtlichen Verpflichtung durch welche eine Verarbeitung von personenbezogenen Daten erforderlich wird, wie beispielsweise zur Erfüllung steuerlicher Pflichten, so basiert die Verarbeitung auf Art. 6 I lit. c DS-GVO. In seltenen Fällen könnte die Verarbeitung von personenbezogenen Daten erforderlich werden, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen. Dies wäre beispielsweise der Fall, wenn ein Besucher in unserem Betrieb verletzt werden würde und daraufhin sein Name, sein Alter, seine Krankenkassendaten oder sonstige lebenswichtige Informationen an einen Arzt, ein Krankenhaus oder sonstige Dritte weitergegeben werden müssten. Dann würde die Verarbeitung auf Art. 6 I lit. d DS-GVO beruhen. Letztlich könnten Verarbeitungsvorgänge auf Art. 6 I lit. f DS-GVO beruhen. Auf dieser Rechtsgrundlage basieren Verarbeitungsvorgänge, die von keiner der vorgenannten Rechtsgrundlagen erfasst werden, wenn die Verarbeitung zur Wahrung eines berechtigten Interesses unseres Unternehmens oder eines Dritten erforderlich ist, sofern die Interessen, Grundrechte und Grundfreiheiten des Betroffenen nicht überwiegen. Solche Verarbeitungsvorgänge sind uns insbesondere deshalb gestattet, weil sie durch den Europäischen Gesetzgeber besonders erwähnt wurden. Er vertrat insoweit die Auffassung, dass ein berechtigtes Interesse anzunehmen sein könnte, wenn die betroffene Person ein Kunde des Verantwortlichen ist (Erwägungsgrund 47 Satz 2 DS-GVO).
|
||||
|
||||
***** 10. Berechtigte Interessen an der Verarbeitung, die von dem Verantwortlichen oder einem Dritten verfolgt werden
|
||||
Basiert die Verarbeitung personenbezogener Daten auf Artikel 6 I lit. f DS-GVO ist unser berechtigtes Interesse die Durchführung unserer Geschäftstätigkeit zugunsten des Wohlergehens all unserer Mitarbeiter und unserer Anteilseigner.
|
||||
|
||||
***** 11. Dauer, für die die personenbezogenen Daten gespeichert werden
|
||||
Das Kriterium für die Dauer der Speicherung von personenbezogenen Daten ist die jeweilige gesetzliche Aufbewahrungsfrist. Nach Ablauf der Frist werden die entsprechenden Daten routinemäßig gelöscht, sofern sie nicht mehr zur Vertragserfüllung oder Vertragsanbahnung erforderlich sind.
|
||||
|
||||
***** 12. Gesetzliche oder vertragliche Vorschriften zur Bereitstellung der personenbezogenen Daten; Erforderlichkeit für den Vertragsabschluss; Verpflichtung der betroffenen Person, die personenbezogenen Daten bereitzustellen; mögliche Folgen der Nichtbereitstellung
|
||||
Wir klären Sie darüber auf, dass die Bereitstellung personenbezogener Daten zum Teil gesetzlich vorgeschrieben ist (z.B. Steuervorschriften) oder sich auch aus vertraglichen Regelungen (z.B. Angaben zum Vertragspartner) ergeben kann. Mitunter kann es zu einem Vertragsschluss erforderlich sein, dass eine betroffene Person uns personenbezogene Daten zur Verfügung stellt, die in der Folge durch uns verarbeitet werden müssen. Die betroffene Person ist beispielsweise verpflichtet uns personenbezogene Daten bereitzustellen, wenn unser Unternehmen mit ihr einen Vertrag abschließt. Eine Nichtbereitstellung der personenbezogenen Daten hätte zur Folge, dass der Vertrag mit dem Betroffenen nicht geschlossen werden könnte. Vor einer Bereitstellung personenbezogener Daten durch den Betroffenen muss sich der Betroffene an einen unserer Mitarbeiter wenden. Unser Mitarbeiter klärt den Betroffenen einzelfallbezogen darüber auf, ob die Bereitstellung der personenbezogenen Daten gesetzlich oder vertraglich vorgeschrieben oder für den Vertragsabschluss erforderlich ist, ob eine Verpflichtung besteht, die personenbezogenen Daten bereitzustellen, und welche Folgen die Nichtbereitstellung der personenbezogenen Daten hätte.
|
||||
|
||||
***** 13. Bestehen einer automatisierten Entscheidungsfindung
|
||||
Als verantwortungsbewusstes Unternehmen verzichten wir auf eine automatische Entscheidungsfindung oder ein Profiling.
|
||||
|
||||
Diese Datenschutzerklärung wurde durch den Datenschutzerklärungs-Generator der DGD Deutsche Gesellschaft für Datenschutz GmbH, die als Externer Datenschutzbeauftragter Köln tätig ist, in Kooperation mit dem Kölner Anwalt für Datenschutzrecht Christian Solmecke erstellt.
|
251
content-org/datamanagement.org
Normal file
251
content-org/datamanagement.org
Normal file
@ -0,0 +1,251 @@
|
||||
#+hugo_base_dir: ../
|
||||
#+hugo_section: ./posts/datamanagement
|
||||
#+options: author:nil
|
||||
|
||||
* EN
|
||||
|
||||
** Baserow
|
||||
*** Game Changer: How Baserow Transformed Our Approach to Data Management
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: why-choose-baserow-to-manage-product-data.en.md
|
||||
:EXPORT_DATE: 2023-10-12
|
||||
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :tutorials '("Data Management") :datamanagement '("Baserow") :featuredImage /img/tutorials/baserow/baserow-excel-title.png
|
||||
:EXPORT_HUGO_PAIRED_SHORTCODES: admonition link
|
||||
:END:
|
||||
|
||||
**** Introduction
|
||||
For over a decade, my journey through the world of e-commerce has been an evolving adventure. Alongside my dedicated team, we have painstakingly built, refined, and iterated numerous versions of our online storefronts, transitioning from earlier solutions like Magento to Shopify over the years. Beyond grappling with the design intricacies and aligning the user experience with each iteration, I’ve come to realize how crucial our approach to product data management truly is.
|
||||
|
||||
Whether we were streamlining the user interface on our Shopify store or making amendments to our product listings, effective and efficient management of our product data emerged as a game-changer. It has truly made the difference between tedious, protracted projects and quick, manageable tasks, saving us dozens of hours in project time that we've been able to direct towards other business growth activities.
|
||||
|
||||
As our storefronts evolved, so did our approach to managing data. Like many others, we began with a simplistic approach, listing products individually via the store's backend. However, we quickly discovered the inefficiency in this method. We transitioned to spreadsheets, gaining the ability to set up multiple products at once. Yet, the limitations of standard spreadsheets prompted a search for an even more efficient solution. This search concluded when we discovered Airtable. Now, Baserow functions as our central repository for all product data. It feeds into all storefronts, various sales channels and our Enterprise Resource Planning (ERP) system, providing a cohesive, streamlined data management system that has scaled elegantly with our growing business.
|
||||
|
||||
The purpose of this journey is not just to share my own e-commerce journey. I want to share basic concepts for data management which can save huge amounts of working hours for e-commerce businesses. I will hopefully give you an introduction on how to build a lasting and efficient solution for data management and free lots of working hourse for more important business tasks like interacting with your customers or building great products. I don't know where you are on your e-commerce journey, but chances are that you face similar challenges like I do.
|
||||
|
||||
**** The state of tools
|
||||
#+ATTR_HTML: :alt Excel just doesn’t cut it :title Excel just doesn’t cut it
|
||||
[[file:/img/tutorials/baserow/spreadsheet-cyberpunk.png]]
|
||||
|
||||
Throughout my entrepreneurial journey, I've grappled with numerous challenges, a significant one being effective product data management. Using traditional tools like Excel, while initially straightforward, soon exposed issues. Excel has limitations on data size, lacks real-time collaboration features, and struggles with complexity as data grows. In short, it doesn’t scale particularly well, especially as an e-commerce business expands its product range and customer base.
|
||||
|
||||
With the growth of my own Shopify business, the limitations of Excel became increasingly apparent. As we expanded our product range, each with numerous attributes like SKU codes, colors, sizes, and prices, the spreadsheets became enormously complex. This complexity was not just hard to manage, but it significantly increased the risk of human error. Information was scattered across different sheets and files, making it difficult for team members to collaborate effectively and efficiently. In essence, Excel was unable to keep up with the increasing data demands of our growing business.
|
||||
|
||||
#+attr_shortcode: :type danger :title 10.000 products in a spreadsheet :open true
|
||||
#+begin_admonition
|
||||
We had times where we had around 10.000 SKUs to manage across 4-5 platforms in 5 different languages. Managing this in a spreadsheet would have been an endless nightmare 🙈
|
||||
#+end_admonition
|
||||
|
||||
The upshot of these complexities and inefficiencies were hours lost - hours that could have been better spent on growing the business, strategizing, or improving customer experience. The frequent errors due to the unwieldy nature of our spreadsheets added up to a considerable amount of time spent on rectification, not to mention disruption of workflow. Instead of assisting in our operations, the limitations of tools like Excel were creating bottlenecks in our product data management process, slowing us down instead of propelling us forward.
|
||||
|
||||
**** Intoducing Baserow
|
||||
|
||||
In the midst of Excel's limitations, I stumbled upon Baserow. This innovative tool, which combines the features of a database and a spreadsheet, offered a fresh perspective on managing our growing product data.
|
||||
|
||||
Baserow's strength lies in its flexibility and customizability, with the capacity to store information in a non-linear way. It presents information beyond the conventional rows and columns, including capability for linked records, multiple views, and rich field types like checkboxes, dropdowns, attachments, and more.
|
||||
|
||||
My initial encounter with Baserow marked the beginning of a transformative journey in data management. Compared to Excel, it seemed more aligned with the needs of a dynamic, rapidly scaling e-commerce business like ours. The question was - could this be the game-changing tool we've been searching for? The potential was definitely there and it was high time for us to dive in and explore.
|
||||
|
||||
**** Baserow as a Solution
|
||||
|
||||
At its core, Baserow shines when it comes to handling large amounts of product data. Unlike Excel, which often becomes slower and more difficult to use with really large lists, Baserow is built specifically to handle big datasets. This means as our product range grew, Baserow could easily keep up.
|
||||
|
||||
One great thing about Baserow is that it lets everyone on the team work together in the same place, in real time. No more juggling multiple versions of the same Excel file - in Baserow, everyone always sees the most up-to-date information. This makes teamwork a lot smoother, and means less chance of mistakes happening.
|
||||
|
||||
#+ATTR_HTML: :alt In Baserow you can view your data from different perspectives :title In Baserow you can view your data from different perspectives
|
||||
[[file:/img/tutorials/baserow/baserow-views.png]]
|
||||
|
||||
Additionally, Baserow provides various views of your data. You can customize multiple grid views to display selected subsets only. Other view options include Gallery for quick overview, Kanban for managing actionable items and Calendar for deadline tracking.
|
||||
|
||||
Switching from Excel to Baserow has vastly improved our data management. Where we once struggled with disorganized product information, Baserow has provided a neat and easily accessible format. The transition to Baserow has saved us significant time and reduced errors, resulting in a more streamlined and manageable workday.
|
||||
|
||||
**** Baserow - A Single Source of Truth
|
||||
|
||||
#+ATTR_HTML: :alt There is not one truth, just the truth :title There is not one truth, just the truth
|
||||
[[file:/img/tutorials/baserow/baserow-single-source-of-truth.png]]
|
||||
|
||||
With Baserow's robust features, our product data no longer exists scattered across disparate platforms, channels, and files. It's gathered in one place - in Airtable. This feature gave us a reliable "single source of truth" that everyone in the team can access, reducing inconsistencies and confusion.
|
||||
|
||||
Baserow allows us to see all our data at a glance. And it’s not just viewing; it provides rich insights which help in decision-making. In the past, cross-referencing data across multiple Excel sheets was a nightmare. Now, it's a simple task. It's like having a magnifying glass on your data that can zoom in on the tiniest detail and zoom out to give you an overview in an instant.
|
||||
|
||||
The biggest advantage for our product data manageent is to connect data and tables. This gives us the ability to manage one central repository of peoduct data as a single source of truth. From this we derive various specialized tables for platforms like Shopify and Amazon which can be easily exported. That makes it very easy to handle small and even large scale changes.
|
||||
|
||||
|
||||
#+attr_shortcode: :type tip :title Pro Tip :open true
|
||||
#+begin_admonition
|
||||
When you put some effort and care into the structure of your product data even large changes will be very easy. It will not matter if you want to push a price change for 5 or 5.000 🚀🚀🚀 products to Shopify.
|
||||
#+end_admonition
|
||||
|
||||
|
||||
|
||||
**** The Potential of Baserow
|
||||
|
||||
One of the biggest wins with Baserow is how much time it saves us. Because it keeps all our data in one easy-to-use place, we're not wasting hours digging through messy information anymore. This has made our daily tasks faster and more efficient. Depending on the task you can easily 10x or 20x or productivity.
|
||||
|
||||
But the time saving doesn't stop there. When you connect Baserow's powerful API to a workflow automation tool like [[https://www.n8n.io][n8n]] you can go very very far. Just some examples what we are dong when it comes to automation:
|
||||
|
||||
#+attr_shortcode: :type tip :title Push changes :open true
|
||||
#+begin_admonition
|
||||
🚀 Create new products of push changes in products automatically to Shopify
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title AI🧠 powered produt desriptions :open true
|
||||
#+begin_admonition
|
||||
🚀 Create product descriptions with AI🧠 based on product attributes automatially 🧙
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title Translations :open true
|
||||
#+begin_admonition
|
||||
🚀 Create translations for descriptions and other attributes with AI🧠
|
||||
#+end_admonition
|
||||
|
||||
|
||||
#+attr_shortcode: :type tip :title 🧙 Magic :open true
|
||||
#+begin_admonition
|
||||
🚀 Do all of the above each time a new product row is added 😉 🤖
|
||||
#+end_admonition
|
||||
|
||||
|
||||
The impact Baserow has on our working hours and overall satisfaction can't be overstated.
|
||||
|
||||
**** Conclusion
|
||||
|
||||
Looking back on my journey, transitioning to Baserow has undoubtedly been one of the best decisions I’ve made for my e-commerce business. It's more than a tool; it's a time-saving, stress-reducing companion that's streamlined our operations and boosted our produtivity.
|
||||
|
||||
If you're an e-commerce business owner struggling with product data management, I wholeheartedly recommend considering Baserow. It may take a some effort to set up initially, but the benefits you'll reap - efficiency, accuracy, and precious time saved - will be well worth it.
|
||||
|
||||
At the end of the day, running a successful e-commerce business isn’t just about having a wide range of products or a sophisticated marketing strategy; it’s also about using the right tools to manage your operations effectively, and for product data management, I've found Airtable to be the right tool.
|
||||
|
||||
#+attr_shortcode: :type tip :title What about Airtable? :open true
|
||||
#+begin_admonition
|
||||
Some of you might be aware of *Airtable* as a similar solution. Although Airtable is a very good product I personally prefer free and open source solutions.
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type success :title Knowledge is power 🤓 :open true
|
||||
#+begin_admonition
|
||||
Share this post with someone for whom it's helpful.
|
||||
#+end_admonition
|
||||
|
||||
|
||||
* DE
|
||||
|
||||
** Baserow
|
||||
*** Game Changer: Wie Baserow unseren Ansatz zur Datenverwaltung verändert hat
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: why-choose-baserow-to-manage-product-data.de.md
|
||||
:EXPORT_DATE: 2023-10-12
|
||||
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :tutorials '("Datenverwaltung") :datamanagement '("Baserow") :featuredImage /img/tutorials/baserow/baserow-excel-title.png
|
||||
:EXPORT_HUGO_PAIRED_SHORTCODES: admonition link
|
||||
:END:
|
||||
|
||||
**** Einführung
|
||||
|
||||
Seit über einem Jahrzehnt ist meine Reise durch die Welt des E-Commerce ein sich ständig weiterentwickelndes Abenteuer. Zusammen mit meinem großartigen Team haben wir zahlreiche Versionen unserer Online-Shops sorgfältig erstellt, verfeinert und iteriert, und sind im Laufe der Jahre von früheren Lösungen wie Magento zu Shopify übergegangen. Neben der Auseinandersetzung mit den gestalterischen Feinheiten und der Abstimmung der Benutzererfahrung mit jeder Iteration habe ich erkannt, wie entscheidend unser Ansatz zur Produkt-Datenverwaltung tatsächlich ist.
|
||||
|
||||
#+attr_shortcode: :type tip :title 🧙 Dieser Artikel ist KI-übersetzt :open false
|
||||
#+begin_admonition
|
||||
🚀 Auch wenn Deutsch meine Muttersprache ist, habe ich Englisch in diesem Blog und auch auf anderen Plattformen den Vorzug. Mein Ziel ist es mein Wissen mit so vielen Menschen wie möglich zu teilen, da komme ich mit der englischen Sprache einfach weiter. Die deutsche Version wurde daher mit Hilfe von KI übersetzt 😉 🤖, wenn Du Fehler findest, darfst Du sie gerne behalten.
|
||||
#+end_admonition
|
||||
|
||||
Ob wir die Benutzeroberfläche in unserem Shopify-Shop optimierten oder Änderungen an unseren Produktlisten vornahmen, die effektive und effiziente Verwaltung unserer Produktdaten hat sich als Game-Changer erwiesen. Sie hat wirklich den Unterschied ausgemacht zwischen mühsamen, langwierigen Projekten und schnellen, handhabbaren Aufgaben, wodurch wir Dutzende von Stunden an Projektzeit sparen konnten, die wir in anderen Aktivitäten zur Geschäftserweiterung sinnvoller nutzen konnten.
|
||||
|
||||
Mit der Weiterentwicklung unserer Shops hat sich auch unser Ansatz zur Datenverwaltung verändert. Wie viele andere begannen wir mit einem simplen Ansatz, indem wir Produkte einzeln über das Backend des Shops eintrugen. Wir stellten jedoch schnell fest, dass diese Methode ineffizient war. Wir wechselten zu Tabellenkalkulationen, was es uns ermöglichte, mehrere Produkte auf einmal anzulegen. Doch die Beschränkungen der Standardtabellenkalkulationen erforderten eine Suche nach einer noch effizienteren Lösung. Diese Suche endete, als wir Baserow entdeckten. Jetzt fungiert Baserow als unser zentrales Repository für alle Produktdaten. Es speist alle Shops, verschiedene Verkaufskanäle und unser ERP-System, was ein kohärentes, straffes Datenverwaltungssystem bietet, das elegant mit unserem wachsenden Geschäft skaliert.
|
||||
|
||||
Der Zweck dieser Artikel ist nicht nur, meine eigene E-Commerce-Reise zu teilen. Ich möchte grundlegende Konzepte für die Datenverwaltung teilen, die riesige Mengen an Arbeitsstunden für E-Commerce-Unternehmen sparen können. Ich hoffe, Dir eine Einführung zu geben, wie Du eine dauerhafte und effiziente Lösung für die Datenverwaltung aufbauen und viel Arbeitszeit für wichtigere Geschäftsaufgaben, wie die Interaktion mit Deinen Kunden oder die Erstellung großartiger Produkte, frei machen kannst. Ich weiß nicht, wo Du Dich auf Deiner E-Commerce-Reise befindest, aber die Chancen stehen gut, dass Du ähnliche Herausforderungen wie ich hast.
|
||||
|
||||
**** Der Stand der Werkzeuge
|
||||
#+ATTR_HTML: :alt Excel bringt es einfach nicht :title Excel bringt Ves einfach nicht
|
||||
[[file:/img/tutorials/baserow/spreadsheet-cyberpunk.png]]
|
||||
|
||||
Während meiner unternehmerischen Reise bin ich auf zahlreiche Herausforderungen gestoßen, eine bedeutende davon war eine effektive Produkt-Datenverwaltung. Die Verwendung herkömmlicher Werkzeuge wie Excel, die zunächst unkompliziert erschien, offenbarte bald Probleme. Excel hat Beschränkungen hinsichtlich der Datengröße, es fehlen Funktionen für die Echtzeit-Zusammenarbeit, und es hat Schwierigkeiten mit der Komplexität, wenn die Datenmenge wächst. Kurz gesagt, es skaliert nicht besonders gut, besonders wenn ein E-Commerce-Unternehmen sein Produktangebot und seine Kundenbasis erweitert.
|
||||
|
||||
Mit dem Wachstum meines eigenen Shopify-Geschäfts wurden die Einschränkungen von Excel immer offensichtlicher. Als wir unser Produktangebot erweiterten, jeweils mit zahlreichen Attributen wie SKU-Codes, Farben, Größen und Preisen, wurden die Tabellenkalkulationen enorm komplex. Diese Komplexität war nicht nur schwierig zu handhaben, sondern sie erhöhte auch signifikant das Risiko menschlicher Fehler. Informationen waren über verschiedene Blätter und Dateien verstreut, was es den Teammitgliedern erschwerte, effektiv und effizient zusammenzuarbeiten. Im Grunde konnte Excel mit den steigenden Datenanforderungen unseres wachsenden Geschäfts nicht mithalten.
|
||||
|
||||
#+attr_shortcode: :type danger :title 10.000 Produkte in einer Tabelle :open true
|
||||
#+begin_admonition
|
||||
Wir hatten Zeiten, in denen wir etwa 10.000 SKUs über 4-5 Plattformen in 5 verschiedenen Sprachen verwalten mussten. Dies in einer Tabelle zu verwalten, wäre ein endloser Alptraum gewesen 🙈
|
||||
#+end_admonition
|
||||
|
||||
Das Ergebnis dieser Komplexitäten und Ineffizienzen waren verlorene Stunden - Stunden, die besser hätten genutzt werden können, um das Geschäft zu erweitern, Strategien zu entwerfen oder das Kundenerlebnis zu verbessern. Die häufigen Fehler aufgrund der unhandlichen Natur unserer Tabellen summierten sich zu einer erheblichen Menge an Zeit, die für Korrekturen aufgewendet werden musste, ganz zu schweigen von der Unterbrechung des Arbeitsablaufs. Anstatt uns bei unseren Operationen zu unterstützen, schufen die Einschränkungen von Werkzeugen wie Excel Engpässe in unserem Produkt-Datenverwaltungsprozess und bremsten uns aus, anstatt uns voranzutreiben.
|
||||
|
||||
**** Einführung von Baserow
|
||||
|
||||
Inmitten der Einschränkungen von Excel stieß ich auf Baserow. Dieses innovative Werkzeug, das die Funktionen einer Datenbank und einer Tabelle kombiniert, bot eine frische Perspektive auf die Verwaltung unserer wachsenden Produktdaten.
|
||||
|
||||
Die Stärke von Baserow liegt in seiner Flexibilität und Anpassungsfähigkeit, mit der Fähigkeit, Informationen auf nicht-lineare Weise zu speichern. Es präsentiert Informationen über die herkömmlichen Zeilen und Spalten hinaus, einschließlich der Möglichkeit für verknüpfte Datensätze, mehrere Ansichten und umfangreiche Felddaten wie Kontrollkästchen, Dropdowns, Anhänge und mehr.
|
||||
|
||||
Meine erste Begegnung mit Baserow markierte den Beginn einer transformierenden Reise in der Datenverwaltung. Im Vergleich zu Excel schien es mehr auf die Bedürfnisse eines dynamischen, schnell skalierenden E-Commerce-Unternehmens wie unserem abgestimmt zu sein. Die Frage war - könnte dies das bahnbrechende Werkzeug sein, das wir gesucht haben? Das Potenzial war definitiv da und es war höchste Zeit für uns, einzutauchen und zu erkunden.
|
||||
|
||||
**** Baserow als Lösung
|
||||
|
||||
Im Kern glänzt Baserow, wenn es um die Handhabung großer Mengen an Produkt-Daten geht. Im Gegensatz zu Excel, das oft langsamer und schwieriger zu bedienen wird, wenn die Listen wirklich groß werden, ist Baserow speziell dafür konzipiert, große Datenmengen zu handhaben. Das bedeutet, dass Baserow problemlos mithalten konnte, als unser Produktangebot wuchs.
|
||||
|
||||
Eines der tollen Dinge an Baserow ist, dass es jedem im Team erlaubt, gemeinsam am selben Ort, in Echtzeit zusammenzuarbeiten. Kein Jonglieren mehr mit mehreren Versionen derselben Excel-Datei - in Baserow sieht jeder immer die aktuellsten Informationen. Das macht die Teamarbeit viel leichter und bedeutet weniger Fehlerchancen.
|
||||
|
||||
#+ATTR_HTML: :alt In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten :title In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten
|
||||
[[file:/img/tutorials/baserow/baserow-views.png]]
|
||||
|
||||
Darüber hinaus bietet Baserow verschiedene Ansichten Deiner Daten. Du kannst mehrere Rasteransichten anpassen, um nur ausgewählte Teilmengen an Informationen anzuzeigen. Weitere Ansichtsoptionen beinhalten die Galerie für eine schnelle Übersicht, Kanban für die Verwaltung von Aktionselementen und den Kalender für die Verfolgung von Fristen.
|
||||
|
||||
Der Wechsel von Excel zu Baserow hat unsere Datenverwaltung erheblich verbessert. Wo wir einst mit unorganisierten Produktinformationen zu kämpfen hatten, hat Baserow uns ein ordentliches und leicht zugängliches Format zur Verfügung gestellt. Der Übergang zu Baserow hat uns erhebliche Zeit gespart und Fehler reduziert, was zu einem strafferem und besser handhabbarem Arbeitstag führte.
|
||||
|
||||
**** Baserow - Eine einzelne Quelle der Wahrheit
|
||||
|
||||
#+ATTR_HTML: :alt Es gibt nicht eine Wahrheit, nur die Wahrheit :title Es gibt nicht eine Wahrheit, nur die Wahrheit
|
||||
[[file:/img/tutorials/baserow/baserow-single-source-of-truth.png]]
|
||||
|
||||
Mit den robusten Funktionen von Baserow existieren unsere Produktdaten nicht mehr verstreut über verschiedene Plattformen, Kanäle und Dateien. Sie sind an einem Ort gesammelt - in Airtable. Diese Funktion gab uns eine zuverlässige "einzige Quelle der Wahrheit", auf die jeder im Team zugreifen kann, was Inkonsistenzen und Verwirrung reduziert.
|
||||
|
||||
Baserow ermöglicht es uns, alle unsere Daten auf einen Blick zu sehen. Und es geht nicht nur ums Ansehen; es liefert reichhaltige Einblicke, die bei der Entscheidungsfindung helfen. In der Vergangenheit war es ein Alptraum, Daten über mehrere Excel-Tabellen hinweg zu referenzieren. Jetzt ist es eine einfache Aufgabe. Es ist, als hätte man eine Lupe auf die Daten, die auf das kleinste Detail zoomen und Ihnen in einem Augenblick eine Übersicht geben kann.
|
||||
|
||||
Der größte Vorteil für unsere Produkt-Datenverwaltung besteht darin, Daten und Tabellen zu verbinden. Dies gibt uns die Fähigkeit, ein zentrales Repository von Produkt-Daten als einzelne Quelle der Wahrheit zu verwalten. Aus diesem leiten wir verschiedene spezialisierte Tabellen für Plattformen wie Shopify und Amazon ab, die leicht exportiert werden können. Das macht es sehr einfach, kleine und sogar große Veränderungen zu handhaben.
|
||||
|
||||
#+attr_shortcode: :type tip :title Pro Tipp :open true
|
||||
#+begin_admonition
|
||||
Wenn Du etwas Mühe und Sorgfalt in die Struktur Deiner Produktdaten steckst, werden selbst große Änderungen sehr einfach sein. Es wird keine Rolle spielen, ob Du z.B. eine Preisänderung für 5 oder 5.000 Produkte 🚀🚀🚀 auf Shopify durchführen wollen. Der Aufwand wird nahezu unabhängig von der Anzahl der Datansätze sein.
|
||||
#+end_admonition
|
||||
|
||||
**** Das Potenzial von Baserow
|
||||
|
||||
Eine der größten Gewinne mit Baserow ist, wie viel Zeit es uns spart. Da es alle unsere Daten an einem leicht zu bedienenden Ort aufbewahrt, verschwenden wir keine Stunden mehr damit, durch chaotische Informationen zu wühlen. Dies hat unsere täglichen Aufgaben schneller und effizienter gemacht. Je nach Aufgabe kannst Du Deine Produktivität leicht verzehn- oder zwanzigfachen.
|
||||
|
||||
Aber die Zeitersparnis hört nicht dort auf. Wenn Du die leistungsstarke API von Baserow mit einem Tool zur Workflow-Automatisierung wie [[https://www.n8n.io][n8n]] verbindest, kannst Du sehr, sehr weit gehen. Nur einige Beispiele dafür, was wir in Bezug auf Automatisierung tun:
|
||||
|
||||
#+attr_shortcode: :type tip :title Änderungen durchführen :open true
|
||||
#+begin_admonition
|
||||
🚀 Bei Erstellung oder Änderung von Produkten automatisch die Produkte in Shopify anlegen oder ändern
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title KI🧠 gestützte Produktbeschreibungen :open true
|
||||
#+begin_admonition
|
||||
🚀 Produktbeschreibungen mit KI🧠 auf Basis von Produktattributen automatisch erstellen 🧙
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title Übersetzungen :open true
|
||||
#+begin_admonition
|
||||
🚀 Übersetzungen für Beschreibungen und andere Attribute mit KI🧠 erstellen
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title 🧙 Magie :open true
|
||||
#+begin_admonition
|
||||
🚀 Alles von den oben stehenden Punkten auf einmal, sobald eine neue Produktzeile hinzugefügt wird 😉 🤖
|
||||
#+end_admonition
|
||||
|
||||
Die Auswirkungen, die Baserow auf unsere Arbeitsstunden und die allgemeine Zufriedenheit hat, können nicht hoch genug eingeschätzt werden.
|
||||
|
||||
**** Schlussfolgerung
|
||||
|
||||
Wenn ich auf meine Reise zurückblicke, war der Übergang zu Baserow zweifellos eine der besten Entscheidungen, die ich für mein E-Commerce-Geschäft getroffen habe. Es ist mehr als ein Werkzeug; es ist ein zeitsparender, stressreduzierender Begleiter, der unsere Abläufe optimiert und unsere Produktivität gesteigert hat.
|
||||
|
||||
Wenn Du ein E-Commerce-Unternehmen besitzt und mit der Produkt-Datenverwaltung zu kämpfen hast, empfehle ich Dir von ganzem Herzen, Baserow in Betracht zu ziehen. Es mag etwas Aufwand bedeuten, es zunächst einzurichten, aber die Vorteile, die Du erzielen kannst - Effizienz, Genauigkeit und gesparte wertvolle Zeit - werden es wert sein.
|
||||
|
||||
Am Ende des Tages geht es beim Betrieb eines erfolgreichen E-Commerce-Geschäfts nicht nur darum, ein breites Sortiment an Produkten oder eine ausgeklügelte Marketingstrategie zu haben; es geht auch darum, die richtigen Werkzeuge zu verwenden, um Deine Abläufe effektiv zu verwalten, und für die Produkt-Datenverwaltung habe ich Baserow als das richtige Werkzeug gefunden.
|
||||
|
||||
#+attr_shortcode: :type tip :title Was ist mit Airtable? :open true
|
||||
#+begin_admonition
|
||||
Einige von Euch könnten *Airtable* als ähnliche Lösung kennen. Obwohl Airtable ein sehr gutes Produkt ist, bevorzuge ich persönlich freie und Open-Source-Lösungen.
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type success :title Wissen ist Macht 🤓 :open true
|
||||
#+begin_admonition
|
||||
Teile diesen Betrag mit jemandem, für den er hilfreich ist.
|
||||
#+end_admonition
|
251
content-org/tutorials.org
Normal file
251
content-org/tutorials.org
Normal file
@ -0,0 +1,251 @@
|
||||
#+hugo_base_dir: ../
|
||||
#+hugo_section: ./posts/tutorials
|
||||
#+options: author:nil
|
||||
|
||||
* EN
|
||||
|
||||
All english posts
|
||||
|
||||
** Shopify
|
||||
|
||||
All the Shopify posts
|
||||
|
||||
*** TODO Example :hugo:bob:chris:
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: hello.en.md
|
||||
:EXPORT_DATE: 2023-10-03
|
||||
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :tutorials '(Shopify) :shopify '("Shopify für alle")
|
||||
:END:
|
||||
lkasdölkalösdklöaksdöl löskdlö aslökdlö
|
||||
**** Test Headline 23
|
||||
#+begin_ai
|
||||
[SYS]: You are a helpful assistant.
|
||||
|
||||
[ME]:
|
||||
#+end_ai
|
||||
|
||||
#+begin_src rust
|
||||
fn main() {
|
||||
|
||||
|
||||
|
||||
}
|
||||
#+end_src
|
||||
lölasdlklöasklö laskdlök öalsk
|
||||
#+begin_src rust
|
||||
|
||||
|
||||
,#+begin_ai :image :size 256x256
|
||||
|
||||
,#+end_ai
|
||||
,#+CAPTION: Hello Bob
|
||||
,#+ATTR_HTML: :alt alt text
|
||||
[[file:/img/n8n/2023-03-17_12-10.png]]
|
||||
|
||||
,#+DOWNLOADED: screenshot @ 2023-03-17 12:03:23
|
||||
[[file:../../../../../../wiki/attachments/Headline/2023-03-17_12-03-23_screenshot.png]]
|
||||
|
||||
hg-im
|
||||
,#+begin_src javascript
|
||||
#+end_src
|
||||
|
||||
|
||||
#+begin_src golang
|
||||
|
||||
#+begin_src json
|
||||
|
||||
#+end_src
|
||||
|
||||
#+CAPTION: TITLE
|
||||
#+ATTR_HTML: :alt ALT TEXT
|
||||
[[file:/img/yt-1/n8n-admin.png]]
|
||||
|
||||
|
||||
|
||||
|
||||
** Automation
|
||||
|
||||
* DE
|
||||
|
||||
** Shopify
|
||||
|
||||
Alle Shopify Posts
|
||||
|
||||
*** TODO Beispiel :hugo:bob:chris:
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: hello.de.md
|
||||
:EXPORT_DATE: 2023-10-03
|
||||
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :tutorials '(Shopify) :shopify '("Shopify für alle")
|
||||
:END:
|
||||
lkasdölkalösdklöaksdöl löskdlö aslökdlö
|
||||
**** Test Headline 23
|
||||
#+begin_ai
|
||||
[SYS]: You are a helpful assistant.
|
||||
|
||||
[ME]:
|
||||
#+end_ai
|
||||
|
||||
#+begin_src rust
|
||||
fn main() {
|
||||
|
||||
|
||||
|
||||
}
|
||||
#+end_src
|
||||
lölasdlklöasklö laskdlök öalsk
|
||||
#+begin_src rust
|
||||
|
||||
|
||||
,#+begin_ai :image :size 256x256
|
||||
|
||||
,#+end_ai
|
||||
,#+CAPTION: Hello Bob
|
||||
,#+ATTR_HTML: :alt alt text
|
||||
[[file:/img/n8n/2023-03-17_12-10.png]]
|
||||
|
||||
,#+DOWNLOADED: screenshot @ 2023-03-17 12:03:23
|
||||
[[file:../../../../../../wiki/attachments/Headline/2023-03-17_12-03-23_screenshot.png]]
|
||||
|
||||
hg-im
|
||||
,#+begin_src javascript
|
||||
#+end_src
|
||||
|
||||
|
||||
#+begin_src golang
|
||||
|
||||
#+begin_src json
|
||||
|
||||
#+end_src
|
||||
|
||||
#+CAPTION: TITLE
|
||||
#+ATTR_HTML: :alt ALT TEXT
|
||||
[[file:/img/yt-1/n8n-admin.png]]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
** Automatisierung
|
||||
|
||||
** Baserow
|
||||
*** Game Changer: Wie Baserow unseren Ansatz zur Datenverwaltung verändert hat
|
||||
:PROPERTIES:
|
||||
:EXPORT_FILE_NAME: why-choose-baserow-to-manage-product-data.de.md
|
||||
:EXPORT_DATE: 2023-10-12
|
||||
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :tutorials '("Datenverwaltung") :datamanagement '("Baserow") :featuredImage /img/tutorials/baserow/baserow-excel-title.png
|
||||
:EXPORT_HUGO_PAIRED_SHORTCODES: admonition link
|
||||
:END:
|
||||
|
||||
**** Einführung
|
||||
|
||||
Seit über einem Jahrzehnt ist meine Reise durch die Welt des E-Commerce ein sich ständig weiterentwickelndes Abenteuer. Zusammen mit meinem großartigen Team haben wir zahlreiche Versionen unserer Online-Shops sorgfältig erstellt, verfeinert und iteriert, und sind im Laufe der Jahre von früheren Lösungen wie Magento zu Shopify übergegangen. Neben der Auseinandersetzung mit den gestalterischen Feinheiten und der Abstimmung der Benutzererfahrung mit jeder Iteration habe ich erkannt, wie entscheidend unser Ansatz zur Produkt-Datenverwaltung tatsächlich ist.
|
||||
|
||||
#+attr_shortcode: :type tip :title 🧙 Dieser Artikel ist KI-übersetzt :open false
|
||||
#+begin_admonition
|
||||
🚀 Auch wenn Deutsch meine Muttersprache ist, habe ich Englisch in diesem Blog und auch auf anderen Plattformen den Vorzug. Mein Ziel ist es mein Wissen mit so vielen Menschen wie möglich zu teilen, da komme ich mit der englischen Sprache einfach weiter. Die deutsche Version wurde daher mit Hilfe von KI übersetzt 😉 🤖, wenn Du Fehler findest, darfst Du sie gerne behalten.
|
||||
#+end_admonition
|
||||
|
||||
Ob wir die Benutzeroberfläche in unserem Shopify-Shop optimierten oder Änderungen an unseren Produktlisten vornahmen, die effektive und effiziente Verwaltung unserer Produktdaten hat sich als Game-Changer erwiesen. Sie hat wirklich den Unterschied ausgemacht zwischen mühsamen, langwierigen Projekten und schnellen, handhabbaren Aufgaben, wodurch wir Dutzende von Stunden an Projektzeit sparen konnten, die wir in anderen Aktivitäten zur Geschäftserweiterung sinnvoller nutzen konnten.
|
||||
|
||||
Mit der Weiterentwicklung unserer Shops hat sich auch unser Ansatz zur Datenverwaltung verändert. Wie viele andere begannen wir mit einem simplen Ansatz, indem wir Produkte einzeln über das Backend des Shops eintrugen. Wir stellten jedoch schnell fest, dass diese Methode ineffizient war. Wir wechselten zu Tabellenkalkulationen, was es uns ermöglichte, mehrere Produkte auf einmal anzulegen. Doch die Beschränkungen der Standardtabellenkalkulationen erforderten eine Suche nach einer noch effizienteren Lösung. Diese Suche endete, als wir Baserow entdeckten. Jetzt fungiert Baserow als unser zentrales Repository für alle Produktdaten. Es speist alle Shops, verschiedene Verkaufskanäle und unser ERP-System, was ein kohärentes, straffes Datenverwaltungssystem bietet, das elegant mit unserem wachsenden Geschäft skaliert.
|
||||
|
||||
Der Zweck dieser Artikel ist nicht nur, meine eigene E-Commerce-Reise zu teilen. Ich möchte grundlegende Konzepte für die Datenverwaltung teilen, die riesige Mengen an Arbeitsstunden für E-Commerce-Unternehmen sparen können. Ich hoffe, Dir eine Einführung zu geben, wie Du eine dauerhafte und effiziente Lösung für die Datenverwaltung aufbauen und viel Arbeitszeit für wichtigere Geschäftsaufgaben, wie die Interaktion mit Deinen Kunden oder die Erstellung großartiger Produkte, frei machen kannst. Ich weiß nicht, wo Du Dich auf Deiner E-Commerce-Reise befindest, aber die Chancen stehen gut, dass Du ähnliche Herausforderungen wie ich hast.
|
||||
|
||||
**** Der Stand der Werkzeuge
|
||||
#+ATTR_HTML: :alt Excel bringt es einfach nicht :title Excel bringt Ves einfach nicht
|
||||
[[file:/img/tutorials/baserow/spreadsheet-cyberpunk.png]]
|
||||
|
||||
Während meiner unternehmerischen Reise bin ich auf zahlreiche Herausforderungen gestoßen, eine bedeutende davon war eine effektive Produkt-Datenverwaltung. Die Verwendung herkömmlicher Werkzeuge wie Excel, die zunächst unkompliziert erschien, offenbarte bald Probleme. Excel hat Beschränkungen hinsichtlich der Datengröße, es fehlen Funktionen für die Echtzeit-Zusammenarbeit, und es hat Schwierigkeiten mit der Komplexität, wenn die Datenmenge wächst. Kurz gesagt, es skaliert nicht besonders gut, besonders wenn ein E-Commerce-Unternehmen sein Produktangebot und seine Kundenbasis erweitert.
|
||||
|
||||
Mit dem Wachstum meines eigenen Shopify-Geschäfts wurden die Einschränkungen von Excel immer offensichtlicher. Als wir unser Produktangebot erweiterten, jeweils mit zahlreichen Attributen wie SKU-Codes, Farben, Größen und Preisen, wurden die Tabellenkalkulationen enorm komplex. Diese Komplexität war nicht nur schwierig zu handhaben, sondern sie erhöhte auch signifikant das Risiko menschlicher Fehler. Informationen waren über verschiedene Blätter und Dateien verstreut, was es den Teammitgliedern erschwerte, effektiv und effizient zusammenzuarbeiten. Im Grunde konnte Excel mit den steigenden Datenanforderungen unseres wachsenden Geschäfts nicht mithalten.
|
||||
|
||||
#+attr_shortcode: :type danger :title 10.000 Produkte in einer Tabelle :open true
|
||||
#+begin_admonition
|
||||
Wir hatten Zeiten, in denen wir etwa 10.000 SKUs über 4-5 Plattformen in 5 verschiedenen Sprachen verwalten mussten. Dies in einer Tabelle zu verwalten, wäre ein endloser Alptraum gewesen 🙈
|
||||
#+end_admonition
|
||||
|
||||
Das Ergebnis dieser Komplexitäten und Ineffizienzen waren verlorene Stunden - Stunden, die besser hätten genutzt werden können, um das Geschäft zu erweitern, Strategien zu entwerfen oder das Kundenerlebnis zu verbessern. Die häufigen Fehler aufgrund der unhandlichen Natur unserer Tabellen summierten sich zu einer erheblichen Menge an Zeit, die für Korrekturen aufgewendet werden musste, ganz zu schweigen von der Unterbrechung des Arbeitsablaufs. Anstatt uns bei unseren Operationen zu unterstützen, schufen die Einschränkungen von Werkzeugen wie Excel Engpässe in unserem Produkt-Datenverwaltungsprozess und bremsten uns aus, anstatt uns voranzutreiben.
|
||||
|
||||
**** Einführung von Baserow
|
||||
|
||||
Inmitten der Einschränkungen von Excel stieß ich auf Baserow. Dieses innovative Werkzeug, das die Funktionen einer Datenbank und einer Tabelle kombiniert, bot eine frische Perspektive auf die Verwaltung unserer wachsenden Produktdaten.
|
||||
|
||||
Die Stärke von Baserow liegt in seiner Flexibilität und Anpassungsfähigkeit, mit der Fähigkeit, Informationen auf nicht-lineare Weise zu speichern. Es präsentiert Informationen über die herkömmlichen Zeilen und Spalten hinaus, einschließlich der Möglichkeit für verknüpfte Datensätze, mehrere Ansichten und umfangreiche Felddaten wie Kontrollkästchen, Dropdowns, Anhänge und mehr.
|
||||
|
||||
Meine erste Begegnung mit Baserow markierte den Beginn einer transformierenden Reise in der Datenverwaltung. Im Vergleich zu Excel schien es mehr auf die Bedürfnisse eines dynamischen, schnell skalierenden E-Commerce-Unternehmens wie unserem abgestimmt zu sein. Die Frage war - könnte dies das bahnbrechende Werkzeug sein, das wir gesucht haben? Das Potenzial war definitiv da und es war höchste Zeit für uns, einzutauchen und zu erkunden.
|
||||
|
||||
**** Baserow als Lösung
|
||||
|
||||
Im Kern glänzt Baserow, wenn es um die Handhabung großer Mengen an Produkt-Daten geht. Im Gegensatz zu Excel, das oft langsamer und schwieriger zu bedienen wird, wenn die Listen wirklich groß werden, ist Baserow speziell dafür konzipiert, große Datenmengen zu handhaben. Das bedeutet, dass Baserow problemlos mithalten konnte, als unser Produktangebot wuchs.
|
||||
|
||||
Eines der tollen Dinge an Baserow ist, dass es jedem im Team erlaubt, gemeinsam am selben Ort, in Echtzeit zusammenzuarbeiten. Kein Jonglieren mehr mit mehreren Versionen derselben Excel-Datei - in Baserow sieht jeder immer die aktuellsten Informationen. Das macht die Teamarbeit viel leichter und bedeutet weniger Fehlerchancen.
|
||||
|
||||
#+ATTR_HTML: :alt In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten :title In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten
|
||||
[[file:/img/tutorials/baserow/baserow-views.png]]
|
||||
|
||||
Darüber hinaus bietet Baserow verschiedene Ansichten Deiner Daten. Du kannst mehrere Rasteransichten anpassen, um nur ausgewählte Teilmengen an Informationen anzuzeigen. Weitere Ansichtsoptionen beinhalten die Galerie für eine schnelle Übersicht, Kanban für die Verwaltung von Aktionselementen und den Kalender für die Verfolgung von Fristen.
|
||||
|
||||
Der Wechsel von Excel zu Baserow hat unsere Datenverwaltung erheblich verbessert. Wo wir einst mit unorganisierten Produktinformationen zu kämpfen hatten, hat Baserow uns ein ordentliches und leicht zugängliches Format zur Verfügung gestellt. Der Übergang zu Baserow hat uns erhebliche Zeit gespart und Fehler reduziert, was zu einem strafferem und besser handhabbarem Arbeitstag führte.
|
||||
|
||||
**** Baserow - Eine einzelne Quelle der Wahrheit
|
||||
|
||||
#+ATTR_HTML: :alt Es gibt nicht eine Wahrheit, nur die Wahrheit :title Es gibt nicht eine Wahrheit, nur die Wahrheit
|
||||
[[file:/img/tutorials/baserow/baserow-single-source-of-truth.png]]
|
||||
|
||||
Mit den robusten Funktionen von Baserow existieren unsere Produktdaten nicht mehr verstreut über verschiedene Plattformen, Kanäle und Dateien. Sie sind an einem Ort gesammelt - in Airtable. Diese Funktion gab uns eine zuverlässige "einzige Quelle der Wahrheit", auf die jeder im Team zugreifen kann, was Inkonsistenzen und Verwirrung reduziert.
|
||||
|
||||
Baserow ermöglicht es uns, alle unsere Daten auf einen Blick zu sehen. Und es geht nicht nur ums Ansehen; es liefert reichhaltige Einblicke, die bei der Entscheidungsfindung helfen. In der Vergangenheit war es ein Alptraum, Daten über mehrere Excel-Tabellen hinweg zu referenzieren. Jetzt ist es eine einfache Aufgabe. Es ist, als hätte man eine Lupe auf die Daten, die auf das kleinste Detail zoomen und Ihnen in einem Augenblick eine Übersicht geben kann.
|
||||
|
||||
Der größte Vorteil für unsere Produkt-Datenverwaltung besteht darin, Daten und Tabellen zu verbinden. Dies gibt uns die Fähigkeit, ein zentrales Repository von Produkt-Daten als einzelne Quelle der Wahrheit zu verwalten. Aus diesem leiten wir verschiedene spezialisierte Tabellen für Plattformen wie Shopify und Amazon ab, die leicht exportiert werden können. Das macht es sehr einfach, kleine und sogar große Veränderungen zu handhaben.
|
||||
|
||||
#+attr_shortcode: :type tip :title Pro Tipp :open true
|
||||
#+begin_admonition
|
||||
Wenn Du etwas Mühe und Sorgfalt in die Struktur Deiner Produktdaten steckst, werden selbst große Änderungen sehr einfach sein. Es wird keine Rolle spielen, ob Du z.B. eine Preisänderung für 5 oder 5.000 Produkte 🚀🚀🚀 auf Shopify durchführen wollen. Der Aufwand wird nahezu unabhängig von der Anzahl der Datansätze sein.
|
||||
#+end_admonition
|
||||
|
||||
**** Das Potenzial von Baserow
|
||||
|
||||
Eine der größten Gewinne mit Baserow ist, wie viel Zeit es uns spart. Da es alle unsere Daten an einem leicht zu bedienenden Ort aufbewahrt, verschwenden wir keine Stunden mehr damit, durch chaotische Informationen zu wühlen. Dies hat unsere täglichen Aufgaben schneller und effizienter gemacht. Je nach Aufgabe kannst Du Deine Produktivität leicht verzehn- oder zwanzigfachen.
|
||||
|
||||
Aber die Zeitersparnis hört nicht dort auf. Wenn Du die leistungsstarke API von Baserow mit einem Tool zur Workflow-Automatisierung wie [[https://www.n8n.io][n8n]] verbindest, kannst Du sehr, sehr weit gehen. Nur einige Beispiele dafür, was wir in Bezug auf Automatisierung tun:
|
||||
|
||||
#+attr_shortcode: :type tip :title Änderungen durchführen :open true
|
||||
#+begin_admonition
|
||||
🚀 Bei Erstellung oder Änderung von Produkten automatisch die Produkte in Shopify anlegen oder ändern
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title KI🧠 gestützte Produktbeschreibungen :open true
|
||||
#+begin_admonition
|
||||
🚀 Produktbeschreibungen mit KI🧠 auf Basis von Produktattributen automatisch erstellen 🧙
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title Übersetzungen :open true
|
||||
#+begin_admonition
|
||||
🚀 Übersetzungen für Beschreibungen und andere Attribute mit KI🧠 erstellen
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type tip :title 🧙 Magie :open true
|
||||
#+begin_admonition
|
||||
🚀 Alles von den oben stehenden Punkten auf einmal, sobald eine neue Produktzeile hinzugefügt wird 😉 🤖
|
||||
#+end_admonition
|
||||
|
||||
Die Auswirkungen, die Baserow auf unsere Arbeitsstunden und die allgemeine Zufriedenheit hat, können nicht hoch genug eingeschätzt werden.
|
||||
|
||||
**** Schlussfolgerung
|
||||
|
||||
Wenn ich auf meine Reise zurückblicke, war der Übergang zu Baserow zweifellos eine der besten Entscheidungen, die ich für mein E-Commerce-Geschäft getroffen habe. Es ist mehr als ein Werkzeug; es ist ein zeitsparender, stressreduzierender Begleiter, der unsere Abläufe optimiert und unsere Produktivität gesteigert hat.
|
||||
|
||||
Wenn Du ein E-Commerce-Unternehmen besitzt und mit der Produkt-Datenverwaltung zu kämpfen hast, empfehle ich Dir von ganzem Herzen, Baserow in Betracht zu ziehen. Es mag etwas Aufwand bedeuten, es zunächst einzurichten, aber die Vorteile, die Du erzielen kannst - Effizienz, Genauigkeit und gesparte wertvolle Zeit - werden es wert sein.
|
||||
|
||||
Am Ende des Tages geht es beim Betrieb eines erfolgreichen E-Commerce-Geschäfts nicht nur darum, ein breites Sortiment an Produkten oder eine ausgeklügelte Marketingstrategie zu haben; es geht auch darum, die richtigen Werkzeuge zu verwenden, um Deine Abläufe effektiv zu verwalten, und für die Produkt-Datenverwaltung habe ich Baserow als das richtige Werkzeug gefunden.
|
||||
|
||||
#+attr_shortcode: :type tip :title Was ist mit Airtable? :open true
|
||||
#+begin_admonition
|
||||
Einige von Euch könnten *Airtable* als ähnliche Lösung kennen. Obwohl Airtable ein sehr gutes Produkt ist, bevorzuge ich persönlich freie und Open-Source-Lösungen.
|
||||
#+end_admonition
|
||||
|
||||
#+attr_shortcode: :type success :title Wissen ist Macht 🤓 :open true
|
||||
#+begin_admonition
|
||||
Teile diesen Betrag mit jemandem, für den er hilfreich ist.
|
||||
#+end_admonition
|
46
content/about.de.md
Normal file
46
content/about.de.md
Normal file
@ -0,0 +1,46 @@
|
||||
---
|
||||
title: "Über mich"
|
||||
date: 2019-09-04T14:32:51+02:00
|
||||
draft: false
|
||||
author: "Sascha"
|
||||
---
|
||||
# Hey!
|
||||
|
||||
Ich bin Sascha. Für heute habe ich mir leider vorgenommen etwas über mich selbst zu schreiben 😱. Vielleicht fange ich mal am Anfang an:
|
||||
|
||||
Ich mit Computern vor Jahrzenten angefangen, was mitunter auch daran liegen kann, dass ich auch nicht mehr der jüngste bin. Als Teenager habe ich mir nichts sehnlicher gewünscht als einen C64. Ich wollte im Grunde einfach nur zocken können und meinen Spaß damit haben. Meine Eltern dachten sich, dass so ein Computer nützlich für die Schule sein sollte. Sie ließen sich beraten und haben mir einen sündhaft teuren 286er mit 640KB RAM angeschleppt.
|
||||
Da saß ich nun. Keine Spiele, keine Ahnung und MS-DOS Version 5 oder so. Wie enttäuschend 😣.
|
||||
|
||||

|
||||
|
||||
Ich habe viel gebastelt und viel ausprobiert und unheimlich viel gelernt, auch wenn ich nicht spielen konnte wie beabsichtigt. Irgendwann habe ich in der Schule einen Informatikurs gemacht und später Informatik in der Schule auch als Fach gewählt. Da ging es tatsächlich um wirklich interessante Sachen. Die meiste Zeit haben wir hier mit Turbo Pascal programmiert. Das war Mega interessant.
|
||||
|
||||
Trotzdem habe ich mich nach der Schule erst einmal für einen anderen Weg entschieden. Ich habe mich damals für Grafikdesign entschieden, anschließend landete ich in der Druckindustrie als Spezialist für Druckvorstufe, Workflow Automatisierung und vor allem Colormanagement.
|
||||
|
||||
Während all dieser Zeit habe ich mich immer mit Computern und neuen Technologien befasst. Einfach weil es super interessant war 😎
|
||||
|
||||
Als ich meine Frau kennenlernte musste ich seßhaft werden. Sie assimilierte mich in ihre Firma, wo ich bis heute mitarbeite und unterstütze. Natürlich mache ich alles was mit Technik, Automatisierung etc. zu tun hat. Das Thema Colormanagement und Druckmaschinenkalibierung habe ich aber mittlerweile in die vertrauensvollen Hände unserer Grafikmitarbeiter gegeben 😁.
|
||||
|
||||
Heute bin ich neben der gemeinsamen Leitung der Firma mit meiner Frau hauptsächlich für Technologie und Automatisierung in unserem Unternehmen zuständig.
|
||||
|
||||
## Wir nutzen bei uns folgende Technologien:
|
||||
|
||||
* NixOS - wenn schon Linux, dann richtig
|
||||
* Docker / Podman - ohne Container geht heute nix mehr
|
||||
* Shopify - einfach und leistungsstark und wenn Du die API nutzt kannst Du fast alles damit machen
|
||||
* n8n - wer nicht automatisiert ist selber schuld
|
||||
* Baserow - Excel bringt's einfach nicht
|
||||
* Metabase - KPIs mal richtig
|
||||
* ...
|
||||
|
||||
## Und sonst so?
|
||||
|
||||
* Ich programmiere fast jeden Tag
|
||||
* Ich laufe ca. 25km in der Woche
|
||||
* 2-3 Tage pro Woche / 1 Stunde HIIT Training muss einfach sein
|
||||
* Ich zocke gerne (natürlich auf Linux) und das beste ist meine Frau auch 🥰
|
||||
* Ich ernähre mich Paleo
|
||||
* Ich fahre Motorrad und liebe meine Ducati, sie heißt Polly 😘
|
||||
* Ich benutze Linux, weil ich wert auf Autonomie und Privatsphäre lege 😜
|
||||
|
||||
TBC
|
46
content/about.en.md
Normal file
46
content/about.en.md
Normal file
@ -0,0 +1,46 @@
|
||||
---
|
||||
title: "About me"
|
||||
date: 2019-09-04T14:32:51+02:00
|
||||
draft: false
|
||||
author: "Sascha"
|
||||
---
|
||||
# Hey!
|
||||
|
||||
I am Sascha. Unfortunately, I've made a plan for today to write something about myself 😱. Maybe I should start at the beginning:
|
||||
|
||||
I started with computers a long time ago, which may be because I am not the youngest anymore. As a teenager, I longed for a C64 nothing else. Essentially, I just wanted to be able to play games and have fun with it. My parents thought such a computer should be useful for school. They sought advice and bought me a sinfully expensive 286er with 640KB RAM.
|
||||
So there I was. No games, no idea, and MS-DOS version 5 or something. How disappointing 😣.
|
||||
|
||||

|
||||
|
||||
I tinkered a lot, tried a lot out and learnt an incredible amount, even though I couldn't play as intended. At some point, I took a computer science course at school and later chose it as a subject. There we actually dealt with really interesting stuff. Most of the time we programmed with Turbo Pascal. It was mega interesting.
|
||||
|
||||
Still, after school I decided to go a different way initially. I chose graphic design, and then ended up in the print industry as a specialist for prepress, workflow automation and especially color management.
|
||||
|
||||
During all this time, I always dealt with computers and new technologies. Simply because it was super interesting 😎.
|
||||
|
||||
When I met my wife, I had to settle down. She assimilated me into her company, where I am still working and supporting. Of course, I do everything that has to do with technology, automation, etc. However, I have now handed over the topic of color management and printing machine calibration to the trusting hands of our graphic designers 😁.
|
||||
|
||||
Today, in addition to jointly managing the company with my wife, I am primarily responsible for technology and automation in our company.
|
||||
|
||||
## We use the following technologies:
|
||||
|
||||
* NixOS - if Linux, then declarative
|
||||
* Docker / Podman - can't do without containers these days
|
||||
* Shopify - simple and powerful and if you use the API you can do almost anything with it
|
||||
* n8n - you're at fault if you don't automate
|
||||
* Baserow - Excel just doesn't cut it
|
||||
* Metabase - KPIs done right
|
||||
* ...
|
||||
|
||||
## And what else?
|
||||
|
||||
* I program almost every day
|
||||
* I run approximately 14.9 miles in a week
|
||||
* 2-3 days per week / 1 hour of HIIT training is a must
|
||||
* I love to game (of course on Linux) and the best part is my wife does too 🥰
|
||||
* I follow the Paleo diet
|
||||
* I ride a motorcycle and love my Ducati, her name is Polly 😘
|
||||
* I use Linux, because I value autonomy and privacy 😜
|
||||
|
||||
TBC
|
3
content/automation/_index.de.md
Normal file
3
content/automation/_index.de.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: "Automatisierung"
|
||||
---
|
3
content/automation/_index.en.md
Normal file
3
content/automation/_index.en.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: "Automation"
|
||||
---
|
3
content/datamanagement/_index.de.md
Normal file
3
content/datamanagement/_index.de.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: "Datenverwaltung"
|
||||
---
|
3
content/datamanagement/_index.en.md
Normal file
3
content/datamanagement/_index.en.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: "Data Management"
|
||||
---
|
272
content/legal.de.md
Normal file
272
content/legal.de.md
Normal file
@ -0,0 +1,272 @@
|
||||
+++
|
||||
title = "Impressum & Datenschutzerklärung"
|
||||
date = 2000-10-03
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Willkommen auf dieser Seite, die die rechtlichen Unternehmensdetails und Datenschutzbestimmungen von Sascha König enthält. Es ist wichtig, dass wir die rechtlichen Aspekte klären, um Transparenz und Vertrauen zu gewährleisten. Vielen Dank für Ihr Verständnis und Ihre Zusammenarbeit.
|
||||
|
||||
|
||||
## Impressum {#impressum}
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
|
||||
## Datenschutzerklärung {#datenschutzerklärung}
|
||||
|
||||
Wir freuen uns sehr über Ihr Interesse an unserem Unternehmen. Datenschutz hat einen besonders hohen Stellenwert für die Geschäftsleitung der Sascha König. Eine Nutzung der Internetseiten der Sascha König ist grundsätzlich ohne jede Angabe personenbezogener Daten möglich. Sofern eine betroffene Person besondere Services unseres Unternehmens über unsere Internetseite in Anspruch nehmen möchte, könnte jedoch eine Verarbeitung personenbezogener Daten erforderlich werden. Ist die Verarbeitung personenbezogener Daten erforderlich und besteht für eine solche Verarbeitung keine gesetzliche Grundlage, holen wir generell eine Einwilligung der betroffenen Person ein.
|
||||
|
||||
Die Verarbeitung personenbezogener Daten, beispielsweise des Namens, der Anschrift, E-Mail-Adresse oder Telefonnummer einer betroffenen Person, erfolgt stets im Einklang mit der Datenschutz-Grundverordnung und in Übereinstimmung mit den für Sascha König geltenden landesspezifischen Datenschutzbestimmungen. Mittels dieser Datenschutzerklärung möchte unser Unternehmen die Öffentlichkeit über Art, Umfang und Zweck der von uns erhobenen, genutzten und verarbeiteten personenbezogenen Daten informieren. Ferner werden betroffene Personen mittels dieser Datenschutzerklärung über die ihnen zustehenden Rechte aufgeklärt.
|
||||
|
||||
Sascha König hat als für die Verarbeitung Verantwortlicher zahlreiche technische und organisatorische Maßnahmen umgesetzt, um einen möglichst lückenlosen Schutz der über diese Internetseite verarbeiteten personenbezogenen Daten sicherzustellen. Dennoch können Internetbasierte Datenübertragungen grundsätzlich Sicherheitslücken aufweisen, sodass ein absoluter Schutz nicht gewährleistet werden kann. Aus diesem Grund steht es jeder betroffenen Person frei, personenbezogene Daten auch auf alternativen Wegen, beispielsweise telefonisch, an uns zu übermitteln.
|
||||
|
||||
|
||||
### 1. Begriffsbestimmungen {#1-dot-begriffsbestimmungen}
|
||||
|
||||
Die Datenschutzerklärung der Sascha König beruht auf den Begrifflichkeiten, die durch den Europäischen Richtlinien- und Verordnungsgeber beim Erlass der Datenschutz-Grundverordnung (DS-GVO) verwendet wurden. Unsere Datenschutzerklärung soll sowohl für die Öffentlichkeit als auch für unsere Kunden und Geschäftspartner einfach lesbar und verständlich sein. Um dies zu gewährleisten, möchten wir vorab die verwendeten Begrifflichkeiten erläutern.
|
||||
|
||||
Wir verwenden in dieser Datenschutzerklärung unter anderem die folgenden Begriffe:
|
||||
|
||||
|
||||
#### a) personenbezogene Daten {#a-personenbezogene-daten}
|
||||
|
||||
Personenbezogene Daten sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden „betroffene Person“) beziehen. Als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung oder zu einem oder mehreren besonderen Merkmalen, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind, identifiziert werden kann.
|
||||
|
||||
|
||||
#### b) betroffene Person {#b-betroffene-person}
|
||||
|
||||
Betroffene Person ist jede identifizierte oder identifizierbare natürliche Person, deren personenbezogene Daten von dem für die Verarbeitung Verantwortlichen verarbeitet werden.
|
||||
|
||||
|
||||
#### c) Verarbeitung {#c-verarbeitung}
|
||||
|
||||
Verarbeitung ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten wie das Erheben, das Erfassen, die Organisation, das Ordnen, die Speicherung, die Anpassung oder Veränderung, das Auslesen, das Abfragen, die Verwendung, die Offenlegung durch Übermittlung, Verbreitung oder eine andere Form der Bereitstellung, den Abgleich oder die Verknüpfung, die Einschränkung, das Löschen oder die Vernichtung.
|
||||
|
||||
|
||||
#### d) Einschränkung der Verarbeitung {#d-einschränkung-der-verarbeitung}
|
||||
|
||||
Einschränkung der Verarbeitung ist die Markierung gespeicherter personenbezogener Daten mit dem Ziel, ihre künftige Verarbeitung einzuschränken.
|
||||
|
||||
|
||||
#### e) Profiling {#e-profiling}
|
||||
|
||||
Profiling ist jede Art der automatisierten Verarbeitung personenbezogener Daten, die darin besteht, dass diese personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person beziehen, zu bewerten, insbesondere, um Aspekte bezüglich Arbeitsleistung, wirtschaftlicher Lage, Gesundheit, persönlicher Vorlieben, Interessen, Zuverlässigkeit, Verhalten, Aufenthaltsort oder Ortswechsel dieser natürlichen Person zu analysieren oder vorherzusagen.
|
||||
|
||||
|
||||
#### f) Pseudonymisierung {#f-pseudonymisierung}
|
||||
|
||||
Pseudonymisierung ist die Verarbeitung personenbezogener Daten in einer Weise, auf welche die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können, sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren natürlichen Person zugewiesen werden.
|
||||
|
||||
|
||||
#### g) Verantwortlicher oder für die Verarbeitung Verantwortlicher {#g-verantwortlicher-oder-für-die-verarbeitung-verantwortlicher}
|
||||
|
||||
Verantwortlicher oder für die Verarbeitung Verantwortlicher ist die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet. Sind die Zwecke und Mittel dieser Verarbeitung durch das Unionsrecht oder das Recht der Mitgliedstaaten vorgegeben, so kann der Verantwortliche beziehungsweise können die bestimmten Kriterien seiner Benennung nach dem Unionsrecht oder dem Recht der Mitgliedstaaten vorgesehen werden.
|
||||
|
||||
|
||||
#### h) Auftragsverarbeiter {#h-auftragsverarbeiter}
|
||||
|
||||
Auftragsverarbeiter ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.
|
||||
|
||||
|
||||
#### i) Empfänger {#i-empfänger}
|
||||
|
||||
Empfänger ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, der personenbezogene Daten offengelegt werden, unabhängig davon, ob es sich bei ihr um einen Dritten handelt oder nicht. Behörden, die im Rahmen eines bestimmten Untersuchungsauftrags nach dem Unionsrecht oder dem Recht der Mitgliedstaaten möglicherweise personenbezogene Daten erhalten, gelten jedoch nicht als Empfänger.
|
||||
|
||||
|
||||
#### j) Dritter {#j-dritter}
|
||||
|
||||
Dritter ist eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle außer der betroffenen Person, dem Verantwortlichen, dem Auftragsverarbeiter und den Personen, die unter der unmittelbaren Verantwortung des Verantwortlichen oder des Auftragsverarbeiters befugt sind, die personenbezogenen Daten zu verarbeiten.
|
||||
|
||||
|
||||
#### k) Einwilligung {#k-einwilligung}
|
||||
|
||||
Einwilligung ist jede von der betroffenen Person freiwillig für den bestimmten Fall in informierter Weise und unmissverständlich abgegebene Willensbekundung in Form einer Erklärung oder einer sonstigen eindeutigen bestätigenden Handlung, mit der die betroffene Person zu verstehen gibt, dass sie mit der Verarbeitung der sie betreffenden personenbezogenen Daten einverstanden ist.
|
||||
|
||||
|
||||
### 2. Name und Anschrift des für die Verarbeitung Verantwortlichen {#2-dot-name-und-anschrift-des-für-die-verarbeitung-verantwortlichen}
|
||||
|
||||
Verantwortlicher im Sinne der Datenschutz-Grundverordnung, sonstiger in den Mitgliedstaaten der Europäischen Union geltenden Datenschutzgesetze und anderer Bestimmungen mit datenschutzrechtlichem Charakter ist die:
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
E-Mail: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
|
||||
### 3. Erfassung von allgemeinen Daten und Informationen {#3-dot-erfassung-von-allgemeinen-daten-und-informationen}
|
||||
|
||||
Die Internetseite Sascha König erfasst mit jedem Aufruf der Internetseite durch eine betroffene Person oder ein automatisiertes System eine Reihe von allgemeinen Daten und Informationen. Diese allgemeinen Daten und Informationen werden in den Logfiles des Servers gespeichert. Erfasst werden können die (1) verwendeten Browsertypen und Versionen, (2) das vom zugreifenden System verwendete Betriebssystem, (3) die Internetseite, von welcher ein zugreifendes System auf unsere Internetseite gelangt (sogenannte Referrer), (4) die Unterwebseiten, welche über ein zugreifendes System auf unserer Internetseite angesteuert werden, (5) das Datum und die Uhrzeit eines Zugriffs auf die Internetseite, (6) eine Internet-Protokoll-Adresse (IP-Adresse), (7) der Internet-Service-Provider des zugreifenden Systems und (8) sonstige ähnliche Daten und Informationen, die der Gefahrenabwehr im Falle von Angriffen auf unsere informationstechnologischen Systeme dienen.
|
||||
|
||||
Bei der Nutzung dieser allgemeinen Daten und Informationen zieht Sascha König keine Rückschlüsse auf die betroffene Person. Diese Informationen werden vielmehr benötigt, um (1) die Inhalte unserer Internetseite korrekt auszuliefern, (2) die Inhalte unserer Internetseite sowie die Werbung für diese zu optimieren, (3) die dauerhafte Funktionsfähigkeit unserer informationstechnologischen Systeme und der Technik unserer Internetseite zu gewährleisten sowie (4) um Strafverfolgungsbehörden im Falle eines Cyberangriffes die zur Strafverfolgung notwendigen Informationen bereitzustellen. Diese anonym erhobenen Daten und Informationen werden durch Sascha König daher einerseits statistisch und ferner mit dem Ziel ausgewertet, den Datenschutz und die Datensicherheit in unserem Unternehmen zu erhöhen, um letztlich ein optimales Schutzniveau für die von uns verarbeiteten personenbezogenen Daten sicherzustellen. Die anonymen Daten der Server-Logfiles werden getrennt von allen durch eine betroffene Person angegebenen personenbezogenen Daten gespeichert.
|
||||
|
||||
|
||||
### 4. Abonnement unseres Newsletters {#4-dot-abonnement-unseres-newsletters}
|
||||
|
||||
Auf der Internetseite der Sascha König wird den Benutzern die Möglichkeit eingeräumt, den Newsletter unseres Unternehmens zu abonnieren. Welche personenbezogenen Daten bei der Bestellung des Newsletters an den für die Verarbeitung Verantwortlichen übermittelt werden, ergibt sich aus der hierzu verwendeten Eingabemaske.
|
||||
|
||||
Sascha König informiert ihre Kunden und Geschäftspartner in regelmäßigen Abständen im Wege eines Newsletters über Angebote des Unternehmens. Der Newsletter unseres Unternehmens kann von der betroffenen Person grundsätzlich nur dann empfangen werden, wenn (1) die betroffene Person über eine gültige E-Mail-Adresse verfügt und (2) die betroffene Person sich für den Newsletterversand registriert. An die von einer betroffenen Person erstmalig für den Newsletterversand eingetragene E-Mail-Adresse wird aus rechtlichen Gründen eine Bestätigungsmail im Double-Opt-In-Verfahren versendet. Diese Bestätigungsmail dient der Überprüfung, ob der Inhaber der E-Mail-Adresse als betroffene Person den Empfang des Newsletters autorisiert hat.
|
||||
|
||||
Bei der Anmeldung zum Newsletter speichern wir ferner die vom Internet-Service-Provider (ISP) vergebene IP-Adresse des von der betroffenen Person zum Zeitpunkt der Anmeldung verwendeten Computersystems sowie das Datum und die Uhrzeit der Anmeldung. Die Erhebung dieser Daten ist erforderlich, um den(möglichen) Missbrauch der E-Mail-Adresse einer betroffenen Person zu einem späteren Zeitpunkt nachvollziehen zu können und dient deshalb der rechtlichen Absicherung des für die Verarbeitung Verantwortlichen.
|
||||
|
||||
Die im Rahmen einer Anmeldung zum Newsletter erhobenen personenbezogenen Daten werden ausschließlich zum Versand unseres Newsletters verwendet. Ferner könnten Abonnenten des Newsletters per E-Mail informiert werden, sofern dies für den Betrieb des Newsletter-Dienstes oder eine diesbezügliche Registrierung erforderlich ist, wie dies im Falle von Änderungen am Newsletterangebot oder bei der Veränderung der technischen Gegebenheiten der Fall sein könnte. Es erfolgt keine Weitergabe der im Rahmen des Newsletter-Dienstes erhobenen personenbezogenen Daten an Dritte. Das Abonnement unseres Newsletters kann durch die betroffene Person jederzeit gekündigt werden. Die Einwilligung in die Speicherung personenbezogener Daten, die die betroffene Person uns für den Newsletterversand erteilt hat, kann jederzeit widerrufen werden. Zum Zwecke des Widerrufs der Einwilligung findet sich in jedem Newsletter ein entsprechender Link. Ferner besteht die Möglichkeit, sich jederzeit auch direkt auf der Internetseite des für die Verarbeitung Verantwortlichen vom Newsletterversand abzumelden oder dies dem für die Verarbeitung Verantwortlichen auf andere Weise mitzuteilen.
|
||||
|
||||
|
||||
### 5. Newsletter-Tracking {#5-dot-newsletter-tracking}
|
||||
|
||||
Die Newsletter der Sascha König enthalten sogenannte Zählpixel. Ein Zählpixel ist eine Miniaturgrafik, die in solche E-Mails eingebettet wird, welche im HTML-Format versendet werden, um eine Logdatei-Aufzeichnung und eine Logdatei-Analyse zu ermöglichen. Dadurch kann eine statistische Auswertung des Erfolges oder Misserfolges von Online-Marketing-Kampagnen durchgeführt werden. Anhand des eingebetteten Zählpixels kann Sascha König erkennen, ob und wann eine E-Mail von einer betroffenen Person geöffnet wurde und welche in der E-Mail befindlichen Links von der betroffenen Person aufgerufen wurden.
|
||||
|
||||
Solche über die in den Newslettern enthaltenen Zählpixel erhobenen personenbezogenen Daten, werden von dem für die Verarbeitung Verantwortlichen gespeichert und ausgewertet, um den Newsletterversand zu optimieren und den Inhalt zukünftiger Newsletter noch besser den Interessen der betroffenen Person anzupassen. Diese personenbezogenen Daten werden nicht an Dritte weitergegeben. Betroffene Personen sind jederzeit berechtigt, die diesbezügliche gesonderte, über das Double-Opt-In-Verfahren abgegebene Einwilligungserklärung zu widerrufen. Nach einem Widerruf werden diese personenbezogenen Daten von dem für die Verarbeitung Verantwortlichen gelöscht. Eine Abmeldung vom Erhalt des Newsletters deutet Sascha König automatisch als Widerruf.
|
||||
|
||||
|
||||
### 6. Kommentarfunktion im Blog auf der Internetseite {#6-dot-kommentarfunktion-im-blog-auf-der-internetseite}
|
||||
|
||||
Sascha König bietet den Nutzern auf einem Blog, der sich auf der Internetseite des für die Verarbeitung Verantwortlichen befindet, die Möglichkeit, individuelle Kommentare zu einzelnen Blog-Beiträgen zu hinterlassen. Ein Blog ist ein auf einer Internetseite geführtes, in der Regel öffentlich einsehbares Portal, in welchem eine oder mehrere Personen, die Blogger oder Web-Blogger genannt werden, Artikel posten oder Gedanken in sogenannten Blogposts niederschreiben können. Die Blogposts können in der Regel von Dritten kommentiert werden.
|
||||
|
||||
Hinterlässt eine betroffene Person einen Kommentar in dem auf dieser Internetseite veröffentlichten Blog, werden neben den von der betroffenen Person hinterlassenen Kommentaren auch Angaben zum Zeitpunkt der Kommentareingabe sowie zu dem von der betroffenen Person gewählten Nutzernamen (Pseudonym) gespeichert und veröffentlicht. Ferner wird die vom Internet-Service-Provider (ISP) der betroffenen Person vergebene IP-Adresse mitprotokolliert. Diese Speicherung der IP-Adresse erfolgt aus Sicherheitsgründen und für den Fall, dass die betroffene Person durch einen abgegebenen Kommentar die Rechte Dritter verletzt oder rechtswidrige Inhalte postet. Die Speicherung dieser personenbezogenen Daten erfolgt daher im eigenen Interesse des für die Verarbeitung Verantwortlichen, damit sich dieser im Falle einer Rechtsverletzung gegebenenfalls exkulpieren könnte. Es erfolgt keine Weitergabe dieser erhobenen personenbezogenen Daten an Dritte, sofern eine solche Weitergabe nicht gesetzlich vorgeschrieben ist oder der Rechtsverteidigung des für die Verarbeitung Verantwortlichen dient.
|
||||
|
||||
|
||||
### 7. Routinemäßige Löschung und Sperrung von personenbezogenen Daten {#7-dot-routinemäßige-löschung-und-sperrung-von-personenbezogenen-daten}
|
||||
|
||||
Der für die Verarbeitung Verantwortliche verarbeitet und speichert personenbezogene Daten der betroffenen Person nur für den Zeitraum, der zur Erreichung des Speicherungszwecks erforderlich ist oder sofern dies durch den Europäischen Richtlinien- und Verordnungsgeber oder einen anderen Gesetzgeber in Gesetzen oder Vorschriften, welchen der für die Verarbeitung Verantwortliche unterliegt, vorgesehen wurde.
|
||||
|
||||
Entfällt der Speicherungszweck oder läuft eine vom Europäischen Richtlinien- und Verordnungsgeber oder einem anderen zuständigen Gesetzgeber vorgeschriebene Speicherfrist ab, werden die personenbezogenen Daten routinemäßig und entsprechend den gesetzlichen Vorschriften gesperrt oder gelöscht.
|
||||
|
||||
|
||||
### 8. Rechte der betroffenen Person {#8-dot-rechte-der-betroffenen-person}
|
||||
|
||||
|
||||
#### a) Recht auf Bestätigung {#a-recht-auf-bestätigung}
|
||||
|
||||
Jede betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber eingeräumte Recht, von dem für die Verarbeitung Verantwortlichen eine Bestätigung darüber zu verlangen, ob sie betreffende personenbezogene Daten verarbeitet werden. Möchte eine betroffene Person dieses Bestätigungsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
|
||||
#### b) Recht auf Auskunft {#b-recht-auf-auskunft}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, jederzeit von dem für die Verarbeitung Verantwortlichen unentgeltliche Auskunft über die zu seiner Person gespeicherten personenbezogenen Daten und eine Kopie dieser Auskunft zu erhalten. Ferner hat der Europäische Richtlinien- und Verordnungsgeber der betroffenen Person Auskunft über folgende Informationen zugestanden:
|
||||
|
||||
die Verarbeitungszwecke
|
||||
die Kategorien personenbezogener Daten, die verarbeitet werden
|
||||
die Empfänger oder Kategorien von Empfängern, gegenüber denen die personenbezogenen Daten offengelegt worden sind oder noch offengelegt werden, insbesondere bei Empfängern in Drittländern oder bei internationalen Organisationen
|
||||
falls möglich die geplante Dauer, für die die personenbezogenen Daten gespeichert werden, oder, falls dies nicht möglich ist, die Kriterien für die Festlegung dieser Dauer
|
||||
das Bestehen eines Rechts auf Berichtigung oder Löschung der sie betreffenden personenbezogenen Daten oder auf Einschränkung der Verarbeitung durch den Verantwortlichen oder eines Widerspruchsrechts gegen diese Verarbeitung
|
||||
das Bestehen eines Beschwerderechts bei einer Aufsichtsbehörde
|
||||
wenn die personenbezogenen Daten nicht bei der betroffenen Person erhoben werden: Alle verfügbaren Informationen über die Herkunft der Daten
|
||||
das Bestehen einer automatisierten Entscheidungsfindung einschließlich Profiling gemäß Artikel 22 Abs.1 und 4 DS-GVO und — zumindest in diesen Fällen — aussagekräftige Informationen über die involvierte Logik sowie die Tragweite und die angestrebten Auswirkungen einer derartigen Verarbeitung für die betroffene Person
|
||||
Ferner steht der betroffenen Person ein Auskunftsrecht darüber zu, ob personenbezogene Daten an ein Drittland oder an eine internationale Organisation übermittelt wurden. Sofern dies der Fall ist, so steht der betroffenen Person im Übrigen das Recht zu, Auskunft über die geeigneten Garantien im Zusammenhang mit der Übermittlung zu erhalten.
|
||||
|
||||
Möchte eine betroffene Person dieses Auskunftsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
|
||||
#### c) Recht auf Berichtigung {#c-recht-auf-berichtigung}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, die unverzügliche Berichtigung sie betreffender unrichtiger personenbezogener Daten zu verlangen. Ferner steht der betroffenen Person das Recht zu, unter Berücksichtigung der Zwecke der Verarbeitung, die Vervollständigung unvollständiger personenbezogener Daten — auch mittels einer ergänzenden Erklärung — zu verlangen.
|
||||
|
||||
Möchte eine betroffene Person dieses Berichtigungsrecht in Anspruch nehmen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
|
||||
#### d) Recht auf Löschung (Recht auf Vergessen werden) {#d-recht-auf-löschung--recht-auf-vergessen-werden}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, von dem Verantwortlichen zu verlangen, dass die sie betreffenden personenbezogenen Daten unverzüglich gelöscht werden, sofern einer der folgenden Gründe zutrifft und soweit die Verarbeitung nicht erforderlich ist:
|
||||
|
||||
Die personenbezogenen Daten wurden für solche Zwecke erhoben oder auf sonstige Weise verarbeitet, für welche sie nicht mehr notwendig sind.
|
||||
Die betroffene Person widerruft ihre Einwilligung, auf die sich die Verarbeitung gemäß Art. 6 Abs. 1 Buchstabe a DS-GVO oder Art. 9 Abs. 2 Buchstabe a DS-GVO stützte, und es fehlt an einer anderweitigen Rechtsgrundlage für die Verarbeitung.
|
||||
Die betroffene Person legt gemäß Art. 21 Abs. 1 DS-GVO Widerspruch gegen die Verarbeitung ein, und es liegen keine vorrangigen berechtigten Gründe für die Verarbeitung vor, oder die betroffene Person legt gemäß Art. 21 Abs. 2 DS-GVO Widerspruch gegen die Verarbeitung ein.
|
||||
Die personenbezogenen Daten wurden unrechtmäßig verarbeitet.
|
||||
Die Löschung der personenbezogenen Daten ist zur Erfüllung einer rechtlichen Verpflichtung nach dem Unionsrecht oder dem Recht der Mitgliedstaaten erforderlich, dem der Verantwortliche unterliegt.
|
||||
Die personenbezogenen Daten wurden in Bezug auf angebotene Dienste der Informationsgesellschaft gemäß Art. 8 Abs. 1 DS-GVO erhoben.
|
||||
Sofern einer der oben genannten Gründe zutrifft und eine betroffene Person die Löschung von personenbezogenen Daten, die bei der Sascha König gespeichert sind, veranlassen möchte, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden. Der Mitarbeiter der Sascha König wird veranlassen, dass dem Löschverlangen unverzüglich nachgekommen wird.
|
||||
|
||||
Wurden die personenbezogenen Daten von der Sascha König öffentlich gemacht und ist unser Unternehmen als Verantwortlicher gemäß Art. 17 Abs. 1 DS-GVO zur Löschung der personenbezogenen Daten verpflichtet, so trifft Sascha König unter Berücksichtigung der verfügbaren Technologie und der Implementierungskosten angemessene Maßnahmen, auch technischer Art, um andere für die Datenverarbeitung Verantwortliche, welche die veröffentlichten personenbezogenen Daten verarbeiten, darüber in Kenntnis zu setzen, dass die betroffene Person von diesen anderen für die Datenverarbeitung Verantwortlichen die Löschung sämtlicher Links zu diesen personenbezogenen Daten oder von Kopien oder Replikationen dieser personenbezogenen Daten verlangt hat, soweit die Verarbeitung nicht erforderlich ist. Der Mitarbeiter der Sascha König wird im Einzelfall das Notwendige veranlassen.
|
||||
|
||||
|
||||
#### e) Recht auf Einschränkung der Verarbeitung {#e-recht-auf-einschränkung-der-verarbeitung}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, von dem Verantwortlichen die Einschränkung der Verarbeitung zu verlangen, wenn eine der folgenden Voraussetzungen gegeben ist:
|
||||
|
||||
Die Richtigkeit der personenbezogenen Daten wird von der betroffenen Person bestritten, und zwar für eine Dauer, die es dem Verantwortlichen ermöglicht, die Richtigkeit der personenbezogenen Daten zu überprüfen.
|
||||
Die Verarbeitung ist unrechtmäßig, die betroffene Person lehnt die Löschung der personenbezogenen Daten ab und verlangt stattdessen die Einschränkung der Nutzung der personenbezogenen Daten.
|
||||
Der Verantwortliche benötigt die personenbezogenen Daten für die Zwecke der Verarbeitung nicht länger, die betroffene Person benötigt sie jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
|
||||
Die betroffene Person hat Widerspruch gegen die Verarbeitung gem. Art. 21 Abs. 1 DS-GVO eingelegt und es steht noch nicht fest, ob die berechtigten Gründe des Verantwortlichen gegenüber denen der betroffenen Person überwiegen.
|
||||
Sofern eine der oben genannten Voraussetzungen gegeben ist und eine betroffene Person die Einschränkung von personenbezogenen Daten, die bei der Sascha König gespeichert sind, verlangen möchte, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden. Der Mitarbeiter der Sascha König wird die Einschränkung der Verarbeitung veranlassen.
|
||||
|
||||
|
||||
#### f) Recht auf Datenübertragbarkeit {#f-recht-auf-datenübertragbarkeit}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, die sie betreffenden personenbezogenen Daten, welche durch die betroffene Person einem Verantwortlichen bereitgestellt wurden, in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten. Sie hat außerdem das Recht, diese Daten einem anderen Verantwortlichen ohne Behinderung durch den Verantwortlichen, dem die personenbezogenen Daten bereitgestellt wurden, zu übermitteln, sofern die Verarbeitung auf der Einwilligung gemäß Art. 6 Abs. 1 Buchstabe a DS-GVO oder Art. 9 Abs. 2 Buchstabe a DS-GVO oder auf einem Vertrag gemäß Art. 6 Abs. 1 Buchstabe b DS-GVO beruht und die Verarbeitung mithilfe automatisierter Verfahren erfolgt, sofern die Verarbeitung nicht für die Wahrnehmung einer Aufgabe erforderlich ist, die im öffentlichen Interesse liegt oder in Ausübung öffentlicher Gewalt erfolgt, welche dem Verantwortlichen übertragen wurde.
|
||||
|
||||
Ferner hat die betroffene Person bei der Ausübung ihres Rechts auf Datenübertragbarkeit gemäß Art. 20 Abs. 1 DS-GVO das Recht, zu erwirken, dass die personenbezogenen Daten direkt von einem Verantwortlichen an einen anderen Verantwortlichen übermittelt werden, soweit dies technisch machbar ist und sofern hiervon nicht die Rechte und Freiheiten anderer Personen beeinträchtigt werden.
|
||||
|
||||
Zur Geltendmachung des Rechts auf Datenübertragbarkeit kann sich die betroffene Person jederzeit an einen Mitarbeiter der Sascha König wenden.
|
||||
|
||||
|
||||
#### g) Recht auf Widerspruch {#g-recht-auf-widerspruch}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, aus Gründen, die sich aus ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung sie betreffender personenbezogener Daten, die aufgrund von Art. 6 Abs. 1 Buchstaben e oder f DS-GVO erfolgt, Widerspruch einzulegen. Dies gilt auch für ein auf diese Bestimmungen gestütztes Profiling.
|
||||
|
||||
Sascha König verarbeitet die personenbezogenen Daten im Falle des Widerspruchs nicht mehr, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die den Interessen, Rechten und Freiheiten der betroffenen Person überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
|
||||
|
||||
Verarbeitet Sascha König personenbezogene Daten, um Direktwerbung zu betreiben, so hat die betroffene Person das Recht, jederzeit Widerspruch gegen die Verarbeitung der personenbezogenen Daten zum Zwecke derartiger Werbung einzulegen. Dies gilt auch für das Profiling, soweit es mit solcher Direktwerbung in Verbindung steht. Widerspricht die betroffene Person gegenüber der Sascha König der Verarbeitung für Zwecke der Direktwerbung, so wird Sascha König die personenbezogenen Daten nicht mehr für diese Zwecke verarbeiten.
|
||||
|
||||
Zudem hat die betroffene Person das Recht, aus Gründen, die sich aus ihrer besonderen Situation ergeben, gegen die sie betreffende Verarbeitung personenbezogener Daten, die bei der Sascha König zu wissenschaftlichen oder historischen Forschungszwecken oder zu statistischen Zwecken gemäß Art. 89 Abs. 1 DS-GVO erfolgen, Widerspruch einzulegen, es sei denn, eine solche Verarbeitung ist zur Erfüllung einer im öffentlichen Interesse liegenden Aufgabe erforderlich.
|
||||
|
||||
Zur Ausübung des Rechts auf Widerspruch kann sich die betroffene Person direkt an jeden Mitarbeiter der Sascha König oder einen anderen Mitarbeiter wenden. Der betroffenen Person steht es ferner frei, im Zusammenhang mit der Nutzung von Diensten der Informationsgesellschaft, ungeachtet der Richtlinie 2002/58/EG, ihr Widerspruchsrecht mittels automatisierter Verfahren auszuüben, bei denen technische Spezifikationen verwendet werden.
|
||||
|
||||
|
||||
#### h) Automatisierte Entscheidungen im Einzelfall einschließlich Profiling {#h-automatisierte-entscheidungen-im-einzelfall-einschließlich-profiling}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, nicht einer ausschließlich auf einer automatisierten Verarbeitung — einschließlich Profiling — beruhenden Entscheidung unterworfen zu werden, die ihr gegenüber rechtliche Wirkung entfaltet oder sie in ähnlicher Weise erheblich beeinträchtigt, sofern die Entscheidung (1) nicht für den Abschluss oder die Erfüllung eines Vertrags zwischen der betroffenen Person und dem Verantwortlichen erforderlich ist, oder (2) aufgrund von Rechtsvorschriften der Union oder der Mitgliedstaaten, denen der Verantwortliche unterliegt, zulässig ist und diese Rechtsvorschriften angemessene Maßnahmen zur Wahrung der Rechte und Freiheiten sowie der berechtigten Interessen der betroffenen Person enthalten oder (3) mit ausdrücklicher Einwilligung der betroffenen Person erfolgt.
|
||||
|
||||
Ist die Entscheidung (1) für den Abschluss oder die Erfüllung eines Vertrags zwischen der betroffenen Person und dem Verantwortlichen erforderlich oder (2) erfolgt sie mit ausdrücklicher Einwilligung der betroffenen Person, trifft Sascha König angemessene Maßnahmen, um die Rechte und Freiheiten sowie die berechtigten Interessen der betroffenen Person zu wahren, wozu mindestens das Recht auf Erwirkung des Eingreifens einer Person seitens des Verantwortlichen, auf Darlegung des eigenen Standpunkts und auf Anfechtung der Entscheidung gehört.
|
||||
|
||||
Möchte die betroffene Person Rechte mit Bezug auf automatisierte Entscheidungen geltend machen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
|
||||
#### i) Recht auf Widerruf einer datenschutzrechtlichen Einwilligung {#i-recht-auf-widerruf-einer-datenschutzrechtlichen-einwilligung}
|
||||
|
||||
Jede von der Verarbeitung personenbezogener Daten betroffene Person hat das vom Europäischen Richtlinien- und Verordnungsgeber gewährte Recht, eine Einwilligung zur Verarbeitung personenbezogener Daten jederzeit zu widerrufen.
|
||||
|
||||
Möchte die betroffene Person ihr Recht auf Widerruf einer Einwilligung geltend machen, kann sie sich hierzu jederzeit an einen Mitarbeiter des für die Verarbeitung Verantwortlichen wenden.
|
||||
|
||||
|
||||
### 9. Rechtsgrundlage der Verarbeitung {#9-dot-rechtsgrundlage-der-verarbeitung}
|
||||
|
||||
Art. 6 I lit. a DS-GVO dient unserem Unternehmen als Rechtsgrundlage für Verarbeitungsvorgänge, bei denen wir eine Einwilligung für einen bestimmten Verarbeitungszweck einholen. Ist die Verarbeitung personenbezogener Daten zur Erfüllung eines Vertrags, dessen Vertragspartei die betroffene Person ist, erforderlich, wie dies beispielsweise bei Verarbeitungsvorgängen der Fall ist, die für eine Lieferung von Waren oder die Erbringung einer sonstigen Leistung oder Gegenleistung notwendig sind, so beruht die Verarbeitung auf Art. 6 I lit. b DS-GVO. Gleiches gilt für solche Verarbeitungsvorgänge die zur Durchführung vorvertraglicher Maßnahmen erforderlich sind, etwa in Fällen von Anfragen zur unseren Produkten oder Leistungen. Unterliegt unser Unternehmen einer rechtlichen Verpflichtung durch welche eine Verarbeitung von personenbezogenen Daten erforderlich wird, wie beispielsweise zur Erfüllung steuerlicher Pflichten, so basiert die Verarbeitung auf Art. 6 I lit. c DS-GVO. In seltenen Fällen könnte die Verarbeitung von personenbezogenen Daten erforderlich werden, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen. Dies wäre beispielsweise der Fall, wenn ein Besucher in unserem Betrieb verletzt werden würde und daraufhin sein Name, sein Alter, seine Krankenkassendaten oder sonstige lebenswichtige Informationen an einen Arzt, ein Krankenhaus oder sonstige Dritte weitergegeben werden müssten. Dann würde die Verarbeitung auf Art. 6 I lit. d DS-GVO beruhen. Letztlich könnten Verarbeitungsvorgänge auf Art. 6 I lit. f DS-GVO beruhen. Auf dieser Rechtsgrundlage basieren Verarbeitungsvorgänge, die von keiner der vorgenannten Rechtsgrundlagen erfasst werden, wenn die Verarbeitung zur Wahrung eines berechtigten Interesses unseres Unternehmens oder eines Dritten erforderlich ist, sofern die Interessen, Grundrechte und Grundfreiheiten des Betroffenen nicht überwiegen. Solche Verarbeitungsvorgänge sind uns insbesondere deshalb gestattet, weil sie durch den Europäischen Gesetzgeber besonders erwähnt wurden. Er vertrat insoweit die Auffassung, dass ein berechtigtes Interesse anzunehmen sein könnte, wenn die betroffene Person ein Kunde des Verantwortlichen ist (Erwägungsgrund 47 Satz 2 DS-GVO).
|
||||
|
||||
|
||||
### 10. Berechtigte Interessen an der Verarbeitung, die von dem Verantwortlichen oder einem Dritten verfolgt werden {#10-dot-berechtigte-interessen-an-der-verarbeitung-die-von-dem-verantwortlichen-oder-einem-dritten-verfolgt-werden}
|
||||
|
||||
Basiert die Verarbeitung personenbezogener Daten auf Artikel 6 I lit. f DS-GVO ist unser berechtigtes Interesse die Durchführung unserer Geschäftstätigkeit zugunsten des Wohlergehens all unserer Mitarbeiter und unserer Anteilseigner.
|
||||
|
||||
|
||||
### 11. Dauer, für die die personenbezogenen Daten gespeichert werden {#11-dot-dauer-für-die-die-personenbezogenen-daten-gespeichert-werden}
|
||||
|
||||
Das Kriterium für die Dauer der Speicherung von personenbezogenen Daten ist die jeweilige gesetzliche Aufbewahrungsfrist. Nach Ablauf der Frist werden die entsprechenden Daten routinemäßig gelöscht, sofern sie nicht mehr zur Vertragserfüllung oder Vertragsanbahnung erforderlich sind.
|
||||
|
||||
|
||||
### 12. Gesetzliche oder vertragliche Vorschriften zur Bereitstellung der personenbezogenen Daten; Erforderlichkeit für den Vertragsabschluss; Verpflichtung der betroffenen Person, die personenbezogenen Daten bereitzustellen; mögliche Folgen der Nichtbereitstellung {#12-dot-gesetzliche-oder-vertragliche-vorschriften-zur-bereitstellung-der-personenbezogenen-daten-erforderlichkeit-für-den-vertragsabschluss-verpflichtung-der-betroffenen-person-die-personenbezogenen-daten-bereitzustellen-mögliche-folgen-der-nichtbereitstellung}
|
||||
|
||||
Wir klären Sie darüber auf, dass die Bereitstellung personenbezogener Daten zum Teil gesetzlich vorgeschrieben ist (z.B. Steuervorschriften) oder sich auch aus vertraglichen Regelungen (z.B. Angaben zum Vertragspartner) ergeben kann. Mitunter kann es zu einem Vertragsschluss erforderlich sein, dass eine betroffene Person uns personenbezogene Daten zur Verfügung stellt, die in der Folge durch uns verarbeitet werden müssen. Die betroffene Person ist beispielsweise verpflichtet uns personenbezogene Daten bereitzustellen, wenn unser Unternehmen mit ihr einen Vertrag abschließt. Eine Nichtbereitstellung der personenbezogenen Daten hätte zur Folge, dass der Vertrag mit dem Betroffenen nicht geschlossen werden könnte. Vor einer Bereitstellung personenbezogener Daten durch den Betroffenen muss sich der Betroffene an einen unserer Mitarbeiter wenden. Unser Mitarbeiter klärt den Betroffenen einzelfallbezogen darüber auf, ob die Bereitstellung der personenbezogenen Daten gesetzlich oder vertraglich vorgeschrieben oder für den Vertragsabschluss erforderlich ist, ob eine Verpflichtung besteht, die personenbezogenen Daten bereitzustellen, und welche Folgen die Nichtbereitstellung der personenbezogenen Daten hätte.
|
||||
|
||||
|
||||
### 13. Bestehen einer automatisierten Entscheidungsfindung {#13-dot-bestehen-einer-automatisierten-entscheidungsfindung}
|
||||
|
||||
Als verantwortungsbewusstes Unternehmen verzichten wir auf eine automatische Entscheidungsfindung oder ein Profiling.
|
||||
|
||||
Diese Datenschutzerklärung wurde durch den Datenschutzerklärungs-Generator der DGD Deutsche Gesellschaft für Datenschutz GmbH, die als Externer Datenschutzbeauftragter Köln tätig ist, in Kooperation mit dem Kölner Anwalt für Datenschutzrecht Christian Solmecke erstellt.
|
273
content/legal.en.md
Normal file
273
content/legal.en.md
Normal file
@ -0,0 +1,273 @@
|
||||
+++
|
||||
title = "Legal Notice & Privacy Policy"
|
||||
date = 2000-01-01
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Welcome to the my Legal Notice page. Here, you'll find all the necessary legal information about my company and our privacy policy. I know legal details can be cumbersome, but it's essential to get these particulars squared away so we can focus on what we both love - technology!
|
||||
|
||||
|
||||
## Legal Notice {#legal-notice}
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Germany
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
|
||||
## Privacy Policy {#privacy-policy}
|
||||
|
||||
Privacy Policy
|
||||
We are very delighted that you have shown interest in our enterprise. Data protection is of a particularly high priority for the management of Sascha König. The use of the Internet pages of Sascha König is possible without any indication of personal data; however, if a data subject wants to use special enterprise services via our website, processing of personal data could become necessary. If the processing of personal data is necessary and there is no statutory basis for such processing, we generally obtain consent from the data subject.
|
||||
|
||||
The processing of personal data, such as the name, address, e-mail address, or telephone number of a data subject shall always be in line with the General Data Protection Regulation (GDPR), and in accordance with the country-specific data protection regulations applicable to Sascha König. By means of this data protection declaration, our enterprise would like to inform the general public of the nature, scope, and purpose of the personal data we collect, use and process. Furthermore, data subjects are informed, by means of this data protection declaration, of the rights to which they are entitled.
|
||||
|
||||
As the controller, Sascha König has implemented numerous technical and organizational measures to ensure the most complete protection of personal data processed through this website. However, Internet-based data transmissions may in principle have security gaps, so absolute protection may not be guaranteed. For this reason, every data subject is free to transfer personal data to us via alternative means, e.g. by telephone.
|
||||
|
||||
|
||||
### 1. Definitions {#1-dot-definitions}
|
||||
|
||||
The data protection declaration of Sascha König is based on the terms used by the European legislator for the adoption of the General Data Protection Regulation (GDPR). Our data protection declaration should be legible and understandable for the general public, as well as our customers and business partners. To ensure this, we would like to first explain the terminology used.
|
||||
|
||||
In this data protection declaration, we use, inter alia, the following terms:
|
||||
|
||||
|
||||
#### a) Personal data {#a-personal-data}
|
||||
|
||||
Personal data means any information relating to an identified or identifiable natural person (“data subject”). An identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person.
|
||||
|
||||
|
||||
#### b) Data subject {#b-data-subject}
|
||||
|
||||
Data subject is any identified or identifiable natural person, whose personal data is processed by the controller responsible for the processing.
|
||||
|
||||
|
||||
#### c) Processing {#c-processing}
|
||||
|
||||
Processing is any operation or set of operations which is performed on personal data or on sets of personal data, whether or not by automated means, such as collection, recording, organisation, structuring, storage, adaptation or alteration, retrieval, consultation, use, disclosure by transmission, dissemination or otherwise making available, alignment or combination, restriction, erasure or destruction.
|
||||
|
||||
|
||||
#### d) Restriction of processing {#d-restriction-of-processing}
|
||||
|
||||
Restriction of processing is the marking of stored personal data with the aim of limiting their processing in the future.
|
||||
|
||||
|
||||
#### e) Profiling {#e-profiling}
|
||||
|
||||
Profiling means any form of automated processing of personal data consisting of the use of personal data to evaluate certain personal aspects relating to a natural person, in particular to analyse or predict aspects concerning that natural person's performance at work, economic situation, health, personal preferences, interests, reliability, behaviour, location or movements.
|
||||
|
||||
|
||||
#### f)Pseudonymisation {#fpseudonymisation}
|
||||
|
||||
Pseudonymisation is the processing of personal data in such a manner that the personal data can no longer be attributed to a specific data subject without the use of additional information, provided that such additional information is kept separately and is subject to technical and organisational measures to ensure that the personal data are not attributed to an identified or identifiable natural person.
|
||||
|
||||
|
||||
#### g) Controller or controller responsible for the processing {#g-controller-or-controller-responsible-for-the-processing}
|
||||
|
||||
Controller or controller responsible for the processing is the natural or legal person, public authority, agency or other body which, alone or jointly with others, determines the purposes and means of the processing of personal data; where the purposes and means of such processing are determined by Union or Member State law, the controller or the specific criteria for its nomination may be provided for by Union or Member State law.
|
||||
|
||||
|
||||
#### h) Processor {#h-processor}
|
||||
|
||||
Processor is a natural or legal person, public authority, agency or other body which processes personal data on behalf of the controller.
|
||||
|
||||
|
||||
#### i) Recipient {#i-recipient}
|
||||
|
||||
Recipient is a natural or legal person, public authority, agency or another body, to which the personal data are disclosed, whether a third party or not. However, public authorities which may receive personal data in the framework of a particular inquiry in accordance with Union or Member State law shall not be regarded as recipients; the processing of those data by those public authorities shall be in compliance with the applicable data protection rules according to the purposes of the processing.
|
||||
|
||||
|
||||
#### j) Third party {#j-third-party}
|
||||
|
||||
Third party is a natural or legal person, public authority, agency or body other than the data subject, controller, processor and persons who, under the direct authority of the controller or processor, are authorised to process personal data.
|
||||
|
||||
|
||||
#### k) Consent {#k-consent}
|
||||
|
||||
Consent of the data subject is any freely given, specific, informed and unambiguous indication of the data subject's wishes by which he or she, by a statement or by a clear affirmative action, signifies agreement to the processing of personal data relating to him or her.
|
||||
|
||||
|
||||
### 2. Name and Address of the controller {#2-dot-name-and-address-of-the-controller}
|
||||
|
||||
Controller for the purposes of the General Data Protection Regulation (GDPR), other data protection laws applicable in Member states of the European Union and other provisions related to data protection is:
|
||||
|
||||
Sascha König
|
||||
|
||||
Bahnhofstrasse 4
|
||||
|
||||
09514 Lengefeld
|
||||
|
||||
Deutschland
|
||||
|
||||
Email: ping@m3tam3re.com
|
||||
|
||||
Website: www.m3tam3re.com
|
||||
|
||||
|
||||
### 3. Collection of general data and information {#3-dot-collection-of-general-data-and-information}
|
||||
|
||||
The website of Sascha König collects a series of general data and information when a data subject or automated system calls up the website. This general data and information are stored in the server log files. Collected may be (1) the browser types and versions used, (2) the operating system used by the accessing system, (3) the website from which an accessing system reaches our website (so-called referrers), (4) the sub-websites, (5) the date and time of access to the Internet site, (6) an Internet protocol address (IP address), (7) the Internet service provider of the accessing system, and (8) any other similar data and information that may be used in the event of attacks on our information technology systems.
|
||||
|
||||
When using these general data and information, Sascha König does not draw any conclusions about the data subject. Rather, this information is needed to (1) deliver the content of our website correctly, (2) optimize the content of our website as well as its advertisement, (3) ensure the long-term viability of our information technology systems and website technology, and (4) provide law enforcement authorities with the information necessary for criminal prosecution in case of a cyber-attack. Therefore, Sascha König analyzes anonymously collected data and information statistically, with the aim of increasing the data protection and data security of our enterprise, and to ensure an optimal level of protection for the personal data we process. The anonymous data of the server log files are stored separately from all personal data provided by a data subject.
|
||||
|
||||
|
||||
### 4. Subscription to our newsletters {#4-dot-subscription-to-our-newsletters}
|
||||
|
||||
On the website of Sascha König, users are given the opportunity to subscribe to our enterprise's newsletter. The input mask used for this purpose determines what personal data are transmitted, as well as when the newsletter is ordered from the controller.
|
||||
|
||||
The Sascha König informs its customers and business partners regularly by means of a newsletter about enterprise offers. The enterprise's newsletter may only be received by the data subject if (1) the data subject has a valid e-mail address and (2) the data subject registers for the newsletter shipping. A confirmation e-mail will be sent to the e-mail address registered by a data subject for the first time for newsletter shipping, for legal reasons, in the double opt-in procedure. This confirmation e-mail is used to prove whether the owner of the e-mail address as the data subject is authorized to receive the newsletter.
|
||||
|
||||
During the registration for the newsletter, we also store the IP address of the computer system assigned by the Internet service provider (ISP) and used by the data subject at the time of the registration, as well as the date and time of the registration. The collection of this data is necessary in order to understand the (possible) misuse of the e-mail address of a data subject at a later date, and it therefore serves the aim of the legal protection of the controller.
|
||||
|
||||
The personal data collected as part of a registration for the newsletter will only be used to send our newsletter. In addition, subscribers to the newsletter may be informed by e-mail, as long as this is necessary for the operation of the newsletter service or a registration in question, as this could be the case in the event of modifications to the newsletter offer, or in the event of a change in technical circumstances. There will be no transfer of personal data collected by the newsletter service to third parties. The subscription to our newsletter may be terminated by the data subject at any time. The consent to the storage of personal data, which the data subject has given for shipping the newsletter, may be revoked at any time. For the purpose of revocation of consent, a corresponding link is found in each newsletter. It is also possible to unsubscribe from the newsletter at any time directly on the website of the controller, or to communicate this to the controller in a different way.
|
||||
|
||||
|
||||
### 5. Newsletter-Tracking {#5-dot-newsletter-tracking}
|
||||
|
||||
The newsletter of Sascha König contains so-called tracking pixels. A tracking pixel is a miniature graphic embedded in such e-mails, which are sent in HTML format to enable log file recording and analysis. This allows a statistical analysis of the success or failure of online marketing campaigns. Based on the embedded tracking pixel, Sascha König may see if and when an e-mail was opened by a data subject, and which links in the e-mail were called up by data subjects.
|
||||
|
||||
Such personal data collected in the tracking pixels contained in the newsletters are stored and analyzed by the controller in order to optimize the shipping of the newsletter, as well as to adapt the content of future newsletters even better to the interests of the data subject. These personal data will not be passed on to third parties. Data subjects are at any time entitled to revoke the respective separate declaration of consent issued by means of the double-opt-in procedure. After a revocation, these personal data will be deleted by the controller. The Sascha König automatically regards a withdrawal from the receipt of the newsletter as a revocation.
|
||||
|
||||
|
||||
### 6. Comments function in the blog on the website {#6-dot-comments-function-in-the-blog-on-the-website}
|
||||
|
||||
The Sascha König offers users the possibility to leave individual comments on individual blog contributions on a blog, which is on the website of the controller. A blog is a web-based, publicly-accessible portal, through which one or more people called bloggers or web-bloggers may post articles or write down thoughts in so-called blogposts. Blogposts may usually be commented by third parties.
|
||||
|
||||
If a data subject leaves a comment on the blog published on this website, the comments made by the data subject are also stored and published, as well as information on the date of the commentary and on the user's (pseudonym) chosen by the data subject. In addition, the IP address assigned by the Internet service provider (ISP) to the data subject is also logged. This storage of the IP address takes place for security reasons, and in case the data subject violates the rights of third parties, or posts illegal content through a given comment. The storage of these personal data is, therefore, in the own interest of the data controller, so that he can exculpate in the event of an infringement. This collected personal data will not be passed to third parties, unless such a transfer is required by law or serves the aim of the defense of the data controller.
|
||||
|
||||
|
||||
### 7. Routine erasure and blocking of personal data {#7-dot-routine-erasure-and-blocking-of-personal-data}
|
||||
|
||||
The data controller shall process and store the personal data of the data subject only for the period necessary to achieve the purpose of storage, or as far as this is granted by the European legislator or other legislators in laws or regulations to which the controller is subject to.
|
||||
|
||||
If the storage purpose is not applicable, or if a storage period prescribed by the European legislator or another competent legislator expires, the personal data are routinely blocked or erased in accordance with legal requirements.
|
||||
|
||||
|
||||
### 8. Rights of the data subject {#8-dot-rights-of-the-data-subject}
|
||||
|
||||
|
||||
#### a) Right of confirmation {#a-right-of-confirmation}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller the confirmation as to whether or not personal data concerning him or her are being processed. If a data subject wishes to avail himself of this right of confirmation, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
|
||||
#### b) Right of access {#b-right-of-access}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller free information about his or her personal data stored at any time and a copy of this information. Furthermore, the European directives and regulations grant the data subject access to the following information:
|
||||
|
||||
the purposes of the processing;
|
||||
the categories of personal data concerned;
|
||||
the recipients or categories of recipients to whom the personal data have been or will be disclosed, in particular recipients in third countries or international organisations;
|
||||
where possible, the envisaged period for which the personal data will be stored, or, if not possible, the criteria used to determine that period;
|
||||
the existence of the right to request from the controller rectification or erasure of personal data, or restriction of processing of personal data concerning the data subject, or to object to such processing;
|
||||
the existence of the right to lodge a complaint with a supervisory authority;
|
||||
where the personal data are not collected from the data subject, any available information as to their source;
|
||||
the existence of automated decision-making, including profiling, referred to in Article 22(1) and (4) of the GDPR and, at least in those cases, meaningful information about the logic involved, as well as the significance and envisaged consequences of such processing for the data subject.
|
||||
Furthermore, the data subject shall have a right to obtain information as to whether personal data are transferred to a third country or to an international organisation. Where this is the case, the data subject shall have the right to be informed of the appropriate safeguards relating to the transfer.
|
||||
|
||||
If a data subject wishes to avail himself of this right of access, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
|
||||
#### c) Right to rectification {#c-right-to-rectification}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller without undue delay the rectification of inaccurate personal data concerning him or her. Taking into account the purposes of the processing, the data subject shall have the right to have incomplete personal data completed, including by means of providing a supplementary statement.
|
||||
|
||||
If a data subject wishes to exercise this right to rectification, he or she may, at any time, contact any employee of the controller.
|
||||
|
||||
|
||||
#### d) Right to erasure (Right to be forgotten) {#d-right-to-erasure--right-to-be-forgotten}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller the erasure of personal data concerning him or her without undue delay, and the controller shall have the obligation to erase personal data without undue delay where one of the following grounds applies, as long as the processing is not necessary:
|
||||
|
||||
The personal data are no longer necessary in relation to the purposes for which they were collected or otherwise processed.
|
||||
The data subject withdraws consent to which the processing is based according to point (a) of Article 6(1) of the GDPR, or point (a) of Article 9(2) of the GDPR, and where there is no other legal ground for the processing.
|
||||
The data subject objects to the processing pursuant to Article 21(1) of the GDPR and there are no overriding legitimate grounds for the processing, or the data subject objects to the processing pursuant to Article 21(2) of the GDPR.
|
||||
The personal data have been unlawfully processed.
|
||||
The personal data must be erased for compliance with a legal obligation in Union or Member State law to which the controller is subject.
|
||||
The personal data have been collected in relation to the offer of information society services referred to in Article 8(1) of the GDPR.
|
||||
If one of the aforementioned reasons applies, and a data subject wishes to request the erasure of personal data stored by Sascha König, he or she may, at any time, contact any employee of the controller. An employee of Sascha König shall promptly ensure that the erasure request is complied with immediately.
|
||||
|
||||
Where the controller has made personal data public and is obliged pursuant to Article 17(1) to erase the personal data, the controller, taking account of available technology and the cost of implementation, shall take reasonable steps, including technical measures, to inform other controllers processing the personal data that the data subject has requested erasure by such controllers of any links to, or copy or replication of, those personal data, as far as processing is not required. An employees of Sascha König will arrange the necessary measures in individual cases.
|
||||
|
||||
|
||||
#### e) Right of restriction of processing {#e-right-of-restriction-of-processing}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to obtain from the controller restriction of processing where one of the following applies:
|
||||
|
||||
The accuracy of the personal data is contested by the data subject, for a period enabling the controller to verify the accuracy of the personal data.
|
||||
The processing is unlawful and the data subject opposes the erasure of the personal data and requests instead the restriction of their use instead.
|
||||
The controller no longer needs the personal data for the purposes of the processing, but they are required by the data subject for the establishment, exercise or defence of legal claims.
|
||||
The data subject has objected to processing pursuant to Article 21(1) of the GDPR pending the verification whether the legitimate grounds of the controller override those of the data subject.
|
||||
If one of the aforementioned conditions is met, and a data subject wishes to request the restriction of the processing of personal data stored by Sascha König, he or she may at any time contact any employee of the controller. The employee of Sascha König will arrange the restriction of the processing.
|
||||
|
||||
|
||||
#### f) Right to data portability {#f-right-to-data-portability}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator, to receive the personal data concerning him or her, which was provided to a controller, in a structured, commonly used and machine-readable format. He or she shall have the right to transmit those data to another controller without hindrance from the controller to which the personal data have been provided, as long as the processing is based on consent pursuant to point (a) of Article 6(1) of the GDPR or point (a) of Article 9(2) of the GDPR, or on a contract pursuant to point (b) of Article 6(1) of the GDPR, and the processing is carried out by automated means, as long as the processing is not necessary for the performance of a task carried out in the public interest or in the exercise of official authority vested in the controller.
|
||||
|
||||
Furthermore, in exercising his or her right to data portability pursuant to Article 20(1) of the GDPR, the data subject shall have the right to have personal data transmitted directly from one controller to another, where technically feasible and when doing so does not adversely affect the rights and freedoms of others.
|
||||
|
||||
In order to assert the right to data portability, the data subject may at any time contact any employee of Sascha König.
|
||||
|
||||
|
||||
#### g) Right to object {#g-right-to-object}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to object, on grounds relating to his or her particular situation, at any time, to processing of personal data concerning him or her, which is based on point (e) or (f) of Article 6(1) of the GDPR. This also applies to profiling based on these provisions.
|
||||
|
||||
The Sascha König shall no longer process the personal data in the event of the objection, unless we can demonstrate compelling legitimate grounds for the processing which override the interests, rights and freedoms of the data subject, or for the establishment, exercise or defence of legal claims.
|
||||
|
||||
If Sascha König processes personal data for direct marketing purposes, the data subject shall have the right to object at any time to processing of personal data concerning him or her for such marketing. This applies to profiling to the extent that it is related to such direct marketing. If the data subject objects to Sascha König to the processing for direct marketing purposes, Sascha König will no longer process the personal data for these purposes.
|
||||
|
||||
In addition, the data subject has the right, on grounds relating to his or her particular situation, to object to processing of personal data concerning him or her by Sascha König for scientific or historical research purposes, or for statistical purposes pursuant to Article 89(1) of the GDPR, unless the processing is necessary for the performance of a task carried out for reasons of public interest.
|
||||
|
||||
In order to exercise the right to object, the data subject may contact any employee of Sascha König. In addition, the data subject is free in the context of the use of information society services, and notwithstanding Directive 2002/58/EC, to use his or her right to object by automated means using technical specifications.
|
||||
|
||||
|
||||
#### h) Automated individual decision-making, including profiling {#h-automated-individual-decision-making-including-profiling}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator not to be subject to a decision based solely on automated processing, including profiling, which produces legal effects concerning him or her, or similarly significantly affects him or her, as long as the decision (1) is not is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) is not authorised by Union or Member State law to which the controller is subject and which also lays down suitable measures to safeguard the data subject's rights and freedoms and legitimate interests, or (3) is not based on the data subject's explicit consent.
|
||||
|
||||
If the decision (1) is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) it is based on the data subject's explicit consent, Sascha König shall implement suitable measures to safeguard the data subject's rights and freedoms and legitimate interests, at least the right to obtain human intervention on the part of the controller, to express his or her point of view and contest the decision.
|
||||
|
||||
If the data subject wishes to exercise the rights concerning automated individual decision-making, he or she may, at any time, contact any employee of Sascha König.
|
||||
|
||||
|
||||
#### i) Right to withdraw data protection consent {#i-right-to-withdraw-data-protection-consent}
|
||||
|
||||
Each data subject shall have the right granted by the European legislator to withdraw his or her consent to processing of his or her personal data at any time.
|
||||
|
||||
If the data subject wishes to exercise the right to withdraw the consent, he or she may, at any time, contact any employee of Sascha König.
|
||||
|
||||
|
||||
### 9. Legal basis for the processing {#9-dot-legal-basis-for-the-processing}
|
||||
|
||||
Art. 6(1) lit. a GDPR serves as the legal basis for processing operations for which we obtain consent for a specific processing purpose. If the processing of personal data is necessary for the performance of a contract to which the data subject is party, as is the case, for example, when processing operations are necessary for the supply of goods or to provide any other service, the processing is based on Article 6(1) lit. b GDPR. The same applies to such processing operations which are necessary for carrying out pre-contractual measures, for example in the case of inquiries concerning our products or services. Is our company subject to a legal obligation by which processing of personal data is required, such as for the fulfillment of tax obligations, the processing is based on Art. 6(1) lit. c GDPR. In rare cases, the processing of personal data may be necessary to protect the vital interests of the data subject or of another natural person. This would be the case, for example, if a visitor were injured in our company and his name, age, health insurance data or other vital information would have to be passed on to a doctor, hospital or other third party. Then the processing would be based on Art. 6(1) lit. d GDPR. Finally, processing operations could be based on Article 6(1) lit. f GDPR. This legal basis is used for processing operations which are not covered by any of the abovementioned legal grounds, if processing is necessary for the purposes of the legitimate interests pursued by our company or by a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the data subject which require protection of personal data. Such processing operations are particularly permissible because they have been specifically mentioned by the European legislator. He considered that a legitimate interest could be assumed if the data subject is a client of the controller (Recital 47 Sentence 2 GDPR).
|
||||
|
||||
|
||||
### 10. The legitimate interests pursued by the controller or by a third party {#10-dot-the-legitimate-interests-pursued-by-the-controller-or-by-a-third-party}
|
||||
|
||||
Where the processing of personal data is based on Article 6(1) lit. f GDPR our legitimate interest is to carry out our business in favor of the well-being of all our employees and the shareholders.
|
||||
|
||||
|
||||
### 11. Period for which the personal data will be stored {#11-dot-period-for-which-the-personal-data-will-be-stored}
|
||||
|
||||
The criteria used to determine the period of storage of personal data is the respective statutory retention period. After expiration of that period, the corresponding data is routinely deleted, as long as it is no longer necessary for the fulfillment of the contract or the initiation of a contract.
|
||||
|
||||
|
||||
### 12. Provision of personal data as statutory or contractual requirement; Requirement necessary to enter into a contract; Obligation of the data subject to provide the personal data; possible consequences of failure to provide such data {#12-dot-provision-of-personal-data-as-statutory-or-contractual-requirement-requirement-necessary-to-enter-into-a-contract-obligation-of-the-data-subject-to-provide-the-personal-data-possible-consequences-of-failure-to-provide-such-data}
|
||||
|
||||
We clarify that the provision of personal data is partly required by law (e.g. tax regulations) or can also result from contractual provisions (e.g. information on the contractual partner). Sometimes it may be necessary to conclude a contract that the data subject provides us with personal data, which must subsequently be processed by us. The data subject is, for example, obliged to provide us with personal data when our company signs a contract with him or her. The non-provision of the personal data would have the consequence that the contract with the data subject could not be concluded. Before personal data is provided by the data subject, the data subject must contact any employee. The employee clarifies to the data subject whether the provision of the personal data is required by law or contract or is necessary for the conclusion of the contract, whether there is an obligation to provide the personal data and the consequences of non-provision of the personal data.
|
||||
|
||||
|
||||
### 13. Existence of automated decision-making {#13-dot-existence-of-automated-decision-making}
|
||||
|
||||
As a responsible company, we do not use automatic decision-making or profiling.
|
||||
|
||||
Developed by the specialists for LegalTech at Willing & Able that also developed the system for data protection training. The legal texts contained in our privacy policy generator have been provided and published by Prof. Dr. h.c. Heiko Jonny Maniero from the German Association for Data Protection and Christian Solmecke from WBS law.
|
375
content/posts/#v1-docker-n8n-setup.de.md#
Normal file
375
content/posts/#v1-docker-n8n-setup.de.md#
Normal file
@ -0,0 +1,375 @@
|
||||
---
|
||||
title: "#1: Docker, Portainer und n8n installieren"
|
||||
date: 2022-03-28
|
||||
draft: false
|
||||
series: ["YouTube", "n8n"]
|
||||
categories: ["Tutorials"]
|
||||
tags: ["docker", "n8n", "caddy", "portainer", "installation", "tutorial"]
|
||||
---
|
||||
|
||||
Ich will mich jetzt nicht allzu lange mit einer Einführung aufhalten. Ich denke es gibt viele gute Videos zu den Themen, die ich hier besprechen werde. Ich möchte Euch hier gar nicht zeigen, wie man Tools wie Docker oder ähnliches benutzt. Viel mehr zeige ich hier ein paar konkrete Lösungsansätze, die ich so oder in abgewandelter Form auch tatsächlich in unserer Firma einsetze.
|
||||
|
||||
Für einen großen Teil der hier gezeigten Videos wird ein Setup aus **Docker, Caddy, Portainer und n8n** notwendig sein. Ich werde mich hier was die Installation und Konfiguration auf das wesentliche beschränken. Ich denke es gibt mehr als genug Tutorials und Videos zu jedem dieser Themen 😉
|
||||
|
||||
## Subdomains & DNS einrichten
|
||||
|
||||
Da ich später Portainer und n8n über separate Subdomains aufrufen möchte und es manchmal ein wenig dauert bis Änderungen an Domains angewendet sind mache ich die Einstellung der Subdomains zuerst. Ich zeige das hier am Beispiel von GoDaddy, weil ich hier meine Domains registriert habe.
|
||||
|
||||
### DNS Einträge erstellen
|
||||
|
||||
Ihr müsst in der Verwaltung Eurer Domain in de DNS Einstellungen gehen. Im Fall von GoDaddy nach dem Login einfach oben rechts auf Euren Namen klicken und dann **Meine Produkte** wählen. Anschließend könnt Ihr Eure Domain verwalten:
|
||||
|
||||

|
||||
|
||||
Jetzt entweder auf das Menü bei der Domain Karte klicken oder unten auf DNS.
|
||||
|
||||
Die DNS Einstellung ist denkbar einfach. Ihr müsst hier einen _A-Record_ und lediglich das Prefix für die Subdomain und die IP-Adresse Eures Servers angeben. Den TTL Wert könnt Ihr so einstellen, wie es für Euch Sinn macht, ich nehme hier immer 600 Sekunden.
|
||||
|
||||

|
||||
|
||||
#vata=# Installation von Docker
|
||||
|
||||
```bash
|
||||
# Unter Arch Linux, Manjaro etc:
|
||||
sudo pacman -S docker docker-compose
|
||||
|
||||
# Unter Debian, Ubuntu etc:
|
||||
sudo apt-get update && apt-get install docker docker-compose
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo groupadd docker # Optional: bei den meisten Distributionen wird die Gruppe bei der Installation angelegt
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
|
||||
### Berechtigungen und Ordner erstellen
|
||||
|
||||
Ich mache es gerne so, dass ich meinen Hauptbenutzer der _docker_ Gruppe hinzufüge, dadurch muss ich beim ausführen von Docker-Befehlen nicht immer das Admin-Kennwort eingeben.
|
||||
Je nachdem welche Shell Ihr einsetzt ist der Befehl ein klein wenig anders. Wenn Ihr nicht wisst welche Shell Ihr nutzt wird das mit Sicherheit _Bash_ sein:
|
||||
|
||||
**Bash**
|
||||
|
||||
```sh
|
||||
sudo usermod -a -G docker "$(whoami)"
|
||||
```
|
||||
|
||||
Oder **Fish**
|
||||
|
||||
```sh
|
||||
sudo usermod -a -G docker (whoami)
|
||||
```
|
||||
|
||||
Jetzt den Ordner erstellen wo Docker Konfigurationen etc. abgelegt werden sollen. Ich habe mich hier für den Ordner _/opt/docker-services_ entschieden.
|
||||
|
||||
```sh
|
||||
sudo mkdir -m 775 /opt/docker-services
|
||||
```
|
||||
|
||||
Und nun die Berechtigungen einstellen:
|
||||
|
||||
**Bash**
|
||||
|
||||
```sh
|
||||
sudo chown $(whoami):docker /opt/docker-services
|
||||
```
|
||||
|
||||
**Fish**
|
||||
|
||||
```sh
|
||||
sudo chown (whoami):docker /opt/docker-services
|
||||
```
|
||||
|
||||
## Repository für Caddy, Portainer und n8 klonen und anpassen
|
||||
|
||||
Um die Installation einfacher zu machen habe ich ein Repository vorbereitet wodurch eigentlich nur noch ein paar Werte angepasst werden müssen und wir dann direkt loslegen können:
|
||||
|
||||
```sh
|
||||
git clone git@git.sr.ht:~m3tam3re/yt1-docker-caddy-portainer-n8n /opt/docker-services
|
||||
```
|
||||
|
||||
Hier eventuell den letzten Teil durch den Ordner ersetzen in dem Du die Daten für Deine Docker Services ablegen möchtest. Das ganze sollte dann von der Struktur her so aussehen:
|
||||
|
||||
```sh
|
||||
/opt/docker-services:
|
||||
├── LICENSE
|
||||
├── n8n
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── DockerFile
|
||||
│ └── README.md
|
||||
├── portainer-caddy
|
||||
│ ├── Caddyfile
|
||||
│ └── docker-compose.yml
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Installation von Caddy und Portainer
|
||||
|
||||
Caddy und Portainer sind die Basis für unser Setup. Dabei nutzen wir Caddy als Reverse-Proxy,der dafür zuständig Anfragen an jeweils entsprechenden Docker Container weiterzuleiten. Alternativ könnte man hier auch Traefik oder NGINX einsetzen, aber Caddy ist hier im Vergleich wesentlich einfacher zu konfigurieren.
|
||||
|
||||
Portainer ist ein Webinterface, dass die Verwaltung von Docker Containern sehr einfach macht. Portainer ist im Grunde optional und eine gute Alternative für alle, die ungern mit dem Terminal arbeiten.
|
||||
|
||||
### Caddy installieren
|
||||
|
||||
Die Caddy Installation ist relativ einfach. Da mein Server Arch Linux als Betriebssystem hat wird Caddy über pacman installiert:
|
||||
|
||||
```sh
|
||||
sudo pacman -Syu caddy
|
||||
```
|
||||
|
||||
In Ubuntu oder anderen Debian basierten Distributionen ist die Installation ein klein wenig umständlicher:
|
||||
|
||||
```sh
|
||||
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
|
||||
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
|
||||
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
|
||||
sudo apt update
|
||||
|
||||
sudo apt install caddy
|
||||
```
|
||||
|
||||
Eigentlich wird Caddy nach der Installation automatisch gestartet, falls nicht einfach nochmal:
|
||||
|
||||
```
|
||||
caddy start
|
||||
```
|
||||
|
||||
Sollte Caddy schon laufen kommt hier ein Fehler. Den könnt Ihr einfach ignorieren.
|
||||
|
||||
### Caddy und Portainer einrichten
|
||||
|
||||
Ich hatte ja ganz oben unter der Überschrift [Subdomains & DNS einrichten](#subdomains--dns-einrichten) darüber gesprochen, dass ich Portainer und n8n über separate Subdomains aufrufen möchte. Damit das funktioniert müssen wir Caddy als Reverse-Proxy konfigurieren. Dazu bearbeiten wir das Caddyfile. In meinem Setup habe ich die Domain _ca.m3tam3re.com_ für Portainer eingeplant und _io.m3tam3re.com_ für n8n. Das Caddyfile sieht dann so aus:
|
||||
|
||||
```json
|
||||
ca.m3tam3re.com {
|
||||
reverse_proxy localhost:9000
|
||||
}
|
||||
io.m3tam3re.com {
|
||||
reverse_proxy localhost:5678
|
||||
}
|
||||
```
|
||||
|
||||
Wie man sieht ist die Caddy Konfiguration denkbar einfach. Hier solltet Ihr natürlich Eure eigenen Domains verwenden 😄
|
||||
|
||||
### Conatiner Stack starten
|
||||
|
||||
Jetzt können wir die Container erstellen und starten. Dazu erstmal das Verzechnis wechseln wo sich die Datei _docker-compose.yml_ aus dem Repository befindet:
|
||||
|
||||
```sh
|
||||
cd /opt/docker-services/portainer-caddy
|
||||
```
|
||||
|
||||
Da ich in der _docker-compose.yml_ ein externes Netzwerk angelegt habe muss das Netzwerk _web_ noch angelegt werden:
|
||||
|
||||
```sh
|
||||
docker network create web
|
||||
```
|
||||
|
||||
Jetzt den Container Stack starten:
|
||||
|
||||
```sh
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
Wenn Ihr jetzt **docker ps** eingebt sollte das ungefähr so aussehen:
|
||||
|
||||
```sh
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
f4b9f9302962 portainer/portainer-ce:latest "/portainer -H unix:…" 4 minutes ago Up 4 minutes 8000/tcp, 9443/tcp, 127.0.0.1:9000->9000/tcp portainer-caddy-portainer-1
|
||||
```
|
||||
|
||||
### Caddy Konfiguration für den Container Stack laden
|
||||
|
||||
Das _Caddyfile_, dass wir zuvor angepasst haben kann jetzt von caddy geladen werden:
|
||||
|
||||
```sh
|
||||
caddy reload
|
||||
```
|
||||
|
||||
### Eventuell Caddy Berechtigungen einstellen
|
||||
|
||||
Je nachdem wie das Betriebssystem konfiguriert ist kann es sein, dass Caddy erst die Berechtigung braucht um die Ports 80 und 443 an sich zu binden. Wenn Ihr **caddy reload** im Terminal ausführt wird Caddy das als Fehler ausgeben.
|
||||
|
||||
```sh
|
||||
tcp :443: bind: permission denied
|
||||
```
|
||||
|
||||
Die Berechtigung setzt Ihr wie folgt:
|
||||
|
||||
**Bash**
|
||||
|
||||
```sh
|
||||
sudo setcap CAP_NET_BIND_SERVICE=+eip $(which caddy)
|
||||
```
|
||||
|
||||
**Fish**
|
||||
|
||||
```sh
|
||||
sudo setcap CAP_NET_BIND_SERVICE=+eip (which caddy)
|
||||
```
|
||||
|
||||
Also nochmal:
|
||||
|
||||
```sh
|
||||
caddy reload
|
||||
```
|
||||
|
||||
Das schöne an Caddy ist übrigens, dass ich in verschiedenen Ordnern _Caddyfiles_ mit unterschiedlichen Einstellungen haben kann und per _caddy reload_ einfach laden kann ohne Neustart des Serverdienstes.
|
||||
|
||||
## Grundeinrichtung von Portainer
|
||||
|
||||
Da jetzt alles laufen sollte 🚀 könnt Ihr jetzt Portainer im Browser ausfrufen. In meinem Fall ist das _ca.m3tam3re.com_.
|
||||
|
||||
Ihr solltet jetzt Eure Administrator Daten für Portainer setzen können:
|
||||

|
||||
|
||||
Wenn Ihr Euer Admin-Konto eingerichtet habt werden Ihr auch direkt angemeldet und wir sind jetzt startklar für 🚀 n8n 🚀.
|
||||
|
||||

|
||||
|
||||
## Installation von n8n
|
||||
|
||||
Jetzt wo das grundsätzliche Setup fertig ist können wir endlich unseren ersten Container starten. Ich zeige hier zwei Möglichkeiten, welche Ihr davon nehmt ist Euch überlassen.
|
||||
|
||||
### 1. Mit docker-compose über das Terminal
|
||||
|
||||
Auch wenn wir gerade Portainer installiert haben, habe ich das Repository so vorbereitet, dass das ganze auch ohne Portainer einfach einzurichten ist. Also los geht's:
|
||||
|
||||
#### Umgebungsvariablen anpassen
|
||||
|
||||
Zuerst müssen wir in den Ordner **n8n** unseres Repositories wechseln:
|
||||
|
||||
```sh
|
||||
cd ../n8n
|
||||
```
|
||||
|
||||
Das Verzeichnis sollte so aussehen.
|
||||
|
||||
```sh
|
||||
/opt/docker-services/n8n
|
||||
├── docker-compose.yml
|
||||
├── DockerFile
|
||||
└── .env
|
||||
```
|
||||
|
||||
Öffnet die Datei **.env** und passt die Werte entsprechend an. Bei mir sieht das z.B. so aus:
|
||||
|
||||
```sh
|
||||
# TLD - Deine Hauptdomain auf der n8n laufen wird
|
||||
DOMAIN_NAME=m3tam3re.com
|
||||
|
||||
# Die Subdomain für n8n
|
||||
SUBDOMAIN=io
|
||||
|
||||
# DOMAIN_NAME und SUBDOMAIN bestimmen in Kombination wie n8n erreichbar sein wird
|
||||
# im oben stehende Beispiel wäre das: https://n8n.deine-domain-hier.com
|
||||
|
||||
# Der Benutzername für die Anmeldung - BITTE ÄNDERN!
|
||||
N8N_BASIC_AUTH_USER=admin
|
||||
|
||||
# Das Kennwort für die Anmeldung - BITTE ÄNDERN!
|
||||
N8N_BASIC_AUTH_PASSWORD=gehtDichNixAn0815
|
||||
|
||||
# Hier kannst Du die Zeitzone setzen, das ist z.B. für CRON Aufgaben wichtig
|
||||
# Wenn nicht gesetzt wird New York gesetzt
|
||||
GENERIC_TIMEZONE=Europe/Berlin
|
||||
|
||||
# Erlaubt das Importieren und Nutzen von internen Modulen in Funktions-Nodes
|
||||
NODE_FUNCTION_ALLOW_BUILTIN=*
|
||||
|
||||
# Erlaubt das Importieren und Nutzen von externen Modulen in Funktions-Nodes
|
||||
NODE_FUNCTION_ALLOW_EXTERNAL=*
|
||||
```
|
||||
|
||||
Da n8n in dieser Konstellation Probleme mit den Berechtigungen bei regulären Docker Volumes bekommt müssen wir noch einen Ordner für die permanente Speicherung der Daten von n8n anlegen:
|
||||
|
||||
```sh
|
||||
mkdir n8n-data
|
||||
```
|
||||
|
||||
**Bash:**
|
||||
|
||||
```sh
|
||||
chown $(whoami):docker n8n-data
|
||||
```
|
||||
|
||||
**Fish:**
|
||||
|
||||
```sh
|
||||
chown (whoami):docker n8n-data
|
||||
```
|
||||
|
||||
Das war es auch schon. Jetzt können wir den Stack starten:
|
||||
|
||||
```sh
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 2. n8n über Portainer einrichten
|
||||
|
||||
#### Ordner für die permanente Speicherung von Daten anlegen
|
||||
|
||||
Zuerst müssen wir auch bei dieser Variante in den Ordner **n8n** unseres Repositories wechseln:
|
||||
|
||||
```sh
|
||||
cd ../n8n
|
||||
```
|
||||
|
||||
```sh
|
||||
mkdir n8n-data
|
||||
```
|
||||
|
||||
**Bash:**
|
||||
|
||||
```sh
|
||||
chown $(whoami):docker n8n-data
|
||||
```
|
||||
|
||||
**Fish:**
|
||||
|
||||
```sh
|
||||
chown (whoami):docker n8n-data
|
||||
```
|
||||
|
||||
#### Den n8n Stack in Portainer erstellen
|
||||
|
||||

|
||||
|
||||
Wenn Ihr auf **Add stack** geklickt habt bekommt Ihr das Konfigurationsfenster für den Stack angezeigt:
|
||||

|
||||
|
||||
Hier gibt es eigentlich nur ein paar Dinge einzustellen:
|
||||
|
||||
1. Den Namen für den Stack festlegen
|
||||
2. Den Inhalt der Datei **n8n/docker-compose.yml** in den Webeditor kopieren oder die Datei über den **Upload** Tab hochladen
|
||||
3. Die Datei **n8n/.env** hochladen
|
||||
|
||||

|
||||
|
||||
Ihr braucht die Datei _.env_ nicht vorher anpassen. Portainer erlaubt Euch hier zuvor die Werte anzupassen.
|
||||
Jetzt mit einem Klick auf **Deploy the stack** den Stack starten.
|
||||
|
||||
### n8n einrichten
|
||||
|
||||
Endlich geschafft 🚀 😄. Ich muss zugeben, dass mir auch so langsam die Puste ausgeht. Das alles einmal aufzuschreiben dauert doch sehr viel länger als ich dachte 🤣.
|
||||
|
||||
Jetzt könnt Ihr die Domain für n8n aufrufen. In meinem Beispiel ist das **io.m3tam3re.com** und den admin Account einrichten:
|
||||
|
||||

|
||||
|
||||
Jetzt könnt Ihr Euch anmelden und landet auf der Seite für die Workflowerstellung. Wer möchte kann hier einfach einmal in den Templates stöbern. n8n bietet jede Menge fertige Vorlagen für die Automatisierng von Aufgaben 😄
|
||||
|
||||

|
||||
|
||||
Das war's 🚀
|
||||
|
||||
## Abschluss
|
||||
|
||||
Noch ein paar abschließende Kommentare 😄:
|
||||
|
||||
1. In vielen Videos wird derzeit sehr oft die Kombination Docker und Traefik gezeigt und angepriesen. Traefik ist ein großartiges Programm und ich würde es bedenkenlos jedem empfehlen. Der Grund warum ich aber hier stattdessen Caddy verwende ist, dass Caddy sehr viel einfacher zu konfigurieren ist und auch viele Dinge einfacher macht. Z.B. werden über Caddy automatisch gültige SSL-Zertifikate für die Domains erstellt, was bei Traefik für jede Domain konfiguriert werde muss.
|
||||
Im Produktiveinsatz macht es natürlich Sinn Caddy als Service zu starten und die Konfiguration über die REST-Api von Caddy vorzunehmen. Für dieses und auch noch folgende Beispiele ist die hier gezeigte Einstellung aber vollkommen ausreichend 😄
|
||||
|
||||
2. Ich setze ganz bewusst das Image n8n-debian ein. Ich weiß, dass Alpine-basierte Container wesentlich kleiner sind, aber es kommt hier gerade nicht auf den Speicherplatz an. Mit dem Debian Image habe ich Zugriff auf eine riesige Datenbank von Binaries die ich im Handumdrehen installieren und nutzen kann. Würde ich den Alpine Container nehmen müsste ich wahrscheinlich so einiges aus dem Quellcode kompilieren, weil es sehr viel weniger Pakete gibt.
|
37
content/posts/100days.de.md
Normal file
37
content/posts/100days.de.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "Der Weg zurück in den Alltag"
|
||||
date: 2020-08-17
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
# Es geht wieder los
|
||||
|
||||
Nachdem ich letzte Woche Urlaub hatte, kommt es mir gerade unermesslich schwer vor wieder in meinen Arbeitsalltag zu finden.
|
||||
Eigentlich sollte ich jetzt hier sitzen und an dem Backend für einen GRPC Service für unsere Buchhaltung arbeiten. Ich habe auch
|
||||
brav meinen Code Editor geöffnet und wollte motiviert loslegen, aber finde nicht wirklich ran.
|
||||
|
||||
Mich dazu zu zwingen bringt mich gerade nicht wirklich weiter, also habe ich mich entschieden bei [#100DaysToOffload](https://100daystooffload.com) mitzumachen.
|
||||
Das hilft mir nicht beim Fertigstellen meines Projektes, aber bestimmt dabei regelmäßig etwas zu schreiben.
|
||||
|
||||
## Es waren doch nur 5 Tage
|
||||
|
||||
Eigentlich hatte ich mir für meinen Urlaub vorgenommen ein privates Coding Projekt voranzubringen. Leider kamen 2 Dinge dazwischen:
|
||||
|
||||
1. Meine Frau wollte renovieren ... na juhu
|
||||
2. In der Zeit wo ich nicht renoviert habe, habe ich mich in Dead by Daylight festgebissen
|
||||
|
||||
Normalerweise spiele ich zurzeit nur noch 1x die Woche. Stattdessen investiere ich durchaus einiges in andere Aktivitäten, wie lernen, Sport etc.
|
||||
Trotzdem glaube ich, dass die Ausnahme gut und notwendig war...und Spaß hat es ja auch gemacht 😎
|
||||
|
||||
## Ab morgen wieder anders
|
||||
|
||||
Ich hatte gestern Abend den festen Entschluss heute "so richtig loszulegen". Das hat anfänglich gut funktioniert. Ich bin um 4:45 Uhr aufgestanden und hatte ca. gegen 7:00 Uhr alles abgearbeitet was sich im Urlaub angesammelt hat.
|
||||
Was dann passiert ist, habe ich ja schon geschrieben 😅
|
||||
|
||||
Für morgen sieht der Plan dann wieder anders aus:
|
||||
* konzentriert für mindestens 4 Stunden an meinem Projekt coden
|
||||
+ idealerweise gleich den zweiten Post für #100DaysToOffload schreiben
|
||||
* wir werden sehen ...
|
||||
|
||||
Dieser Beitrag ist **Teil 1** von 100 Days To Offload. Wenn Du mitmachen willst besuche https://100daystooffload.com
|
36
content/posts/100days.en.md
Normal file
36
content/posts/100days.en.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
title: "Back to business"
|
||||
date: 2020-08-17
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
# Let's get started
|
||||
|
||||
After taking vacation last week, it is just now immeasurably difficult to find my way back into my daily work.
|
||||
Actually, I should be sitting here now and working on the backend for a GRPC service for our accounting. I opened my code editor and wanted to get started with motivation, but couldn't really find into the code.
|
||||
|
||||
Forcing myself to do it doesn't really help me right now, so I decided to take part in [# 100DaysToOffload] (https://100daystooffload.com).
|
||||
It doesn't help me finish my project, but it certainly helps me to write something regularly.
|
||||
|
||||
## Only 5 days of vacation
|
||||
|
||||
Actually, I had planned to advance a private coding project for my vacation. Unfortunately, 2 things came up:
|
||||
|
||||
1. My wife wanted to renovate ... oh yeah
|
||||
2. During the time I wasn't renovating, I got sucked into Dead by Daylight
|
||||
|
||||
Usually I play videogames only once or twice a week at the moment. Instead, I invest quite a bit in other activities, such as learning, sports, etc.
|
||||
Nevertheless, I believe that the exception was good and necessary ... and it was fun too 😎
|
||||
|
||||
## Try again from tomorrow
|
||||
|
||||
Yesterday evening I made the decision to "really get started" today. That worked well initially. I got up at 4:45 a.m. and around 7:00 a.m. worked through everything that had accumulated on vacation.
|
||||
I've already written what happened then 😅
|
||||
|
||||
For tomorrow the plan looks different again:
|
||||
* Coding my project for at least 4 hours
|
||||
+ ideally write the second post for # 100DaysToOffload right away
|
||||
* we will see ...
|
||||
|
||||
This post is **part 1** of 100 Days To Offload. If you want to participate, visit https://100daystooffload.com
|
20
content/posts/21-01-04.de.md
Normal file
20
content/posts/21-01-04.de.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
title: "Optimierung meiner Wochenplanung"
|
||||
date: 2021-04-01
|
||||
draft: true
|
||||
tags: ["blabla","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe kürzlich ja schon eine [Änderung meiner Wochenplanung](https://www.m3tam3re.com/2021/21-28-03/) vorgenommen. Die Wochenplanung mit Omnifocus ist auf jeden Fall eine große Hilfe, aber so richtig zufrieden bin ich damit noch nicht.
|
||||
|
||||
Ich nehme mir zwar sonntags ca. eine Stunde Zeit und gehe alle Aufgaben durch, die ich in der kommenden Woche erledigen möchte, aber das ganze ist noch ein wenig zu locker.
|
||||
|
||||
### Was fehlt der Wochenplanung noch?
|
||||
|
||||
- detaillierte Planung der Aufgaben mit Vorausplanung was ich an welchem Tag erledigen möchte
|
||||
- Vorausplanung Sport, d.h. mit Details zu den Workouts, die ich in der kommenden Woche machen möchte
|
||||
- konkrete Planung an welchem Tag ich was in meinem Programmierprojekt erreichen will
|
||||
|
||||
Ich muss mir glaube ich noch einmal die Regeln für die Wochenplanung festlegen.
|
||||
|
||||
|
20
content/posts/21-01-04.en.md
Normal file
20
content/posts/21-01-04.en.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
title: "Optimizing my weekly schedule"
|
||||
date: 2021-04-01
|
||||
draft: true
|
||||
tags: ["blabla","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
I recently made a [change to my weekly schedule](https://www.m3tam3re.com/2021/21-28-03/). The weekly planning with Omnifocus is definitely a great help, but I'm not really satisfied with it yet.
|
||||
|
||||
I take about an hour on Sundays and go through all the tasks that I want to do in the coming week, but the whole thing is still a little too loose.
|
||||
|
||||
### What is still missing from the weekly planning?
|
||||
|
||||
- detailed planning of the tasks with advance planning of what I want to do on which day
|
||||
- plan sports in advance, i.e. with details of the workouts I want to do in the coming week
|
||||
- concrete planning on which day I want to achieve what in my programming project
|
||||
|
||||
I think I have to define the rules for weekly planning again.
|
||||
|
||||
|
26
content/posts/21-02-04.de.md
Normal file
26
content/posts/21-02-04.de.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Vielleicht doch lieber englisch?"
|
||||
date: 2021-04-02
|
||||
draft: true
|
||||
tags: ["blabla"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Ich überlege gerade, ob ich mir die Übersetzung ins englische erspare und stattdessen nur noch auf englisch schreibe. Das würde nicht nur Zeit sparen, sondern
|
||||
ich würde auch mehr dabei lernen. Jetzt ist es oft so, dass ich mich beeile, weil ich ja noch übersetzen muss.
|
||||
|
||||
Ich bin noch etwas hin- und hergerissen. Vielleicht hilft eine Liste?
|
||||
|
||||
## Deutsch & Englisch
|
||||
- **+** es ist eigentlich ganz nett, dass es auch deutschen Content im Internet gibt
|
||||
- **+** nicht jeder kann englisch
|
||||
- **-** mehr Arbeit
|
||||
- **-** eigentlich fühle ich mich in der englischen Sprache *wohler*
|
||||
|
||||
## Nur Englisch
|
||||
- **+** mein Englisch wird besser, wenn ich direkt in der Sprache denke und schreibe
|
||||
- **+** ich galube, dass Englisch besser für das Internet ist, da das Internet nunmal uns alle verbindet, egal wo wir herkommen
|
||||
- **-** viele Deutsche können nicht sehr gut Englisch
|
||||
|
||||
Okay, die Liste hilft mir so gar nicht. Ich merke gerade, dass ich jeden Punkt regelrecht aus meinem Kopf saugen muss. Ich denke ich werde da mal etwas drüber nachdenken und mich dann entscheiden.
|
||||
|
||||
Dieser Beitrag ist **Teil 25** von 100 Days To Offload. Wenn Du mitmachen willst besuche https://100daystooffload.com
|
26
content/posts/21-02-04.en.md
Normal file
26
content/posts/21-02-04.en.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
title: "Maybe English as main language?"
|
||||
date: 2021-04-02
|
||||
draft: true
|
||||
tags: ["blabla"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
I am currently considering whether I should save myself the translation into English and instead only write in English. That would not only save time, but
|
||||
I would also learn more from it. At the moment I often feel like I am in a hurry, because I still have to translate.
|
||||
|
||||
I'm still a little torn. Maybe a list will help?
|
||||
|
||||
## German + English
|
||||
- **+** it is actually quite nice that there is also German content on the Internet
|
||||
- **+** not everyone can speak English
|
||||
- **-** more work
|
||||
- **-** actually I feel *more comfortable* in the English language
|
||||
|
||||
## Only English
|
||||
- **+** my English gets better when I think and write directly in the language
|
||||
- **+** I think English is better for the internet because the internet connects us all, no matter where we come from
|
||||
- **-** many Germans don't speak English very well
|
||||
|
||||
Okay, the list doesn't help me at all. I am just realizing that I have to suck every point out of my head. I'll think about it a bit and then make a decision.
|
||||
|
||||
This post is **Part 25** of 100 Days To Offload. If you want to participate, visit https://100daystooffload.com
|
15
content/posts/21-03-04.de.md
Normal file
15
content/posts/21-03-04.de.md
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "Manchmal ist manuell doch besser"
|
||||
date: 2021-04-03
|
||||
draft: true
|
||||
tags: ["blabla","programmierung"]
|
||||
series: [""]
|
||||
---
|
||||
Ich hatte vor ein paar Tagen einem Problem mit einerr oAuth 2 Authentifizierung mit einer API geschrieben. Ich habe mich gestern noch einmal da rangesetzt, weil der Status "Es funktioniert nicht" vollkommen inakzeptabel ist.
|
||||
|
||||
Dieses Mal habe ich keine externe oAuth Library genommen sondern das Ganze Hand umgesetzt. Ich habe mich gefragt warum man überhaupt eine Library für oAuth
|
||||
braucht, weil der Authentifizierungsvorgang eigentlich super einfach ist. Auch der Coder, den ich geschrieben habe ist nur unwesentlich länger.
|
||||
|
||||
Ich freue mich schon darauf, wenn ich in dem kleinen Projekt jetzt endlich weiterkomme.
|
||||
|
||||
|
15
content/posts/21-03-04.en.md
Normal file
15
content/posts/21-03-04.en.md
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "Sometimes manual is till better"
|
||||
date: 2021-04-03
|
||||
draft: true
|
||||
tags: ["blabla","coding"]
|
||||
series: [""]
|
||||
---
|
||||
A few days ago I wrote about a problem with an oAuth 2 authentication with an API. I sat down again yesterday because the "It doesn't work" status is completely unacceptable.
|
||||
|
||||
This time I did not use an external oAuth library but implemented the whole thing by hand. I was wondering why there should be a library for oAuth
|
||||
because the authentication process is actually super easy. The code that I wrote is only slightly longer than the code with using the library.
|
||||
|
||||
I am already looking forward to when I can finally make progress on this small project.
|
||||
|
||||
|
21
content/posts/21-04-04.de.md
Normal file
21
content/posts/21-04-04.de.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: "2 Wochen tägliches Schreiben"
|
||||
date: 2021-04-04
|
||||
draft: true
|
||||
tags: ["blabla"]
|
||||
series: [""]
|
||||
---
|
||||
Ich schreibe jetzt seit ca. 2 Wochen täglich. Dabei gibt es verschiedene Ansätze, die ich zur Zeit beide verfolge:
|
||||
|
||||
1. Ich führe ein Tagebuch in dem ich über den Vortag reflektiere und kurz das beschreibe was mir durch den Kopf geht
|
||||
2. Ich schreibe Beiträge für meinen Blog.
|
||||
|
||||
Ich bemerke mittlerweile ein paar Veränderungen. Das Schreiben hilft mir dabei Klarheit zu schaffen. Meine Gedanken sind weniger chaotisch und das ist wirklich sehr angenehm. Das interessante dabei ist, dass der einfache Akt des Schreibens schon reicht. Wahrscheinlich ist das wirklich schon der Trick an der Sache. Dadurch, dass man seine Gedanken in Worte fasst muss man sich intensiever damit befassen und lässt sich weniger treiben und hinterfragt für sich selbst auch mehr.
|
||||
|
||||
Worüber ich mir noch nicht ganz sicher bin ist der Blog. Der Grund warum ich ich hier täglisch schreibe ist, weil ich mir angewöhnen möchte Content zu produzieren statt zu konsumieren. Der erste Grundstein dafür ist bereits gelegt, immerhin habe ich schon 14 Tage am Stück jeden Tag zumindest etwas kleines veröffnetlicht.
|
||||
|
||||
Im nächsten Schritt möchte ich mit noch mehr Planung an den Blog gehen, d.h. ich möchte bereits in meiner Wochenplanung 1-2 große Themen, die mich beschäftigen festlegen und darüber dann ausführlicher schreiben.
|
||||
|
||||
Von den Inhalten her soll es um Dinge geben, über die ich gerade nachdenke und vor allen Dingen um meine eigene Position zu dem Thema. Also nicht einfach nur eine neutrale Besprechung Themen, sonden Position beziehen.
|
||||
|
||||
|
21
content/posts/21-04-04.en.md
Normal file
21
content/posts/21-04-04.en.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: "2 weeks of daily writing"
|
||||
date: 2021-04-04
|
||||
draft: true
|
||||
tags: ["blabla"]
|
||||
series: [""]
|
||||
---
|
||||
I've been writing every day for about 2 weeks now. There are different approaches that I am currently both pursuing:
|
||||
|
||||
1. I keep a diary in which I reflect on the previous day and briefly describe what goes through my head
|
||||
2. I write posts for my blog.
|
||||
|
||||
I'm noticing a few changes now. Writing helps me to create clarity. My thoughts are less chaotic and that is really very pleasant. The interesting thing is that the simple act of writing is enough. That's probably really the trick. Because you put your thoughts into words, you have to deal with them more intensely and let yourself be drifted less and question more for yourself.
|
||||
|
||||
What I'm not quite sure about yet is the blog. The reason why I write here every day is because I want to get into the habit of producing content instead of consuming it. The first cornerstone for this has already been laid, after all, I've been opening at least something small every day for 14 days in a row.
|
||||
|
||||
In the next step, I would like to go to the blog with even more planning, i.e. I would like to define 1-2 major topics that concern me in my weekly planning and then write about them in more detail.
|
||||
|
||||
In terms of content, it should be about things that I'm currently thinking about and, above all, about my own position on the topic. So not just a neutral discussion of topics, but take a position.
|
||||
|
||||
|
19
content/posts/21-05-04.de.md
Normal file
19
content/posts/21-05-04.de.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "Ziele & Reflektion"
|
||||
date: 2021-04-05
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe in der letzten Woche das Buch [Stop living on Autopilot Antonio Neves](https://theantonioneves.com/stop-living-on-autopilot-book/) gelesen. Ein wirklich tolles Buch. Es ist jetzt nicht so, dass es neue Erkenntnisse enthält. Der Autor verfolgt aber ein paar interessante Ansätze:
|
||||
|
||||
Die für mich wichtigste Erkenntnis war die Idee regelmäßig die letzten 30 Tage zu reflektieren, d.h. wenn man sich jetzt zum Beispiel vorgenommen hat im Job bessere Leistungen zu bringen sollte man sich fragen ob die Firma einen erneut einstellen würde, wenn man die Leistung der letzten 30 Tage betrachtet.
|
||||
Der Autor vertritt die Ansicht, dass wenn man sich nicht zu sehr auf das konzentrieren sollte was man in 3 oder 5 Jahren erreichen will. Stattdessen sollte man eher schauen, dass man sich auf die nächsten 30 Tage konzentriert und durch Reflektion der letzten 30 Tage realistisch seinen Fortschritt bewertet.
|
||||
|
||||
Vieles in dem Buch dreht sich darum zu lernen die Dinge zu sehen wie sie wirklich sind und daraus zu lernen.
|
||||
|
||||
Ich glaube mittlerweile, dasss eine realistische Reflektion und Auswertung Fortschritten mindestens genauso wichtig bei der Erreichung Zielen ist, wie die Ziele selbst.
|
||||
|
||||
Man liest viel darüber, dass man sich große Ziele setzen soll oder sich voll und ganz auf den Prozess konzentrieren soll. Ich glaube mittlerweile, dass der Weg ganz klar in der Mitte liegt und das aber auch für jeden anders.
|
||||
|
||||
|
19
content/posts/21-05-04.en.md
Normal file
19
content/posts/21-05-04.en.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "Goals & Reflection"
|
||||
date: 2021-04-05
|
||||
draft: true
|
||||
tags: ["blabla","life","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
Last week I read the book [Stop living on Autopilot by Antonio Neves](https://theantonioneves.com/stop-living-on-autopilot-book/). A really great book. It is not like it contains very new knowledge. However, the author takes a few interesting approaches:
|
||||
|
||||
The most important finding for me was the idea to regularly reflect on the last 30 days, i.e. if you have now decided to perform better in your job, you should ask yourself whether the company would hire you again based on your performance for the last 30 days.
|
||||
The author believes that you shouldn't focus too much on what you want to achieve in 3 or 5 years. Instead, you should make sure that you concentrate on the next 30 days and realistically evaluate your progress through the 30 days of reflection.
|
||||
|
||||
Much of the book revolves around learning to see things for what they really are and learning from them.
|
||||
|
||||
I believe that realistic reflection and evaluation of progress is at least as important in achieving goals as the goals themselves.
|
||||
|
||||
You read a lot about the fact that you should set big goals or concentrate fully on the process. I now believe that the path is clearly in the middle and that it is different for everyone.
|
||||
|
||||
|
25
content/posts/21-06-04.de.md
Normal file
25
content/posts/21-06-04.de.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "Der Urlaub wird verschoben"
|
||||
date: 2021-04-06
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Eigentlich haben wir für diese Woche Urlaub eingeplant. In Zeiten der Pandemie bedeutet das, dass man seinen Urlaub zu Hause verbringt, da reisen ja zur Zeit
|
||||
nicht möglich ist, zumindest bei vielen Menschen. Bei uns macht das keinen Unterschied. Wir haben durch unsere vielen Tieren eine Situation, die das reisen, und
|
||||
wenn es nur über's Wochenende ist, schwierig macht. Das ist aber auch gar nicht schlimm 😊.
|
||||
|
||||
Wir hatten gestern darüber geredet, dass wir den Urlaub in die nächste Woche verlegen, da in dieser Woche noch Buchhaltung und Einarbeitung einer virtuellen
|
||||
Assistentin anstehen. Ich habe mich allerdings dazu entschieden, den Urlaub erst dann zu nehmen, wenn ich ihn mir verdient habe.
|
||||
|
||||
Das Problem ist, dass ich mit dem Steuerberater noch ein paar Konten abstimmen muss um den Jahresabschluss fertig zu machen. Dadurch, dass wir aber zuvor einen
|
||||
6-wöchigen Projektblock gemacht haben ist da noch nicht viel passiert. Nach unserem Urlaub würde dann der nächste Projektblock starten und auch wenn ich bei dem
|
||||
kommenden Projekt eher eine beratende Funktion habe entsteht in den ersten 2 Wochen doch einiges an Arbeit bis man auf der Spur ist. Das bedeutet, dass sich
|
||||
dadurch die Zuarbeiten für den Steuerberater um weitere 2-3 Wochen nach hinten schieben würden.
|
||||
|
||||
Eigentlich ist Buchhaltung nicht wirklich mein Ding, aber ich freue mich darauf das Thema nächste Woche, statt, Urlaub anzugehen. Wenn ich ansonsten nur die
|
||||
allernötigsten Aufgaben mache und nur diese eine Aufgabe habe wird das wahrscheinlich sehr viel Spaß machen und ich werde gut damit vorankommen.
|
||||
|
||||
Den Urlaub werde ich wahrscheinlich aufteilen und stattdessen ein paar verlängerte Wochenenden machen.
|
||||
|
||||
|
24
content/posts/21-06-04.en.md
Normal file
24
content/posts/21-06-04.en.md
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
title: "Vacation moved"
|
||||
date: 2021-04-06
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Actually, we have planned vacation for this week. In times of the pandemic, this means that you spend your vacation at home, since traveling is currently
|
||||
not possible, at least for many people. It doesn't make any difference to us. We have a situation through our many animals that travel and
|
||||
even weekend trips are a bit difficult. But that's not bad at all 😊.
|
||||
|
||||
We had talked yesterday about moving the vacation to the next week, since this week there are still bookkeeping and training of a virtual
|
||||
Assistant standing in line. However, I've decided not to take the vacation until I've earne it.
|
||||
|
||||
The problem is that I still have to coordinate a few accounts with the tax adviser to get the financial statements ready. But because we did a 6-week project
|
||||
cycle beforehand not much has happened yet. After our vacation, the next project block would start, and although I have more of an advisory role in this project
|
||||
there is still a lot of work for the first 2 weeks to get everything on track. As a result
|
||||
the preparatory work for the tax adviser would be postponed by another 2-3 weeks.
|
||||
|
||||
Actually, bookkeeping isn't really my thing, but I'm looking forward to tackling the topic next week instead of vacation. Otherwise if I only have that one task on my list for the coming week it will will probably be a lot of fun and I'll get on well with it.
|
||||
|
||||
I'll probably split the vacation up and do a couple of extended weekends instead.
|
||||
|
||||
|
23
content/posts/21-07-04.de.md
Normal file
23
content/posts/21-07-04.de.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
title: "Irgendwas stört mich an der Schreiberei noch"
|
||||
date: 2021-04-07
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Ich bin gerade dabei zu überdenken, wie ich das Thema *schreiben und reflektieren* besser umsetze. Derzeit bin ich ja schon dabei mir hier eine Routine zu schaffen und das funktioniert ja auch schon einmal seit mehr als 14 Tagen.
|
||||
Leider muss ich aber auch sagen, dass mir hier ein wenig der Tiefgang fehlt. Es kommt mir oft so vor, dass ich das mehr abarbeite als mich mit den wirklich interessanten Themen zu beschäftigen. Um es mal ganz klar zu sagen: viel zu viel blabla.
|
||||
|
||||
Ich merke halt gerade, dass das alles zwar ganz nett ist und dass ich einhalte was ich mir vorgenommen habe, aber es ist relativ oberflächlich. Der Unterschied zwischen dem was ich schreibe und dem was mir so durch den Kopf geht ist relativ groß und das ist eigentlich schade.
|
||||
|
||||
Im Grunde ist das aber eher ein Zeitproblem. Derzeit habe ich was das schreiben angeht 3 Baustellen:
|
||||
|
||||
- meine tägliche Reflektion
|
||||
- den kurzen Blogpost für meinen Blog
|
||||
- die Übersetzung des Blogpost
|
||||
|
||||
An manchen Tagen führt das zu einem regelrechten *durchrauschen*, weil von vorneherein klar ist, dass die Zeit knapp ist.
|
||||
|
||||
Ich habe mir jetzt noch keinen konkreten Plan gemacht, wie ich das anders machen könnte. Ein erster Ansatz ist, dass ich vielleicht nur noch 2 oder 3x die Woche etwas für meinen Blog schreibe, aber dafür wählerischer und ausführlicher bin in den Themen.
|
||||
|
||||
Dieser Beitrag ist **Teil 30** von 100 Days To Offload. Wenn Du mitmachen willst besuche https://100daystooffload.com
|
23
content/posts/21-07-04.en.md
Normal file
23
content/posts/21-07-04.en.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
title: "Something is not feeling right yet"
|
||||
date: 2021-04-07
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
I am rethinking how to better implement *writing and reflecting*. At the moment I am already in the process of creating a routine here and it has been working for more than 14 days.
|
||||
Unfortunately, I also have to say that I am a little lacking in depth here. It often seems to me that I work through this more than dealing with the really interesting topics. To be very clear: way too much blabla.
|
||||
|
||||
I'm just realizing that all of this is *okay* as far as I keep what I've set out to do, but it's relatively superficial. The difference between what I write and what goes through my head is relatively big and that's actually a shame.
|
||||
|
||||
Basically, that's more of a time problem. Currently I have 3 construction sites as far as writing is concerned:
|
||||
|
||||
- my daily reflection
|
||||
- the short Blog post for my Blog
|
||||
- the translation of the Blog post
|
||||
|
||||
On some days this leads to a real *rushing through*, because it is clear from the start that time is short.
|
||||
|
||||
I haven't made a concrete plan yet how I could do it differently. A first approach is that I may only write something for my Blog 2 or 3 times a week, but I am more selective and detailed about the topics.
|
||||
|
||||
This post is **Part 30** of 100 Days To Offload. If you want to participate, visit https://100daystooffload.com
|
16
content/posts/21-08-04.de.md
Normal file
16
content/posts/21-08-04.de.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "25 Schritte mehr"
|
||||
date: 2021-04-08
|
||||
draft: true
|
||||
tags: ["blabla","life","training"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Ich habe vor ein paar Wochen damit angefangen mein Lauftraining zu ändern. Zuerst habe ich einen Versuch mit der Länge der Strecke gestartet. Statt der üblichen 6 km bin ich einfach mal 8 km gelaufen.
|
||||
|
||||
Das lief erstaunlich gut. Ich kann sogar sagen, dass die Änderung der Streckenlänge eigentlich kaum einen Unterschied gemacht hat.
|
||||
|
||||
Seit ich die 8 km laufe habe ich mir vorgenommen jedes Mal etwas mehr zu laufen, d.h. ich laufe jedes Mal mindestens **25 Schritte mehr** als beim letzten Mal. Dadurch bin ich mittlerweile bei 8,15 km.
|
||||
|
||||
Ich habe jetzt nicht das Ziel einen Marathon oder so zu laufen, aber es ist trotzdem schön sich zu steigern. Auf diese Art und Weise stelle ich sicher, dass ich jedes Mal zumindest etwas Fortschritt mache.
|
||||
|
||||
Dieser Beitrag ist **Teil 31** von 100 Days To Offload. Wenn Du mitmachen willst besuche https://100daystooffload.com
|
16
content/posts/21-08-04.en.md
Normal file
16
content/posts/21-08-04.en.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "25 steps mehr"
|
||||
date: 2021-04-08
|
||||
draft: true
|
||||
tags: ["blabla","life","training"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
I started changing my running routine a few weeks ago. First I started a test with the length of the route. Instead of the usual 6 km, I just ran 8 km.
|
||||
|
||||
That went amazingly well. I can even say that the change in the length of the track actually made little difference.
|
||||
|
||||
Since I've been running the 8 km, I've decided to run a little more each time, i.e. I run at least **25 steps more** than last time. As a result, I am now at 8.15 km.
|
||||
|
||||
My goal is not to running a marathon or anything, but it's still nice to improve. This way I make sure that I make at least some progress every time.
|
||||
|
||||
This post is **Part 31** of 100 Days To Offload. If you want to participate, visit https://100daystooffload.com
|
16
content/posts/21-09-04.de.md
Normal file
16
content/posts/21-09-04.de.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Amtsblatt, Hühner und die Steinzeit"
|
||||
date: 2021-04-09
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Heute geht es um Hühner 🐓. Meine Frau hat gestern einen Außenhühnerstall improvisiert. Der Grund dafür liegt darin, dass es zur Zeit eine Stallpflicht aufgrund der Vogelgrippe gibt. Eigentlich hätte ja eine Pandemie gereicht, aber auch unsere Hühner müssen in Quarantäne.
|
||||
|
||||
Etwa fragwürdig ist, wie die Information mit der Stallpflicht zu uns gelangt ist. Man sollte meinen, dass aufgrund der Tatsache, dass unser Hühnerbestand beim Veterinäramt registriert ist, ein einfacher Informationsfluss möglich ist. Die Damen und Herren auf dem Amt haben unsere Anschrift, Telefonnummer und auch die E-Mail. Klingt ja alles erst einmal ganz einfach. Wir haben allerdings von der Stallpflicht per WhatsApp von einem *Hühnerfreund* erfahren. Dieser hatte die Info auch nur, weil er aufgrund eines Gerüchtes beim Veterinäramt angerufen hat.
|
||||
|
||||
Meine Frau hat als das Thema aufkam erst einmal eine Internet Recherche gemacht. Sie hat ganz genau eine Seite gefunden, die eine Info dazu für unseren Landkreis hatte. Das Veterinäramt selbst hat die offizielle Info dazu im Amtsblatt veröffentlicht. Hallo? Amtsblatt? Lebt ihr noch in der Steinzeit?
|
||||
|
||||
Es könnte doch wirklich einfach sein? Wenn man doch eh schon seinen Hühnerbestand anmelden muss, warum kann man nicht einfach jeden Hühnerhalter von der Stallpflicht per E-Mail Newsletter informieren? Einfacher geht es doch nun wirklich nicht mehr.
|
||||
|
||||
Dieser Beitrag ist **Teil 32** von 100 Days To Offload. Wenn Du mitmachen willst besuche https://100daystooffload.com
|
16
content/posts/21-09-04.en.md
Normal file
16
content/posts/21-09-04.en.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Official gazette, chickens and the Stonde Age"
|
||||
date: 2021-04-09
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Today it's about chickens 🐓. My wife improvised an outside chicken coop yesterday. The reason for this is that there is currently compulsory stable due to bird flu. A pandemic would have been enough, but our chickens also have to be quarantined.
|
||||
|
||||
It is somewhat questionable how the information about the compulsory stable got to us. One would think that due to the fact that our chicken herd is registered with the veterinary office, an easy flow of information is possible. The ladies and gentlemen in the office have our address, telephone number and email. It all sounds very simple at first. However, we heard about the compulsory stable via WhatsApp from a *chicken friend*. He only had the information because he called the veterinary office based on a rumor.
|
||||
|
||||
When the subject came up, my wife did some internet research. She found exactly one page that had information about it for our district. The veterinary office itself has published the official information in the official gazette. Hello? Official Gazette? Do you still live in the Stone Age?
|
||||
|
||||
If you have to register your chickens anyway, why can't you just inform every chicken owner with an email newsletter? It really doesn't get any easier than that.
|
||||
|
||||
This post is **Part 32** of 100 Days To Offload. If you want to participate, visit https://100daystooffload.com
|
16
content/posts/21-10-04.de.md
Normal file
16
content/posts/21-10-04.de.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Entscheidung"
|
||||
date: 2021-04-10
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
Ich werde die Art und Weise, wie ich schreibe etwas ändern. Ich denke ich habe jetzt für eine Weile erst einmal geübt, wie es ist täglich zu schreiben, zu reflektieren und
|
||||
meinen Gedanken Ausdruck zu verleihen. Ich habe dabei gemerkt, dass z.B. Täglich ein wenig für diesen Blog zu schreiben mich im Grunde davon abhält tiefer zu
|
||||
gehen.
|
||||
|
||||
Ich werde daher mal die Variante versuchen, dass ich nur noch 1-2 Mal die Woche hier schreibe und mich stattdessen mehr um meine Notizen und Gedanken kümmern.
|
||||
Die werden auch auch täglich hochgeladen.
|
||||
|
||||
Was ich dann auch nochmal testen werde ist mir 1-2 Themen im Rahmen meiner Wochenplanung zu überlegen mit denen ich mich konkret gedanklich befassen möchte.
|
||||
Also weniger vor mich hin plätschern, sondern etwas zielgerichteter sein.
|
16
content/posts/21-10-04.en.md
Normal file
16
content/posts/21-10-04.en.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Decision"
|
||||
date: 2021-04-10
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: ["#100DaysToOffload"]
|
||||
---
|
||||
I will change the way I write. I think I've practiced for a while now what it's like to write, reflect and write on a daily basis
|
||||
to express my thoughts. I noticed that, for example, writing a little daily for this blog basically prevents me from going deeper
|
||||
walk.
|
||||
|
||||
I will therefore try the variant that I only write here 1-2 times a week and instead concentrate more on my notes and thoughts.
|
||||
They are also uploaded daily.
|
||||
|
||||
What I will then test again is to consider 1-2 topics as part of my weekly planning that I would like to deal with specifically in thought.
|
||||
So less splashing around in front of me, but rather be a little more purposeful.
|
18
content/posts/21-17-03.de.md
Normal file
18
content/posts/21-17-03.de.md
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "Disziplinarstrafe"
|
||||
date: 2021-03-17
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
## Disziplin und Strafe
|
||||
|
||||
Ich habe vor einigen Wochen eine Art Disziplinarstrafe für mich selber eingeführt. Wann immer ich nicht in der Lage bin die Willenskraft aufzubringen mich an etwas zu halten, dass ich mir vorgenommen habe, wird für den kommenden Tag die Messlatte deutlich höher gelegt.
|
||||
Beispiel: Gestern war als Sportprogramm eine Stunde radfahren auf dem Plan. Da wir vormittags noch einen Termin beim Tierarzt für unseren Kakadu Dexter gemacht hatten war es absehbar, dass ich nachmittags in Zeitnot kommen werde. Trotzdem habe ich den Tierarzttermin ignoriert, was dazu führte, dass ich statt der geplanten 60 Minuten nur 45 Minuten Sport absolvieren konnte. Das bedeutete für heute ganz konkret, dass der 6K Lauf, der morgens anstand entweder schneller oder länger sein musste als üblicherweise. Das Endgergebnis war eine neue persönliche Bestleistung.
|
||||
|
||||
## Konsequenzen helfen einem bei der Sache zu bleiben
|
||||
|
||||
Ich habe die Erfahrung gemacht, dass man nicht immer in der Lage ist sich diszipliniert an alles zu hakten was man sich so vorgenommen hat. Manche Tage sind stressig, man hat sich schlechter organisiert als man dachte oder man hat einfach schlecht geschlafen und das ist auch okay, weil es eben menschlich ist. Ich fand es aber irgendwie nicht ausreichend sich selbst zu sagen "Ist schon, okay. Morgen wird es wieder besser". Auch wenn man das wahrschenlich schon 1000x zu sich oder jemand anderem gesagt hat finde ich, dass man sich auf diese Art und Weise schnell den Schwung nehmen kann, weil man so ein Szenario schafft in dem es einfach keine Konsequenz gibt.
|
||||
Dadurch das man sich für den kommenden Tag auferlegt noch mehr, dem was man sich vorgenommen hat, leisten überlegt man sich das eine oder andere Mal noch ob man es heute wirklich nicht durchziehen kann.
|
||||
|
||||
|
18
content/posts/21-17-03.en.md
Normal file
18
content/posts/21-17-03.en.md
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "Disciplinary punishment"
|
||||
date: 2021-03-17
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
## Disziplin und Strafe
|
||||
|
||||
I introduced some kind of disciplinary punishment for myself a few weeks ago. Whenever I am unable to sustain the willpower to hold onto something that I have set out to do, the bar is raised significantly for the day ahead.
|
||||
Example: Yesterday, an hour of cycling was on the plan as a sports program. Since we had made an appointment with the vet for our cocatoo Dexter in the morning, it was foreseeable that I would be short of time in the afternoon. Nevertheless, I ignored the vet appointment, which meant that I was only able to do 45 minutes of exercise instead of the planned 60 minutes. For today, that meant in concrete terms that the 6K run that was due in the morning had to be either faster or longer than usual. The end result was a new personal best.
|
||||
|
||||
## Consequences help you stick with it
|
||||
|
||||
In my experience, you are not always able to discipline yourself to hook up to everything that you have set out to do. Some days are stressful, you are less organized than you thought or you just slept badly and that's okay because it's human. But I found it somehow insufficient to say to myself "It's okay. Tomorrow it will be better". Even if you have probably said that 1000 times to yourself or someone else, I think that you can quickly get going in this way, because you create a scenario in which there is simply no consequence.
|
||||
By imposing even more of what you have set out to do for the next day, you think one time or the other whether you really can't go through with it today.
|
||||
|
||||
|
47
content/posts/21-17-04.de.md
Normal file
47
content/posts/21-17-04.de.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "Meine täglichen Notizen & Schreibroutine"
|
||||
date: 2021-04-17
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Ich stoße gerade auf ein paar Probleme mit meiner täglichen Schreibroutine. Das Problem ist nicht, dass ich mich nicht daran halte, sondern eher wie ich insgesamt dazu stehe. Das führt dazu, dass ich mich zwar damit beschäftige und mich daran gewöhne, aber ich trotzdem das Gefühl habe, dass ich nur um das Thema *herumtanze*. Daher möchte ich einmal versuchen das Thema genauer zu beleuchten und vor allen Dingen ein paar Grundregeln festzulegen.
|
||||
|
||||
## Meine Probleme beim Schreiben meiner täglichen Notizen
|
||||
|
||||
### Zeitfenster und Eile
|
||||
Ich habe mir hier ein Zeitfenster innerhalb meiner [Tagesroutine](https://publish.obsidian.md/m3tam3re/%E2%9C%85+-+NOTIZEN/Tagesroutine) zugewiesen. Innerhalb dieses Zeitfensters passieren mehrere Sachen, unter anderem auch eine kurze Meditation(wenn man das so nennen will). Ich habe oft das Gefühl, dass ich hier trotz der 2 Stunden durch hetze.
|
||||
|
||||
Bis vor kurzem hatte ich mir fest vorgenommen täglich wie eine Art Tagebuch zu schreiben und anschließend einen kurzen Blogpost in Deutsch und Englisch zu schreiben.
|
||||
|
||||
Ich glaube dieses Gefühl der Eile kam aus dem Wunsch alles fertig zu bekommen, was ich mir vorgenommen habe.
|
||||
|
||||
### Haken dran und fertig?
|
||||
Diese 2 Stunden früh am morgen, bevor ❤️ Kathleen wach ist oder mich irgendjemand oder irgendetwas einnehmen kann, sollten eigentlich etwas sein, dass ich genießen kann. Ich habe in dieser Zeit keine Verpflichtungen (außer denen, die ich mir selbst auferlege) und keine Ablenkungen. Es ist wahrscheinlich der einzige Zeitblock des Tages der wirklich nur mir gehört.
|
||||
|
||||
Das oben beschriebene Gefühl der Eile hat, glaube ich ernsthafte Konsequenzen, was das Ergebnis angeht. Daraus entsteht eher das Gefühl **fertig werden zu wollen** und das was ich mir vorgenommen habe abzuhaken und erledigt zu wissen.
|
||||
|
||||
### YouTube
|
||||
Ich genieße es eigentlich, morgens meinen ersten Kaffee zu trinken und mir auf YouTube ganz in Ruhe ein Video von etwas anzusehen, dass mich interessiert.
|
||||
|
||||
Leider führt das aber auch dazu, dass ich YouTube einfach nebenbei weiterlaufen lasse was zu 2 Problemen führt:
|
||||
|
||||
1. Ich werde beim Schreiben immer mal wieder von meinen Gedanken abgebracht
|
||||
2. Ich glaube, dass die Videos und deren Geräuschkulisse schon der erste Stress des Tages ist
|
||||
|
||||
## Was will ich eigentlich mit den 2 Stunden erreichen?
|
||||
Diese 2 Stunden des Schreibens jeden morgen habe ich aus verschiedenen Gründen in meine [Tagesroutine](Tagesroutine.md) aufgenommen:
|
||||
|
||||
1. Ich möchte sicherstellen, dass ich täglich etwas erschaffe, statt nur zu konsumieren.
|
||||
2. Ich möchte meine Gedanken und Gefühle aufzeichnen. Ich glaube man dreht sich nur um sich selbst, wenn alles nur im eigenen Kopf bleibt.
|
||||
3. Ich möchte durch das Schreiben und damit verbundene reflektieren Klarheit in meine Gedankenwelt bringen.
|
||||
4. Ich bin neugierig welche langfristigen Veränderungen das tägliche schreiben in mein Leben bringt.
|
||||
|
||||
Es dreht sich vieles darum, dass ich mir meiner Gedanken und Gefühle bewusst werde. Ich glaube auch, dass ich bereits die ersten positiven Auswirkungen spüren kann. Z.B. scheine ich etwas mehr Abstand zu bekommen, also im Sinne von *Ich beobachte mich selbst und schaffe es dadurch innezuhalten*.
|
||||
Ein Aspekt dabei ist, dass ich das alles hier ja auch öffentlich tue. Ich bin mir nicht sicher, ob es überhaupt jemanden gibt, der diese Seite gefunden hat, geschweige denn hier regelmäßig liest. Darum geht es auch gar nicht wirklich. Ich weiß nicht genau, wie ich es beschreiben soll, aber ich glaube, dass das Ganze etwas ernster und auch verbindlicher ist, wenn ich weiß, dass es jemand anderes lesen könnte.
|
||||
|
||||
## Also was mache ich nun mit den 2 Stunden, wie sieht die Lösung aus?
|
||||
|
||||
1. **Ich muss meine Einstellung dazu ändern:** d.h. ich muss dieses Zeitfenster als etwas sehen für das ich dankbar sein kann. Das ist Zeit, die einfach nur mir gehört und niemandem sonst und das sollte ich schätzen und lieben.
|
||||
2. **Ich muss dafür sorgen, dass ich diese Zeit nur mit mir verbringe:** d.h. ich muss, so gerne ich mir auch interessante Videos ansehe, diese Zeit ohne Ablenkung verbringen. Ideal wäre es wahrscheinlich, wenn ich diese 2 Stunden in totaler Stille verbringe, in der ich keine Geräusche außer des Tippens meiner Tastatur höre (und des Schnarchens meiner Hunde)
|
||||
3. **Ich muss es etwas lockerer nehmen**: Vorsätze sind gut und wichtig. Dennoch muss ich hier lernen, dass es nicht darauf ankommt, dass alles erledigt ist, was ich mir vorgenommen habe. Stattdessen sollte ich sicherstellen, dass das *was mir am wichtigsten ist* erledigt ist. Beim Schreiben bedeutet das konkret, dass ich mich eben nicht hetzen sollte, weil ich ja noch einen Blogpost schreiben wollte, sondern dass ich das woran ich gerade schreibe, um meine Gedanken klar zu kriegen vollende, sodass es seinem Zweck gerecht werden kann.
|
47
content/posts/21-17-04.en.md
Normal file
47
content/posts/21-17-04.en.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "My daily notes & writing routine"
|
||||
date: 2021-04-17
|
||||
draft: true
|
||||
tags: ["blabla","life","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
I'm running into a couple of issues with my daily writing routine. The problem is not that I don't stick to it, but rather how I feel about it as a whole. This leads to the fact that I get used to it, but I still feel like I'm just *dancing around* the topic. Therefore I would like to try to shed a light on the subject and, above all, to lay down a few basic rules.
|
||||
|
||||
## My problems with writing my daily notes
|
||||
|
||||
### Time slots and a hurry
|
||||
I have assigned myself a time window within my [daily routine](https://publish.obsidian.md/m3tam3re/%E2%9C%85+-+NOTIZEN/Tagesroutine). Several things happen within this time window, including a short meditation (if you want to call it that). I often have the feeling that I'm rushing through here despite the 2 hours.
|
||||
|
||||
Until recently, I had firmly resolved to write a kind of diary every day and then write a short blog post in German and English.
|
||||
|
||||
I think this sense of rush came from wanting to get everything done that I set out to do.
|
||||
|
||||
### Hook on and done?
|
||||
Those 2 hours early in the morning before ❤️ Kathleen is awake or anyone or anything can take me in should actually be something I can enjoy loneliness. I have no obligations (other than those that I impose on myself) and no distractions during this time. It's probably the only time block of the day that really belongs to me.
|
||||
|
||||
I believe that the feeling of rush described above has serious consequences for the result. This rather creates the feeling of **wanting to finish** and knowing that what I have set out to do is ticked off and done.
|
||||
|
||||
### YouTube
|
||||
I actually enjoy having my first coffee in the morning and quietly watching a video on YouTube of something that interests me.
|
||||
|
||||
Unfortunately, this also leads to the fact that I just keep YouTube running on the side, which leads to 2 problems:
|
||||
|
||||
1. I am always distracted from my thoughts while writing
|
||||
2. I think that the videos and their background noise is the first stress of the day
|
||||
|
||||
## What do I actually want to achieve with the 2 hours?
|
||||
I have included these 2 hours of writing every morning in my [Daily Routine](Daily Routine.md) for various reasons:
|
||||
|
||||
1. I want to make sure that I create something every day instead of just consuming it.
|
||||
2. I want to record my thoughts and feelings. I think you only revolve around yourself if everything just stays in your own head.
|
||||
3. I would like to bring clarity to my thoughts through writing and the related reflection.
|
||||
4. I am curious about the long-term changes daily writing will bring to my life.
|
||||
|
||||
A lot revolves around becoming aware of my thoughts and feelings. I also believe that I can already feel the first positive effects. E.g. I seem to get a little more distance, in the sense of *I observe myself and thus manage to pause*.
|
||||
One aspect is that I do all of this in public. I'm not sure if there is anyone who has found this page, let alone reads it here regularly. That's not really the point. I'm not sure how to describe it, but I think it's a bit more serious and also more authentic when I know that someone else could read it.
|
||||
|
||||
## So what do I do with the 2 hours, what is the solution?
|
||||
|
||||
1. **I have to change my attitude towards this:** i.e. I have to see this time window as something I can be thankful for. This is time that just belongs to me and nobody else and I should cherish and love that.
|
||||
2. **I have to make sure that I only spend this time with myself:** i.e., as much as I like to watch interesting videos, I have to spend this time without distraction. It would probably be ideal if I spend those 2 hours in total silence, in which I hear no noises other than typing my keyboard (and my dogs snoring)
|
||||
3. **I have to take it a little more relaxed**: resolutions are good and important. Nevertheless, I have to learn here that it does not matter that everything that I set out to do is done. Instead, I should make sure that * what matters most to me * is done. When writing this specifically means that I shouldn't rush myself because I wanted to write a blog post, but that I complete what I'm writing to get my thoughts clear so that it can do justice to its purpose.
|
25
content/posts/21-18-03.de.md
Normal file
25
content/posts/21-18-03.de.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "Digitales Sammelsurium"
|
||||
date: 2021-03-18
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
## Was für ein Chaos
|
||||
|
||||
Es ist mir schon länger ein Dorn im Auge. Wenn ich mir alleine meine Filme und Serien anschaue frage ich mich wie ich hier jemals Ordnung reinkriege. Locker 100 Blu Rays, teilweise digitalisiert und auf dem Plex Homeserver, 10-20 gekaufte Filme und Serien auf Amazon Prime, das gleiche bei Apple. Bei den Games sieht es ähnlich aus. Ein Teil auf Xbox, der Großteil über Playstation. Eigentlich müsste man Buch darüber führen welche digitalten Besitztümer man so hat, bei welchem Anbieter sie liegen und mit welchem Gerät man was abspielen kann.
|
||||
Ich frage mich ernsthaft ob das im Zeitalter Blockchain Technologie noch zeitgemäß ist. Eigentlich sollte es doch möglich sein, die Lizenzen für Spiele Filme etc. zentral zu verwalten. Die Technologie dafür ist vorhanden.
|
||||
|
||||
## Es könnte so einfach sein
|
||||
|
||||
Wenn man sich mal im Gegenzug vorstellt man würde das ganze Thema über Blockchain Technologie abbilden könnte das wirklich eine einfache und runde Sache werden. Über Smart Contracts könnten Nutzungsrechte klar und plattformübergreifend geregelt werden.
|
||||
|
||||
### Kaufen, Verkaufen, Leihen, Tauschen, alles kein Problem
|
||||
|
||||
Würde man den Kauf z.B. eines Filmes über eine Blockchain regeln wäre es im Grunde egal wo ich den Film gekauft habe. Mein Abspielgerät oder meine App zum abspielen könnte vor dem abspielen über die Blockchain verifizieren, dass ich den Film besitze oder abspielen darf.
|
||||
So wäre es auch möglich, dass ich z.B. einen Film wieder verkaufe, weil ich kein Interesse mehr daran habe. Von der Sache her würde uns die Blockchain Technologie erlauben mit digitalen Gütern umzugehen wie früher mit Musik-CDs oder Comics. Ganz einfach kaufen, verkaufen etc.
|
||||
Auch das ausleihen wäre kein Thema und das nicht nur zwischen Anbieter und Kunde, sondern auch Kunde zu Kunde. Man könnte zum Beispiel per Smart Contract einen Film für sagen wir mal 2 Tage an einen Kumpel verleihen. Ist die Zeit abgelaufen wird die Berechtigung automatisch wieder an den Besitzer des Filmes zurückübertragen.
|
||||
|
||||
Nur mal so am Rande...
|
||||
|
||||
|
27
content/posts/21-18-03.en.md
Normal file
27
content/posts/21-18-03.en.md
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "Digitales Sammelsurium"
|
||||
date: 2021-03-18
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
## What a mess
|
||||
|
||||
It has been a thorn in my side for a long time. When I watch my movies and tv-shows alone, I ask myself how I can ever get this in order. Easily more than 100 Blu Rays, partially digitized and on the Plex Homeserver, 10-20 bought movies and tv-shows on Amazon Prime, the same on Apple. It looks similar with the games. Some on Xbox, the majority on Playstation. Actually, you should keep a record of what digital possessions you have, with which provider they are and with which device you can play what.
|
||||
I seriously ask myself whether this is still appropriate in the age of blockchain technology. It should actually be possible to manage the licenses for games, movies, etc. centrally. The technology is there.
|
||||
|
||||
|
||||
|
||||
## It could be so easy
|
||||
|
||||
If you imagine in return that the whole topic would be covered by blockchain technology, it could really be a simple and well-rounded thing. Using smart contracts, usage rights could be regulated clearly and across platforms.
|
||||
|
||||
### Buying, selling, lending, swapping, no problem at all
|
||||
|
||||
If you were to regulate the purchase of a movie via a blockchain, for example, it would basically not matter where I bought the movie. My player or my app to play it could verify via the blockchain before playing that I own the movie or that I am allowed to play it.
|
||||
It would also be possible, for example, to resell a movie because I am no longer interested in it. Blockchain technology would allow us to deal with digital goods like we did when we were kids music with CDs or comics. Easily buy, sell, etc.
|
||||
Borrowing would also not be an issue and not only between provider and customer, but also from customer to customer. For example, you could lend a movie to a buddy for, say, two days using a smart contract. When the time has expired, the right to watch the movie are automatically transferred back to the owner of the movie.
|
||||
|
||||
Just by the way ...
|
||||
|
||||
|
41
content/posts/21-19-03.de.md
Normal file
41
content/posts/21-19-03.de.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Das richtige Werkzeug ist nur eine Ausrede"
|
||||
date: 2021-03-19
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
## Jetzt mal ganz ehrlich
|
||||
|
||||
Wie oft kommt es vor, dass man das Fehlen eines Werkzeuges, eines Programmes oder was auch immer vorschiebt um sich selbst dem was man sich vorgenommen
|
||||
abzuhalten. Wenn ich an die Zeit zurückdenke als ich wieder mit dem programmieren begonnen habe könnte ich mir jetzt noch die Haare raufen. Es ist unfassbar
|
||||
wieviel Zeit man mit der Frage zubringen kann "Welcher Editor ist der beste um zu programmieren?". Der Punkt ist der: Wenn man seine Zeit damit verbringt sich
|
||||
Stunden und Tage mit der Frage nach dem besten Editor befasst lautet die Antwort wahrscheinlich: "Gar keiner".
|
||||
|
||||
Die oben geschilderte Situation gibt es in unzähligen Variationen. Dabei ist es egal ob man Fotograf, Handwerker oder Steuerberater ist. Jeder kennt das
|
||||
wahrscheinlich allzu gut.
|
||||
|
||||
Das ist als würde man Gitarre lernen wollen und man kauft sich erst einmal die beste und teuerste Gitarre, die man für Geld finden kann. Aber der Punkt ist
|
||||
einfach nun mal der, dass einem das wirklich gar nichts nützt. Die Gitarre macht Dich nicht zum Rockstar, die 500 Megapixel Kamera macht aus Dir keinen
|
||||
Fotografen.
|
||||
|
||||
## Die Komfortzone ist das Problem
|
||||
|
||||
Wenn wir versuchen etwas schwieriges, neues oder gar beides zu tun scheint unser Gehirn besonders kreativ zu werden. Das Fehlen eines bestimmten Werkzeuges als
|
||||
Grund dafür mit etwas nicht zu beginnen ist nur eine Ausrede vielen. Soweit ich das beobachtet haben neigen wir zu derartigen Ausreden, sobald wir den
|
||||
sicheren Boden unserer Komfortzone verlassen.
|
||||
|
||||
## Man muss sich selber austricksen
|
||||
|
||||
Das Problem ist, dass unser Gehirn so gut darin ist uns diese Ausreden aufzutischen, dass wir es manchmal erst Stunden später mitbekommen. Eine perfekte Lösung
|
||||
dafür habe ich noch nicht gefunden, aber ein Einsatz könnte tatsächlich eine gute Planung kombiniert mit einer gesunden Portion Sturheit sein.
|
||||
Ich habe die Methode zu der Zeit wo ich wieder mit regelmäßigem Sport angefangen genutzt. Im Grunde muss man einen Zustand schaffen in dem es kein entweder oder
|
||||
gibt. Es muss einfach vollkommen klar sein, dass jetzt genau das passieren muss was man sich vorgenommen.
|
||||
|
||||
Dabei ist es wichtig, dass man vorher entschieden hat was in diesem Moment zu tun ist. Mit anderen Worten geht es um Planung. Wenn man bereits gestern
|
||||
entschieden hat was jetzt in diesem Moment zu tun ist macht es das deutlich einfacher. Es ist ja schon entschieden...oder?
|
||||
|
||||
Hier kommt die Sturheit ins Spiel. Man muss am Anfang in der Lage sein sich hier selbst in die Verantwortung zu nehmen. "Du hast das gestern so entschieden,
|
||||
jetzt wir XYZ gemacht. Ende der Durchsage".
|
||||
|
||||
|
41
content/posts/21-19-03.en.md
Normal file
41
content/posts/21-19-03.en.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "The right tool is just an excuse"
|
||||
date: 2021-03-19
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
## Now let's be honest
|
||||
|
||||
How often does it happen that you think the lack of a tool, a program or whatever in order to make yourself aware of what you set out to do
|
||||
to hold. When I think back to the time when I started programming again, I could still pull my hair out now. It's unbelievable
|
||||
how much time you can spend with the question "Which editor is the best for programming?". The point is this: when you spend your time doing it yourself
|
||||
Hours and days spent trying to find the best editor the answer is probably: "None at all".
|
||||
|
||||
The situation described above exists in countless variations. It doesn't matter whether you are a photographer, craftsman or tax advisor. Everyone knows that
|
||||
probably too good.
|
||||
|
||||
It's like wanting to learn to play the guitar and first of all you buy the best and most expensive guitar that money can find. But the point is
|
||||
simply the fact that it really doesn't help you at all. The guitar doesn't make you a rock star, the 500 megapixel camera doesn't make you a rock star
|
||||
Photographers.
|
||||
|
||||
## The comfort zone is the problem
|
||||
|
||||
When we try to do something difficult, new, or both, our brains seem particularly creative. The lack of a specific tool as
|
||||
Reason to not start with something is just one of many excuses. As far as I've seen, we tend to make such excuses as soon as we do
|
||||
Leave the safe ground of our comfort zone.
|
||||
|
||||
## You have to outsmart yourself
|
||||
|
||||
The problem is, our brains are so good at making these excuses that we sometimes don't notice them until hours later. A perfect solution
|
||||
I haven't found it yet, but a mission could actually be good planning combined with a healthy dose of stubbornness.
|
||||
I used the method around the time I started doing regular exercise again. Basically you have to create a state where there is no either or
|
||||
gives. It just has to be perfectly clear that exactly what you set out to do has to happen now.
|
||||
|
||||
It is important that you have decided beforehand what to do at this moment. In other words, it's about planning. If you already have decided yesterday
|
||||
what to do now things seem a lot easier. It's already decided ... right?
|
||||
|
||||
|
||||
now we made XYZ. End of the announcement ".
|
||||
|
||||
|
16
content/posts/21-20-03.de.md
Normal file
16
content/posts/21-20-03.de.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Ich bin gespannt auf die nächste Woche"
|
||||
date: 2021-03-20
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
## Und nochmal
|
||||
|
||||
Ich habe das alles schon allzu oft versucht. Ziele stzen, Planung, etc...Ich bin immer wieder in alte Muster zurückgefallen. Das waren zwar niemals komplette
|
||||
Fehlschläge, aber ich habe es bisher niemals hinbekommen eine permanente Änderung in allem was ich mir vorgenommen habe zu erreichen.
|
||||
|
||||
Ich bin mir noch nicht einmal sicher, ob das was ich mir in dieser Urlaubswoche erarbeitet es wirklich wert ist. Der Zugang zu meinen eigenen Wünschen und
|
||||
Gefühlen bleibt nach wie vor schwer.
|
||||
|
||||
|
16
content/posts/21-20-03.en.md
Normal file
16
content/posts/21-20-03.en.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: "Curious about the upcoming week"
|
||||
date: 2021-03-20
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
## And again
|
||||
|
||||
I've tried all of this too many times. Setting goals, planning, etc ... I kept falling back into old patterns. They were never complete
|
||||
failures, but I've never managed to make permanent changes in everything I've set out to achieve.
|
||||
|
||||
I'm not even sure if what I've worked out for this week of vacation is really worth it. Access to my own desires and
|
||||
feelings are still difficult.
|
||||
|
||||
|
35
content/posts/21-21-03.de.md
Normal file
35
content/posts/21-21-03.de.md
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "Ich habe keine gute Erklärung dafür"
|
||||
date: 2021-03-21
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","beziehungen"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe vor ein paar Tagen damit angefangen diesen Satz häufiger zusagen. Die Situation ist meistens die, dass ich
|
||||
- etwas getan habe, was ich nicht hätte tun sollen
|
||||
- irgendwas nur halbherzig getan habe
|
||||
- etwas falsch gemacht habe
|
||||
- bitte ausfüllen
|
||||
|
||||
Ich rede hier diesen Situationen, wo Deine Frau dich fragt, ob Du noch bei Trost bist. Ich weiß nicht, wie es anderen geht, aber bei uns ist das ziemlich oft. Das könnte unter Umständen daran liegen, dass ich dazu neige ein klein wenig stur zu sein.
|
||||
|
||||
Warum ich ich angefangen habe mit "Ich habe keine gute Erklärung dafür" zu antworten weiß ich nicht. Ich habe nirgendwo darüber glesen oder sonst etwas. Das ist aber auch egal, wichtig ist was dieser kleine Satz bewirkt:
|
||||
|
||||
## Eine kleine Portion Ehrlichkeit
|
||||
|
||||
Meistens ist es doch wirklich so: Wir tun etwas, wovon wir wissen, dass jetzt nicht gerade weise ist oder nur halbherzig oder man weiß, dass man gerade etwas tut was dem anderen mißfallen wird.
|
||||
Ich weiß jetzt nicht wie es anderen geht, aber wenn man dabei erwischt und danach gefragt wird, ist das meistens eine Steilvorlage für eine Ausrede. Der Punkt ist der, dass Deine Frau mekrt, dass Du ihr gerade eine Aurede auftischst.
|
||||
Das ist wenig ruhmreich, nicht wirklich ehrlich, aber es ist wie es ist, man versucht irgendwie Sinn in sein Verhalten zu erklären.
|
||||
|
||||
Wenn ich statt mit einer Ausrede oder einer Eklärung mit "Ich habe keine gute Erklärung dafür" reagierte passieren andere Dinge als sonst:
|
||||
|
||||
1. Meine Frau reagiert mit einem Lächeln und die Situation entspannt sich
|
||||
2. Der Druck, den ich selbst evtl. in so einer Situation spüre ist sofort verflogen
|
||||
|
||||
Das ist nicht nur eine Floskel. Es ist wahrscheinlich das einzige was ich sagen könnte, was wirklich der Wahrheit entspricht, denn Fakt ist: Ich habe meistens wirklich keine gute Erklärung für mein Verhalten in solchen Situationen. Das macht diese Antwort sehr ehrlich.
|
||||
|
||||
Wenn alles andere sowieso eine Ausrede und der klägliche Versuch wäre Sinn aus unsinnigem Verhalten zu machen ist es wahrscheinlich die Mühe nicht wert.
|
||||
|
||||
Ich werde diese Art und Weise beibehalten. Ob sich das langfristig auszahlt und wir dadurch besser und ehrlicher miteinander umgehen kann ich heute noch nicht sagen. Vielleicht trägt es ja dazu bei.
|
||||
|
||||
|
35
content/posts/21-21-03.en.md
Normal file
35
content/posts/21-21-03.en.md
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "I don't have a good explanation for this"
|
||||
date: 2021-03-21
|
||||
draft: true
|
||||
tags: ["blabla","life","misc","relationships"]
|
||||
series: [""]
|
||||
---
|
||||
A few days ago I started saying this sentence more often. The situation is mostly that me
|
||||
- did something I shouldn't have done
|
||||
- have only done something half-heartedly
|
||||
- did something wrong
|
||||
- Please fill in the blanks
|
||||
|
||||
I'm talking about these situations where your wife asks you if you are still at consolation. I don't know about others, but we do quite often. That could possibly be because I tend to be a little bit stubborn.
|
||||
|
||||
I don't know why I started to answer "I don't have a good explanation for it". I haven't read about it anywhere or anything. But that doesn't matter, what is important is what this little sentence does:
|
||||
|
||||
## A small portion of honesty
|
||||
|
||||
Most of the time it really is like this: We do something that we know is not exactly wise now or only half-heartedly or we know that we are doing something that will displease the other.
|
||||
I don't know how others are doing, but if you're caught doing it and asked about it, it's usually a great excuse. The point is that your wife will remark that you are just serving her an aura.
|
||||
It's not very glorious, not really honest, but it is what it is, you try to explain the meaning of your behavior somehow.
|
||||
|
||||
If I responded with "I don't have a good explanation" instead of an excuse or an explanation, different things happen than usual:
|
||||
|
||||
1. My wife responds with a smile and the situation relaxes
|
||||
2. The pressure that I myself may feel in such a situation is gone immediately
|
||||
|
||||
This is not just an empty phrase. It's probably the only thing I could say that is really true, because the fact is: I usually really don't have a goo explanation for my behavior in such situations. That makes this answer very honest.
|
||||
|
||||
If everything else is an excuse anyway and the pitiful attempt to make sense of nonsensical behavior, it is probably not worth the effort.
|
||||
|
||||
I will keep this way. I can't say today whether this will pay off in the long term and whether we will treat each other better and more honestly as a result. Maybe it will help.
|
||||
|
||||
|
17
content/posts/21-22-03.de.md
Normal file
17
content/posts/21-22-03.de.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
title: "Justice League - Snyder Cut"
|
||||
date: 2021-03-22
|
||||
draft: true
|
||||
tags: ["filme"]
|
||||
series: [""]
|
||||
---
|
||||
Gestern war es soweit. Ich habe mir den langersehnten Snyder Cut des Films Justice League angesehen. Der Film war insgesamt schon ziemlich gut, hat aber dennoch meiner Meinung nach nicht das Niveau vorheriger Zack Snyder Filme erreicht.
|
||||
|
||||
Mir fast 4 Stunden Laufzeit war der Film fast doppelt so lang wie die Kinofassung. Das gute daran ist, dass hier icht einfach nur entfallene Szenen in den Film gestückelt wurden. Stattdessen hat man sehr viel mehr Tiefgang im gesamten Film geschaffen. Die Stories und Motive der einzelnen Helden und auch der Bösewichte wurden sehr viel ausführlicher erzählt als bei der Kinofassung. Das ist meiner Meinung nach auch ein ganz wichtiger Untschied der beiden Fassungen. Ich fand, dass in der original Kinofassung einfach viel zu wenig erklärt wurde.
|
||||
Was mir auch gut gefallen hat war, dass man sich in manchen Szenen einfach Zeit gelassen hat um so die Stimmung wirken lassen zu können. Das kennt man schon aus anderen Zack Snyder Filmen, gerade Man of Steel war hier ganz groß. Im Vergleich zu Man of Steel muss man allerdings auch sagen, dass diese ruhigen Momente in Justice League lange nicht so gut waren wie in Man of Steel.
|
||||
|
||||
Was etwas seltsam war, war das Filmformat. Statt 16:9 Bildformat wurde hier eine Art 4:3 gewählt, ich glaube es war das Imax Format. Ich fand das Format eher störend und irritierend. Das hat auch noch die Tatsache unterstützt, dass der Film in der Bildgestaltung sowieso nicht allzu gut war. Ich weiß nicht genau wie ich das erklären soll, aber wenn ich mir im Vergleich Filme wie Watchmen, 300, Sucker Punch oder Man of Steel ansehe, dann waren diese Filme der Bildgestaltung her in fast jeder Szene perfekt. In den neueren Filmen Zack Snyder ist das leider nicht mehr so.
|
||||
|
||||
Insgesamt war der Film sehr gut und unterhaltsam. Ich muss jedoch auch sagen, dass wir meiner Meinung nach den Punkt erreicht haben an dem die meisten Superheldengeschichten erzählt sind. Marvel und DC haben mittlerweile zu allen ihren Helden mehr als nur einen Film. Hinzu kommen noch Filme wie Justice League in denen mehrere Helden zusammen kommen. Ich für meinen Teil bin mittlerweile übersättigt was Comicverfilmungen angeht.
|
||||
|
||||
|
17
content/posts/21-22-03.en.md
Normal file
17
content/posts/21-22-03.en.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
title: "Justice League - Snyder Cut"
|
||||
date: 2021-03-22
|
||||
draft: true
|
||||
tags: ["movies"]
|
||||
series: [""]
|
||||
---
|
||||
The time had come yesterday. I watched the long-awaited Snyder Cut from Justice League. The film was pretty good overall, but in my opinion it still didn't reach the level of previous Zack Snyder films.
|
||||
|
||||
With a running time of almost 4 hours, the film was almost twice as long as the theatrical version. The good thing about it is that not just deleted scenes have been cut into the film. Instead, you created a lot more depth in the entire film. The stories and motifs of the individual heroes and the villains were told in much more detail than in the theatrical version. In my opinion, this is also a very important difference between the two versions. I found that the original theatrical version simply didn't explain enough.
|
||||
What I also liked was that in some scenes you simply took your time to let the mood take effect. You already know that from other Zack Snyder films, especially Man of Steel was really big here. Compared to Man of Steel, it has to be said that those quiet moments in Justice League weren't nearly as good as in Man of Steel.
|
||||
|
||||
What was a little strange was the film format. Instead of 16: 9 picture format, a kind of 4: 3 was chosen, I think it was the Imax format. I found the format rather annoying and irritating. That also supported the fact that the film wasn't very good at the composition anyway. I don't know exactly how to explain that, but when I watch movies like Watchmen, 300, Sucker Punch or Man of Steel in comparison, these films were perfect in terms of the picture composition in almost every scene. Unfortunately, this is no longer the case in Zack Snyder's newer films.
|
||||
|
||||
Overall, the film was very good and entertaining. I have to say, however, that in my opinion we have reached the point where most of the superhero stories are told. Marvel and DC now have more than one movie about all of their heroes. There are also films like Justice League in which several heroes come together. For my part, I'm now saturated when it comes to comic book adaptations.
|
||||
|
||||
|
38
content/posts/21-23-03.de.md
Normal file
38
content/posts/21-23-03.de.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
title: "Wann ist Kundendienst so schlecht geworden?"
|
||||
date: 2021-03-23
|
||||
draft: true
|
||||
tags: ["work"]
|
||||
series: ["","Kompetenz im Kundedienst"]
|
||||
---
|
||||
Ich wundere mich schon seit längerem darüber wie unterirdisch so mancher Kundendienst ist. Ich habe eigentlich täglich mit großen Firmen wie Amazon oder DPD zu
|
||||
tun und es ist immer wieder spannend zu sehen wie nutzlos der Kundendienst die meiste Zeit ist.
|
||||
|
||||
## Du willst uns erreichen? Na dann viel Erfolg dabei
|
||||
|
||||
Ich weiß nicht wie es anderen geht, aber ich bin jemand, der den Kundendienst einer Firma in der Regel nur dann kontaktiert, wenn er wirklich nicht weiterkommt.
|
||||
Das bedeutet, dass mein Problem in der Regel nicht über die FAQ Seite beantwirtet werden kann.
|
||||
|
||||
Bei den meisten Firmen geht hier schon der Frust für mich als Kunden los. Bei vielen Firmen muss man wirklich auf die Suche gehen, wo man Kontakt zum
|
||||
Unternehmen aufnehmen kann. E-Mail, Telefonnummer oder einfach nur ein Tocket eröffnen? Fehlanzeige! Meistens muss man sich erst einmal durch Chatbots oder
|
||||
andere Frage-Antwort-Spiele wühlen bevor man mit etwas Glück seine Frage stellen kann.
|
||||
|
||||
## Sind solche künstlichen Barrieren wirklich notwendig?
|
||||
|
||||
Die Botschaft, die vermittelt wird ist leider oft sehr deutlich: "Wir möchten nicht, dass Du uns kontaktiert". Hat man es endlich geschafft in einem
|
||||
Ticketsystem oder einem einigermaßen sinvollen Call-System zu landen wird man meistens wenig dezent darauf hingewiesen, dass "aufgrund des hohen Aufkommens an
|
||||
Kundenanfragen zur Zeit mit einer längeren Wartezeit zu rechnen ist.". Meistens werden einem auch gleich noch die FAQ oder Hilfseiten als "bessere Alternative" zur Wartezeit angeboten. Die bösen, bösen Kunden. Verstopfen die Leitungen mit Ihren Fragen!
|
||||
Irgendwo in diesem Prozess wurde mir als Kunden natürlich noch eine Standardfloskel wie "Du, lieber Kunde, bist uns als Unternehmen sehr wichtig" eingestreut.
|
||||
Gott sei Dank, jetzt geht es mit gleich viel besser 😇
|
||||
|
||||
## Wann ist Kommunikation mit den Kunden so unwichtig geworden?
|
||||
|
||||
Ich weiß ja nicht...vielleicht werde ich ja aufgrund meines ALters mittlerweile komisch, aber ist eine direktes Gespräch mit einem Kunden für ein Unternehmen
|
||||
nicht immer auch eine Gelegenheit? Die meiste Zeit macht man sich doch als Unternehmen Gedanken darüber welche Produkte man anbieten könnte und wie man seine Kunden
|
||||
am besten erreicht etc.
|
||||
|
||||
Es wäre doch viel besser, wenn man die Anfrage beim Kundendienst als Gelegenheit nutzt. Natürlich ist das auch Arbeit, weil der Kunde sich ja aufgrund eines
|
||||
Problems meldet. Löst man aber das Problem des Kunden (was man ja eh tun muss) hat man hier die Gelegenheit einfach an Kundenfeedback zu kommen und einen Dialog
|
||||
mit dem Kunden zu führen.
|
||||
|
||||
|
37
content/posts/21-23-03.en.md
Normal file
37
content/posts/21-23-03.en.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
title: "When did customer service really get that bad?"
|
||||
date: 2021-03-23
|
||||
draft: true
|
||||
tags: ["work"]
|
||||
series: ["","Competence in customer service"]
|
||||
---
|
||||
I've been wondering for a long time how underground some customer service is. I actually work with big companies like Amazon or DPD every day
|
||||
do and often wonder how useless customer service is most of the time.
|
||||
|
||||
## Do you want to contact us? Well then, good luck with it
|
||||
|
||||
I don't know about others, but I am someone who usually only contacts a company's customer service department when I am really stuck.
|
||||
This means that my problem can usually not be answered via the FAQ page.
|
||||
|
||||
For most companies, this is where the frustration starts for me as a customer. With many companies you really have to look for where to contact
|
||||
Company can accommodate. Email, phone number or just open a pocket? Nothing! Most of the time you first have to go through chatbots or
|
||||
rummage through other question-answer games before, with a bit of luck, you can ask your question.
|
||||
|
||||
## Are such artificial barriers really necessary?
|
||||
|
||||
The message that is conveyed is unfortunately often very clear: "We don't want you to contact us". Did you finally make it to a
|
||||
Ticket system or a reasonably usable call system you are discreetly pointed out that "due to the high volume of
|
||||
Customer inquiries a longer waiting time is to be expected. ". Mostly the FAQ or help pages are also offered as a" better alternative "to the waiting time. The bad, bad customers. Clog the lines with your questions!
|
||||
Somewhere in this process, as a customer, I was of course interspersed with a standard phrase like "You, my dearest customer, are very important to us as a company".
|
||||
Thank goodness, now I feel much better 😇
|
||||
|
||||
## When did communication with customers become so unimportant?
|
||||
|
||||
I don't know ... maybe my age makes me weird, but is a direct conversation with a customer for a company
|
||||
not always an opportunity? Most of the time a company you thinks about which new product to offer and how to reach the customers.
|
||||
|
||||
It would be much better if you used the customer service inquiry as an opportunity. Of course, that is also work, because the customer is is asking for help
|
||||
with a problem. But if you solve the customer's problem (which you have to do anyway) you have the opportunity to simply get customer feedback and a dialogue
|
||||
to lead with the customer.
|
||||
|
||||
|
32
content/posts/21-24-03.de.md
Normal file
32
content/posts/21-24-03.de.md
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
title: "Projekte & Abschlüsse"
|
||||
date: 2021-03-24
|
||||
draft: true
|
||||
tags: ["work","projekte"]
|
||||
series: [""]
|
||||
---
|
||||
Wir sind gerade in der Firma in einer Phase kurz nach einem Projekt. Wir haben zuvor 6 Wochen damit verbracht ein neues Corporate Design zu entwickeln und zu
|
||||
planen. Ich hatte die Projektleitung dabei. Jetzt sind wir gerade an einem Punkt, an dem wir zwar das Projekt recht gut umgesetzt haben, aber es noch eine Menge
|
||||
Verwirrung dazu gibt.
|
||||
|
||||
Das Problem ist eigentlich, dass ich nicht dafür gesorgt habe, dass wir mit einem klaren Fahrplan für Anpassung unserer ganzen Werbemittel etc. aus dem Projekt
|
||||
gehen. Das führt gerade zu Unklarheiten und Unsicherheit bei meinen Kollegen. Das gute dabei ist, dass meine Kollegin mittlerweile lernt sehr viel offener Dinge
|
||||
anzusprechen. Sie hat einen großartigen internen Blogpost gemacht in dem sie klar geäußert hat wie sie sich fühlt und was passiert, wenn wir das Projekt jetzt
|
||||
so stehen lassen.
|
||||
|
||||
## Den richtigen Weg zu finden ist gar nicht so einfach
|
||||
|
||||
Wir arbeiten jetzt seit ca. 1 Jahr in Projektzyklen. D.h. wir machen jeweils 6 Wochen Projekt und dann 2 Wochen Pause. Von der Sache her funktioniert das
|
||||
eigentlich ziemlich gut, da wir es so schaffen Dinge anzugehen, die für die Firma wichtig sind statt nur das tägliche Rauschen abzuarbeiten.
|
||||
|
||||
Dennoch haben wir noch viel zu lernen. Zur Zeit ist es so, dass ich der einzige bin, der sich Gedanken darüber gemacht hat, wie man am besten an die internen
|
||||
Projekte herangeht. Das führt bei mir gerade zu etwas Frust angesichts der oben genannten Situation. Ich bin zur Zeit noch nicht in der Lage mich und
|
||||
meine Kollegen in unseren Projekten so zu führen, dass wir wirklich vorwärts kommen. Es fühlt sich manchmal an als würde man Steine schneiden.
|
||||
|
||||
Ich das Gefühl, dass meine Kollegen zwar alles bereitwillig mitmachen, aber es fehlt an dem Blick für das "warum". Es ist leider nicht genug
|
||||
Interesse vorhanden, dass man sich eingehender damit befassen möchte "wie wir arbeiten". Das ist aber nicht der Fehler meiner Kollegen. Ich muss einen Weg finden
|
||||
das Interesse dafür zu wecken bestmöglich zu arbeiten. Wie ich das hinbekomme weiß ich noch nicht.
|
||||
|
||||
Vielleicht bin ich aber auch zu ungeduldig und ich sehr den Fortschritt gerade noch nicht?
|
||||
|
||||
|
29
content/posts/21-24-03.en.md
Normal file
29
content/posts/21-24-03.en.md
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "Projekte & Deadlines"
|
||||
date: 2021-03-24
|
||||
draft: true
|
||||
tags: ["work","projects"]
|
||||
series: [""]
|
||||
---
|
||||
In our company we are currently in a phase shortly after a project. We had previously spent 6 weeks developing and installing a new corporate design. I had the
|
||||
project lead. We are now at the point where we have implemented the project quite well, but there seems to be a lot confusion about the next steps.
|
||||
|
||||
The problem is actually that I did not ensure that we had a clear timetable for adapting all of our advertising material etc. from the project
|
||||
walk. This leads to confusion and uncertainty among my colleagues. The good thing is that my colleague is now learning to address issues a lot more openly. She did a great internal blog post in which she clearly stated how she felt and what would happen if we did not put the work in to solve the situation.
|
||||
|
||||
## Finding the right way is not that easy
|
||||
|
||||
We have been working in project cycles for about 1 year. That means we do a 6-week project and then a 2-week break. It works
|
||||
actually pretty good, because we manage to tackle things that are important and meaningful for the company instead of just dealing with the daily noise.
|
||||
|
||||
Still, we have a lot to learn. At the moment, I'm the only one who has thought about how best to approach the internal
|
||||
projects. That leads to some frustration for me, especially in situations like the above-mentioned. At the moment I am not yet able to lead myself and
|
||||
my colleagues in such a way that we really get ahead. Sometimes it feels like cutting stones.
|
||||
|
||||
I have the feeling that my colleagues willingly go along with everything, but they lack an understanding of the "why". Unfortunately there is not enough
|
||||
interest in delving deeper into "how we work". That is not my colleagues' fault. I have to find a way
|
||||
to arouse interest in doing the best possible job. I don't know how to do that yet.
|
||||
|
||||
But maybe I'm too impatient and I'm not very aware of the progress yet?
|
||||
|
||||
|
50
content/posts/21-25-03.de.md
Normal file
50
content/posts/21-25-03.de.md
Normal file
@ -0,0 +1,50 @@
|
||||
---
|
||||
title: "Die Meinung der anderen"
|
||||
date: 2021-03-25
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
In der heutigen Zeit ist es einfach, dass man den Meinungen anderer beeinflusst wird. Genau genommen bekommt man die Meinung anderer nicht nur kostenlos, sondern auch ungefragt, egal ob man sie hören will oder nicht.
|
||||
|
||||
Jeder der einen Social Media Account hat lässt seine Meinung zu einem Thema vom Stapel und pustet sie in die Welt hinaus.
|
||||
|
||||
Bei den ist es nicht besser. Ich interessiere mich normalerweise so gar nicht für Nachrichten, habe aber aufgrund der Pandemie im letzten Jahr einigermaßen regelmäßig Nachrichten gesehen. Aus meiner Sicht sind die Nachrichten kein Stück besser als Social Media.
|
||||
Dabei folgen die Nachrichten den gleichen Grundregeln wie der Quatsch den wir teilweise in den sozialien Medien sehen, mit einem etwas offizielleren Charakter. Es geht nicht darum was wahr oder gut ist, es geht eigentlich nur darum was die meiste Aufmerksamkeit erzeugt.
|
||||
In Laufe der Pandemie hat man das sehr schön gesehen. Nch kurzer Zeit ging es nur noch um Wirtschaft, um Infektionszahlen und darum wer Schuld daran hat, dass die kürzlich beschlossenen Maßnehmen nicht funktionieren.
|
||||
Das was das größte Potential hat den Zuschauer oder Leser aufzuregen wird genommen 😇.
|
||||
|
||||
## Warum sollte man sich überhaupt mit den Meinungen anderer abgeben?
|
||||
|
||||
Man könnte sich jetzt auf die Position zurückziehen, dass die Meinungen anderer ja unwichtig sind und dass es nur auf einen selbst ankommt. Das funktioniert aber nicht. Wir können nicht nur in unserem eigenen Kopf und unserer eigenen Gedankenwelt leben.
|
||||
Die Meinung anderer hilft uns dabei unseren eigenen Blick auf die Wet zu schärfen und liefert uns durchaus immer wieder interessante Einblicke.
|
||||
Gerade für diejenigen die kreativen Output produzieren ist die Meinung anderer unerlässlich. Sie hilft uns dabei besser zu werden, unsere Produkte und unsere Kunst zu verbessern und noch so vieles mehr.
|
||||
|
||||
## Man muss darauf achten was man reinlässt
|
||||
|
||||
Am liebsten wäre es mir wahrscheinlich einfach alle Meinungen komplett zu ignorieren. Das wäre bequem, schmerzfrei und würde für den Moment super funktionieren.
|
||||
|
||||
Dann habe ich da ja auch noch die [[Liste meiner Lieblingsmenschen]] 🥰. Wenn ich mich dazu entschließe nur Meinungen in meinen Kopf zu lassen, wenn der Autor der Meinung auf der Liste steht ist das wahrscheinlich schon einmal ein ziemlich guter Filter.
|
||||
|
||||
Dennoch bin ich der Meinung, dass auch das mittel- bis langfristig zu Stagnation führt.
|
||||
|
||||
Und was ist eigentlich, wenn jemand nicht auf der Liste steht, seine Meinung aber vollkommen nachvollziehbar und berechtigt ist?
|
||||
|
||||
Eine andere Möglichkeit zu Filtern ist wahrscheinlich auch wie lange ich brauche um die Meinung zu konsumieren. Für einen Tweet brauche ich vielleicht 5 Sekunden, ist die Meinung aber in einem Blogpost verfasst für den ich 30 Minuten brauche sieht das schon anders aus.
|
||||
Die ganzen Ein- und Zweizeiler Clickbait Meinungen kann man im Grunde komplett ignorieren. Warum sollte man eine Meinung in seinen Kopf lassen, die einfach so im Raum steht?
|
||||
|
||||
## Fazit
|
||||
|
||||
Im Grunde kommt es wahrscheinlich auf 2 Dinge an:
|
||||
|
||||
1. Kommt die Meinung jemandem, dem man vertraut
|
||||
2. Und/Oder hat sich derjenige die Mühe gemacht zu erklären warum er dieser Meinung ist
|
||||
|
||||
Alles andere kann man wahrscheinlich getrost ignorieren zggl. so einiger Grauzonen zwischendrin.
|
||||
|
||||
Das wichtigste ist sowieso, dass man, egal ob man eine Meinung in seinen Kopf lässt, sich seine eigenen Gedanken macht.
|
||||
|
||||
Aber das hier ist ja auch nur eine weitere Meinung.
|
||||
|
||||
|
||||
|
50
content/posts/21-25-03.en.md
Normal file
50
content/posts/21-25-03.en.md
Normal file
@ -0,0 +1,50 @@
|
||||
---
|
||||
title: "The optinion of the others"
|
||||
date: 2021-03-25
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
In this day and age, it's easy to be influenced by the opinions of others. Strictly speaking, you not only get the opinion of others for free, but also without being asked whether you want to hear them or not.
|
||||
|
||||
Everyone who has a social media account lets his opinion on a topic from the stack and blows it out into the world.
|
||||
|
||||
It's not better with them. I'm usually not that interested in the news, but I've seen the news fairly regularly over the past year due to the pandemic. From my point of view, the news is no better than social media.
|
||||
The news follows the same basic rules as the nonsense that we sometimes see in social media, with a somewhat more official character. It's not about what's true or what's good, it's actually just about what gets the most attention.
|
||||
That was seen very nicely in the course of the pandemic. Before long it was only about the economy, the number of infections and who is to blame for the fact that the recently decided measures do not work.
|
||||
What has the greatest potential to excite the viewer or reader is taken 😇.
|
||||
|
||||
## Why should one even bother with the opinions of others?
|
||||
|
||||
One could now withdraw to the position that the opinions of others are unimportant and that it is only up to you that matters. But that doesn't work. We cannot just live in our own mind and thoughts.
|
||||
The opinion of others helps us to sharpen our own view of the wet and provides us with interesting insights again and again.
|
||||
The opinion of others is essential, especially for those who produce creative output. It helps us to get better, to improve our products and our art and so much more.
|
||||
|
||||
## You have to pay attention to what you let in
|
||||
|
||||
I would probably prefer to just ignore all opinions completely. That would be comfortable, painless, and would work great for the moment.
|
||||
|
||||
Then I also have the [[list of my favorite people]] 🥰. If I decide to just let opinions in my head when the author of the opinion is on the list, that's probably a pretty good filter.
|
||||
|
||||
Nevertheless, I am of the opinion that this will also lead to stagnation in the medium to long term.
|
||||
|
||||
And what if someone is not on the list, but their opinion is completely understandable and justified?
|
||||
|
||||
Another way to filter is probably how long it will take me to consume the opinion. For a tweet I might need 5 seconds, but if the opinion is written in a blog post that takes me 30 minutes, things look different.
|
||||
The whole one- and two-line clickbait opinions can basically be ignored completely. Why should you let an opinion in your head that just stands there?
|
||||
|
||||
## Conclusion
|
||||
|
||||
Basically, it probably comes down to 2 things:
|
||||
|
||||
1. The opinion comes from someone you trust
|
||||
2. And / or has the person bothered to explain why he or she is of this opinion
|
||||
|
||||
Everything else can probably be safely ignored zggl. so a few gray areas in between.
|
||||
|
||||
The most important thing is anyway that, regardless of whether you let an opinion in your head, you make your own thoughts.
|
||||
|
||||
But this is just another opinion.
|
||||
|
||||
|
||||
|
22
content/posts/21-26-03.de.md
Normal file
22
content/posts/21-26-03.de.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Dinge, die nicht so funktioniert haben, wie ich dachte."
|
||||
date: 2021-03-26
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
Okay, das wird vielleicht komisch. Ich habe gerade beschlossen mich mit den Fehlschlägen in meinem Leben auseinanderzusetzen. Ich bin mir fast sicher, dass dieses Thema aus ganz anderen Gründen schwierig wird als manch einer denkt.
|
||||
|
||||
Mir fällt es schwer Fehlschläge in meinem Leben überhaupt als solche zu registrieren. Vielleicht liegt es daran, dass ich eigentlich nie etwas bereue, sondern dankbar für jede Erfahrung bin, die ich gemacht habe. Auf jeden Fall merke ich gerade, dass das eine Kopfnuss wird. Ich habe zwar bereits 2 Dinge identifiziert, aber es war nicht ganz einfach.
|
||||
|
||||
Wahrscheinlich brauche ich einfach nur eine andere Bezeichnung dafür, die besser zu dem passt wie ich das empfinde. Vielleicht Dinge, die nicht so funktioniert haben, wie ich dachte?
|
||||
|
||||
## Wieso will ich das überhaupt machen?
|
||||
|
||||
Mir geht es dabei gerade darum mir ein paar Dinge bewusst zu machen. Ich möchte einfach verstehen was schiefgelaufen, warum ich welche Entscheidungen getroffen habe und was ich daraus lernen kann.
|
||||
|
||||
Ich bin mir sicher, dass ich vieles unterwegs gelernt habe und es ist mit Sciherheit unmöglich alles zu rekapitulieren. Dennoch hat man ja in seinem Leben immer mal wieder vor großen Veränderungen gestanden und sich für das eine oder andere entschieden.
|
||||
|
||||
Es sollte machbar sein ein paar der großen Brocken zu identifizieren und sich genauer anzuschauen warum man sich dafür entschieden hat und warum das am Ende nicht so lief, wie man es sich vorgestellt hat.
|
||||
|
||||
|
22
content/posts/21-26-03.en.md
Normal file
22
content/posts/21-26-03.en.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Things that didn't work out the way I thought"
|
||||
date: 2021-03-26
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
Okay, this might be weird. I've just decided to deal with the failures in my life. I am almost certain that this topic will be difficult for completely different reasons than some people think.
|
||||
|
||||
I find it difficult to even register failures in my life as such. Maybe it's because I never really regret anything, but rather am grateful for every experience I've had. In any case, I'm just noticing that this is going to be a headache. I already identified 2 things, but it wasn't that easy.
|
||||
|
||||
I probably just need a different name for it that better fits how I feel about it. Maybe things that didn't work the way I thought?
|
||||
|
||||
## Why do I even want to do that?
|
||||
|
||||
For me, it's just about making myself aware of a few things. I just want to understand what went wrong, why I made which decisions and what I can learn from them.
|
||||
|
||||
I am sure that I learned a lot on the way and it is impossible to recapitulate everything with certainty. Nevertheless, you have always faced major changes in your life and decided on one thing or the other.
|
||||
|
||||
It should be feasible to identify a few of the big chunks and take a closer look at why you decided to do it and why it didn't work out as you imagined it in the end.
|
||||
|
||||
|
12
content/posts/21-27-03.de.md
Normal file
12
content/posts/21-27-03.de.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: "Tagesroutine ändern"
|
||||
date: 2021-03-27
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe heute so gedacht, dass ich meine [Tagesroutine](https://publish.obsidian.md/m3tam3re/%E2%9C%85+-+NOTIZEN/Tagesroutine) noch anders nutzen muss. Ich
|
||||
habe mir zwar bei vielen Dingen schon die Mühe gemacht sie aufzuschreiben, dennoch glaube ich, dass ich mir gerade so etwas wie wichtige Ziele und Gründe
|
||||
täglich ansehen sollte.
|
||||
|
||||
|
12
content/posts/21-27-03.en.md
Normal file
12
content/posts/21-27-03.en.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: "Changing my daily routine"
|
||||
date: 2021-03-27
|
||||
draft: true
|
||||
tags: ["blabla","life","misc"]
|
||||
series: [""]
|
||||
---
|
||||
Today I thought that I would have to use my [daily routine](https://publish.obsidian.md/m3tam3re/%E2%9C%85+-+NOTIZEN/Tagesroutine) differently. I
|
||||
I have already written them down for many things, but I still believe that I have something like important goals and reasons
|
||||
should watch daily.
|
||||
|
||||
|
52
content/posts/21-28-03.de.md
Normal file
52
content/posts/21-28-03.de.md
Normal file
@ -0,0 +1,52 @@
|
||||
---
|
||||
title: "Wochenplanung - bloß weg mit dem verdammten Kalender"
|
||||
date: 2021-03-28
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe letzte Woche damit angefangen meine Wochen im Voraus zu planen:
|
||||
|
||||
- Arbeit
|
||||
- persönliches Wachstum
|
||||
- Sport
|
||||
- ... you name it
|
||||
|
||||
Nachdem ich in der letzten Woche ganz klassisch unterwegs war, habe ich diese Woche einfach alles anders gemacht, dazu später mehr.
|
||||
|
||||
## Die letzte Woche
|
||||
Ich habe ganz klassisch mit meinen Notizen und einem Kalender die Woche durchgeplant. Da ich nicht vollkommen wahnsinnig bin hatte ich mir zuvor eine Vorlage ausgearbeitet, die mir die wöchentliche Planung erleichter.
|
||||
|
||||
Soweit so gut, aber ein Kalender? Ich habe nicht die geringste Ahnung wie ein Kalender jemals bei sowas hätte hilfreich sein können. Na klar, den Geburtstag XYZ kann man eintragen oder den Besuch Geschäftspartner Blablabla.
|
||||
|
||||
Ich dachte aber ich versuche es trotzdem mal, d.h. ich habe meine Routinen als wiederkehrende Ereignisse eingespeichert, habe Arbeitsblöcke festgelegt etc. etc.
|
||||
|
||||
Ich habe jetzt leider keinen Screenshot mehr, weil ich den Kalender nach 2 Tagen gelöscht und zum Teufel gejagt habe, aber der war einfach:
|
||||
|
||||
- überfüllt
|
||||
- unübersichtlich
|
||||
- ablenkend
|
||||
- verstörend
|
||||
|
||||
## Zurück zu Omnifocus
|
||||
Ich habe zwar letztens darüber geschrieben, dass das [richtige Werkzeug nur eine Ausrede ist](https://www.m3tam3re.com/2021/21-19-03/), aber ich habe prompt meine erste Ausnahme gefunden.
|
||||
|
||||
Ich habe vor Jahre schon Omnifocus genutzt und habe damals zugunsten Teamarbeit und Co. in der Firma Omnifocus zugunsten Basecamp verworfen (der Weg zu Basecamp führte allerdings auch über Umwege. Vielleicht ein anderes Mal).
|
||||
|
||||
Nachdem ich letzten Sonntag alles peinlich genau für die kommende Woche geplant hatte und mich in meine gut geplante aber unübersichtliche Woche gestürzt hatte, fiel es mir am Dienstag wie Schuppen den Augen. Mit Omnoficus geht das alles so viel einfacher.
|
||||
|
||||
Ohne jetzt hier eine Programmvorstellung machen zu wollen hier einmal ein paar Schlüsselaspekte:
|
||||
|
||||
- Zurückstellen Aufgaben: Wenn ich meine Woche plane kann ich Aufgaben, die ich in dieser Woche eh nicht machen will zurückstellen. Wenn ich nun meine Perpektiven richtig eingestellt habe sind diese Aufgaben komplett verschwunden, dadurch sehe ich nur die Aufgaben, wie für die Woche wirklich relevant sind
|
||||
- Tagesplanung: Ich habe eine eigene Perspektive für die Planung des nächsten Tages.
|
||||
- Heute: Ich habe mir eine Heute Perspektive eingerichtet. Hier werden nur Objekte angezeigt, die ich in der Tagesplanung zugewiesen habe. Dadurch sehe ich wirklich nur das, was für den Tag interessant ist.
|
||||
- Aufgabenerfassun: Über eine Hotkey kann ich innerhalb Sekunden eine neue Aufgabe oder Notiz erfassen. Dadurch schaffe ich es bei Störungen sofort wieder an die Arbeit zu gehen. Hotkey -> Notiz -> zurück zur Aufgabe
|
||||
|
||||
## Die heutige Planung
|
||||
Meine heutige Wochenplanung war im Vergleich zur letzten Woche geradezu lächerlich einfach. Ich habe gerade mal 30 Minuten dafür gebraucht und es hat sogar Spaß gemacht.
|
||||
|
||||
Das Beste daran ist, dass ich mir sicher bin, dass ich alles im Blick hatte und auch garantiert nichts übersehen habe. Die Woche kann kommen.
|
||||
|
||||
Die Wochenplanung mit Omnifocus will ich aber trotzdem nach und nach weiter ausarbeiten und verbessern.
|
||||
|
||||
|
52
content/posts/21-28-03.en.md
Normal file
52
content/posts/21-28-03.en.md
Normal file
@ -0,0 +1,52 @@
|
||||
---
|
||||
title: "Weekly planning - just get rid of that damn calendar"
|
||||
date: 2021-03-28
|
||||
draft: true
|
||||
tags: ["blabla","life","productivity"]
|
||||
series: [""]
|
||||
---
|
||||
I started planning my weeks in advance last week:
|
||||
|
||||
- Job
|
||||
- personal growth
|
||||
- Sports
|
||||
- ... you name it
|
||||
|
||||
After I was on the classic road last week, I just did everything differently this week, more on that later.
|
||||
|
||||
## The last week
|
||||
I planned the week through the classic way with my notes and a calendar. Since I am not completely insane, I had previously worked out a template that made the weekly planning easier for me.
|
||||
|
||||
So far so good, but a calendar? I have absolutely no idea how a calendar could ever have been helpful with this. Of course, you can enter XYZ's birthday or a visit from business partner blah blah blah blah blah blah blah blah blah blah blah bla trails.
|
||||
|
||||
But I thought I would give it a try anyway, i.e. I saved my routines as recurring events, defined work blocks etc. etc.
|
||||
|
||||
Unfortunately, I don't have a screenshot anymore because I deleted the calendar after 2 days and chased the hell out of it, but it was easy:
|
||||
|
||||
- overfilled
|
||||
- confusing
|
||||
- distracting
|
||||
- disturbing
|
||||
|
||||
## Back to Omnifocus
|
||||
I recently wrote about the [correct tool is just an excuse] (https://www.m3tam3re.com/2021/21-19-03/), but I promptly found my first exception.
|
||||
|
||||
I used Omnifocus years ago and at that time discarded Omnifocus in favor of Basecamp in favor of teamwork and co.
|
||||
|
||||
After I had meticulously planned everything for the coming week last Sunday and plunged into my well-planned but confusing week, it fell like scales from my eyes on Tuesday. It's so much easier with Omnoficus.
|
||||
|
||||
Without wanting to present a program here, here are a few key aspects:
|
||||
|
||||
- Postpone tasks: When I plan my week, I can postpone tasks that I don't want to do this week anyway. If I have now set my perspectives correctly, these tasks have completely disappeared, so I only see the tasks that are really relevant for the week
|
||||
- Daily planning: I have my own perspective for planning the next day.
|
||||
- Today: I have set up a Today perspective. Only objects that I have assigned in the daily planning are displayed here. As a result, I really only see what is interesting for the day.
|
||||
- Task recording: I can use a hotkey to record a new task or note within seconds. This enables me to go back to work immediately in the event of a malfunction. Hotkey -> Note -> back to the task
|
||||
|
||||
## Today's planning
|
||||
My weekly planning today was ridiculously easy compared to last week. It only took me 30 minutes and it was even fun.
|
||||
|
||||
The best part is that I am sure that I had everything in view and guaranteed not to overlook anything. The week can come.
|
||||
|
||||
Nevertheless, I want to gradually develop and improve the [[weekly planning with omnifocus]].
|
||||
|
||||
|
19
content/posts/21-30-03.de.md
Normal file
19
content/posts/21-30-03.de.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
title: "Schreiben ist nicht einfach"
|
||||
date: 2021-03-30
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: [""]
|
||||
---
|
||||
Eigentlich wollte ich heute an dem Thema weiterschrieben, dass ich gestern angefangen habe. Das habe ich auch. In meinen Notizen habe ich ein paar Abschnitte
|
||||
weitergeschrieben. Ich habe aber das Gefühl, dass ich noch nicht bei dem bin worauf ich eigentlich hinaus will bei dem Thema. Es wirkt so als würde ich noch
|
||||
etwas übersehen oder noch nicht ganz klar bekommen.
|
||||
|
||||
Seine Gedanken un Worte zu fassen ist anstrengend. Oft weiß man nicht genau wie man etwas so formulieren soll, dass es auch Sinn ergibt. Gleichzeitig macht das
|
||||
Schreiben Fehler in den eigenen Denkmustern sehr offensichtlich. Mir geht es oft so, dass ich etwas schreibe und dann später lese, nur um dann zu dem Schluss
|
||||
zu kommen, dass ich mir etwas vormache oder mich selbst austrickse.
|
||||
|
||||
Das ist glaube ich schon einmal ein Vorteil des Schreibens. Man ist außerhalb seines eigenen Kopfes damit und dreht sich nicht nur um sich selbst. Mit etwas
|
||||
Abstand das Geschriebene nochmal zu lesen schafft viel Klarheit.
|
||||
|
||||
|
14
content/posts/21-30-03.en.md
Normal file
14
content/posts/21-30-03.en.md
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
title: "It's not easy to write"
|
||||
date: 2021-03-30
|
||||
draft: true
|
||||
tags: ["blabla","life"]
|
||||
series: [""]
|
||||
---
|
||||
Actually, I wanted to continue to write on the topic today that I started yesterday. I have. In my notes I have written a few sections, but I had the feeling that I have not yet found the point of what I would like to express. It seems like there is something that I overlooked or that is not quite clear.
|
||||
|
||||
To grasp your thoughts is exhausting. Often you do not know exactly how to formulate something in order to make sense of it. At the same time writing often reveals mistakes in thought patterns. I often feel that I write something and then read it later, only to conclude, that I fooled myself about something.
|
||||
|
||||
That's where the huge advantage of writing comes into play. One is outside of his own head and is not just about himself. Writing allows to come back to one's thoughts and helps to deliver clarity in thinking.
|
||||
|
||||
|
22
content/posts/21-31-03.de.md
Normal file
22
content/posts/21-31-03.de.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Festgebissen..."
|
||||
date: 2021-03-31
|
||||
draft: true
|
||||
tags: ["blabla","programmieren"]
|
||||
series: [""]
|
||||
---
|
||||
Ich habe gestern Abend an einer oAuth 2 Authentifizierung für eine API gesessen, die wir auf der Arbeit nutzen. Eigentlich sollte das Ganze eine einfache Machbarkeitsstudie werden.
|
||||
Die Voraussetzungen dafür waren eigentlich ganz gut:
|
||||
|
||||
- eine gut dokumentierte API
|
||||
- eine oAuth 2 Library die mir Teile der grundlegenden Arbeit abnimmt
|
||||
|
||||
Tja, soviel zur Theorie. Mit Hilfe der Library hätte das alles relativ einfach sein sollen. Das war auch das was ich gestern Abend immer wieder gedacht habe. "Es ist alles richtig, das muss funktionieren".
|
||||
|
||||
Nach 2 Stunden bin ich dann doch mißtrauisch geworden. Ich habe über [n8n](https://www.n8n.io/) mal schnell das gleiche versucht, nur um dann festzustellen, dass ich hier das gleiche Problem habe.
|
||||
|
||||
Danach habe ich noch einmal die Gegenprobe gemacht und sowohl in meinem Code als auch in n8n mit der Github API kommuniziert...ohne Probleme.
|
||||
|
||||
So ist es leider manchmal.
|
||||
|
||||
|
22
content/posts/21-31-03.en.md
Normal file
22
content/posts/21-31-03.en.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Difficult API"
|
||||
date: 2021-03-31
|
||||
draft: true
|
||||
tags: ["blabla","coding"]
|
||||
series: [""]
|
||||
---
|
||||
Last night I was working an oAuth 2 authentication for an API that we use at work. Actually, the whole thing should have been a simple feasibility study.
|
||||
The prerequisites for this were actually quite good:
|
||||
|
||||
- a well-documented API
|
||||
- an oAuth 2 library that does most of the basic work for me
|
||||
|
||||
Well, so much for the theory. With the help of the library, it should all have been relatively easy. That was also what I kept thinking last night. "Everything is right, it has to work."
|
||||
|
||||
After 2 hours I got suspicious. I quickly tried the same thing via [n8n](https://www.n8n.io/), only to find out that I have the same problem here.
|
||||
|
||||
Then I did the cross-check again and communicated with the Github API both in my code and in n8n ... without any problems.
|
||||
|
||||
Unfortunately, that's the way it is sometimes.
|
||||
|
||||
|
45
content/posts/bitwarden.de.md
Normal file
45
content/posts/bitwarden.de.md
Normal file
@ -0,0 +1,45 @@
|
||||
---
|
||||
title: "Bitwarden - Open Source Passwortmanager"
|
||||
date: 2020-08-20
|
||||
draft: false
|
||||
tags: ["sicherheit","tools"]
|
||||
archive: ["Technik Zeug"]
|
||||
series: [""]
|
||||
featuredImage: "/img/bitwarden/bitwarden.gif"
|
||||
---
|
||||
# Bitwarden - ein großartiger Passwortmanager
|
||||
|
||||
Ich habe jahrelang 1 Passwor benutzt um meine Kennwörter sicher aufzubewahren. Das Programm hat mir immer gute Dienste geleistet.
|
||||
Als die Firma vor ein paar Jahren das Lizenzmodell umgestellt hat, habe ich nach einer Alternative umgesehen.
|
||||
Seither setze ich stattdessen [Bitwarden](https://bitwarden.com/) ein und habe seitdem auch nie wieder zurückgeschaut.
|
||||
|
||||
Bitwarden ist im Gegensatz zu anderen Passwort Managern, wie 1 Passwor oder Dashlane vollkommen kostenlos und ist für alle gängigen Plattformwn verfügbar.
|
||||
Auch Plugins für alle gängigen Browser sind verfügbar.
|
||||
|
||||
Was ich persönlich auch sehr spannend finde ist, dass Bitwarden Open Source ist. Darüber hinaus betreibt Bitwarden ein Bug Bounty Program über Hackerone um Bugs und Sicherheitsprobleme schnell aufdecken zu können.
|
||||
|
||||
|
||||
## Funktionen
|
||||
|
||||
Der Funktionsumfang im Grunde so, wie man es solchen Programmen gewohnt ist. Das Interface erinnert mich stark an 1Passwor was den Umstieg natürlich deutlich erleichtert. Ihr könnt neben Zugangsdaten auch sichere Notizen, Kreditkarten oder auch Identitätsdaten speichern.
|
||||
Mit einer Browser-Erweiterung kann mann dann z.B. mit einem Klick Kreditkartendaten oder Login-Formulare ausfüllen.
|
||||
|
||||

|
||||
|
||||
Funktionen wie 2-Faktor-Authentifizierung sind selbstverständlich eingebaut und funktionieren sehr gut, wenn man z.B. eine Authenticator App nutzt.
|
||||
In der Premium Variante kann man aber auch FIDO U2F Sicherheitsschlüssel nutzen, wenn man ganz sicher sein will.
|
||||
|
||||
Die Synchronisation läuft zwischen allen Geräten tadellos.
|
||||
|
||||
## Premium Variante
|
||||
|
||||
Es gibt auch eine Premium Variante, die im Grunde 1 GB sicheren Speicherplatz bietet und FIDO U2F Sicherheitsschlüssel oder Duo Unterstützung.
|
||||
Die meisten sollten aber mit dem kostenlosen Funktionsumfang locker hinkommen. Ich selbst habe die Premium Variante gebucht, weniger wegenn der Funktionen, sondern um ein wenig zu unterstützen. 10 $ für die Premium Variante sind wirklich günstig.
|
||||
|
||||
Einen Familienaccount gibt es für 12 $ im Jahr für bis zu 5 Benutzer. Was ich hier sehr schön finde ist, dass man Einträge untereinander freigeben kann.
|
||||
|
||||
## Fazit
|
||||
|
||||
Bitwarden ist ein richtig guter Passwort Manager und ein tolles Beispiel dafür, dass Open Source Software einer kommerziellen Lösung in nichts nachstehen muss.
|
||||
|
||||
|
44
content/posts/bitwarden.en.md
Normal file
44
content/posts/bitwarden.en.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
title: "Bitwarden - Open Source password manager"
|
||||
date: 2020-08-20
|
||||
draft: false
|
||||
tags: ["security","tools"]
|
||||
archive: ["Technical Stuff"]
|
||||
series: [""]
|
||||
featuredImage: "/img/bitwarden/bitwarden.gif"
|
||||
---
|
||||
# Bitwarden - a great password manager
|
||||
|
||||
I used 1 Passwor for years to keep my passwords safe. The program has always served me well.
|
||||
When the company changed its licensing model a few years ago, I looked for an alternative.
|
||||
Since then, I have been using [Bitwarden](https://bitwarden.com/) instead and have never looked back since.
|
||||
|
||||
In contrast to other password managers such as 1 Passwor or Dashlane , Bitwarden is completely free and is available for all common platforms.
|
||||
Plugins for all common browsers are also available.
|
||||
|
||||
What I personally find very exciting is that Bitwarden is open source. In addition, Bitwarden operates a Bug Bounty Program via Hackerone in order to be able to quickly uncover bugs and security problems.
|
||||
|
||||
## Features
|
||||
|
||||
The functionality is basically what you would expect to from such programs. The interface reminds me a lot of 1Passwor which of course makes the switch much easier. In addition to access data, you can also save secure notes, credit cards or identity data.
|
||||
With a browser extension you can e.g. fill in credit card details or login forms with one click.
|
||||
|
||||

|
||||
|
||||
Functions such as 2-factor authentication are of course built in and work very well, e.g. if you have an authenticator app.
|
||||
In the premium version you can also use the FIDO U2F security key if you want to be completely safe.
|
||||
|
||||
The synchronization runs flawlessly between all devices.
|
||||
|
||||
## Premium Features
|
||||
|
||||
There is also a premium version, which basically offers 1 GB of secure storage space and FIDO U2F security key or duo support.
|
||||
Most of them should easily get there with the free range of functions. I booked the premium variant myself, not so much because of the functions, but to provide a little support. $ 10 for the premium variant is really cheap.
|
||||
|
||||
A family account is available for $ 12 a year for up to 5 users. What I think is very nice here is that you can share entries with each other.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Bitwarden is a really good password manager and a great example that open source software has to be in no way inferior to a commercial solution.
|
||||
|
||||
|
@ -0,0 +1,116 @@
|
||||
+++
|
||||
title = "Game Changer: Wie Baserow unseren Ansatz zur Datenverwaltung verändert hat"
|
||||
date = 2023-10-12
|
||||
draft = false
|
||||
tutorials = ["Datenverwaltung"]
|
||||
datamanagement = ["Baserow"]
|
||||
featuredImage = "/img/tutorials/baserow/baserow-excel-title.png"
|
||||
+++
|
||||
|
||||
## Einführung {#einführung}
|
||||
|
||||
Seit über einem Jahrzehnt ist meine Reise durch die Welt des E-Commerce ein sich ständig weiterentwickelndes Abenteuer. Zusammen mit meinem großartigen Team haben wir zahlreiche Versionen unserer Online-Shops sorgfältig erstellt, verfeinert und iteriert, und sind im Laufe der Jahre von früheren Lösungen wie Magento zu Shopify übergegangen. Neben der Auseinandersetzung mit den gestalterischen Feinheiten und der Abstimmung der Benutzererfahrung mit jeder Iteration habe ich erkannt, wie entscheidend unser Ansatz zur Produkt-Datenverwaltung tatsächlich ist.
|
||||
|
||||
{{< admonition type="tip" title="🧙 Dieser Artikel ist KI-übersetzt" open="false" >}}
|
||||
🚀 Auch wenn Deutsch meine Muttersprache ist, habe ich Englisch in diesem Blog und auch auf anderen Plattformen den Vorzug. Mein Ziel ist es mein Wissen mit so vielen Menschen wie möglich zu teilen, da komme ich mit der englischen Sprache einfach weiter. Die deutsche Version wurde daher mit Hilfe von KI übersetzt 😉 🤖, wenn Du Fehler findest, darfst Du sie gerne behalten.
|
||||
{{< /admonition >}}
|
||||
|
||||
Ob wir die Benutzeroberfläche in unserem Shopify-Shop optimierten oder Änderungen an unseren Produktlisten vornahmen, die effektive und effiziente Verwaltung unserer Produktdaten hat sich als Game-Changer erwiesen. Sie hat wirklich den Unterschied ausgemacht zwischen mühsamen, langwierigen Projekten und schnellen, handhabbaren Aufgaben, wodurch wir Dutzende von Stunden an Projektzeit sparen konnten, die wir in anderen Aktivitäten zur Geschäftserweiterung sinnvoller nutzen konnten.
|
||||
|
||||
Mit der Weiterentwicklung unserer Shops hat sich auch unser Ansatz zur Datenverwaltung verändert. Wie viele andere begannen wir mit einem simplen Ansatz, indem wir Produkte einzeln über das Backend des Shops eintrugen. Wir stellten jedoch schnell fest, dass diese Methode ineffizient war. Wir wechselten zu Tabellenkalkulationen, was es uns ermöglichte, mehrere Produkte auf einmal anzulegen. Doch die Beschränkungen der Standardtabellenkalkulationen erforderten eine Suche nach einer noch effizienteren Lösung. Diese Suche endete, als wir Baserow entdeckten. Jetzt fungiert Baserow als unser zentrales Repository für alle Produktdaten. Es speist alle Shops, verschiedene Verkaufskanäle und unser ERP-System, was ein kohärentes, straffes Datenverwaltungssystem bietet, das elegant mit unserem wachsenden Geschäft skaliert.
|
||||
|
||||
Der Zweck dieser Artikel ist nicht nur, meine eigene E-Commerce-Reise zu teilen. Ich möchte grundlegende Konzepte für die Datenverwaltung teilen, die riesige Mengen an Arbeitsstunden für E-Commerce-Unternehmen sparen können. Ich hoffe, Dir eine Einführung zu geben, wie Du eine dauerhafte und effiziente Lösung für die Datenverwaltung aufbauen und viel Arbeitszeit für wichtigere Geschäftsaufgaben, wie die Interaktion mit Deinen Kunden oder die Erstellung großartiger Produkte, frei machen kannst. Ich weiß nicht, wo Du Dich auf Deiner E-Commerce-Reise befindest, aber die Chancen stehen gut, dass Du ähnliche Herausforderungen wie ich hast.
|
||||
|
||||
|
||||
## Der Stand der Werkzeuge {#der-stand-der-werkzeuge}
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/spreadsheet-cyberpunk.png" alt="Excel bringt es einfach nicht" title="Excel bringt Ves einfach nicht" >}}
|
||||
|
||||
Während meiner unternehmerischen Reise bin ich auf zahlreiche Herausforderungen gestoßen, eine bedeutende davon war eine effektive Produkt-Datenverwaltung. Die Verwendung herkömmlicher Werkzeuge wie Excel, die zunächst unkompliziert erschien, offenbarte bald Probleme. Excel hat Beschränkungen hinsichtlich der Datengröße, es fehlen Funktionen für die Echtzeit-Zusammenarbeit, und es hat Schwierigkeiten mit der Komplexität, wenn die Datenmenge wächst. Kurz gesagt, es skaliert nicht besonders gut, besonders wenn ein E-Commerce-Unternehmen sein Produktangebot und seine Kundenbasis erweitert.
|
||||
|
||||
Mit dem Wachstum meines eigenen Shopify-Geschäfts wurden die Einschränkungen von Excel immer offensichtlicher. Als wir unser Produktangebot erweiterten, jeweils mit zahlreichen Attributen wie SKU-Codes, Farben, Größen und Preisen, wurden die Tabellenkalkulationen enorm komplex. Diese Komplexität war nicht nur schwierig zu handhaben, sondern sie erhöhte auch signifikant das Risiko menschlicher Fehler. Informationen waren über verschiedene Blätter und Dateien verstreut, was es den Teammitgliedern erschwerte, effektiv und effizient zusammenzuarbeiten. Im Grunde konnte Excel mit den steigenden Datenanforderungen unseres wachsenden Geschäfts nicht mithalten.
|
||||
|
||||
{{< admonition type="danger" title="10.000 Produkte in einer Tabelle" open="true" >}}
|
||||
Wir hatten Zeiten, in denen wir etwa 10.000 SKUs über 4-5 Plattformen in 5 verschiedenen Sprachen verwalten mussten. Dies in einer Tabelle zu verwalten, wäre ein endloser Alptraum gewesen 🙈
|
||||
{{< /admonition >}}
|
||||
|
||||
Das Ergebnis dieser Komplexitäten und Ineffizienzen waren verlorene Stunden - Stunden, die besser hätten genutzt werden können, um das Geschäft zu erweitern, Strategien zu entwerfen oder das Kundenerlebnis zu verbessern. Die häufigen Fehler aufgrund der unhandlichen Natur unserer Tabellen summierten sich zu einer erheblichen Menge an Zeit, die für Korrekturen aufgewendet werden musste, ganz zu schweigen von der Unterbrechung des Arbeitsablaufs. Anstatt uns bei unseren Operationen zu unterstützen, schufen die Einschränkungen von Werkzeugen wie Excel Engpässe in unserem Produkt-Datenverwaltungsprozess und bremsten uns aus, anstatt uns voranzutreiben.
|
||||
|
||||
|
||||
## Einführung von Baserow {#einführung-von-baserow}
|
||||
|
||||
Inmitten der Einschränkungen von Excel stieß ich auf Baserow. Dieses innovative Werkzeug, das die Funktionen einer Datenbank und einer Tabelle kombiniert, bot eine frische Perspektive auf die Verwaltung unserer wachsenden Produktdaten.
|
||||
|
||||
Die Stärke von Baserow liegt in seiner Flexibilität und Anpassungsfähigkeit, mit der Fähigkeit, Informationen auf nicht-lineare Weise zu speichern. Es präsentiert Informationen über die herkömmlichen Zeilen und Spalten hinaus, einschließlich der Möglichkeit für verknüpfte Datensätze, mehrere Ansichten und umfangreiche Felddaten wie Kontrollkästchen, Dropdowns, Anhänge und mehr.
|
||||
|
||||
Meine erste Begegnung mit Baserow markierte den Beginn einer transformierenden Reise in der Datenverwaltung. Im Vergleich zu Excel schien es mehr auf die Bedürfnisse eines dynamischen, schnell skalierenden E-Commerce-Unternehmens wie unserem abgestimmt zu sein. Die Frage war - könnte dies das bahnbrechende Werkzeug sein, das wir gesucht haben? Das Potenzial war definitiv da und es war höchste Zeit für uns, einzutauchen und zu erkunden.
|
||||
|
||||
|
||||
## Baserow als Lösung {#baserow-als-lösung}
|
||||
|
||||
Im Kern glänzt Baserow, wenn es um die Handhabung großer Mengen an Produkt-Daten geht. Im Gegensatz zu Excel, das oft langsamer und schwieriger zu bedienen wird, wenn die Listen wirklich groß werden, ist Baserow speziell dafür konzipiert, große Datenmengen zu handhaben. Das bedeutet, dass Baserow problemlos mithalten konnte, als unser Produktangebot wuchs.
|
||||
|
||||
Eines der tollen Dinge an Baserow ist, dass es jedem im Team erlaubt, gemeinsam am selben Ort, in Echtzeit zusammenzuarbeiten. Kein Jonglieren mehr mit mehreren Versionen derselben Excel-Datei - in Baserow sieht jeder immer die aktuellsten Informationen. Das macht die Teamarbeit viel leichter und bedeutet weniger Fehlerchancen.
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/baserow-views.png" alt="In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten" title="In Baserow kannst Du Deine Daten aus mehreren Blickwinkeln betrachten" >}}
|
||||
|
||||
Darüber hinaus bietet Baserow verschiedene Ansichten Deiner Daten. Du kannst mehrere Rasteransichten anpassen, um nur ausgewählte Teilmengen an Informationen anzuzeigen. Weitere Ansichtsoptionen beinhalten die Galerie für eine schnelle Übersicht, Kanban für die Verwaltung von Aktionselementen und den Kalender für die Verfolgung von Fristen.
|
||||
|
||||
Der Wechsel von Excel zu Baserow hat unsere Datenverwaltung erheblich verbessert. Wo wir einst mit unorganisierten Produktinformationen zu kämpfen hatten, hat Baserow uns ein ordentliches und leicht zugängliches Format zur Verfügung gestellt. Der Übergang zu Baserow hat uns erhebliche Zeit gespart und Fehler reduziert, was zu einem strafferem und besser handhabbarem Arbeitstag führte.
|
||||
|
||||
|
||||
## Baserow - Eine einzelne Quelle der Wahrheit {#baserow-eine-einzelne-quelle-der-wahrheit}
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/baserow-single-source-of-truth.png" alt="Es gibt nicht eine Wahrheit, nur die Wahrheit" title="Es gibt nicht eine Wahrheit, nur die Wahrheit" >}}
|
||||
|
||||
Mit den robusten Funktionen von Baserow existieren unsere Produktdaten nicht mehr verstreut über verschiedene Plattformen, Kanäle und Dateien. Sie sind an einem Ort gesammelt - in Airtable. Diese Funktion gab uns eine zuverlässige "einzige Quelle der Wahrheit", auf die jeder im Team zugreifen kann, was Inkonsistenzen und Verwirrung reduziert.
|
||||
|
||||
Baserow ermöglicht es uns, alle unsere Daten auf einen Blick zu sehen. Und es geht nicht nur ums Ansehen; es liefert reichhaltige Einblicke, die bei der Entscheidungsfindung helfen. In der Vergangenheit war es ein Alptraum, Daten über mehrere Excel-Tabellen hinweg zu referenzieren. Jetzt ist es eine einfache Aufgabe. Es ist, als hätte man eine Lupe auf die Daten, die auf das kleinste Detail zoomen und Ihnen in einem Augenblick eine Übersicht geben kann.
|
||||
|
||||
Der größte Vorteil für unsere Produkt-Datenverwaltung besteht darin, Daten und Tabellen zu verbinden. Dies gibt uns die Fähigkeit, ein zentrales Repository von Produkt-Daten als einzelne Quelle der Wahrheit zu verwalten. Aus diesem leiten wir verschiedene spezialisierte Tabellen für Plattformen wie Shopify und Amazon ab, die leicht exportiert werden können. Das macht es sehr einfach, kleine und sogar große Veränderungen zu handhaben.
|
||||
|
||||
{{< admonition type="tip" title="Pro Tipp" open="true" >}}
|
||||
Wenn Du etwas Mühe und Sorgfalt in die Struktur Deiner Produktdaten steckst, werden selbst große Änderungen sehr einfach sein. Es wird keine Rolle spielen, ob Du z.B. eine Preisänderung für 5 oder 5.000 Produkte 🚀🚀🚀 auf Shopify durchführen wollen. Der Aufwand wird nahezu unabhängig von der Anzahl der Datansätze sein.
|
||||
{{< /admonition >}}
|
||||
|
||||
|
||||
## Das Potenzial von Baserow {#das-potenzial-von-baserow}
|
||||
|
||||
Eine der größten Gewinne mit Baserow ist, wie viel Zeit es uns spart. Da es alle unsere Daten an einem leicht zu bedienenden Ort aufbewahrt, verschwenden wir keine Stunden mehr damit, durch chaotische Informationen zu wühlen. Dies hat unsere täglichen Aufgaben schneller und effizienter gemacht. Je nach Aufgabe kannst Du Deine Produktivität leicht verzehn- oder zwanzigfachen.
|
||||
|
||||
Aber die Zeitersparnis hört nicht dort auf. Wenn Du die leistungsstarke API von Baserow mit einem Tool zur Workflow-Automatisierung wie [n8n](https://www.n8n.io) verbindest, kannst Du sehr, sehr weit gehen. Nur einige Beispiele dafür, was wir in Bezug auf Automatisierung tun:
|
||||
|
||||
{{< admonition type="tip" title="Änderungen durchführen" open="true" >}}
|
||||
🚀 Bei Erstellung oder Änderung von Produkten automatisch die Produkte in Shopify anlegen oder ändern
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="KI🧠 gestützte Produktbeschreibungen" open="true" >}}
|
||||
🚀 Produktbeschreibungen mit KI🧠 auf Basis von Produktattributen automatisch erstellen 🧙
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="Übersetzungen" open="true" >}}
|
||||
🚀 Übersetzungen für Beschreibungen und andere Attribute mit KI🧠 erstellen
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="🧙 Magie" open="true" >}}
|
||||
🚀 Alles von den oben stehenden Punkten auf einmal, sobald eine neue Produktzeile hinzugefügt wird 😉 🤖
|
||||
{{< /admonition >}}
|
||||
|
||||
Die Auswirkungen, die Baserow auf unsere Arbeitsstunden und die allgemeine Zufriedenheit hat, können nicht hoch genug eingeschätzt werden.
|
||||
|
||||
|
||||
## Schlussfolgerung {#schlussfolgerung}
|
||||
|
||||
Wenn ich auf meine Reise zurückblicke, war der Übergang zu Baserow zweifellos eine der besten Entscheidungen, die ich für mein E-Commerce-Geschäft getroffen habe. Es ist mehr als ein Werkzeug; es ist ein zeitsparender, stressreduzierender Begleiter, der unsere Abläufe optimiert und unsere Produktivität gesteigert hat.
|
||||
|
||||
Wenn Du ein E-Commerce-Unternehmen besitzt und mit der Produkt-Datenverwaltung zu kämpfen hast, empfehle ich Dir von ganzem Herzen, Baserow in Betracht zu ziehen. Es mag etwas Aufwand bedeuten, es zunächst einzurichten, aber die Vorteile, die Du erzielen kannst - Effizienz, Genauigkeit und gesparte wertvolle Zeit - werden es wert sein.
|
||||
|
||||
Am Ende des Tages geht es beim Betrieb eines erfolgreichen E-Commerce-Geschäfts nicht nur darum, ein breites Sortiment an Produkten oder eine ausgeklügelte Marketingstrategie zu haben; es geht auch darum, die richtigen Werkzeuge zu verwenden, um Deine Abläufe effektiv zu verwalten, und für die Produkt-Datenverwaltung habe ich Baserow als das richtige Werkzeug gefunden.
|
||||
|
||||
{{< admonition type="tip" title="Was ist mit Airtable?" open="true" >}}
|
||||
Einige von Euch könnten **Airtable** als ähnliche Lösung kennen. Obwohl Airtable ein sehr gutes Produkt ist, bevorzuge ich persönlich freie und Open-Source-Lösungen.
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="success" title="Wissen ist Macht 🤓" open="true" >}}
|
||||
Teile diesen Betrag mit jemandem, für den er hilfreich ist.
|
||||
{{< /admonition >}}
|
@ -0,0 +1,112 @@
|
||||
+++
|
||||
title = "Game Changer: How Baserow Transformed Our Approach to Data Management"
|
||||
date = 2023-10-12
|
||||
draft = false
|
||||
tutorials = ["Data Management"]
|
||||
datamanagement = ["Baserow"]
|
||||
featuredImage = "/img/tutorials/baserow/baserow-excel-title.png"
|
||||
+++
|
||||
|
||||
## Introduction {#introduction}
|
||||
|
||||
For over a decade, my journey through the world of e-commerce has been an evolving adventure. Alongside my dedicated team, we have painstakingly built, refined, and iterated numerous versions of our online storefronts, transitioning from earlier solutions like Magento to Shopify over the years. Beyond grappling with the design intricacies and aligning the user experience with each iteration, I’ve come to realize how crucial our approach to product data management truly is.
|
||||
|
||||
Whether we were streamlining the user interface on our Shopify store or making amendments to our product listings, effective and efficient management of our product data emerged as a game-changer. It has truly made the difference between tedious, protracted projects and quick, manageable tasks, saving us dozens of hours in project time that we've been able to direct towards other business growth activities.
|
||||
|
||||
As our storefronts evolved, so did our approach to managing data. Like many others, we began with a simplistic approach, listing products individually via the store's backend. However, we quickly discovered the inefficiency in this method. We transitioned to spreadsheets, gaining the ability to set up multiple products at once. Yet, the limitations of standard spreadsheets prompted a search for an even more efficient solution. This search concluded when we discovered Airtable. Now, Baserow functions as our central repository for all product data. It feeds into all storefronts, various sales channels and our Enterprise Resource Planning (ERP) system, providing a cohesive, streamlined data management system that has scaled elegantly with our growing business.
|
||||
|
||||
The purpose of this journey is not just to share my own e-commerce journey. I want to share basic concepts for data management which can save huge amounts of working hours for e-commerce businesses. I will hopefully give you an introduction on how to build a lasting and efficient solution for data management and free lots of working hourse for more important business tasks like interacting with your customers or building great products. I don't know where you are on your e-commerce journey, but chances are that you face similar challenges like I do.
|
||||
|
||||
|
||||
## The state of tools {#the-state-of-tools}
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/spreadsheet-cyberpunk.png" alt="Excel just doesn’t cut it" title="Excel just doesn’t cut it" >}}
|
||||
|
||||
Throughout my entrepreneurial journey, I've grappled with numerous challenges, a significant one being effective product data management. Using traditional tools like Excel, while initially straightforward, soon exposed issues. Excel has limitations on data size, lacks real-time collaboration features, and struggles with complexity as data grows. In short, it doesn’t scale particularly well, especially as an e-commerce business expands its product range and customer base.
|
||||
|
||||
With the growth of my own Shopify business, the limitations of Excel became increasingly apparent. As we expanded our product range, each with numerous attributes like SKU codes, colors, sizes, and prices, the spreadsheets became enormously complex. This complexity was not just hard to manage, but it significantly increased the risk of human error. Information was scattered across different sheets and files, making it difficult for team members to collaborate effectively and efficiently. In essence, Excel was unable to keep up with the increasing data demands of our growing business.
|
||||
|
||||
{{< admonition type="danger" title="10.000 products in a spreadsheet" open="true" >}}
|
||||
We had times where we had around 10.000 SKUs to manage across 4-5 platforms in 5 different languages. Managing this in a spreadsheet would have been an endless nightmare 🙈
|
||||
{{< /admonition >}}
|
||||
|
||||
The upshot of these complexities and inefficiencies were hours lost - hours that could have been better spent on growing the business, strategizing, or improving customer experience. The frequent errors due to the unwieldy nature of our spreadsheets added up to a considerable amount of time spent on rectification, not to mention disruption of workflow. Instead of assisting in our operations, the limitations of tools like Excel were creating bottlenecks in our product data management process, slowing us down instead of propelling us forward.
|
||||
|
||||
|
||||
## Intoducing Baserow {#intoducing-baserow}
|
||||
|
||||
In the midst of Excel's limitations, I stumbled upon Baserow. This innovative tool, which combines the features of a database and a spreadsheet, offered a fresh perspective on managing our growing product data.
|
||||
|
||||
Baserow's strength lies in its flexibility and customizability, with the capacity to store information in a non-linear way. It presents information beyond the conventional rows and columns, including capability for linked records, multiple views, and rich field types like checkboxes, dropdowns, attachments, and more.
|
||||
|
||||
My initial encounter with Baserow marked the beginning of a transformative journey in data management. Compared to Excel, it seemed more aligned with the needs of a dynamic, rapidly scaling e-commerce business like ours. The question was - could this be the game-changing tool we've been searching for? The potential was definitely there and it was high time for us to dive in and explore.
|
||||
|
||||
|
||||
## Baserow as a Solution {#baserow-as-a-solution}
|
||||
|
||||
At its core, Baserow shines when it comes to handling large amounts of product data. Unlike Excel, which often becomes slower and more difficult to use with really large lists, Baserow is built specifically to handle big datasets. This means as our product range grew, Baserow could easily keep up.
|
||||
|
||||
One great thing about Baserow is that it lets everyone on the team work together in the same place, in real time. No more juggling multiple versions of the same Excel file - in Baserow, everyone always sees the most up-to-date information. This makes teamwork a lot smoother, and means less chance of mistakes happening.
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/baserow-views.png" alt="In Baserow you can view your data from different perspectives" title="In Baserow you can view your data from different perspectives" >}}
|
||||
|
||||
Additionally, Baserow provides various views of your data. You can customize multiple grid views to display selected subsets only. Other view options include Gallery for quick overview, Kanban for managing actionable items and Calendar for deadline tracking.
|
||||
|
||||
Switching from Excel to Baserow has vastly improved our data management. Where we once struggled with disorganized product information, Baserow has provided a neat and easily accessible format. The transition to Baserow has saved us significant time and reduced errors, resulting in a more streamlined and manageable workday.
|
||||
|
||||
|
||||
## Baserow - A Single Source of Truth {#baserow-a-single-source-of-truth}
|
||||
|
||||
{{< figure src="/img/tutorials/baserow/baserow-single-source-of-truth.png" alt="There is not one truth, just the truth" title="There is not one truth, just the truth" >}}
|
||||
|
||||
With Baserow's robust features, our product data no longer exists scattered across disparate platforms, channels, and files. It's gathered in one place - in Airtable. This feature gave us a reliable "single source of truth" that everyone in the team can access, reducing inconsistencies and confusion.
|
||||
|
||||
Baserow allows us to see all our data at a glance. And it’s not just viewing; it provides rich insights which help in decision-making. In the past, cross-referencing data across multiple Excel sheets was a nightmare. Now, it's a simple task. It's like having a magnifying glass on your data that can zoom in on the tiniest detail and zoom out to give you an overview in an instant.
|
||||
|
||||
The biggest advantage for our product data manageent is to connect data and tables. This gives us the ability to manage one central repository of peoduct data as a single source of truth. From this we derive various specialized tables for platforms like Shopify and Amazon which can be easily exported. That makes it very easy to handle small and even large scale changes.
|
||||
|
||||
{{< admonition type="tip" title="Pro Tip" open="true" >}}
|
||||
When you put some effort and care into the structure of your product data even large changes will be very easy. It will not matter if you want to push a price change for 5 or 5.000 🚀🚀🚀 products to Shopify.
|
||||
{{< /admonition >}}
|
||||
|
||||
|
||||
## The Potential of Baserow {#the-potential-of-baserow}
|
||||
|
||||
One of the biggest wins with Baserow is how much time it saves us. Because it keeps all our data in one easy-to-use place, we're not wasting hours digging through messy information anymore. This has made our daily tasks faster and more efficient. Depending on the task you can easily 10x or 20x or productivity.
|
||||
|
||||
But the time saving doesn't stop there. When you connect Baserow's powerful API to a workflow automation tool like [n8n](https://www.n8n.io) you can go very very far. Just some examples what we are dong when it comes to automation:
|
||||
|
||||
{{< admonition type="tip" title="Push changes" open="true" >}}
|
||||
🚀 Create new products of push changes in products automatically to Shopify
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="AI🧠 powered produt desriptions" open="true" >}}
|
||||
🚀 Create product descriptions with AI🧠 based on product attributes automatially 🧙
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="Translations" open="true" >}}
|
||||
🚀 Create translations for descriptions and other attributes with AI🧠
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="tip" title="🧙 Magic" open="true" >}}
|
||||
🚀 Do all of the above each time a new product row is added 😉 🤖
|
||||
{{< /admonition >}}
|
||||
|
||||
The impact Baserow has on our working hours and overall satisfaction can't be overstated.
|
||||
|
||||
|
||||
## Conclusion {#conclusion}
|
||||
|
||||
Looking back on my journey, transitioning to Baserow has undoubtedly been one of the best decisions I’ve made for my e-commerce business. It's more than a tool; it's a time-saving, stress-reducing companion that's streamlined our operations and boosted our produtivity.
|
||||
|
||||
If you're an e-commerce business owner struggling with product data management, I wholeheartedly recommend considering Baserow. It may take a some effort to set up initially, but the benefits you'll reap - efficiency, accuracy, and precious time saved - will be well worth it.
|
||||
|
||||
At the end of the day, running a successful e-commerce business isn’t just about having a wide range of products or a sophisticated marketing strategy; it’s also about using the right tools to manage your operations effectively, and for product data management, I've found Airtable to be the right tool.
|
||||
|
||||
{{< admonition type="tip" title="What about Airtable?" open="true" >}}
|
||||
Some of you might be aware of **Airtable** as a similar solution. Although Airtable is a very good product I personally prefer free and open source solutions.
|
||||
{{< /admonition >}}
|
||||
|
||||
{{< admonition type="success" title="Knowledge is power 🤓" open="true" >}}
|
||||
Share this post with someone for whom it's helpful.
|
||||
{{< /admonition >}}
|
76
content/posts/dgraph1.de.md
Normal file
76
content/posts/dgraph1.de.md
Normal file
@ -0,0 +1,76 @@
|
||||
---
|
||||
title: "DGraph - Teil 1: Installation & erste Schritte"
|
||||
date: 2020-03-13
|
||||
draft: false
|
||||
tags: ["datenbank","graphql","grpc","graph","graphql"]
|
||||
archive: ["Dgraph Grundlagen"]
|
||||
---
|
||||
Ich war auf der Suche nach einem Datenbanksystem für ein internes Projekt in unserer Firma. Aus diesem Grund habe ich mir verschiedene Systeme angesehen. Neben alten Bekannten aus dem SQL oder NoSQL Umfeld bin ich auf etwas sehr interessantes gestoßen. Graph Datenbanken.
|
||||
Ohne großartig auf die Unterschiede eingehen zu wollen, hier die für mich interessantesten Aspekte, weshalb ich mich entschieden habe für meine Projekt :eine Graphdatenbank zu wählen:
|
||||
|
||||
- kein festes Datenbankschema erforderlich
|
||||
- Daten werden in Form Knoten und Verbindungen abgebildet
|
||||
- starker Fokus auf die Beziehungen Datensätzen zueinander
|
||||
- präziser Abruf Daten auch über Beziehungen hinweg
|
||||
- gRPC Server eingebaut
|
||||
- GraphQL Server eingebaut
|
||||
|
||||
## Dgraph Server starten
|
||||
|
||||
Am einfachsten lässt sich Dgraph mit Docker starten. Da wir persistente Daten haben wollen erstellen wir einen Ordner dgraph den wir unserem Container als Volume zur Verfügung stellen.
|
||||
```sh
|
||||
mkdir ~/dgraph
|
||||
```
|
||||
```sh
|
||||
docker run -p 8080:8080 -p 9080:9080 -p 8000:8000 -it -v ~/dgraph:/dgraph dgraph/standalone:latest
|
||||
```
|
||||
Damit wird dgraph gestartet. Ist der Container noch nicht vorhanden wird das Image heruntergeladen. Zur Zeit ist die aktuelle Version die 2.0. Einen Überblick über die Version gibt es auf dem Docker Hub unter https://hub.docker.com/r/dgraph/dgraph/tags
|
||||
|
||||
Was bekommen wir hier?
|
||||
- einen HTTP Dienst auf Port 8080 mit den Endpunkten /admin und /graphql
|
||||
- einen HTTP Dienst auf Port 8000 mit dem WebInterface für Dgraph namens Ratel
|
||||
- einen gRPC Dienst auf Port 9080
|
||||
|
||||
|
||||
## Die ersten Datensätze speichern und wieder abrufen
|
||||
|
||||
Jetzt kann man auch schon mit der Datenbank interagieren und zwar auf eine der 3 oben stehenden Arten.
|
||||
Wir können uns unter http://localhost:8000/ in Ratel einloggen und unter Console anfangen die ersten Daten zu speichern. Dazu klicken wir erst einmal auf Mutation.
|
||||
Unsere erste Mutation sieht so aus:
|
||||
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
}
|
||||
}
|
||||
```
|
||||
Hiermit erstellen wir mehrere Personen mit den Feldern name und hometown. Das Feld friend_of ist eine Verbindung zu einem anderen Datensatz. Wer sich wegen des Formates wundert, es handelt sich hier um das RDF N-Quad Format. Keine Sorge deswegen, dazu kommen wir noch und das Format ist relativ einfach.
|
||||
|
||||
Jetzt können wir die Daten abfragen. Dazu wählen wir in der Konsole die Query aus und geben folgendes ein:
|
||||
```graphql
|
||||
{
|
||||
all(func: has(name)){
|
||||
uid
|
||||
name
|
||||
hometown
|
||||
friend_of{
|
||||
uid
|
||||
name
|
||||
hometown
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Wir erstellen eine Abfrage all und nutzen dazu die Funktion has. Damit suchen wir alle Datensätze, die das Feld name haben. Dann geben wir an, dass wie die Felder ui, name, hometown und friend_of haben möchten.
|
||||
Da friend_of eine Verbindung zu einem anderen Datensatz ist geben wir hier wieder an welche Felder wir gerne haben möchten.
|
||||
|
||||
Wir haben jetzt erst einmal gesehen, wie man Dgraph startet und die ersten Schritte geht. Bisher haben wir ja auch nur mit Ratel gearbeitet. Der GraphQL endpunkt ist zwar gestartet, aber meckert, dass wir kein Schema haben. Außerdem haben wird RDF N-Quads kennengelernt. Hier müssen wir auf jeden Fall nochmal ansetzen 😊
|
73
content/posts/dgraph1.en.md
Normal file
73
content/posts/dgraph1.en.md
Normal file
@ -0,0 +1,73 @@
|
||||
---
|
||||
title: "Dgraph - Part 1: installation & first steps"
|
||||
date: 2020-03-23
|
||||
draft: false
|
||||
tags: ["database","graphql","grpc","graph"]
|
||||
archive: ["Dgraph Basics"]
|
||||
---
|
||||
I was looking for a database system for an internal project in our company. For this reason, I looked at various systems. In addition to old acquaintances from the SQL or NoSQL environments, I came across something very interesting. Graph databases.
|
||||
Without wanting to go into great detail, here are the most interesting aspects for me and the reason I decided to choose a graph database for my project:
|
||||
|
||||
- no fixed database schema required
|
||||
- data is represented in the form of nodes and connections
|
||||
- strong focus on relationships between data sets
|
||||
- precise retrieval of data even across relationships
|
||||
- gRPC server built in
|
||||
- GraphQL server built in
|
||||
|
||||
## Start Your Dgraph Server
|
||||
|
||||
The easiest way to start Dgraph is with Docker. Since we want persistent data, we create a folder dgraph which we make available to our container as a volume.
|
||||
```sh
|
||||
mkdir ~/dgraph
|
||||
```
|
||||
```sh
|
||||
docker run -p 8080:8080 -p 9080:9080 -p 8000:8000 -it -v ~/dgraph:/dgraph dgraph/standalone:latest
|
||||
```
|
||||
This starts dgraph. If the container does not yet exist, the image is downloaded. Currentlythe version is 2.0. An overview of the versions available on Docker Hub can bou found at https://hub.docker.com/r/dgraph/dgraph/tags
|
||||
What do we get here?
|
||||
- an HTTP service on port 8080 with the endpoints /admin and /graphql
|
||||
- an HTTP service on port 8000 with the web interface for Dgraph called Ratel
|
||||
- a gRPC service on port 9080
|
||||
|
||||
|
||||
## Save and retrieve the first records
|
||||
|
||||
Now you can already interact with the database in one of the 3 ways mentioned above.
|
||||
We can login at http://localhost:8000/ and use Ratel to start storing the first data using the menu item Console. To do this, we first click on Mutation.
|
||||
Our first mutation looks like this:
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
}
|
||||
}
|
||||
```
|
||||
We use this to create several people with the fields name and hometown. The friend_of field is a connection to another data record. If you are wondering about the format, this is the RDF N-Quads format. Don't worry, we'll get to that and the format is relatively simple.
|
||||
Now we can query the data. To do this, we select the query in the console and enter the following:
|
||||
```graphql
|
||||
{
|
||||
all(func: has(name)){
|
||||
uid
|
||||
name
|
||||
hometown
|
||||
friend_of{
|
||||
uid
|
||||
name
|
||||
hometown
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
We create a query all using the has function. We use it to search for all data records that have the field name. Then we indicate that we want to have the fields ui, name, hometown and friend_of.
|
||||
Since friend_of is a connection to another data record, we indicate here which fields we would like to have.
|
||||
|
||||
We have just seen how to start Dgraph and take the first steps. So far we have only worked with Ratel. The GraphQL endpoint is started, but complains that we don't have a schema. We also got to know RDF N-Quads. We definitely have to pick up here 😊
|
132
content/posts/dgraph2.de.md
Normal file
132
content/posts/dgraph2.de.md
Normal file
@ -0,0 +1,132 @@
|
||||
---
|
||||
title: "DGraph - Teil 2: GraphQL Schema und die ersten Schritte"
|
||||
date: 2020-03-16
|
||||
draft: false
|
||||
tags: ["datenbank","graphql","grpc","graph"]
|
||||
archive: ["Dgraph Grundlagen"]
|
||||
---
|
||||
Beim letzten mal haben wir den Server gestartet und unsere ersten Daten gespeichert. Hierzu hatten wir das Ratel Interface Dgraph genutzt. Wir haben auch einen GraphQl Endpunkt bereitgestellt. Hier erzeugen wir die selben Daten und Verbindungen wie schon zuvor in Ratel.
|
||||
Im Moment können wir mit unseren GraphQL Endpunkt nichts machen, da GraphQL ein Schema benötigt. Hierzu erstellen wir eine Datei namens schema.graphql:
|
||||
```graphql
|
||||
type Person {
|
||||
name: String! @id
|
||||
hometown: String
|
||||
friend_of: [Person]
|
||||
}
|
||||
```
|
||||
Die Struktur ist so wie in Teil 1. Zusätzlich definieren wir das Feld name als Pflichtfeld und sorgen dafür, dass die Einträge eindeutig sind. Das erreichen wir mit der Direktive @i. Man könnte natürlich auch ein zusätzliches Feld mit einer eindeutigen Id bestimmen, aber für unser Beispiel soll das erstmal so reichen.
|
||||
Das Feld friend_of wird als Liste vom Typ Person definiert. Das bedeutet, dass hier in Dgraph eine Verbindung zu einer anderen Person erstellt.
|
||||
Nun können wir unser Schema an den admin Endpunkt übermitteln:
|
||||
|
||||
```sh
|
||||
curl -X POST localhost:8080/admin/schema -d '@schema.graphql'
|
||||
```
|
||||
Dgraph hat unserem Schema deutlich mehr Komplexität hinzugefügt. Wenn wir uns das Schema über einen GraphQL Client ansehen sehen wir grob zusammengefasst folgende Zusätze:
|
||||
|
||||
- definierte Mutation für das erstellen, ändern oder löschen Personen
|
||||
- definierte Queries für das abrufen Personen
|
||||
- verschiedene Input Typen für das filtern und sortieren, sowie Paginierung
|
||||
|
||||
## Die ersten Datensätze speichern
|
||||
Da wir das Schema übermittelt haben können wir jetzt mit dem GraphQL Endpunkt interagieren. Im Vergleich zu den RDF N-Quads aus Teil 1 sieht das hinzufügen der gleichen Personen etwas komplexer aus.
|
||||
Außerdem lassen sich die Verknüpfungen über friendof nur teilweise direkt beim erstellen setzen. Wir können zwar für Harry Osborne die beiden anderen Personen im Zuge der friend_of Verknüpfung miterstellen, trotzdem müssen wir anschließend noch Mary Jane Watson aktualisieren.
|
||||
Würde wir bei Mary Jane Watson unseren Peter Parker ebenfalls im Zuge der friend_of Verknüpfung erstellen würde Peter Parker 2x in der Datenbank existieren.
|
||||
```graphql
|
||||
mutation addPerson {
|
||||
addPerson(input:[
|
||||
{
|
||||
name: "Harry Osborne",
|
||||
hometown: "New York",
|
||||
friend_of: [
|
||||
{
|
||||
name: "Mary Jane Watson",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Peter Parker",
|
||||
hometown: "New York",
|
||||
},
|
||||
|
||||
]
|
||||
}
|
||||
])
|
||||
{
|
||||
person{
|
||||
name
|
||||
}
|
||||
},
|
||||
updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Mary Jane Watson"}}
|
||||
set: {friend_of: [{name: "Peter Parker"}]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Ein Hinweis noch zur updatePerson Mutation: Wir haben ja in diesem Beispiel die updatePerson Mutation einfach an die addPerson Mutation angehängt. Würden wir jetzt versuchen eine weitere updatePerson Mutation anzuhängen würde GraphQL einen Fehler melden:
|
||||
|
||||
Fields updatePerson conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.
|
||||
|
||||
Wenn wir jetzt aber in Zeile 21 und 34 mit Aliases arbeiten gibt es kein Problem.
|
||||
```graphql
|
||||
mutation addPerson {
|
||||
addPerson(input:[
|
||||
{
|
||||
name: "Harry Osborne",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Peter Parker",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Mary Jane Watson",
|
||||
hometown: "New York",
|
||||
},
|
||||
])
|
||||
{
|
||||
person{
|
||||
name
|
||||
}
|
||||
},
|
||||
mary: updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Mary Jane Watson"}}
|
||||
set: {friend_of: [{name: "Peter Parker"}]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
},
|
||||
harry: updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Harry Osborne"}}
|
||||
set: {friend_of: [
|
||||
{name: "Mary Jane Watson"},
|
||||
{name: "Peter Parker"}
|
||||
]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Wie man sieht kann man mit Dgraph recht schnell mit der Nutzung GraphQL loslegen. Dabei übernimmt Dgraph so einige Dinge, die man sonst selbst machen müsste.
|
||||
|
||||
Beim nächsten Mal schauen wir uns dann die RDF N-Quads noch einmal genauer an 😊
|
130
content/posts/dgraph2.en.md
Normal file
130
content/posts/dgraph2.en.md
Normal file
@ -0,0 +1,130 @@
|
||||
---
|
||||
title: "Dgraph - Part 2: GraphQL, Schema & first steps"
|
||||
date: 2020-03-24
|
||||
draft: false
|
||||
tags: ["database","graphql","grpc","graph"]
|
||||
archive: ["Dgraph Basics"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Last time we started the server and saved our first data. For this we used Dgraph's Ratel Interface. We also provided a GraphQl endpoint. Here we create the same data and connections as before in Ratel.
|
||||
At the moment we cannot do anything with our GraphQL endpoint because GraphQL needs a schema. For this we create a file called schema.graphql:
|
||||
```graphql
|
||||
type Person {
|
||||
name: String! @id
|
||||
hometown: String
|
||||
friend_of: [Person]
|
||||
}
|
||||
```
|
||||
The structure is the same as in part 1. In addition, we define the field name as a mandatory field and ensure that the entries are unique. We achieve this with the directive @i. You could of course also specify an additional field with a unique ID, but for our example this should be enough for now.
|
||||
The field friend_of is defined as a list of the type person. This means that Dgraph will create a connection to another person.
|
||||
Now we can send our schema to the admin endpoint:
|
||||
```sh
|
||||
curl -X POST localhost:8080/admin/schema -d '@schema.graphql'
|
||||
```
|
||||
Dgraph has added significantly more complexity to our schema. If we look at the schema using a GraphQL client, we see the following additions:
|
||||
- predefined mutation for creating, changing or deleting people
|
||||
- predefined queries for retrieving people
|
||||
- Different input types for filtering and sorting, as well as pagination
|
||||
|
||||
## Store the first records
|
||||
|
||||
Now that we've submitted the schema, we can interact with the GraphQL endpoint. Compared to the RDF N-Quads from Part 1, adding the same people looks a bit more complex.
|
||||
In addition, the links via friendof can only be partially set directly when they are created. We can use Harry Osborne to create the other two people as part of the friend_of connection, but we still have to update Mary Jane Watson afterwards.
|
||||
When we use Mary Jane Watson to create our Peter Parker as part of the friend_of connection Peter Parker would exist twice in the database.
|
||||
```graphql
|
||||
mutation addPerson {
|
||||
addPerson(input:[
|
||||
{
|
||||
name: "Harry Osborne",
|
||||
hometown: "New York",
|
||||
friend_of: [
|
||||
{
|
||||
name: "Mary Jane Watson",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Peter Parker",
|
||||
hometown: "New York",
|
||||
},
|
||||
|
||||
]
|
||||
}
|
||||
])
|
||||
{
|
||||
person{
|
||||
name
|
||||
}
|
||||
},
|
||||
updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Mary Jane Watson"}}
|
||||
set: {friend_of: [{name: "Peter Parker"}]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
A note about the updatePerson mutation: In this example, we simply added the updatePerson mutation to the addPerson mutation. If we tried to add another updatePerson mutation, GraphQL would report an error:
|
||||
Fields updatePerson conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.
|
||||
|
||||
If we work with Aliases in lines 21 and 34, there is no problem.
|
||||
```graphql
|
||||
mutation addPerson {
|
||||
addPerson(input:[
|
||||
{
|
||||
name: "Harry Osborne",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Peter Parker",
|
||||
hometown: "New York",
|
||||
},
|
||||
{
|
||||
name: "Mary Jane Watson",
|
||||
hometown: "New York",
|
||||
},
|
||||
])
|
||||
{
|
||||
person{
|
||||
name
|
||||
}
|
||||
},
|
||||
mary: updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Mary Jane Watson"}}
|
||||
set: {friend_of: [{name: "Peter Parker"}]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
},
|
||||
harry: updatePerson(input:
|
||||
{
|
||||
filter: {name: {eq: "Harry Osborne"}}
|
||||
set: {friend_of: [
|
||||
{name: "Mary Jane Watson"},
|
||||
{name: "Peter Parker"}
|
||||
]}
|
||||
},
|
||||
){
|
||||
person{
|
||||
name
|
||||
friend_of{
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
As you can see, with Dgraph you can start using GraphQL quite quickly. Dgraph creates the CRUD functionality for you. You do not need to write resolvers or anything.
|
||||
Next time we will take a closer look at the RDF N-Quads
|
120
content/posts/dgraph3.de.md
Normal file
120
content/posts/dgraph3.de.md
Normal file
@ -0,0 +1,120 @@
|
||||
---
|
||||
title: "DGraph - Teil 3: RDF N-Quads"
|
||||
date: 2020-03-28
|
||||
draft: false
|
||||
tags: ["datenbank","graphql","grpc","graph","RDF","N-Quads"]
|
||||
archive: ["Dgraph Grundlagen"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Das hinzufügen oder ändern Daten wird in Dgraph so wie in GraphQL auch als Mutation bezeichnet. Das Eingabeformat sind hier sogenannte Triples im RDF N-Quad Format.
|
||||
So ein Triple besteht aus 3 Bausteinen, einem Subjekt, einem Prädikat und einem Objekt. Da klingelt doch was? Ja genau, so etwas gab es vor graumer Zeit einmal in der Schule. Die Begriffe Subjekt, Prädikat und Objekt sind hier nicht zufällig gewählt:
|
||||
Ein Triple ist eine Aussage, die Subjekt und Objekt miteinander in Beziehung setzt,
|
||||
|
||||
z.B. Peter Parker ---befreundet mit --> Mary Jane Watson
|
||||
|
||||
Eine ausführliche Beschreibung dazu findet Ihr auf [Wikipedia](https://de.wikipedia.org/wiki/Resource_Description_Framework).
|
||||
|
||||
Im ersten Teil haben wir ja schon mit Triples gearbeitet, wenn auch wenig dazu erklärt. Der Aufbau der Triples für eine Mutation in Dgraph ist eigentlich genau so einfach wie das oben stehende Beispiel:
|
||||
```graphql
|
||||
<subject> <predicate> <object> .
|
||||
|
||||
<0x01> <name> "Peter Parker" .
|
||||
<0x02> <name> "Mary Jane Watson" .
|
||||
<0x01> <friend_of> <0x02> .
|
||||
```
|
||||
Hier haben wir einen Knoten mit der Id 0x01. Dieser Knoten hat ein Feld name, dem wir den Wert Peter Parker zugewiesen haben. Beim Knoten 0x02 haben wir Mary Jane Watson als Namen zugewiesen. Anschließend verbinden wir die beiden Datansätze mit dem Prädikat friend_of. Der . am Ende signalisiert das Ende der Zeile.
|
||||
Hat ein Knoten noch mehr Felder oder andere Verbindungen kann man nach diesem Schema Zeile für Zeile weitermachen.
|
||||
Das o.g. genannte Beispiel setzt natürlich voraus, dass wir die Ids der Knoten kennen.
|
||||
|
||||
## Mutationen in Dgraph
|
||||
|
||||
In Teil hatten wir ja schon die erste Mutation in diesem Format:
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
}
|
||||
}
|
||||
```
|
||||
Hierbei haben wir neue Datensätze erzeugt. Damit wir das effizient tun können hat Dgraph die Möglichkeit mit leeren Knoten zu arbeiten. Hierbei können wir temporäre Ids nutzen um einen Bezug zwischen Datensätzen herzustellen. Das Format hierbei ist _:Bezeichnung.
|
||||
Dadurch können wir mehere Felder setzen und auch gleich Beziehungen mehrerer Knoten untereinander definieren.
|
||||
|
||||
## Kombination mit Queries
|
||||
|
||||
Richtig schick wird es in der Kombination Queries und Mutationen. Wir können in Dgraph Variablen innerhalb einer Query definieren, die wir dann in in einer Mutation nutzen können.
|
||||
```graphql
|
||||
upsert {
|
||||
query {
|
||||
q(func: eq(name, "Peter Parker")) {
|
||||
Peter as uid
|
||||
name
|
||||
}
|
||||
}
|
||||
mutation {
|
||||
set {
|
||||
uid(Peter) <name> "Spiderman" .
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
In diesem Beispiel suchen wir erst im Feld name nach Peter Parker und weisen der Variable Peter den Wert der uid unseres Suchergebnisses zu. Die Variable Peter können wir dann in der Mutation nutzen um den Knoten zu aktualisieren.
|
||||
Die Möglichkeit hier mit Variablen zu arbeiten ist einfach großartig, weil Sie Zeit und vor allem Code spart.
|
||||
|
||||
## Schemadefinition mit RDF N-Quads
|
||||
|
||||
Ich habe oben ein wenig geschummelt. Die Kombination aus Query und Mutation funktioniert zwar, aber nur wenn man zuvor die Definition des Feldes name ein wenig ändert.
|
||||
Damit wir per Funktion das Feld name durchsuchen können müssen wir Dgraph erst noch mitteilen, dass es sich um ein suchbares Feld handelt. Dazu müsst Ihr im Ratel Interface auf den Punkt Schema klicken und könnt nun Bulk Edit klicken:
|
||||
|
||||

|
||||
|
||||
Die Bulk Edit Funktion macht dann Sinn, wenn Ihr mehrere Einträge überarbeiten wollt. Wenn Ihr jedoch nur einen überarbeiten wollt könnt Ihr auch einfach auf den Feldnamen klicken:
|
||||
|
||||

|
||||
|
||||
Damit haben wir das Feld name suchbar gemacht und jetzt funktioniert auch die upsert mutation. Man kann das Schema auch über einen der verfügbaren Clients übermitteln. Eine Schemaänderung über http z.B. mit cURL ist aus Sicherheitsgründen nicht möglich.
|
||||
|
||||
DGraph erstellt automatisch ein Datenschema anhand der Daten, die man speichert. Das bedeutet man muss sich im ersten Moment wenig Gedanken darum machen. Man sieht am oben stehenden Beispiel aber, dass man schon für eine einfache Suche nach einem bestimmten Feld nicht mehr ganz um das Thema Schema herumkommt.
|
||||
Das ist auch durchaus sinvoll. Wenn jedes Fel Hause aus suchbar wäre, dann wäre das nicht besonders performant.
|
||||
|
||||
## Mutationen im JSON Format
|
||||
|
||||
Man kann Mutationen auch im JSON Format übermitteln was gerade bei komplexen Datensätzen eine enorme Erleichterung darstellt.
|
||||
|
||||
```json
|
||||
{
|
||||
"set": [
|
||||
{
|
||||
"name": "Peter Parker",
|
||||
"hometown": "New York"
|
||||
},
|
||||
{
|
||||
"name": "Mary Jane Watson",
|
||||
"hometown": "New York"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Auch die Nutzung Variablen aus einer Query für eine Upsert Operation ist möglich:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "{ var(func: eq(name, \"Peter Parker\")) { Peter as uid}}",
|
||||
"set":
|
||||
{
|
||||
"uid": "uid(Peter)",
|
||||
"name": "Batman"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Das ist nur ein grober Überblick über das Thema, In der DGraph Dokumentation finden sich noch weitere Beispiele und Infos.
|
||||
[DGraph Dokumentation](https://dgraph.io/docs/master/mutations/#language-and-rdf-types)
|
120
content/posts/dgraph3.en.md
Normal file
120
content/posts/dgraph3.en.md
Normal file
@ -0,0 +1,120 @@
|
||||
---
|
||||
title: "DGraph - Part 3: RDF N-Quads"
|
||||
date: 2020-03-31
|
||||
draft: false
|
||||
tags: ["database","graphql","grpc","graph","RDF","N-Quads"]
|
||||
archive: ["Dgraph basics"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Adding or changing data is also called a mutation in Dgraph as in GraphQL. The input format here are so-called triples in the RDF N-Quad format.
|
||||
Such a triple consists of 3 components, a subjec , a predicate and a object. Something is ringing? Yes, exactly, there was something like that back in school a long time ago. The terms subject, predicate and object are not chosen at random here:
|
||||
A triple is a statement that relates subject and object to each other,
|
||||
|
||||
e.g. Peter Parker ---is a friend of --> Mary Jane Watson
|
||||
|
||||
A detailed description can be found on [Wikipedia](https://en.wikipedia.org/wiki/Resource_Description_Framework).
|
||||
|
||||
In the first part we already worked with triples, although little was explained about it. Building triples for a mutation in Dgraph is actually just as simple as the example above:
|
||||
```graphql
|
||||
<subject> <predicate> <object> .
|
||||
|
||||
<0x01> <name> "Peter Parker" .
|
||||
<0x02> <name> "Mary Jane Watson" .
|
||||
<0x01> <friend_of> <0x02> .
|
||||
```
|
||||
Here we have a node with the id 0x01. This node has a field name to which we have assigned the value Peter Parker. At node 0x02 we assigned Mary Jane Watson as a name. Then we connect the two data sets with the predicate friend_of. The . at the end signals the end of the line.
|
||||
If a node has more fields or other connections, you can continue line by line according to this scheme.
|
||||
The above The example given assumes, of course, that we know the Ids of the nodes.
|
||||
|
||||
## Mutations in Dgraph
|
||||
|
||||
In part we already had the first mutation in this format:
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
}
|
||||
}
|
||||
```
|
||||
We have created new data records. So that we can do this efficiently, Dgraph has the option to work with empty nodes. Here we can use temporary IDs to create a relationship between data records. The format here is _: description.
|
||||
This allows us to set several fields and to define relationships between several nodes.
|
||||
|
||||
## Combination of Queries and Mutations
|
||||
|
||||
It gets really efficient in the combination of queries and mutations. In Dgraph we can define variables within a query, which we can then use in a mutation.
|
||||
```graphql
|
||||
upsert {
|
||||
query {
|
||||
q(func: eq(name, "Peter Parker")) {
|
||||
Peter as uid
|
||||
name
|
||||
}
|
||||
}
|
||||
mutation {
|
||||
set {
|
||||
uid(Peter) <name> "Spiderman" .
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
In this example, we first look for Peter Parker in the name field and assign the Peter variable the value of the uid of our search result. We can then use the variable Peter in the mutation to update the node.
|
||||
The ability to work with variables here is great because it saves you time and, above all, code.
|
||||
|
||||
## Schema definition with RDF N-Quads
|
||||
|
||||
I cheated a bit above. The combination of query and mutation works, but only if you change the definition of the field name a little beforehand.
|
||||
We need to be able to search on the field name with a function, so we have to tell Dgraph that it is a searchable field. To do this you have to click on the Schema in the Ratel interface and now you can click Bulk Edit:
|
||||
|
||||

|
||||
|
||||
The Bulk Edit function makes sense if you want to edit several entries. However, if you only want to revise one, you can simply click on the field name:
|
||||
|
||||

|
||||
|
||||
We have now made the field name searchable and now the upsert mutation works. The scheme can also be transmitted via one of the available clients. A scheme change via http e.g. with cURL is not possible for security reasons.
|
||||
|
||||
DGraph automatically creates a data schema based on the data you save. That means you don't have to worry about it at first. You can see from the example above, however, that even a simple search for a specific field can no longer avoid the topic of schema.
|
||||
This makes a lot of sense. If every field were searchable from home, it would not be particularly performant.
|
||||
|
||||
## Mutations in the JSON Format
|
||||
|
||||
Mutations can also be transmitted in JSON format, which is an enormous relief, especially for complex data sets.
|
||||
|
||||
```json
|
||||
{
|
||||
"set": [
|
||||
{
|
||||
"name": "Peter Parker",
|
||||
"hometown": "New York"
|
||||
},
|
||||
{
|
||||
"name": "Mary Jane Watson",
|
||||
"hometown": "New York"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
It is also possible to use variables from a query for an upsert operation:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "{ var(func: eq(name, \"Peter Parker\")) { Peter as uid}}",
|
||||
"set":
|
||||
{
|
||||
"uid": "uid(Peter)",
|
||||
"name": "Batman"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This is only a rough overview of the topic. There are further examples and information in the DGraph documentation.
|
||||
[DGraph Documentation](https://dgraph.io/docs/master/mutations/#language-and-rdf-types)
|
109
content/posts/dgraph4.de.md
Normal file
109
content/posts/dgraph4.de.md
Normal file
@ -0,0 +1,109 @@
|
||||
---
|
||||
title: "DGraph - Teil 4: Schema in Dgraph erstellen"
|
||||
date: 2020-08-12
|
||||
draft: false
|
||||
tags: ["datenbank","graph","graphql"]
|
||||
archive: ["Dgraph Grundlagen"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Im ersten Teil dieser Serie habe ich erwähnt, dass Dgraph ohne Schema auskommt. In Teil 3 haben wir eine Anpassung des Schemas gemacht um ein Feld suchbar zu machen.
|
||||
Darüber hinaus gibt es noch weitere Gründe sich mit dem Thema Schema in Dgraph zu befassen, da man für manche Funktionen ohne Schema nicht weiterkommt.
|
||||
Ein Beispiel dafür ist die expand() Funktion. Damit ist es möglich alle Felder eines Datensatzes abzurufen ohne diese explizit anzufordern. Damit das funktioniert müssen wir in Dgraph erst einmal ein Schema definieren.
|
||||
|
||||
## Schema und Datentypen definieren
|
||||
|
||||
Die Schema Definition in Dgraph ist relativ einfach. Mit dem Keyword type teilen wir Dgraph mit, dass eine Typendefinition folgt. Innerhalb der Definition geben wir die Datenfelder / Prädikate an aus denen der Typ bestehen soll.
|
||||
|
||||
Im Anschluss an den Datentyp können wir noch die einzelnen Felder genauer definieren.
|
||||
```graphql
|
||||
type Person {
|
||||
name
|
||||
hometown
|
||||
friend_of
|
||||
}
|
||||
|
||||
name: string @index(hash) .
|
||||
hometown: string .
|
||||
friend_of: [uid] .
|
||||
```
|
||||
Hier definieren wir das Feld name als Typ string und teilen Dgraph mit, dass dieses Feld indiziert sein soll. Für das Feld friend_of geben wir an, dass es sich um eine Verbindung zu einem anderen Datensatz handelt.
|
||||
|
||||
Dgraph verwendet den definierten Knotentyp nicht automatisch und geht nicht davon aus, dass bloß weil ein Knoten alle Felder des Typs Person besitzt, dieser auch vom Knotentyp Person ist. Das bedeutet, dass wir DGraph mitteilen müssen, wenn ein Datensatz eine Person ist:
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Peter <dgraph.type> "Person" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Mary <dgraph.type> "Person" .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
_:Harry <dgraph.type> "Person" .
|
||||
}
|
||||
}
|
||||
```
|
||||
Mit dem N-Quad _:Peter <dgraph.type> "Person" . wird z.B. dem Knoten für Peter Parker der Typ Person zugewiesen. Das funktioniert natürlich auch im JSON Format:
|
||||
```json
|
||||
{
|
||||
"set": [
|
||||
{
|
||||
"name": "Peter Parker",
|
||||
"hometown": "New York",
|
||||
"dgraph.type": "Person"
|
||||
},
|
||||
{
|
||||
"name": "Mary Jane Watson",
|
||||
"hometown": "New York",
|
||||
"dgraph.type": "Person"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Ein paar Funktionen, die sich aus der Schemadefinition ergeben
|
||||
|
||||
Dank der Schemadefinition haben wir jetzt Zugriff auf ein paar Standardfunktionen, die ohne Schema nicht möglich wären.
|
||||
Jetzt können wir in Dgraph z.B. gezielt nach dem Typ Person suchen.
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
uid
|
||||
name
|
||||
}
|
||||
}
|
||||
```
|
||||
Dadurch lassen sich Queries noch gezielter ausführen, da man ja meistens mit recht konkreten Datanstrukturen arbeitet. In einem Bestellsystem hat man Bestellungen, Kunden und so weiter. Diese definiert man als eigene Typen, die man dann gezielt wieder ansprechen kann.
|
||||
|
||||
Eine weitere praktische Funktion ist expan:
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
expand(_all_) {
|
||||
expand(_all_)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Mit expan lassen sich alle Felder eines Datensatzes ausgeben und müssen nicht einzeln angegeben werden.
|
||||
|
||||
Ich habe schon oft gelesen, dass schemalos als Vorteil Datenbanken angepriesen wird. Das ist ja im Grunde auch gut und richtig, letzten Endes muss man sich aber bei jedem Projekt so oder so Gedanken über die Struktur seiner Daten machen. Im Fall Dgraph halte ich es für absolut sinnvoll mit einem Schema zu arbeiten.
|
||||
Es ist in Dgraph auch nicht so, dass man sich mit einem Schema die Flexibilität nimmt. Selbst wenn ein Datensatz als Typ angelegt wurde kann man trotzdem beliebige Felder hinzufügen, die nicht in der Typendefinition enthalten sind. Man muss sich nur darüber klar sein, dass man diese Felder dann in einer Query anfordern muss:
|
||||
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
fieldname
|
||||
expand(_all_) {
|
||||
expand(_all_)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ich werde wahrscheinlich an dieser Stelle erst einmal mit den Basics aufhören und in den nächsten Beiträgen zeigen wie man mit dem Go Client mit Dgraph interagiert.
|
108
content/posts/dgraph4.en.md
Normal file
108
content/posts/dgraph4.en.md
Normal file
@ -0,0 +1,108 @@
|
||||
---
|
||||
title: "DGraph - Part 4: Creating a schema"
|
||||
date: 2020-08-12
|
||||
draft: false
|
||||
tags: ["database","graph","graphql"]
|
||||
archive: ["Dgraph basics"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
In the first part of this series I mentioned that Dgraph works without a scheme. In part 3 we made an adjustment to the schema to make a field searchable.
|
||||
In addition, there are other reasons to deal with the topic of schema in Dgraph, as you will not get any further for some functions without schema.
|
||||
An example of this is the expand() function. This makes it possible to call up all fields of a data record without explicitly requesting them. For this to work we first have to define a scheme in Dgraph.
|
||||
|
||||
## Define a schema and data types
|
||||
|
||||
The schema definition in Dgraph is relatively simple. With the keyword type we tell Dgraph that a type definition follows. Within the definition, we specify the data fields / predicates from which the type should consist.
|
||||
|
||||
Following the data type, we can define the individual fields more precisely.
|
||||
```graphql
|
||||
type Person {
|
||||
name
|
||||
hometown
|
||||
friend_of
|
||||
}
|
||||
|
||||
name: string @index(hash) .
|
||||
hometown: string .
|
||||
friend_of: [uid] .
|
||||
```
|
||||
Here we define the field name as type string and tell Dgraph that this field should be indexed. For the field friend_of we indicate that it is a connection to another data record.
|
||||
|
||||
Dgraph does not automatically use the defined node type and does not assume that just because a node has all fields of the Person type, it is also of the Person node type. That means we need to tell DGraph when a record is a person:
|
||||
```graphql
|
||||
{
|
||||
set{
|
||||
_:Peter <name> "Peter Parker" .
|
||||
_:Peter <hometown> "New York" .
|
||||
_:Peter <dgraph.type> "Person" .
|
||||
_:Mary <name> "Mary Jane Watson" .
|
||||
_:Mary <hometown> "New York" .
|
||||
_:Mary <friend_of> _:Peter .
|
||||
_:Mary <dgraph.type> "Person" .
|
||||
_:Harry <name> "Harry Osborne" .
|
||||
_:Harry <hometown> "New York" .
|
||||
_:Harry <friend_of> _:Peter .
|
||||
_:Harry <friend_of> _:Mary .
|
||||
_:Harry <dgraph.type> "Person" .
|
||||
}
|
||||
}
|
||||
```
|
||||
With the N-Quad _: Peter <dgraph.type> "Person". e.g. assigned the type Person to the node for Peter Parker. Of course, this also works in JSON format:
|
||||
```json
|
||||
{
|
||||
"set": [
|
||||
{
|
||||
"name": "Peter Parker",
|
||||
"hometown": "New York",
|
||||
"dgraph.type": "Person"
|
||||
},
|
||||
{
|
||||
"name": "Mary Jane Watson",
|
||||
"hometown": "New York",
|
||||
"dgraph.type": "Person"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## A couple of functions that result from the schema definition
|
||||
|
||||
Thanks to the schema definition, we now have access to a few standard functions that would not be possible without the schema.
|
||||
Now in Dgraph we can e.g. search specifically for the type person.
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
uid
|
||||
name
|
||||
}
|
||||
}
|
||||
```
|
||||
This allows queries to be executed even more specifically, since you usually work with very concrete data structures. In an ordering system, you have orders, customers, and so on. You define these as your own types, which you can then specifically address again.
|
||||
|
||||
Another useful function is expan:
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
expand(_all_) {
|
||||
expand(_all_)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
With expand all fields of a data record can be output and do not have to be specified individually.
|
||||
|
||||
I've read many times that schemaless is touted as an advantage of databases. That is basically a good thing and correct to say, but in the end you have to think about the structure of your data one way or another with every project. In the case of Dgraph, I think it makes perfect sense to work with a schema.
|
||||
It is also not the case in Dgraph that a scheme takes away the flexibility. Even if a data record has been created as a type, you can still add any fields that are not included in the type definition. You just have to be aware that you have to request these fields in a query:
|
||||
```graphql
|
||||
{
|
||||
persons(func: type(Person)){
|
||||
fieldname
|
||||
expand(_all_) {
|
||||
expand(_all_)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
I will probably stop at this point with the basics and show in the next few posts how to interact with the Go Client with Dgraph.
|
97
content/posts/email-hoelle.de.md
Normal file
97
content/posts/email-hoelle.de.md
Normal file
@ -0,0 +1,97 @@
|
||||
---
|
||||
title: "Einmal E-Mail Hölle und zurück"
|
||||
date: 2019-09-01
|
||||
draft: true
|
||||
tags: ["produktivität","ordnung","e-mail","spam","automatisierung"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
# UPDATE August 2020
|
||||
|
||||
Der folgende Artikel ist zwar für den einen oder anderen interessant, spiegelt aber mittlerweile nicht mehr meinen aktuellen Ansatz zum Thema E-Mail wieder.
|
||||
Ich habe mich mittlerweile allen genannten Tools getrennt und habe stattdessen seit Juni einen [HEY](https://hey.com). Ich werde hierzu noch einen Beitrag schreiben 😊
|
||||
|
||||
||||||||||||||||||||||||||
|
||||
|
||||
Kennt Ihr das? Ihr bekommt gefühlt tausende Benachrichtigungen, Status Updates, Bestellbestätigungen und vieles mehr? Man bekommt so viel Zeug im Laufe des Tages und das meiste davon ist es einfach nicht wert auch nur geöffnet zu werden. Dabei muss sich gar nicht einmal um Newsletter handeln. Ich bekomme viele Statusupdates. Meistens den Systemen, mit denen ich tagtäglich in der Firma arbeite. WiKi, Aufgabenverwaltung, CC, E-Mails Kollegen, Logs etc. etc.
|
||||
|
||||
## Ordnung und Regeln
|
||||
|
||||
Zuerst habe ich E-Mail Regeln Apple Mail versucht.
|
||||
|
||||
Das funktioniert im ersten Moment recht gut. E-Mails einem bestimmten Absendet können als gelesen markiert und verschoben werden. Das ganze lässt sich auch mit Schlüsselwörtern kombinieren. Das schafft Ordnung, aber es gab leider dennoch ein paar Punkte mit denen ich nicht zufrieden war:
|
||||
|
||||
bei sehr vielen Absendern und sehr vielen E-Mails ist man schnell bei 30+ Regeln
|
||||
ich wollte gerne E-Mails als erledigt markieren und sie in einen FERTIG-Ordner schieben
|
||||
E-Mails, die einen Handlungsbedarf haben möchte ich an Omnifocus übergeben.
|
||||
|
||||
Durch dies vielen E-Mails war ich trotzdem irgendwann genervt. Viele Leute verbringen täglich viele Zeit in ihren Mails. Ich selbst möchte mich nicht dazuzählen müssen. Wie viele der E-Mails, die man täglich erhält sind wirklich wichtig oder interessant?
|
||||
|
||||
## Von Apple Mail zu Air Mail
|
||||
|
||||
Ich bin Apple Mail zu Airmail gewechselt. Ich benutze das Programm mittlerweile seit Jahren für macOS und iOS und bin echt glücklich damit. Natürlich muss man hier abwägen, ob man die knapp 11 € + knapp 6 € iOS Version investieren möchte.
|
||||
|
||||
Ich habe mich aus diesen Gründen dafür entschieden:
|
||||
|
||||
E-Mails als erledigt markieren und verschieben (mit einer Aktion)
|
||||
E-Mails schlummern lassen
|
||||
E-Mail Erinnerungen für versendete E-Mails
|
||||
aus E-Mails Aufgaben oder Erinnerungen machen
|
||||
|
||||
### Schlummern & Erinnerungen machen das Leben leichter
|
||||
Die Schlummern Funktion ist eine wirklich großartige Sache. Dadurch verschwindet eine E-Mail eine bestimmte Zeit. Gerade E-Mails bei E-Mails mit Handlungsbedarf ist diese Funktion super. Wie sagt man? Aus den Augen, aus dem Sinn.
|
||||
|
||||

|
||||
|
||||
Ideal ist es für mich die eine E-Mail bis zu dem Zeitpunkt schlummern zu lassen an dem ich Zeit dafür habe. Nach Ablauf der Schlummer-Zeit legt Air Mail die E-Mail wieder in den Posteingang.
|
||||
|
||||
Die Erinnerungsfunktion kann direkt beim verfassen einer E-Mail eingeschaltet werden. Ich nutze die Erinnerungen, wenn ich dringend auf eine Antwort warte. So erinnert mich Air Mail daran, dass ich diese E-Mail versendet habe und ich kann ggf. nochmal nachfassen.
|
||||
|
||||
### Aktionen & Dienste
|
||||
|
||||
Wirklich schnell wird das Durchgehen des Posteingangs durch Aktionen. Diese kann man in Airmail selbst definieren. Meine rechte Pfeiltaste markiert eine E-Mail als erledigt. Gleichzeitig wird die E-Mail dadurch in den ERLEDIGT Ordner geschoben. Die linke Pfeiltaste übergibt die markierte E-Mail an Omnifocus. Mit der Eingabetaste setze ich E-Mails auf Schlummern. So komme ich bei durchgehen meiner E-Mails extrem schnell voran.
|
||||
|
||||

|
||||
|
||||
Neben Omnifocus gibt es übrigens noch viele weitere Dienste, die sich integrieren lassen. Kalender, Google Drive, Wunderlist, Trello und Todoist sind nur einige davon.
|
||||
|
||||
Ich nutze Airmail seit Jahren und es hilft mir wirklich effizient mit Mails zu arbeiten. Trotzdem fehlte mir was. Mein Hauptkritikpunkt sind genau wie bei Apple Mail die Regeln. Man muss hier gefühlt permanent neue Regeln erstellen. Außerdem sind die Regeln in der iOS App nicht verfügbar. Ist man ein paar Tage unterwegs kann hier schnell das Chaos im Posteingang einziehen. Ich bin einfach nie zufrieden 😎.
|
||||
|
||||
## Mit Sanebox im E-Mail Himmel
|
||||
|
||||
Seit ein paar Monaten setze ich zusätzlich zu Air Mail noch Sanebox ein. Sanebox arbeitet direkt mit dem Mailserver. Dadurch laufen alle Aktion Sanebox auch ohne Abruf durch den E-Mail Client.
|
||||
|
||||

|
||||
|
||||
E-Mail Regeln sind mit dem Einsatz Sanebox vollkommen hinfällig. Sanebox versucht im Grunde nur wichtige E-Mails im Posteingang zu zeigen. Alles was nicht wichtig ist landet im Ordner @SaneLater. Was wichtig ist und was nicht lernt Sanebox recht schnell. Ein Kriterium ist z.B. auf welche E-mails man antwortet und wie schnell nach Erhalt der Mail.
|
||||
|
||||

|
||||
|
||||
### Noch mehr Ordnung mit eigenen Ordnern
|
||||
|
||||
Natürlich kann man auch eigene Ordner definieren. Das Schöne daran ist, dass man hier auch gleich noch eine Weiterleitung anhängen kann. E-Mails mit Rechnungen lasse ich so z.B. gleich an unsere Buchhaltung weiterleiten.
|
||||
|
||||
Durch das Verschieben E-Mails einem Ordner zum anderen lernt Sanebox. Das tolle daran ist, dass man wenig Aufwand betreiben muss um das System anzulernen. Bei mir ist es so, dass ich meine E-Mails sowieso in Unterordner sortiere.
|
||||
|
||||
Neben den Standardordners bietet Sanebox auch noch Ordner mit weiteren Funktionen an. Ordner mit Schlummern Funktion oder ein schwarzes Loch 😁 für alles was man gar nicht sehen will. Praktisch ist auch der SaneNoReplies Ordner. Sanebox legt hier E-Mails ab auf die man noch keine Antwort erhalten hat. Kombiniert mit SaneReminders wird das wirklich interessant. Man kann beim Versand einer Mail eine Erinnerungsadresse angeben. Die Erinnerungsadresse hat einen definierten Zeitraum. Wurde die E-mail in dem Zeitraum nicht beantwortet landet die E-Mail wieder im Eingang.
|
||||
|
||||
### Sanebox Digest
|
||||
|
||||
Man kann sich Sanebox so einrichten, dass man regelmäßig einen Bericht bekommt. Hier hat man alle Trainings und verschobenen E-Mails im Überblick. Eventuell falsch zugeordnete E-Mails können ganz einfach anders zugeordnet werden. So hat man immer einen Überblick ob Sanebox richtige Zuordnungen vornimmt.
|
||||
|
||||
### Ich bearbeite meine E-Mails wieder gerne
|
||||
|
||||
Okay, das ist nicht ganz war. Ich mache mein E-Mail Programm wieder gerne auf. Kein Wunder, ich muss mittlerweile kaum noch E-Mails selbst bearbeiten oder sortieren 😇.
|
||||
|
||||
Dank Air Mail und Sanebox bearbeite ich meine E-Mails innerhalb 5 Minuten pro Tag. Das Spart Zeit und Nerven und ich kann mich um wichtigere Dinge kümmern. Inbox Zero - jeden Tag 😎
|
||||
|
||||
### "Gesunde" E-Mail Gewohnheiten sollte man trotzdem haben
|
||||
|
||||
Ordnung alleine ist nicht alles. Letzten Endes braucht man Disziplin, wenn man effektiv sein möchte. Es gibt so viele Ablenkungen in der heutigen Zeit. Oft werden E-Mails und andere Arten Benachrichtigungen verteufelt. Tatsache ist aber, dass man mit diesen Dingen richtig umgehen muss. Wir haben es selbst in der Hand ob wir uns ablenken lassen oder nicht. Niemand zwingt uns den ganzen Tag _Pling_ und _Bing_ zu hören oder das E-Mail Programm permanent geöffnet zu haben.
|
||||
|
||||
Ich habe mir angewöhnt mein E-Mail Programm 2x am Tag zu öffnen. In Kombination mit Airmail und Sanebox wird dadurch vieles entspannter.
|
||||
|
||||
### Links zu den verwendeten Programmen und Diensten:
|
||||
|
||||
[Sanebox (Afiiliate Link)](https://sanebox.com/t/28g9627o30) | [Sanebox](https://sanebox.com)
|
||||
|
||||
[Air Mail (Affiliate Link)](https://geo.itunes.apple.com/de/app/airmail-3/id918858936?mt=12&app=apps) | [Air Mail](https://apps.apple.com/de/app/airmail-3/id918858936/)
|
95
content/posts/email-hoelle.en.md
Normal file
95
content/posts/email-hoelle.en.md
Normal file
@ -0,0 +1,95 @@
|
||||
---
|
||||
title: "Down to e-mail hell and back again"
|
||||
date: 2019-09-01
|
||||
draft: true
|
||||
tags: ["productivity","order","e-mail","spam","automation"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
# UPDATE August 2020
|
||||
|
||||
The following article may be of interest to one or the other, but no longer reflects my current approach to the subject of email.
|
||||
I have since parted with all the tools mentioned and have had a [HEY](https://hey.com) instead since June. I will write a post about this 😊
|
||||
|
||||
|||||||||||||||||||||||||||
|
||||
|
||||
Do you know that? You get thousands of notifications, status updates, order confirmations and much more? You get so much stuff during the day and most of it is not worth opening. It does not even have to be newsletters. I get many status updates from I work with every day in the company. WiKi, task management, CC, emails from colleagues, logs etc. etc.
|
||||
|
||||
## Order and rules
|
||||
|
||||
First I tried email rules from Apple Mail. That works pretty well at first. E-mails from a particular sender can be marked as read and moved. The whole thing can also be combined with keywords. That brings order, but unfortunately there were a few points I was not satisfied with:
|
||||
|
||||
With a lot of senders and a lot of emails you will end up with 30+ rules
|
||||
I wanted to mark emails as done and put them in a DONE folder
|
||||
I would like to hand over emails, which have a need for action, to Omnifocus.
|
||||
|
||||
I was annoyed by getting this many e-mails. Many people spend a lot of time every day in their post box. I no interest to this as well. Honestly, how many of the emails you receive are really important or interesting?
|
||||
|
||||
## From Apple Mail to Air Mail
|
||||
|
||||
I switched from Apple Mail to Airmail. I have been using the program for macOS and iOS for years and am really happy with it. Of course, you have to weigh whether you want to invest the almost 11 € and 6 € iOS version.
|
||||
|
||||
I decided for Airmail for these reasons:
|
||||
|
||||
Mark emails as done and move them (with an action)
|
||||
Let e-mails go to sleep
|
||||
E-Mail reminders for sent emails
|
||||
make emails tasks or reminders
|
||||
Snooze & rminders make life easier
|
||||
|
||||
The snooze function is a really great thing. It makes an e-mail disappear from your inbox for a certain time. Especially for actionable e-mails this feature is great. How do you say? Out of sight, out of mind.
|
||||
|
||||

|
||||
|
||||
Usually I let an e-mail snooze until I have time to deal with it. At the end of the slumber time, Air Mail puts the e-mail back in the Inbox.
|
||||
|
||||
The reminder function can be activated directly when writing an e-mail. I use the memories when I am urgently waiting for an answer. So Air Mail reminds me that I have sent this e-mail and I can possibly catch up again.
|
||||
|
||||
### Actions & Services
|
||||
|
||||
Actions & Services make going through the inbox fast. These can be defined in Airmail itself. My right arrow key marks an email as done. At the same time the e-mail is pushed into the DONE folder. The left arrow key passes the selected email to Omnifocus. I use the Enter key to put emails to snooze. This is how I get ahead of my e-mails extremely fast.
|
||||
|
||||

|
||||
|
||||
Besides Omnifocus, there are many more services that can be integrated. Calendar, Google Drive, Wunderlist, Trello and Todoist are just some of them.
|
||||
|
||||
I have been using Airmail for years and it really helps me to work efficiently with mails. Still, I was missing something. My main criticism is the same as with Apple Mail. You feel like you are constantly creating new rules. Moreover, the rules function is not available in the iOS app. If you are a few days on the road, the chaos in the inbox can quickly move in here. I'm just never satisfied 😎.
|
||||
|
||||
### With Sanebox to email heaven
|
||||
|
||||
For a few months, I have been using Sanebox in addition to Air Mail. Sanebox works directly with the mail server. As a result, all actions from Sanebox run without retrieval by the e-mail client.
|
||||
|
||||

|
||||
|
||||
Email rules are completely obsolete with the use of Sanebox. Sanebox basically just tries to show important emails in the Inbox. Everything that is not important ends up in the folder @SaneLater. What's important and what does not Sanebox learn quickly. One criterion is e.g. on which e-mails one responds and how fast after receiving the mail.
|
||||
|
||||

|
||||
|
||||
## Even more order with their custom folders
|
||||
|
||||
Of course you can also define your own folders. The nice thing is that you can attach a forwarding function as well. In my setup e-Mails containing invoices are immediately forward to our accounting department.
|
||||
|
||||
By moving emails from one folder to another, Sanebox learns. The great thing is that you have to do little effort to learn the system. For me, I sort my e-mails into subfolders anyway.
|
||||
|
||||
Besides he default folders, Sanebox also offers folders with extra functions. Folder with a snooze function or a black hole 😁 for everything you do not want to see. Practical is also the SaneNoReplies folder. Sanebox deposits emails that have not been answered yet. Combined with SaneReminders that will be really interesting. You can specify a reminder address when sending an e-mail. The reminder address has a defined period. If the e-mail was not answered during the period, the e-mail will be returned to the entrance.
|
||||
|
||||
### Sanebox Digest
|
||||
|
||||
You can set up Sanebox to get a report regularly. Here you have all trainings and postponed emails at a glance. Any mismatched emails can easily be reassigned. So you always have an overview of whether Sanebox makes correct assignments.
|
||||
|
||||
### I like to go through my e-mails again
|
||||
|
||||
Okay, that was not quite. I like to open my e-mail program again. No wonder, I hardly have to edit or sort e-mails myself mittlerweile.
|
||||
|
||||
Thanks to Air Mail and Sanebox I process my emails within 5 minutes per day. It saves time and nerves and I can take care of more important things. Inbox Zero - every day 😎
|
||||
|
||||
## You should still have "healthy" e-mail habits
|
||||
|
||||
Order alone is not everything. After all, you need discipline if you want to be effective. There are so many distractions in this day and age. Often emails and other types of notifications are vilified. The fact is that you have to deal with these things properly. We have it in our own hands whether we let ourselves be distracted or not. Nobody forces us to listen to _pling_ and _bing_ all day or to have the e-mail program permanently open.
|
||||
|
||||
I have become accustomed to opening my e-mail program twice a day. In combination with Airmail and Sanebox this will be much more relaxed.
|
||||
|
||||
### Links to the programs and services:
|
||||
|
||||
[Sanebox (Afiiliate Link)] (https://sanebox.com/t/28g9627o30) | [Sanebox] (https://sanebox.com)
|
||||
|
||||
[Air Mail (Affiliate Link)] (https://geo.itunes.apple.com/de/app/airmail-3/id918858936?mt=12&app=apps) | [Air Mail] (https://apps.apple.com/de/app/airmail-3/id918858936)
|
157
content/posts/evans-grpc.de.md
Normal file
157
content/posts/evans-grpc.de.md
Normal file
@ -0,0 +1,157 @@
|
||||
---
|
||||
title: "Evans - ein CLI gRPC Client"
|
||||
date: 2020-08-18
|
||||
draft: false
|
||||
tags: ["grpc","protobuf","cli"]
|
||||
archive: ["Technik Zeug"]
|
||||
series: [""]
|
||||
featuredImage: "/img/evans/evans.gif"
|
||||
---
|
||||
# gRPC Server testen, aber wie?
|
||||
|
||||
Wenn man eine REST oder GraphQL Api entwickelt hat man diverse Tools zur Verfügung, die einen beim Testen unterstützen. Ich persönlich setze hier [Insomnia](https://insomnia.rest) ein, viele werden auch [Postman](https://www.postman.com/) verwenden.
|
||||
Manch einer wird aber auch einfach [cURL](https://curl.haxx.se/) verwenden. Für gRPC scheinen solche Tools weniger weit verbreitet zu sein.
|
||||
|
||||
Ein Tool, dass ich sehr nützlich finde und dass mir hilft, wenn ich mit einem gRPC Service arbeite ist [Evans](https://github.com/ktr0731/evans).
|
||||
|
||||
## Installation & Setup
|
||||
|
||||
Die Installation ist unter MacOS am einfachsten:
|
||||
|
||||
```bash
|
||||
brew tap ktr0731/evans
|
||||
brew install evans
|
||||
```
|
||||
|
||||
Binaries für Linux und Windows sind auf [Github](https://github.com/ktr0731/evans) ebenfalls verfügbar.
|
||||
|
||||
Um Evans effektiv nutzen zu könnnen, empfehle ich auf jeden Fall gRPC Reflection einzuschalten. In Go könnte das so aussehen:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/reflection"
|
||||
"log"
|
||||
"net"
|
||||
pb "path/to/your/compiled/protobuf/package"
|
||||
)
|
||||
|
||||
var port = ":50051"
|
||||
|
||||
func main() {
|
||||
lis, err := net.Listen("tcp", port)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to listen: %v", err)
|
||||
}
|
||||
|
||||
s := grpc.NewServer()
|
||||
pb.RegisterExampleserviceServer(s, &exampleService)
|
||||
|
||||
// Enable reflection:
|
||||
reflection.Register(s)
|
||||
|
||||
if err := s.Serve(lis); err != nil {
|
||||
log.Fatalf("failed to serve: %v", err)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Erste Schritte
|
||||
|
||||
Evans startet Ihr z.B. im Repl Modus mit:
|
||||
```bash
|
||||
evans -r -p 50051
|
||||
```
|
||||
Ist Reflection so wie oben beschrieben eingeschaltet könnt Ihr Euch mit show package die verfügbaren Services anzeigen lassen und mit packache ServiceName zu einem Service wechseln.
|
||||
|
||||

|
||||
|
||||
## Reflektion
|
||||
|
||||
Sinn und zweck des Ganzen ist aber natürlich das Testen RPCs. Auch hier hilft uns die Reflektion. Wenn Ihr ein package gewählt habt könnt Ihr Euch mit show Service anzeigen lassen welche Services in dem Paket verfügbar sind.
|
||||
|
||||

|
||||
|
||||
Das Schöne ist, dass Euch die RPCs samt Request- und Responsetypen ebenfalls angezeigt werden.
|
||||
|
||||
Um mit dem Service arbeiten zu können muss dieser ausgewählt werden. service ServiceName wählt einen Service aus und nun könnnt Ihr Euch mit show rpc die verfügbaren RPCs anzeigen lassen:
|
||||
|
||||

|
||||
|
||||
## RPCs aufrufen
|
||||
|
||||
Mit call RPCname könnt Ihr jetzt RPCs aufrufen. In meinem Beispiel hier rufe ich Save auf. Evans fragt nun interaktiv die einzelnen Felder ab, diee für den Aufruf notwendig sind.
|
||||

|
||||
Wie man sieht bekommt man hier auch noch weitere Infos angezeigt. Repeate zeigt uns, dass addresslist ein Array ist un welchem Typ die einzelnen Felder sind. Die protobuf Datei dazu sieht so aus:
|
||||
|
||||
```protobuf
|
||||
syntax = "proto3";
|
||||
|
||||
package address;
|
||||
|
||||
import "helper/helper.proto";
|
||||
|
||||
option go_package = "models/address";
|
||||
|
||||
service AddressService {
|
||||
rpc GetSingleAddress (address.GetAddressRequest) returns (address.Address) {}
|
||||
rpc GetAddressList (address.GetAddressRequest) returns (address.AddressList) {}
|
||||
rpc Save (address.AddressList) returns (helper.StatusResponse) {}
|
||||
rpc Delete (address.AddressList) returns (helper.StatusResponse) {}
|
||||
}
|
||||
|
||||
message GetAddressRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message Address {
|
||||
string id = 1;
|
||||
string firstName = 2;
|
||||
string lastName = 3;
|
||||
string company = 4;
|
||||
string address1 = 5;
|
||||
string address2 = 6;
|
||||
string zip = 7;
|
||||
string city = 8;
|
||||
Country country = 9;
|
||||
}
|
||||
|
||||
message AddressList {
|
||||
repeated address.Address addresslist = 1;
|
||||
}
|
||||
|
||||
enum Country {
|
||||
option allow_alias = true;
|
||||
AL = 0 ;
|
||||
AD = 1 ;
|
||||
AT = 2 ;
|
||||
BY = 3 ;
|
||||
BE = 4 ;
|
||||
...
|
||||
ALBANIA = 0 ;
|
||||
ANDORRA = 1 ;
|
||||
AUSTRIA = 2 ;
|
||||
BELARUS = 3 ;
|
||||
BELGIUM = 4 ;
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Fazit und Alternativen
|
||||
|
||||
Das kann natürlich erst einmal nur als Überblick dienen. Evans kann noch einiges mehr, unter anderem kann damit auch Streaming getestet werden.
|
||||
|
||||
Ich persönlich finde, dass das Testen dadurch um einiges leichter wird. Dass es sich um ein CLI tool handelt, finde ich gerade gut, da man ja nicht immer unbedingt ein GUI zur Verfügung hat.
|
||||
|
||||
Alternativen gibt es natürlich auch. z.B. [Bloom RPC](https://github.com/uw-labs/bloomrpc) ist ein Electron Client für gRPC mit einem schicken GUI. Wer z.B. mit [GraphiQL](https://github.com/graphql/graphiql) vertraut ist wird sich hier schnell zurechtfinden.
|
||||
|
||||
[gRPC Curl](https://github.com/fullstorydev/grpcurl) ist für einige mit Sicherheit auch eine Möglichkeit.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
157
content/posts/evans-grpc.en.md
Normal file
157
content/posts/evans-grpc.en.md
Normal file
@ -0,0 +1,157 @@
|
||||
---
|
||||
title: "Evans - a CLI gRPC Client"
|
||||
date: 2020-08-18
|
||||
draft: false
|
||||
tags: ["grpc","protobuf","cli"]
|
||||
archive: ["Technical Stuff"]
|
||||
series: [""]
|
||||
featuredImage: "/img/evans/evans.gif"
|
||||
---
|
||||
# gRPC Server testing, but how?
|
||||
|
||||
If you develop a REST or GraphQL Api you have various tools available that support you in testing. I personally use [Insomnia](https://insomnia.rest) here, many will also use [Postman](https://www.postman.com/).
|
||||
But some people will simply use [cURL](https://curl.haxx.se/). Such tools appear to be less common for gRPC.
|
||||
|
||||
A tool that I find very useful and that helps me when I work with a gRPC service is [Evans](https://github.com/ktr0731/evans).
|
||||
|
||||
## Installation & Setup
|
||||
|
||||
Installation is easiest on MacOS:
|
||||
|
||||
```bash
|
||||
brew tap ktr0731/evans
|
||||
brew install evans
|
||||
```
|
||||
|
||||
Binaries for Linux and Windows are also available on [Github](https://github.com/ktr0731/evans).
|
||||
|
||||
In order to be able to use Evans effectively, I definitely recommend switching on gRPC Reflection. In Go this could look like this:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/reflection"
|
||||
"log"
|
||||
"net"
|
||||
pb "path/to/your/compiled/protobuf/package"
|
||||
)
|
||||
|
||||
var port = ":50051"
|
||||
|
||||
func main() {
|
||||
lis, err := net.Listen("tcp", port)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to listen: %v", err)
|
||||
}
|
||||
|
||||
s := grpc.NewServer()
|
||||
pb.RegisterExampleserviceServer(s, &exampleService)
|
||||
|
||||
// Enable reflection:
|
||||
reflection.Register(s)
|
||||
|
||||
if err := s.Serve(lis); err != nil {
|
||||
log.Fatalf("failed to serve: %v", err)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## First Steps
|
||||
|
||||
Evans starts in repl mode with
|
||||
```bash
|
||||
evans -r -p 50051
|
||||
```
|
||||
If Reflection enabled as described above, you can display the available services with show package and switch to a service with packache ServiceName.
|
||||
|
||||

|
||||
|
||||
## Reflection
|
||||
|
||||
The whole point, of course, is to test RPCs. Here, too, reflection helps us. If you have chosen a package you can use show Service to display which services are available in the package.
|
||||
|
||||

|
||||
|
||||
The nice thing is that you can also see the RPCs including request and response types.
|
||||
|
||||
To be able to work with the service, it must be selected. service ServiceName selects a service and now you can display the available RPCs with show rpc:
|
||||
|
||||

|
||||
|
||||
## Call RPCs
|
||||
|
||||
With call RPCname you can now call RPCs. In my example here, I am calling Save. Evans now asks interactively the individual fields that are necessary for the call.
|
||||

|
||||
As you can see, further information is also displayed here. repeate indicates that addresslist is an array and what type the individual fields are. The protobuf file looks like this:
|
||||
|
||||
```protobuf
|
||||
syntax = "proto3";
|
||||
|
||||
package address;
|
||||
|
||||
import "helper/helper.proto";
|
||||
|
||||
option go_package = "models/address";
|
||||
|
||||
service AddressService {
|
||||
rpc GetSingleAddress (address.GetAddressRequest) returns (address.Address) {}
|
||||
rpc GetAddressList (address.GetAddressRequest) returns (address.AddressList) {}
|
||||
rpc Save (address.AddressList) returns (helper.StatusResponse) {}
|
||||
rpc Delete (address.AddressList) returns (helper.StatusResponse) {}
|
||||
}
|
||||
|
||||
message GetAddressRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message Address {
|
||||
string id = 1;
|
||||
string firstName = 2;
|
||||
string lastName = 3;
|
||||
string company = 4;
|
||||
string address1 = 5;
|
||||
string address2 = 6;
|
||||
string zip = 7;
|
||||
string city = 8;
|
||||
Country country = 9;
|
||||
}
|
||||
|
||||
message AddressList {
|
||||
repeated address.Address addresslist = 1;
|
||||
}
|
||||
|
||||
enum Country {
|
||||
option allow_alias = true;
|
||||
AL = 0 ;
|
||||
AD = 1 ;
|
||||
AT = 2 ;
|
||||
BY = 3 ;
|
||||
BE = 4 ;
|
||||
...
|
||||
ALBANIA = 0 ;
|
||||
ANDORRA = 1 ;
|
||||
AUSTRIA = 2 ;
|
||||
BELARUS = 3 ;
|
||||
BELGIUM = 4 ;
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Conclusion and alternatives
|
||||
|
||||
Of course, this can only serve as an overview. Evans can do a lot more, including streaming testing.
|
||||
|
||||
Personally, I think it makes testing a lot easier. I think it's a good thing that it's a CLI tool, because you don't always have a GUI available.
|
||||
|
||||
There are of course alternatives. e.g. [Bloom RPC](https://github.com/uw-labs/bloomrpc) is an electron client for gRPC with a nice GUI. Who e.g. is familiar with [GraphiQL](https://github.com/graphql/graphiql) you will quickly find your way around here.
|
||||
|
||||
[gRPC Curl](https://github.com/fullstorydev/grpcurl) is certainly an option for some.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
136
content/posts/go-pointer.de.md
Normal file
136
content/posts/go-pointer.de.md
Normal file
@ -0,0 +1,136 @@
|
||||
---
|
||||
title: "Pointer in Go"
|
||||
date: 2019-09-10
|
||||
draft: false
|
||||
tags: ["programmieren","golang","go","datenstrukturen","zeiger","pointer"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Ein Pointer in Go, oder auch Zeiger verweist auf die Speicheradresse an der ein Wert gesichert ist. Um die Speicheradresse für eine Variable auszugeben verwendet man das & Zeichen:
|
||||
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
fmt.Println(x)
|
||||
fmt.Println(&x)
|
||||
|
||||
fmt.Printf("%T\n", x)
|
||||
fmt.Printf("%T\n", &x)
|
||||
}
|
||||
```
|
||||
|
||||
Gibt man Typ der Speicheradresse ausgeben, so ist er \int. Da \ ist der Operator für einen Pointer, dass heißt, die Speicheradresse ist ein Pointer zu einem int. Mit anderen Worten zeigt der Pointer zeigt auf eine Speicheradresse an der ein Wert vom Typ int gespeichert ist.
|
||||
|
||||
Man muss hier klarstellen, dass ein Pointer zu einem int ein eigener Typ ist und nicht dem Typ int gleichzusetzen ist.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
|
||||
y := &x
|
||||
fmt.Println(y)
|
||||
fmt.Println(y)
|
||||
}
|
||||
```
|
||||
|
||||
In Zeile 6 wird der Operator \ verwendet. Dieser dereferenziert die in y gespeicherte Speicheradressem d.h. er gibt den dort gespeicherten Wert aus.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
|
||||
y := &x
|
||||
y = 88
|
||||
fmt.Println(x)
|
||||
}
|
||||
```
|
||||
|
||||
Hier wird x = 88 gesetzt. Das liegt daran, dass die Variable y die Speicheradresse x enthält. Durch die Verwendung \y = 88 passiert wieder eine Dereferenzierung, d.h. man sagt dem Programm im Grunde "Setze den Wert, der sich an der in y gespeicherten Adresse befindet gleich 88".
|
||||
|
||||
## Wie Pointer benutzt werden
|
||||
|
||||
Pointer sind dann besonders nützlich, wenn man große Datemengen übergeben möchte. Es ist wesentlich effizienter auf die Adresse zu verweisen an der die Daten gespeichert sind statt die Daten an sich zu übergeben.
|
||||
|
||||
Der zweite Anwendungsfall ist der, dass man manchmal Werte an einer Adresse ändern möchte.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
var x int = 5
|
||||
fmt.Println("Adresse x", &x)
|
||||
zahlen(&x)
|
||||
}
|
||||
|
||||
func zahlen(x int) {
|
||||
fmt.Println("x vorher ",x)
|
||||
fmt.Println("Adresse x", &x)
|
||||
x = 48
|
||||
fmt.Println("x nachher ",x)
|
||||
fmt.Println("Adresse x", &x)
|
||||
}
|
||||
```
|
||||
|
||||
Die Funktion zahlen() konsumiert einen Pointer vom Typ int, d.h. wir übergeben in Zeile 3 die Speicheradresse x indem wir &x übergeben. Die Speicheradresse bleibt im oberen Beispiel immer die gleiche, während wir den Wert an der Adresse ändern.
|
||||
|
||||
Die Funktion zahlen() hat keinen Zugriff auf. Selbst wenn x direkt an sie übergeben würde wäre es nicht möglich x zu ändern, da bei Übergabe an die Funktion eine Kopie x erstellt wird.
|
||||
|
||||
## Methodensatz
|
||||
|
||||
Eine Methodensatz sind die Methoden, die einem bestimmten Datentyp zugerordnet sind. Ein Methodensatz bestimmt die Schnittstellen (Interfaces), die der jeweilige Typ implementiert.
|
||||
|
||||
Bei den Methodensätzen gibt es einen wichtigen Unterschied beim Empfänger Argumenten:
|
||||
|
||||
Ein Receiver, der nicht als Pointer definiert ist funktioniert mit mit Pointern und auch mit nicht-Pointern.
|
||||
|
||||
Ein Receiver, der als Pointer definiert ist funktioniert nur mit Pointern.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type kreis struct {
|
||||
radius float64
|
||||
}
|
||||
|
||||
type form interface {
|
||||
flaeche() float64
|
||||
}
|
||||
|
||||
func (k kreis) flaeche() float64 {
|
||||
return math.Pi k.radius k.radius
|
||||
}
|
||||
|
||||
func info(f form) {
|
||||
fmt.Println("Fläche", f.flaeche())
|
||||
}
|
||||
|
||||
func main() {
|
||||
k := kreis{5}
|
||||
info(&k) //Pointer Übergabe
|
||||
info(k) //Nicht-Pointer Übergabe
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Die Aufrufe in Zeile 26 und 27 führen beide zum selben Ergebnis. Würde man die Methode flaeche() anders definieren würde der Aufruf in Zeile 27 einen Fehler verursachen:
|
||||
|
||||
```go
|
||||
...
|
||||
func (k kreis) flaeche() float64 {
|
||||
return math.Pi k.radius k.radius
|
||||
}
|
||||
...
|
||||
|
||||
func main() {
|
||||
k := kreis{5}
|
||||
info(&k) //Pointer Übergabe
|
||||
info(k) //Nicht-Pointer Übergabe // FEHLER
|
||||
}
|
||||
```
|
||||
|
||||
Der Grund warum info(k) fehlschlägt ist, dass die Funktion konkret nach einem Pointer vom Typ kreis verlangt. Da wie oben schon beschrieben ein Pointer vom Typ kreis ein eigenständiger Typ ist und nicht das gleiche wie der Typ kreis muss hier auch ein Pointer übergeben werden.
|
||||
|
||||
|
||||
|
132
content/posts/go-pointer.en.md
Normal file
132
content/posts/go-pointer.en.md
Normal file
@ -0,0 +1,132 @@
|
||||
---
|
||||
title: "Pointer in Go"
|
||||
date: 2019-09-10
|
||||
draft: false
|
||||
tags: ["programming","golang","go", "data structures","pointer"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
A pointer in Go or pointer points to the memory address at which a value is saved. To output the memory address for a variable, use the & character:
|
||||
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
fmt.Println(x)
|
||||
fmt.Println(&x)
|
||||
|
||||
fmt.Printf("%T\n", x)
|
||||
fmt.Printf("%T\n", &x)
|
||||
}
|
||||
```
|
||||
|
||||
If you enter the type of the memory address, it is \int. Since \ is the operator for a pointer, that is, the memory address is a pointer to an int. In other words, the pointer points to a memory address at which a value of the type int is stored.
|
||||
|
||||
You have to make it clear here that a pointer to an int is a separate type and is not to be equated with the type int.
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
|
||||
y := &x
|
||||
fmt.Println(y)
|
||||
fmt.Println(y)
|
||||
}
|
||||
```
|
||||
|
||||
The operator \ is used in line 6. This dereferences the memory address stored in y i.e. it outputs the value stored there.
|
||||
```go
|
||||
func main() {
|
||||
x := 10
|
||||
|
||||
y := &x
|
||||
y = 88
|
||||
fmt.Println(x)
|
||||
}
|
||||
```
|
||||
|
||||
Here x =c88 is set. This is because the variable y contains the memory address of x. By using \ y = 88 dereferencing happens again, i.e. the program is basically told "set the value at the address stored in y equal to 88".
|
||||
|
||||
## How Pointers Are Used
|
||||
|
||||
Pointers are particularly useful when you want to transfer large amounts of data. It is much more efficient to refer to the address where the data is stored than to pass the data on to yourself.
|
||||
|
||||
The second use case is that you sometimes want to change values at an address.
|
||||
```go
|
||||
func main() {
|
||||
var x int = 5
|
||||
fmt.Println("Adresse of x", &x)
|
||||
numbers(&x)
|
||||
}
|
||||
|
||||
func numbers(x int) {
|
||||
fmt.Println("x before ",x)
|
||||
fmt.Println("Adresse of x", &x)
|
||||
x = 48
|
||||
fmt.Println("x after ",x)
|
||||
fmt.Println("Adresse of x", &x)
|
||||
}
|
||||
```
|
||||
|
||||
The function numbers () consumes a pointer of the type int, i.e. we pass the memory address of x in line 3 by passing &x. In the example above, the memory address always remains the same as we change the value at the address.
|
||||
|
||||
The numbers() function has no access to. Even if x were passed directly to them, it would not be possible to change x, since a copy of x is created when passed to the function.
|
||||
|
||||
## Method Set
|
||||
|
||||
A method set are the methods that are assigned to a certain data type. A set of methods determines the interfaces that the respective type implements.
|
||||
|
||||
There is an important difference in the method sets when receiving arguments:
|
||||
|
||||
A receiver that is not defined as a pointer works with pointers and also with non-pointers.
|
||||
|
||||
A receiver that is defined as a pointer only works with pointers.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type circle struct {
|
||||
radius float64
|
||||
}
|
||||
|
||||
type shape interface {
|
||||
area() float64
|
||||
}
|
||||
|
||||
func (c circle) area() float64 {
|
||||
return math.Pi c.radius c.radius
|
||||
}
|
||||
|
||||
func info(f shape) {
|
||||
fmt.Println("Area", f.area())
|
||||
}
|
||||
|
||||
func main() {
|
||||
k := circle{5}
|
||||
info(&k) //Pointer
|
||||
info(k) //Non-pointer
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
The calls in lines 26 and 27 both lead to the same result. If the method area() were to be defined differently, the call in line 27 would cause an error:
|
||||
|
||||
```go
|
||||
...
|
||||
func (c circle) area() float64 {
|
||||
return math.Pi c.radius c.radius
|
||||
}
|
||||
...
|
||||
|
||||
func main() {
|
||||
k := circle{5}
|
||||
info(&k) //Pointer
|
||||
info(k) //Non-pointer = ERROR
|
||||
}
|
||||
```
|
||||
|
||||
The reason why info(k) fails is that the function specifically requests a pointer of the type circle. Since, as already described above, a \circle type pointer is an independent type and not the same as the circle type, a pointer must also be passed here.
|
||||
|
||||
|
203
content/posts/goroutine-errors.de.md
Normal file
203
content/posts/goroutine-errors.de.md
Normal file
@ -0,0 +1,203 @@
|
||||
---
|
||||
title: "Go routinen und Fehlerbehandlung"
|
||||
date: 2020-02-14
|
||||
draft: false
|
||||
tags: ["programmieren","golang","go","goroutine","concurrent","channels"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Bei einem kleinen Projekt an dem ich gerade arbeite habe ich gerade mit dem Thema Fehlerbeahndlung in Verbindung mit Goroutinen zu tun. Ich habe hier eine Library geschrieben, welche verschiedene Methoden für eine Bestellung anbietet. Natürlich habe ich brav darauf geachtet, dass im Fall der Fälle ein Fehler zurückgegeben wird.
|
||||
Aber wie ist das wenn ich nun eine Methode als Goroutine starte.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//do something useful with the order
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
o := order{}
|
||||
err := o.create("OD-001")
|
||||
fmt.Printf("Error: %v / Id: %s\n", err, o.id)
|
||||
|
||||
o2 := order{}
|
||||
err = o.create("OD-002")
|
||||
fmt.Printf("Error: %v / Id: %s\n", err, o2.id)
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/M7x_bd6xTDJ)
|
||||
|
||||
## Goroutinen erlauben parallele Ausführung
|
||||
Schön und gut. Wenn wir uns jetzt vorstellen, dass wir tausende Bestellungen bearbeiten müssen macht es natürlich Sinn über Effizienz nachzudenken.
|
||||
Indem wir unsere Methode als Gouroutine starten ermöglichen wir eine parallele Ausführung der Methoden. Klingt ja erstmal sinnvoll, also probieren wir das aus:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//do something useful with the order
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
o := order{}
|
||||
o2 := order{}
|
||||
|
||||
//start goroutines
|
||||
go o.create("OD-001")
|
||||
go o.create("OD-002")
|
||||
|
||||
fmt.Printf("Id: %s\n", o.id)
|
||||
fmt.Printf("Id: %s\n", o2.id)
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/XJAUIxdr4-W)
|
||||
|
||||
Was passiert hier? Wir haben hier im Prinzip 3 Goroutinen. Zuerst die Goroutine auf der unser main() Funktion läuft. Dazu kommen noch die beiden Goroutinen für o.create().
|
||||
Aber wir sehen keine Werte! Der Grund dafür ist einfach. Wir starten 2x o.create() als Goroutine. Das bedeutet aber auch, dass unsere main() weiterläuft, wir haben ja gesagt wir möchten o.create() jeweils parallel ausführen.
|
||||
Das führt aber jetzt dazu, dass die main() komplett durchläuft und nicht auf die Ergebnisse der anderen beiden Goroutinen wartet. Schlussendlich beendet sich sogar das Programm bevor wir einen Wert erhalten.
|
||||
|
||||
Der zweite Punkt ist, dass wir keine Fehlerbehandlung mehr machen. Verursacht eine der Goroutinen einen Fehler, so wird dieser nicht behandelt und der Benutzer bekommt eine wirklich häßliche Fehlermeldung mit der er wahrscheinlich nix anzufangen weiß.
|
||||
|
||||
## Channels machen hier alles besser
|
||||
|
||||
Wir brauchen also 2 Dinge. 1. müssen wir dafür Sorgen, dass unser Hauptprogramm auf die Beendigung der Goroutinen wartet, 2. müssen wir dafür sorgen, dass wir unseren Goroutinen eventuell Fehlermeldungen erhalten. Eine Lösung für beides bieten Channel. Ein Channel in Go ist im Grunde eine Verbindung 2 Übergabepunkten, einem Sende und einem Empfänger. Ein wichtiger Punkt ist zu wissen, das Channels blockieren. Das bedeutetkonkret, dass wenn eine Go Routine Daten in einen Channel sendet, ihre weitere Ausführung so lange blockiert wird bis der Empfänger (das könnte eine andere Go Routine sein) die Daten entgegengenommen hat.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
c := make(chan int)
|
||||
numbers := []int{1, 2, 3, 4, 5}
|
||||
for _, num := range numbers {
|
||||
go func(n int) {
|
||||
c <- n
|
||||
fmt.Printf("end goroutine %v\n", n)
|
||||
}(num)
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/5bUaufpUrkI)
|
||||
|
||||
In diesem Beispiel iterieren wir über einen numbers und starten für jeden Wert eine Go Routine. Die Goroutine schreibt die Zahl in den channel. Der Wert des Channels wird jeweils fmt.Printf() abgerufen. Das klappt soweit, jetzt schauen wir uns das blockieren einmal genauer an:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c := make(chan int)
|
||||
numbers := []int{1, 2, 3, 4, 5}
|
||||
for _, num := range numbers {
|
||||
go func(n int) {
|
||||
c <- n
|
||||
fmt.Printf("end goroutine %v\n", n)
|
||||
}(num)
|
||||
}
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
time.Sleep(time.Second 5)
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/dnkPclxJOvB)
|
||||
|
||||
Der einzige Unterschied zum vorherigen Code ist, dass fmt.Printf() nun außerhalb der for Schleife ist. Das bedeutet, dass wir den Channel nun nur noch einmal abrufen, statt zuvor fünf mal. Probiert man den Code aus so sieht man nur noch eine Ausgabe für ein Element numbers und auch fmt.Printf("end goroutine %v\n", n) innerhalb der Go Routinen wird wird nur einmal ausgegeben. Was passiert hier?
|
||||
In der for Schleife starten wir die Go Routinen. Der erste Abruf des Chanels c erfolgt erst nachdem alle Go Routinen gestartet wurden. Hier kommt die blockierende Eigenschaft Channels zum tragen. Dadurch, dass wir den Channel nur einmal abrufen bleiben die übrigen 4 Go Routinen nach dem senden an den Channel stehen und fmt.Printf("end goroutine %v\n", n) wird gar nicht ausgeführt. Ruft man aber 5 Sekunden später den Channel ein weiteres mal ab kann die nächste Go Routine beendet werden.
|
||||
|
||||
## Channel für die Fehlerbehandlung nutzen
|
||||
|
||||
Das zweite Punkt unseres Ausgangsproblems war ja die Fehlerbehandlung. Im Grunde haben wir hierfür schon alles was wir brauchen. Wir definieren mit errch := make(chan error) einen Channel der Daten vom Typ error weiterleitet. Sollte ein Fehler auftreten senden wir diesen in den Channel (Zeile 44-47), falls nicht senden wir nil in den Channel.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//tue etwas nützliches
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// a slice of order numbers
|
||||
orderno := []string{"OD-001", "OD-002", "OD-003"}
|
||||
// channel of type error
|
||||
errch := make(chan error)
|
||||
// a slice of empty orders
|
||||
orders := []order{
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
}
|
||||
for i, order := range orders {
|
||||
go func() {
|
||||
err := order.create(orderno[i])
|
||||
if err != nil {
|
||||
errch <- err
|
||||
return
|
||||
}
|
||||
errch <- nil
|
||||
}()
|
||||
err := <-errch
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
fmt.Println(order)
|
||||
}
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/p_rrBOfduT9)
|
||||
|
||||
Auf der anderen Seite muss natürlich der Abruf der Daten aus dem Channel erfolgen. In Zeile 51 rufen wir die Daten innerhalb der for Schleife aus dem Channel ab. Dadurch, dass der Channel Daten vom Typ error weiterleitet können wir in den Zeilen 51-55 die Fehlerbehandlung so wie sonst auch handhaben 😊
|
201
content/posts/goroutine-errors.en.md
Normal file
201
content/posts/goroutine-errors.en.md
Normal file
@ -0,0 +1,201 @@
|
||||
---
|
||||
title: "Go routines and error handling"
|
||||
date: 2020-02-14
|
||||
draft: false
|
||||
tags: ["programming","golang","go","goroutine","concurrent","channels"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
In a small project I am currently working on, I am dealing with the topic of error handling in goroutines. I have written a library here that offers different methods for orders. Of course, I took good care to ensure that an error is returned if the worst comes to the worst.
|
||||
But what is it like when I start a method as a goroutine?
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//do something useful with the order
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
o := order{}
|
||||
err := o.create("OD-001")
|
||||
fmt.Printf("Error: %v / Id: %s\n", err, o.id)
|
||||
|
||||
o2 := order{}
|
||||
err = o.create("OD-002")
|
||||
fmt.Printf("Error: %v / Id: %s\n", err, o2.id)
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/M7x_bd6xTDJ)
|
||||
|
||||
## Go routines allow parallel execution
|
||||
Nice and good. If we now imagine that we have to process thousands of orders, it obviously makes sense to think about efficiency.
|
||||
By starting our method as a go routine, we enable parallel execution of the methods. Sounds reasonable at first, so let's try it out:
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//do something useful with the order
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
o := order{}
|
||||
o2 := order{}
|
||||
|
||||
//start goroutines
|
||||
go o.create("OD-001")
|
||||
go o.create("OD-002")
|
||||
|
||||
fmt.Printf("Id: %s\n", o.id)
|
||||
fmt.Printf("Id: %s\n", o2.id)
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/XJAUIxdr4-W)
|
||||
|
||||
What's happening? We basically have 3 goroutines here. First the goroutine on which our main() function runs. Then there are the two goroutines for o.create().
|
||||
But we don't see any values! The reason for this is simple. We start 2x o.create() as a go routine. But that also means that our main() continues running as we wanted to execute o.create() in parallel.
|
||||
However, this now leads to the main() running and finishing the program not waiting for the results of the other two go routines.
|
||||
|
||||
The second point is that we no longer do any error handling. If one of the go routines causes an error, it is not dealt with and the user gets a really ugly error message with which he probably doesn't know what to do.
|
||||
|
||||
## Channels make things better here
|
||||
|
||||
So we need 2 things. 1. we have to make sure that our main program is waiting for the go routines to finish, 2. we have to make sure that we receive error messages from our go routines. Channel offers a solution for both. A Channel in Go is basically a connection of 2 transfer points, a send and a receiver. An important point to know is that channels block. In concrete terms, this means that if a go routine sends data to a channel, its further execution is blocked until the recipient (which could be another go routine) has accepted the data.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
c := make(chan int)
|
||||
numbers := []int{1, 2, 3, 4, 5}
|
||||
for _, num := range numbers {
|
||||
go func(n int) {
|
||||
c <- n
|
||||
fmt.Printf("end goroutine %v\n", n)
|
||||
}(num)
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/5bUaufpUrkI)
|
||||
|
||||
In this example we iterate over numbers and start a go routine for each value. The go routine writes the number into the channel. The value of the channel is retrieved by fmt.Printf (). This works so far, now let's take a closer look at blocking:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c := make(chan int)
|
||||
numbers := []int{1, 2, 3, 4, 5}
|
||||
for _, num := range numbers {
|
||||
go func(n int) {
|
||||
c <- n
|
||||
fmt.Printf("end goroutine %v\n", n)
|
||||
}(num)
|
||||
}
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
time.Sleep(time.Second 5)
|
||||
fmt.Printf("channel: %v\n", <-c)
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/dnkPclxJOvB)
|
||||
|
||||
The only difference from the previous code is that fmt.Printf() is now outside the for loop. This means that we now only retrieve the channel value once, instead of five times before. If you try out the code, you only see output for one element of numbers and also one fmt.Printf("end goroutine% v \ n", n) executed within the go routines. What's happening?
|
||||
We start the go routines in the for loop. The first call of the Chanel c takes place after all go routines have been started. This is where the blocking property of channels comes into play. Because we only retireve from the channel once, the other 4 go routines remain paused after sending to the channel and fmt.Printf("end goroutine% v \ n", n) is not executed at all. If you retrieve from the channel again 5 seconds later, the next go routine can be end.
|
||||
|
||||
## Channel for error handling
|
||||
|
||||
The second point of our initial problem was error handling. Basically, we already have everything we need for this. With errch:= make(chan error) we define a channel that forwards data of the type error. If an error occurs we send it to the channel (lines 44-47), if not we send nil to the channel.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type order struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (o order) create(id string) error {
|
||||
//tue etwas nützliches
|
||||
if id == "OD-002" {
|
||||
err := fmt.Errorf("error with %s", id)
|
||||
return (err)
|
||||
}
|
||||
o.id = id
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// a slice of order numbers
|
||||
orderno := []string{"OD-001", "OD-002", "OD-003"}
|
||||
// channel of type error
|
||||
errch := make(chan error)
|
||||
// a slice of empty orders
|
||||
orders := []order{
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
{
|
||||
id: "",
|
||||
},
|
||||
}
|
||||
for i, order := range orders {
|
||||
go func() {
|
||||
err := order.create(orderno[i])
|
||||
if err != nil {
|
||||
errch <- err
|
||||
return
|
||||
}
|
||||
errch <- nil
|
||||
}()
|
||||
err := <-errch
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
fmt.Println(order)
|
||||
}
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/p_rrBOfduT9)
|
||||
|
||||
On the other hand, the data must be retrieved from the channel. In line 51 we retrieve the data within the for loop from the channel. Because the channel forwards data of the type error we can handle error handling in the lines 51-55 as usual 😊
|
166
content/posts/graphql-shopify-golang.de.md
Normal file
166
content/posts/graphql-shopify-golang.de.md
Normal file
@ -0,0 +1,166 @@
|
||||
---
|
||||
title: "Daten vom GraphQL Endpunkt Shopify holen"
|
||||
date: 2020-04-24
|
||||
draft: false
|
||||
tags: ["programmieren","golang","go","graphql","shopify"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Ich habe gestern für einen unserer Backend-Services einfach nur einen Preis aus unserem Shopify Shop gebraucht.
|
||||
Um genau zu sein brauchte ich eine Möglichkeit um bei Shopify anhand einer Artikelnummer/SKU einen Preis abzufragen.
|
||||
|
||||
Da es sich hier um eine sehr gezielte Anfrage handelt, habe ich mir gedacht, dass ich hierzu die GraphQL Api Shopify nutze 😊
|
||||
Im folgenden zeige ich einmal wie man ein derartiges Problem lösen kann. Der vollständige Code ist unter folgender URL zu finden:
|
||||
|
||||
https://gist.github.com/m3tam3re/98d9b57f404db3bc1ff8af133e54afd0
|
||||
|
||||
## Was brauchen wir?
|
||||
|
||||
Zunächst einmal muss unser Programm ein Http Request an den GraphQL Endpunkt Shopify senden. Mit diesem Request wollen wir natürlich eine konkrete Anfrage in Form einer Query senden.
|
||||
D.h. wir brauchen eine Funktion, die unsere Query anhand einer gegebenen Artikelnummer erzeugt und das Ergebnis verarbeitet und uns den Preis zurückgibt.
|
||||
|
||||
Um das umzusetzen brauchen wir eigentlich keinerlei zusätzliche Pakete. Das alles lässt sich mit dem Standardumfang GO lösen. Da ich allerdings für mich den Umgang mit der JSON Antwort vereinfachen wollte habe ich mich entschieden das Paket github.com/valyala/fastjson zu verwenden.
|
||||
Wenn Ihr Euch den Code anseht versteht Ihr schnell wieso 😇
|
||||
|
||||
## 1. Funktion für HTTP Request erstellen
|
||||
|
||||
Als erstes erstellen wir eine Funktion, die ein Request an den GraphQL Endpunkt unseres Shopify Shops sendet und uns die Antwort oder einen Fehler zurückliefert.
|
||||
Da ich davon ausgehe, dass ich vielleicht auch noch andere Daten brauche außer dem aktuellen Anwendungsfall habe ich mich entschieden das Ganze in eine allgemeine Funktion zu packen.
|
||||
```go
|
||||
func startRequest(body []byte) (http.Response, error) {
|
||||
client := http.Client{
|
||||
Timeout: time.Second 120,
|
||||
}
|
||||
req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(body))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf( "error building request: %s", err)
|
||||
}
|
||||
req.Header.Add("X-Shopify-Access-Token",token)
|
||||
req.Header.Add("Content-Type", "application/graphql")
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf( "error executing request: %s", err)
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
```
|
||||
Die Funktion ist eigentlich recht einfach:
|
||||
- wir erstellen einen HTTP Client mit einem Timeout, damit die Anfrage abgebrochen wird, wenn es zu lange dauert
|
||||
- wir erstellen ein neues POST Request, dem wir neben der Art des Requests auch die URL und den Inhalt/body übermitteln. Da diese Funktion einen io.Reader erfordert wandeln wir unseren body in einen Buffer um der das io.Reader Interface implementiert
|
||||
- wir fügen dem Header unseres Requests das X-Shopify-Access-Token hinzu und definieren, dass das Request vom Typ application/graphql ist
|
||||
- anschließend führen wir das Request mit client.Do(req) aus
|
||||
- unterwegs behandeln wir noch Fehler, die eventuell auftreten können
|
||||
|
||||
## 2. Funktion zur Abfrage des Preises erstellen
|
||||
|
||||
Die 2. Funktion die wir schreiben soll unsere Query für den GraphQL Endpunkt bauen und das Ganze an unsere startrequest() Funktion übermitteln. Außerdem soll Sie das zurückgelieferte Ergebnis auswerten und an unser Hauptprogramm zurückliefern.
|
||||
|
||||
Das Anlegen eines eigenen Typs für das Einsortieren des JSON Antwort halte ich hier für Overkill, wir wollen ja nur einen Wert! Daher verwenden wir das Paket fastjson.
|
||||
```go
|
||||
func getItemPrice(sku string) (float32, error) {
|
||||
query := `{
|
||||
inventoryItems(first:1, query:"sku:` + sku + `") {
|
||||
edges{
|
||||
node{
|
||||
sku
|
||||
variant {
|
||||
price
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`
|
||||
resp, err := startRequest([]byte(query))
|
||||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf( "error reading response body: %s", err)
|
||||
}
|
||||
p := fastjson.GetString(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price")
|
||||
if fastjson.Exists(body, "error") {
|
||||
return 0, fmt.Errorf("shopify responded with an error: %s", fastjson.GetString(body, "error"))
|
||||
}
|
||||
if fastjson.Exists(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price") == false {
|
||||
return 0, fmt.Errorf("item could not be found in shopify: %s", sku)
|
||||
}
|
||||
price, err:= strconv.ParseFloat(p, 32)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf( "error reading response body: %s", err)
|
||||
}
|
||||
return float32(price), nil
|
||||
}
|
||||
```
|
||||
Ich erkläre mal oben nach unten was die Funktion macht:
|
||||
- zuerst legen wir die Query für den GraphQL Endpunkt fest. Diese ist im Grunde nur ein zusammengesetzter String in den zwischendurch die Artikelnummer eingefügt wird, die wir der Funktion beim Aufruf übergeben haben
|
||||
- danach übergeben wir unserer startRequest() die Query als byte Slice und erhalten die Antwort Shopify als \http.Response zurück
|
||||
- wir sorgen mit defer resp.Body.Close() dafür, dass der Inhalt der Antwort nach Abschluss geschlossen wird und nutzen einen reader um den Inhalt in der Variable body zu speichern
|
||||
- jetzt holen wir uns über die Funktion fastjson.GetString() den Preis aus der Antwort Shopify und erzeugen in der Zeile danach einen Fehler falls Shopify einen Fehler zurückmeldet.
|
||||
- außerdem behandeln wir noch den Fall, dass das Feld price Shopify gar nicht zurückgeliefert wird (z.B. wenn Shopify den Artikel nicht kennt)
|
||||
- zuletzt machen wir aus dem String den uns Shopify liefert ein Float und geben den Preis zurück an die Hauptfunktion
|
||||
|
||||
### Wie das mit fastjson funktioniert
|
||||
|
||||
Ich oben schnell darüber hinweggegangen wie genau wir mit fastjson unseren Preis erhalten. Im Grunde funktioniert das so, dass wir uns an der JSON antwort entlang hangeln:
|
||||
Die Antwort Shopify sieht in etwa so aus:
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"inventoryItems": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"sku": "mySKU",
|
||||
"variant": {
|
||||
"price": "144.90"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"extensions": {
|
||||
"cost": {
|
||||
"requestedQueryCost": 4,
|
||||
"actualQueryCost": 4,
|
||||
"throttleStatus": {
|
||||
"maximumAvailable": 1000.0,
|
||||
"currentlyAvailable": 996,
|
||||
"restoreRate": 50.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Unser fastjson.GetString() Aufruf sah ja so aus:
|
||||
```go
|
||||
fastjson.GetString(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price")
|
||||
```
|
||||
Wie man sieht, übergeben wir die komplette Antwort Shopify durch die Variable body gefolgt der Struktur, die wir in der JSON Antwort finden bis wir bei price landen.
|
||||
Das Einzige was man hier wirklich beachten muss ist, dass die edges in der Antwort eine Liste sind. Daher müssen wir fastjson mitteilen welches Element der Liste wir haben wollen. Wir haben hier ja nur ein Element, daher geben wir den Index 0 an: ... "edges", "0", "node" ...
|
||||
|
||||
Mit fastjson.Exists() kann man prüfen ob ein bestimmter Wert in der Antwort enthalten ist und entsprechend darauf reagieren. Natürlich hat fastjson noch weitere nützliche Funktionen. Mehr dazu unter:
|
||||
|
||||
https://github.com/valyala/fastjson
|
||||
|
||||
## 3. Die Hauptfunktion
|
||||
|
||||
Die Hauptfunktion ist relativ simpel. Wir übergeben getItemPrice() die Artikelnummer, die wir suchen, prüfen ob es eventuell einen Fehler gab und geben ansonsten den Preis aus:
|
||||
```go
|
||||
func main() {
|
||||
price, err := getItemPrice("your_SKU") // The SKU you are looking for
|
||||
if err != nil {
|
||||
log.Fatalf("could not get price from shopify: %s", err)
|
||||
}
|
||||
fmt.Println("Price:", price)
|
||||
}
|
||||
```
|
||||
Wie schon gesagt, den kompletten Code findet Ihr unter:
|
||||
|
||||
https://gist.github.com/m3tam3re/98d9b57f404db3bc1ff8af133e54afd0
|
||||
|
||||
## 4. Das war's 😇
|
||||
|
||||
Wie man sieht kann man sich relativ einfach Daten aus seinem Shopify Shop holen. Neben ein paar Programmierkenntnissen ist es natürlich hilfreich, wenn man sich mit GraphQL ein wenig auskennt.
|
||||
|
||||
Man könnte an diesem kleinen Programm berechtigterweise kritisieren, dass die Funktion getItemPrice() zu viele Aufgaben zu erledigen hat. In einem größeren Kontext hätte man wahrscheinlich das Erstellen der Query an eine eigene Funktion ausgelagert.
|
||||
Ich denke aber das Prinzip wird trotzdem klar.
|
166
content/posts/graphql-shopify-golang.en.md
Normal file
166
content/posts/graphql-shopify-golang.en.md
Normal file
@ -0,0 +1,166 @@
|
||||
---
|
||||
title: "Get data from the graphql endpoint of you Shopify store"
|
||||
date: 2020-04-24
|
||||
draft: false
|
||||
tags: ["programming","golang","go","graphql","shopify"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
Yesterday I just needed a price from our Shopify Shop for one of our backend services.
|
||||
To be precise, I needed a way to request a price from Shopify using an article number / SKU.
|
||||
|
||||
Since this is a very specific query, I thought that I would use the GraphQL Api from Shopify 😊
|
||||
In the following I show how to solve such a problem. The full code can be found at the following URL:
|
||||
|
||||
https://gist.github.com/m3tam3re/98d9b57f404db3bc1ff8af133e54afd0
|
||||
|
||||
## What do we need?
|
||||
|
||||
First of all, our program has to send a Http Request to the GraphQL endpoint of Shopify. With this request we naturally want to send a specific query in the form of a query.
|
||||
I.e. we need a function that generates our query based on a given article number and processes the result and returns the price to us.
|
||||
|
||||
We don't actually need any additional packages to implement this. All of this can be solved with the standard library of GO. However, since I wanted to simplify the handling of the JSON answer for myself, I decided to use the package github.com/valyala/fastjson .
|
||||
If you look at the code, you quickly understand why 😇
|
||||
|
||||
## 1. Create a function for the HTTP request
|
||||
|
||||
First, we create a function that sends a request to the GraphQL endpoint of our Shopify shop and returns the answer or an error.
|
||||
Since I assume that I might need other data besides the current use case, I decided to put the whole thing in a general function.
|
||||
```go
|
||||
func startRequest(body []byte) (http.Response, error) {
|
||||
client := http.Client{
|
||||
Timeout: time.Second 120,
|
||||
}
|
||||
req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(body))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf( "error building request: %s", err)
|
||||
}
|
||||
req.Header.Add("X-Shopify-Access-Token",token)
|
||||
req.Header.Add("Content-Type", "application/graphql")
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf( "error executing request: %s", err)
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
```
|
||||
The function is actually quite simple:
|
||||
- we create an HTTP client with a timeout so that the request is canceled in case it takes too long
|
||||
- we create a new POST request, to which we send the URL and the content / body in addition to the type of request. Since this function requires a io.Reader, we convert our body into a buffer that implements the io.Reader interface
|
||||
- we add the X-Shopify-Access-Token to the header of our request and define that the request is of the type application/graphql
|
||||
- then we execute the request with client.Do (req)
|
||||
- on the way we still handle errors that may occur
|
||||
|
||||
## 2. Create a function to query the price
|
||||
|
||||
The second function we are going to write is to build our query for the GraphQL endpoint and to send the whole thing to our startRequest() function. Also the returned result should be evaluated and returned to our main function.
|
||||
|
||||
I think creating an own type for unmarshaling the JSON answer is overkill, we only want one value! Therefore we use the fastjson package.
|
||||
```go
|
||||
func getItemPrice(sku string) (float32, error) {
|
||||
query := `{
|
||||
inventoryItems(first:1, query:"sku:` + sku + `") {
|
||||
edges{
|
||||
node{
|
||||
sku
|
||||
variant {
|
||||
price
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`
|
||||
resp, err := startRequest([]byte(query))
|
||||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf( "error reading response body: %s", err)
|
||||
}
|
||||
p := fastjson.GetString(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price")
|
||||
if fastjson.Exists(body, "error") {
|
||||
return 0, fmt.Errorf("shopify responded with an error: %s", fastjson.GetString(body, "error"))
|
||||
}
|
||||
if fastjson.Exists(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price") == false {
|
||||
return 0, fmt.Errorf("item could not be found in shopify: %s", sku)
|
||||
}
|
||||
price, err:= strconv.ParseFloat(p, 32)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf( "error reading response body: %s", err)
|
||||
}
|
||||
return float32(price), nil
|
||||
}
|
||||
```
|
||||
I'll explain from top to bottom what the function does:
|
||||
- First we define the query for the GraphQL endpoint. Basically, this is just a composite string in which the article number that we provided to the function is inserted
|
||||
- then we pass the query to our startRequest() as a byte slice and receive the response from Shopify as \http.Response
|
||||
- With defer or Body.Close() we ensure that the content of the answer is closed after completion. Moreover we use a reader to save the content in the variable body
|
||||
- Now we use the fastjson.GetString() function to get the price from Shopify's response and then generate an error in the line if Shopify reports an error.
|
||||
- We also deal with the case that the price field is not returned by Shopify (e.g. if Shopify does not know the item)
|
||||
- Finally, we make the string that Shopify provides us with a float and return the price to the main function
|
||||
|
||||
### How to use fastjson
|
||||
|
||||
I quickly went over how exactly we get our price with fastjson. Basically we need to move along the JSON answer:
|
||||
Shopify's answer looks something like this:
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"inventoryItems": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"sku": "mySKU",
|
||||
"variant": {
|
||||
"price": "144.90"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"extensions": {
|
||||
"cost": {
|
||||
"requestedQueryCost": 4,
|
||||
"actualQueryCost": 4,
|
||||
"throttleStatus": {
|
||||
"maximumAvailable": 1000.0,
|
||||
"currentlyAvailable": 996,
|
||||
"restoreRate": 50.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Our fastjson.GetString() function call looked like this:
|
||||
```go
|
||||
fastjson.GetString(body, "data", "inventoryItems", "edges", "0", "node", "variant", "price")
|
||||
```
|
||||
As you can see, we pass Shopify's complete response through the variable body followed by the structure we find in the JSON response until we end up with price.
|
||||
The only thing you really have to consider here is that the edges in the answer are a list. Therefore we have to tell fastjson which element of the list we want. We only have one element here, so we give the index 0: ... "edges", "0", "node" ...
|
||||
|
||||
With fastjson.Exists() you can check whether a certain value is contained in the answer and react accordingly. Of course, fastjson has other useful functions. More on this at:
|
||||
|
||||
https://github.com/valyala/fastjson
|
||||
|
||||
## 3. The main() function
|
||||
|
||||
The main function is relatively simple. We pass getItemPrice() the article number we are looking for, check whether there was an error and otherwise output the price:
|
||||
```go
|
||||
func main() {
|
||||
price, err := getItemPrice("your_SKU") // The SKU you are looking for
|
||||
if err != nil {
|
||||
log.Fatalf("could not get price from shopify: %s", err)
|
||||
}
|
||||
fmt.Println("Price:", price)
|
||||
}
|
||||
```
|
||||
As I said, you can find the complete code at:
|
||||
|
||||
https://gist.github.com/m3tam3re/98d9b57f404db3bc1ff8af133e54afd0
|
||||
|
||||
## 4. That's it 😇
|
||||
|
||||
As you can see, it is relatively easy to get data from your Shopify shop. In addition to a few programming skills, it is of course helpful if you are familiar with GraphQL.
|
||||
|
||||
One could legitimately criticize this small program. The function getItemPrice() has too many responsibilities. In a larger context, the query creation would probably have been outsourced to its own function.
|
||||
I think the principle is still clear.
|
31
content/posts/links.de.md
Normal file
31
content/posts/links.de.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Links"
|
||||
date: 2020-03-13
|
||||
draft: true
|
||||
tags: ["datenbank","graphql","grpc","graph","graphql"]
|
||||
series: ["Dgraph Grundlagen"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
|
||||
https://www.ecamm.com/mac/ecammlive/
|
||||
https://github.com/rclone/rclone
|
||||
https://github.com/pion/webrtc
|
||||
https://github.com/labstack/echo
|
||||
https://github.com/cristalhq/jwt
|
||||
https://github.com/containous/traefik
|
||||
https://github.com/fatedier/frp
|
||||
https://etcd.io/
|
||||
https://jsonnet.org/
|
||||
dependabot
|
||||
mighty networkd
|
||||
|
||||
https://github.com/Redocly/redoc
|
||||
golang.org/x/crypto/acme/autocert
|
||||
|
||||
https://github.com/johanbrandhorst/grpc-auth-example
|
||||
https://github.com/johanbrandhorst/grpc-auth-example
|
||||
|
||||
https://www.alexedwards.net/blog/organising-database-access
|
||||
|
||||
https://wallabag.org/en#
|
||||
https://www.freshrss.org/
|
31
content/posts/links.en.md
Normal file
31
content/posts/links.en.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
title: "Links"
|
||||
date: 2020-03-13
|
||||
draft: true
|
||||
tags: ["datenbank","graphql","grpc","graph","graphql"]
|
||||
series: ["Dgraph Grundlagen"]
|
||||
categories: ["Archive"]
|
||||
---
|
||||
|
||||
https://www.ecamm.com/mac/ecammlive/
|
||||
https://github.com/rclone/rclone
|
||||
https://github.com/pion/webrtc
|
||||
https://github.com/labstack/echo
|
||||
https://github.com/cristalhq/jwt
|
||||
https://github.com/containous/traefik
|
||||
https://github.com/fatedier/frp
|
||||
https://etcd.io/
|
||||
https://jsonnet.org/
|
||||
dependabot
|
||||
mighty networkd
|
||||
|
||||
https://github.com/Redocly/redoc
|
||||
golang.org/x/crypto/acme/autocert
|
||||
|
||||
https://github.com/johanbrandhorst/grpc-auth-example
|
||||
https://github.com/johanbrandhorst/grpc-auth-example
|
||||
|
||||
https://www.alexedwards.net/blog/organising-database-access
|
||||
|
||||
https://wallabag.org/en#
|
||||
https://www.freshrss.org/
|
120
content/posts/orchid.de.md
Normal file
120
content/posts/orchid.de.md
Normal file
@ -0,0 +1,120 @@
|
||||
---
|
||||
title: "Orchid - Dezentrales VPN"
|
||||
date: 2020-08-27
|
||||
draft: true
|
||||
tags: ["sicherheit","tools","vpn","privatsphäre","anonym"]
|
||||
archiv: ["Archive"]
|
||||
featuredImage: "/img/orchid/orchid.gif"
|
||||
---
|
||||
# Privatsphäre im heutigen Internet
|
||||
|
||||
Machen wir uns nichts vor. Die Zeiten, in denen das Internet ein freier Ort war, sind längst vorbei. Die vielen vermeintlich kostenlosen Dienste der Web 2.0 Ära kosten uns unsere Privatsphäre und werden durch unsere Daten und Online-Gewohnheiten finanziert.
|
||||
Ich will hier jetzt gar nicht klagen. Deutschland ist mit Sicherheit nicht die allerschlechteste Wahl, wenn es um den Schutz persönlicher Daten angeht. Die EU versucht ja immerhin die Sammelwut diverser Großkonzerne zu begrenzen.
|
||||
|
||||
Ich habe mir lange Zeit keine Gedanken um so etwas gemacht. Frei nach dem Motto "Ich habe ja eh nichts zu verbergen." habe ich mir auch nicht viel dabei gedacht, was mit meinen Daten so passiert.
|
||||
In den letzten Jahren ist es aber leider sehr viel schlimmer geworden und hat teilweise gruselige Ausmaße angenommen. Werbung ist einfach allgegenwärtig.
|
||||
Ich habe früher immer gerne Werbung gesehen und fand es immer toll auf das eine oder andere interessante Produkt hingewiesen zu werden. Das ist leider lange vorbei.
|
||||
|
||||
Ich will jetzt hier auch kein generelles Urteil fällen. Es gehören immer zwei Seiten dazu und wir als Konsumenten und Kunden haben durchaus Einfluss auf die Situation. Die Sache ist die: Wenn wir alles umsonst haben wollen, müssen Firmen wie Google, E-Mail Anbieter und soziale Netzwerke sich Möglichkeiten überlegen um trotz kostenloser Dienste profitabel arbeiten zu können.
|
||||
|
||||
Es scheint auch so, dass das aktuelle Modell attraktiver für die meisten Konzerne ist. Zumindest ist es bisher so, dass man bei nur wenigen Anbietern die Wahl hat. Vielleicht würde ja der eine oder andere gerne ein paar Euro für einen Dienst bezahlen und dafür eine werbefreie Erfahrung genießen.
|
||||
|
||||
|
||||
## Mein persönliches Setup
|
||||
|
||||
Ein Teil meiner Strategie ist, dass ich, da wo es Sinn ergibt ,auf kostenpflichtige Dienste setze. Z.B. nutze ich für meine E-Mail [HEY](https://hey.com/). Außerdem habe ich ein YouTube Premium Abo, da ich Youtube sehr viel nutze und man hier für vergleichsweise wenig Geld viel Werbung erspart bekommt.
|
||||
|
||||
Zusätzlich setze ich [Pi Hole](https://pi-hole.net/) als DNS Server ein, d.h. der gesamte Internetverkehr geht durch den Pi Hole Server. Pi Hole leistet wirklich gute Arbeit beim Entfernen Werbeanzeigen.
|
||||
|
||||
Als Browser nutze ich [Brave](https://brave.com/). Meiner Meinung nach hat Brave viele Punkte in Sachen Privatsphäre sehr gut gelöst. Auch der Ansatz, dass man für das Einblenden Werbung BAT Token verdient finde ich einen guten Ansatz. So kann man selbst entscheiden, ob und wie viel Werbung man sehen möchte.
|
||||
|
||||
Zusätzlich dazu nutze ich auch ab und zu einen VPN Dienst. Bisher hatte ich hier den Dienstleister IPVanish genutzt. Also mein Abo bei diesem Dienst vor ein paar Wochen auslief, habe ich mich nach Alternativen umgesehen. Ich bin dabei auf das [Orchid](https://www.orchid.com/) Netzwerk gestoßen.
|
||||
|
||||
## Was ist Orchid
|
||||
|
||||
Orchid ist im Wesentlichen ein dezentraler VPN Marktplatz. Mit eigener Crypto Währung und Smart Contracts auf Basis der Ethereum Blockchain werden die Transaktionen zwischen Usern und VPN Anbietern dezentral abgewickelt.
|
||||
Der komplette Marktplatz ist peer-to-peer, d.h. es gibt keine zentrale Verwaltung.
|
||||
|
||||
Man kann über die Orchid App mit einem Klick eine sichere VPN Verbindung herstellen, der Rest läuft im Hintergrund. Auch Verbindungen aus mehreren Sprüngen/Hops, so wie manch einer es vom Tor Netzwerk kennt, sind möglich. Hier ist jeder Sprung im Grunde eine zusätzliche VPN Verbindung.
|
||||
|
||||
Die Währung OXT dient dazu, die Zahlungen, genannt Nanopayments, zwischen VPN Nutzern und Anbietern abzuwickeln. Gleichzeitig müssen die Anbieter OXT Anteile halten um am Netzwerk teilnehmen zu können.
|
||||
|
||||
Die Abrechnung erfolgt nach verbrauchter Bandbreite. Laut [diesem Artikel](https://blog.orchid.com/how-much-does-bandwidth-cost-on-orchid/) entspricht ein OXT einem Datenvolumen rund 10 GB.
|
||||
|
||||
Orchid kann jedem genutzt werden, ohne Registrierung und ohne persönliche Daten. Es gibt keine Laufzeit und keine Verträge. Man benötigt lediglich ein Wallet, dass mit OXT aufgeladen ist und kann loslegen.
|
||||
Für den einfachen Einstieg bietet Orchid eine App für iOS, Android und macOS. Eine Windows App soll bald folgen.
|
||||
|
||||
## Einen Account einrichten
|
||||
|
||||
Für die Einrichtung eines Accounts gibt es 2 Möglichkeiten.
|
||||
|
||||
1. Ihr könnt in der App einen Orchid Account kaufen. Ihr bekommt dafür einen Account der bereits mit OXT aufgeladen ist und könnt sofort loslegen.
|
||||
2. Ihr könnnt selbst einen Account anlegenn
|
||||
|
||||

|
||||
|
||||
Wie das genau mit dem selbst angelegten Account funktioniert zeigt einem die [Orchid Webseite](https://www.orchid.com/join).
|
||||
Für die Einrichtung des Accounts müssen ausreichend OXT Credits vorhanden sein. Zurzeit sind dazu 65 OXT notwendig, was beim aktuellen Kurs(28.08.2020) etwa 25 € entspricht.
|
||||
|
||||
Für den Kauf der OXT Credits gibt es verschiedene Wege. Man kann die Credits einfach bei einem Anbieter wie [Coinbase](https://www.coinbase.com/join/knig_ij) kaufen.
|
||||
|
||||
Da man sich bei nahezu jedem Anbieter verifizieren muss, ist dieser Vorgang im ersten Moment nicht gerade anonym.
|
||||
Das muss er aber auch gar nicht sein. Die Anbieter, bei denen man Cryptowährungen kaufen kann, verwalten die Bestände der Kunden auf internen Konten. Wenn man jetzt dort aus Coins an eine Wallet Adresse sendet, kann mann zwar die Transaktion auf der Blockchain sehen, es gibt aber keine Möglichkeit herauszufinden wer die Coins ursprünglich gekauft hat (es sei denn der Anbieter wird gehacked).
|
||||
|
||||
## Die Orchid App nutzen
|
||||
|
||||
Hat man seinen Account, ist die Einrichtung denkbar einfach. Man fügt einfach einen Hop/Sprung hinzu und hinterlegt seinen Account.
|
||||
|
||||

|
||||
|
||||
Ein Hop ist dabei immer jeweils eine VPN Verbindung. Wie man am Bild oben sieht, muss ein Hop nicht zwangsläufig ein Orchid Account sein. Ihr könnt hier auch eine beliebige OpenVPN oder WireGuard Konfiguration hinterlegen.
|
||||
Man kann mehrere Hops einrichten und so die Anonymisierung noch verstärken. Man muss sich aber auch darüber klar sein, dass mehrere Hops mit Orchid Accounts auch zu höherem OXT Verbrauch führen.
|
||||
|
||||
Hat man seine Hops eingerichtet muss man eigentlich nur noch den Connect Button drücken:
|
||||
|
||||

|
||||
|
||||
## Wie anonym ist das Ganze?
|
||||
|
||||
Wenn man einem einzelnen Hop ausgeht, ist man ungefähr so anonym wie bei einem herkömmlichen VPN Anbieter, d.h. der VPN Anbieter weiß die folgenden Dinge:
|
||||
|
||||
welchen ISP Du benutzt
|
||||
wie Deine IP Adresse lautet
|
||||
welche Internetseiten Du besuchst
|
||||
|
||||
Außerdem ist die Zahlung Ethereum Adresse Deines Orchid Account zur Ethereum Adresse des VPN Anbieters auf der Blockchain einsehbar. Der VPN Anbieter weiß aber trotzdem nicht, wem die Ethereum Adresse gehört.
|
||||
Dein ISP allerdings weiß nur noch über Deine Verbindung zum VPN Anbieter Bescheid und kann nicht nachvollziehen welche Webseiten Du besuchst.
|
||||
Auch die besuchten Webseiten wissen weniger über Dich, Deine Herkunft und Dein ISP sind z.B. nicht mehr für die Webseiten verfügbar.
|
||||
|
||||
### Mit mehreren Hops arbeiten
|
||||
|
||||
Wer sehr viel Wert auf seine Privatsphäre legt, kann auch mit mehreren Hops arbeiten. Bei mehreren Hops über Orchid Accounts ist es sinnvoll, wenn das unterschiedliche Accounts nutzt. Dadurch gibt es für keinen Anbieter wirklich brauchbare Informationen.
|
||||
Welche Inhalte man aufruft weiß nur der letzte Anbieter in der Kette, wie die ursprüngliche IP Adresse lautet und welchen Internetanbieter man nutzt weiß hingegen nur der erste Anbieter.
|
||||
|
||||

|
||||
|
||||
Man muss hier auch nicht mit eigenen Accounts arbeiten. Der Orchid App ist es völlig egal zu wem der Account gehört und bietet einem die Möglichkeit Accounts einfach weiterzugeben oder zu teilen.
|
||||
Es können auch mehrere Leute einen Account gleichzeitig nutzen.
|
||||
|
||||
### Nachteile mehrerer Hops
|
||||
|
||||
So schön mehrere Hops auch für die Privatsphäre sind, es gibt auch Nachteile. Je mehr Sprünge die Verbindung macht desto höher wird die Latenz. Die Geschwindigkeit wird dadurch ebenfalls negativ beeinflusst. Ein anderer Faktor ist der OXT Verbrauch. 4 Hops = 4x so hoher Verbrauch Credits.
|
||||
|
||||
|
||||
## TL;DR
|
||||
|
||||
Orchid ist eine flexible und auch günstige Lösung, die Sicherheit und Privatsphäre gewährleistet. Durch die Abrechnung per Crypto Währung nach Datenvolumen zahlt man auch wirklich nur das, was man auch nutzt. Die Token verfallen auch nicht.
|
||||
Einmal gekauft ist es egal ob man die OXT Token in 4 Wochen oder in 4 Jahren verbraucht.
|
||||
|
||||
Die Accounterstellung ist sehr einfach gehalten. Auch an Nutzer, die sich noch nie mit Blockchain und Ethereum befasst haben wurde gedacht, da man einfach fertige Accounts kaufen kann.
|
||||
|
||||
Orchid ist dezentral und es sind keinerlei persönliche Daten erforderlich um den Dienst zu nutzen. Dadurch muss man sein Vertrauen nicht in einen einzelnen Anbieter setzen, in der Hoffnung, dass dieser keine Logs schreibt oder Nutzerdaten weitergibt.
|
||||
|
||||
Die App ist wirklich sehr einfach zu bedienen, mit technischen Details muss man sich eigentlich gar nicht befassen.
|
||||
|
||||
Interessant fände ich die Möglichkeit mit erweiterten Einstellungen zu arbeiten. Im Whitepaper gibt es einen Absatz zum Thema Node Auswahl anhan Metadaten wie Geolocation, Preis, Latenz etc.
|
||||
Ich fände es für die App durchaus interessant hier ein wenig Einfluss zu haben. Man hat ja auch nicht immer die gleichen Anforderungen.
|
||||
|
||||
Das war's fürs Erste 😎
|
||||
|
||||
|
120
content/posts/orchid.en.md
Normal file
120
content/posts/orchid.en.md
Normal file
@ -0,0 +1,120 @@
|
||||
+++
|
||||
title = "Orchid - Decentralized VPN"
|
||||
date = 2020-08-27
|
||||
draft = true
|
||||
tags = ["security","tools","vpn","privacy"]
|
||||
archive = ["bla"]
|
||||
series = ["misc stuff"]
|
||||
featuredImage = "/img/orchid/orchid.gif"
|
||||
+++
|
||||
# Privacy in today's internet
|
||||
|
||||
Let's not fool ourselves. The days when the internet was a free place are long gone. The many supposedly free services of the Web 2.0 era cost us our privacy and are financed by our data and online habits.
|
||||
I don't want to complain here now. Germany is definitely not the worst choice when it comes to protecting personal data. After all, the EU is trying to limit the collecting mania of various large corporations.
|
||||
|
||||
For a long time I didn't think about that. True to the motto "I have nothing to hide anyway." I didn't think too much about what would happen to my data.
|
||||
Unfortunately, in the last few years it has gotten a lot worse and has taken on creepy proportions. Advertising is ubiquitous.
|
||||
In the past I always liked to see advertising and always found it great to be pointed out to one or the other interesting product. Unfortunately that is long over.
|
||||
|
||||
I don't want to make a general judgment here either. There are always two sides to it, and we as consumers and customers definitely have an influence on the situation. The thing is: if we want everything for free, companies like Google, email providers and social networks have to think about ways to work profitably despite free services.
|
||||
|
||||
It also appears that the ad based model is more attractive to most corporations. At least it has been the case so far that you only have a choice with a few providers. Perhaps one or the other would like to pay a few euros for a service and enjoy an ad-free experience in return.
|
||||
|
||||
## My personal setup
|
||||
|
||||
Part of my strategy is to use paid services where it makes sense. E.g. I use [HEY](https://hey.com/) for my email. I also have a YouTube Premium subscription because I use YouTube a lot, so you can save a lot of advertising for comparatively little money.
|
||||
|
||||
In addition, I use [Pi Hole](https://pi-hole.net/) as a DNS server, i.e. all internet traffic goes through the Pi Hole server. Pi Hole does a wonderful job of removing ads.
|
||||
|
||||
My browser is [Brave](https://brave.com/). In my opinion, Brave handled a lot of privacy issues very well. I also think that the approach that you earn BAT tokens for displaying ads is a good way. So you can decide for yourself whether and how much advertising you want to see.
|
||||
|
||||
In addition, I also use a VPN service from time to time. So far I had used the service provider IPVanish. As my subscription to this service expired a few weeks ago, I started looking for alternatives. I came across the [Orchid](https://www.orchid.com/) network.
|
||||
|
||||
## What is orchid
|
||||
|
||||
Orchid is essentially a decentralized VPN marketplace. With their own crypto currency and smart contracts based on the Ethereum blockchain, the transactions between users and VPN providers are processed decentrally.
|
||||
The entire marketplace is peer-to-peer, i.e. there is no central administration.
|
||||
|
||||
You can set up a secure VPN connection with one click of the Orchid app, the rest runs in the background. Connections from several hops, as some people know from the Tor network, are also possible. Here, every jump is basically an additional VPN connection.
|
||||
|
||||
The OXT currency is used to process payments, called nanopayments, between VPN users and providers. At the same time, the providers must hold OXT shares in order to participate in the network.
|
||||
|
||||
Billing is based on the bandwidth used. According to [this article](https://blog.orchid.com/how-much-does-bandwidth-cost-on-orchid/) an OXT corresponds to a data volume of around 10 GB.
|
||||
|
||||
Orchid can be used by anyone, without registration and without personal data. There is no term and no contracts. All you need is a wallet that is charged with OXT and you can get started.
|
||||
Orchid offers an app for iOS, Android and macOS. A Windows app should follow soon.
|
||||
|
||||
## Set up an account
|
||||
|
||||
There are 2 options for setting up an account.
|
||||
|
||||
1. You can buy an Orchid account in the app. You will get an account that is already charged with OXT and you can start immediately.
|
||||
2. You can create an account yourself
|
||||
|
||||

|
||||
|
||||
The [Orchid website](https://www.orchid.com/join) shows you exactly how to set up an account on your own.
|
||||
Sufficient OXT credits must be available to set up the account. At the moment 65 OXT are necessary for this, which corresponds to about 25 € at the current rate (08/28/2020).
|
||||
|
||||
There are different ways to buy the OXT Credits. You can simply buy the credits from a provider like [Coinbase](https://www.coinbase.com/join/knig_ij).
|
||||
|
||||
Since you have to verify yourself with almost every provider, this process is not exactly anonymous at first.
|
||||
But it doesn't have to be. The providers from whom you can buy crypto currencies manage the customers' inventories in internal accounts. If you now send coins to a wallet address from there, you can see the transaction on the blockchain, but there is no way to find out who originally bought the coins (unless the provider is hacked).
|
||||
|
||||
## Use the Orchid app
|
||||
|
||||
If you have an account, the setup is very easy. You just add a hop and save your account.
|
||||
|
||||

|
||||
|
||||
One hop is always a VPN connection. As you can see in the picture above, a hop does not have to be an Orchid account. You can also store any OpenVPN or WireGuard configuration here.
|
||||
You can set up several hops and thus increase the anonymization. But you also have to be aware that multiple hops with Orchid accounts also lead to higher OXT consumption.
|
||||
|
||||
Once you have set up your hops, you actually only have to press the Connect button:
|
||||
|
||||

|
||||
|
||||
## How anonymous is it all?
|
||||
|
||||
If you assume a single hop, you are about as anonymous as with a conventional VPN provider, i.e. the VPN provider knows the following things:
|
||||
|
||||
which ISP you are using
|
||||
what your IP address is
|
||||
which websites you visit
|
||||
|
||||
In addition, the payment from the Ethereum address of your Orchid account to the Ethereum address of the VPN provider can be viewed on the blockchain. The VPN provider still does not know who owns the Ethereum address.
|
||||
However, your ISP only knows about your connection to the VPN provider and cannot find out which websites you are visiting.
|
||||
The websites visited also know less about you, your origin and your ISP are e.g. no longer available for the websites.
|
||||
|
||||
### Working with multiple hops
|
||||
|
||||
Those who value their privacy very much can also work with several hops. If there are several hops via Orchid accounts, it makes sense to use different accounts. As a result, there is no really useful information for any provider.
|
||||
Only the last provider in the chain knows what content is accessed, what the original IP address is and which Internet provider you are using, on the other hand, only the first provider knows.
|
||||
|
||||

|
||||
|
||||
You don't have to work with accounts that you created yourself. The Orchid app doesn’t care who the account belongs to and offers you the option of simply passing on or sharing accounts.
|
||||
Several people can use one account at the same time.
|
||||
|
||||
### Disadvantages of multiple hops
|
||||
|
||||
As nice as multiple hops are for privacy, there are downsides too. The more hops the connection makes, the higher the latency. This also has a negative impact on the speed. Another factor is OXT consumption. 4 hops = 4x as high consumption of credits.
|
||||
|
||||
|
||||
## TL; DR
|
||||
|
||||
Orchid is a flexible and affordable solution that ensures security and privacy. By billing via crypto currency according to data volume, you really only pay for what you actually use. The tokens do not expire either.
|
||||
Once bought, it doesn't matter whether you use up the OXT tokens in 4 weeks or 4 years.
|
||||
|
||||
The account creation is kept very simple. Users who have never dealt with blockchain and Ethereum were also thought of, as you can simply buy ready-made accounts.
|
||||
|
||||
Orchid is decentralized and no personal data is required to use the service. This means you don't have to put your trust in a single provider in the hope that they won't write any logs or pass on user data.
|
||||
|
||||
The app is really very easy to use, you don't actually have to deal with technical details.
|
||||
|
||||
I would find the possibility to work with advanced settings interesting. In the white paper there is a paragraph on the subject of node selection based on metadata such as geolocation, price, latency, etc.
|
||||
I would find it interesting for the app to have a little influence here. You don't always have the same requirements.
|
||||
|
||||
That's it for now 😎.
|
||||
|
||||
|
33
content/posts/password-encrypt-go.de.md
Normal file
33
content/posts/password-encrypt-go.de.md
Normal file
@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "Kennwörter in Go verschlüsseln"
|
||||
date: 2020-02-26
|
||||
draft: false
|
||||
tags: ["programmieren","golang","go","crypt","snippets"]
|
||||
---
|
||||
Go hat vorne herein bereits viele hilfreiche Pakete. Eines davon ist das Paket bcrypt mit dem sich z.B. Kennwörter sicher verschlüsseln lassen:
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
pw := "SecretPassword"
|
||||
bs, err := bcrypt.GenerateFromPassword([]byte(pw), 2)
|
||||
|
||||
//let's look at the encrypted password
|
||||
fmt.Printf("encryption result: %s\n", string(bs))
|
||||
|
||||
err = bcrypt.CompareHashAndPassword(bs, []byte(pw))
|
||||
if err != nil {
|
||||
fmt.Println("Wrong! Wrong! Wrong!")
|
||||
}
|
||||
}
|
||||
```
|
||||
[Code ausprobieren](https://play.golang.org/p/jxoTHhAPQ5G)
|
||||
|
||||
Wir übergeben der Funktion GenerateFromPassword([]byte(pw), 2) unser Kennwort als slice vom Typ Byte, sowie einen Integer für das zweite Funktionsargument cost. Je höher die Zahl ist desto höher die "Kosten" für die Berechnung. Das bedeutet, dass die Verschlüsselung bei einer höheren Zahl länger braucht, aber auch sicherer ist. Wenn wir eine 0 als Kosten übergeben nimmt bcrypt einen Standardwert für die Berechnung.
|
||||
|
||||
Eigentlich alles recht easy 😊
|
33
content/posts/password-encrypt-go.en.md
Normal file
33
content/posts/password-encrypt-go.en.md
Normal file
@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "Encrypt passwords with Go"
|
||||
date: 2020-02-26
|
||||
draft: false
|
||||
tags: ["programming","golang","go","crypt","snippets"]
|
||||
---
|
||||
Go already has many helpful packages from the start. One of them is the bcrypt package with which e.g. will encrypt passwords securely.
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
pw := "SecretPassword"
|
||||
bs, err := bcrypt.GenerateFromPassword([]byte(pw), 2)
|
||||
|
||||
//let's look at the encrypted password
|
||||
fmt.Printf("encryption result: %s\n", string(bs))
|
||||
|
||||
err = bcrypt.CompareHashAndPassword(bs, []byte(pw))
|
||||
if err != nil {
|
||||
fmt.Println("Wrong! Wrong! Wrong!")
|
||||
}
|
||||
}
|
||||
```
|
||||
[Try it out](https://play.golang.org/p/jxoTHhAPQ5G)
|
||||
|
||||
We pass our password to the function GenerateFromPassword([]byte(pw), 2) as a slice of byte. The second argument is the cost for the encryption as an integer. The higher the costs the longer the encryption will take. The encryption will also be more secure if calculated with a higher cost value. If we pass a 0 bcrypt will use a standard value for the cost.
|
||||
|
||||
Pretty easy so far 😊
|
51
content/posts/productivity-80-20.de.md
Normal file
51
content/posts/productivity-80-20.de.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "Ich und die 80/20 Regel"
|
||||
date: 2020-08-21
|
||||
draft: true
|
||||
tags: ["blabla","life","produktivität","tips","pareto"]
|
||||
series: [""]
|
||||
featuredImage: "/img/productivity-8020/productivity-8020.png"
|
||||
---
|
||||
# Meine Erfahrung mit dem Pareto Prinzip - Einleitung
|
||||
|
||||
Ich will gar nicht lange um das Pareto Prinzip, die 80/20 Regel oder wie auch immer man das Kind nennen will herumtanzen. Es ist einen ganzen Industriezweig Life Coaches, Selbsthilfegurus und Produktivitätsexperten die sich damit ausführlich befassen.
|
||||
|
||||
Also nur soviel: laut dem Pareto Prinzip sind 20% des Aufwandes ist für 80% des Ergebnisses verantwortlich
|
||||
|
||||
Ich habe es ausprobiert, sehr real und noch dazu sehr erfolgreich...und ja ich habe irgendein Selbsthilfebuch gelesen, ich glaube es war ["The One Thing"](https://en.wikipedia.org/wiki/The_One_Thing_(book)).
|
||||
Ob ich das Buch jetzt jedem empfehlen würde weiß ich nicht. Ich fand es ganz gut, aber dadurch, dass das Pareto Prinzip sehr einfach ist, hätte man sich auch locker 75% der Wörter sparen können 😇.
|
||||
|
||||
Der für mich interessante Aspekt ist eigentlich der, dass das Pareto Prinzip zu einer sehr positiven Veränderung beigetragen hat.
|
||||
|
||||
## Die Erkenntnis
|
||||
|
||||
Meine Frau, unsere Mitarbeiter und ich designen und produzieren Wandbilder. Wir verkaufen die Bilder in unserem Online Shop.
|
||||
|
||||
Viele Jahre haben wir es so gemacht wie fast jeder in der Branche. Immer mehr Designs kamen dazu, wir waren glaube ich in unseren Spitzenzeiten bei
|
||||
mehreren hundert Designs.
|
||||
Eines Tages habe ich mich hingesetzt und einmal eine Rechnung aufgemacht. Ich habe mir angesehen, mit welchen Produkten wir die meisten Verkäufe machen.
|
||||
Ich wollte es erst gar nicht glauben, aber es war tatsächlich so, dass wir mit 10% unserer Produkte mehr als 90% der Verkäufe generiert haben.
|
||||
|
||||
Ihr denkt Euch jetzt vielleicht "Na klar, die Sache ist doch ganz einfach!" - oh einfach ist sowas nicht. Wie oben schon geschrieben, wir haben unsere Designs selbst gemacht.
|
||||
D.h. keine Bilder der Stange aus irgendwelchen Bilddatenbanken, sondern Blut, Schweiß und Tränen uns und unseren Grafikdesignern. Es ist unermesslich schwer sich so vielen Stunden Arbeit einfach zu trennen.
|
||||
|
||||
Können wir das wirklich machen und 90% unserer jahrelangen Arbeit über Bord werfen?
|
||||
|
||||
## Die Entscheidung
|
||||
|
||||
Wir haben uns dafür entschieden! Wir haben gefühlt wochenlang diskutiert. Wir haben miteinander gekämpft und es uns wirklich nicht leicht gemacht mit der Entscheidung. Es konnte aber nur die eine Entscheidung geben: 90% der Produkte müssen weg.
|
||||
Um uns die Möglichkeit zu nehmen einfach wieder zurückrudern zu können haben wir uns dazu entschieden alles auf eine Karte zu setzen.
|
||||
Wir haben einen komplett neuen Online Shop erstellt und unsere gesamte Kommunikation und unser Image nach diesen 10% der Produkte ausgerichtet. Kein Weg zurück.
|
||||
|
||||
## Das Ergebnis
|
||||
|
||||
Das ist jetzt 1 Jahr her. Ich gebe zu, dass die ersten Monate nicht einfach waren. Wir wussten zwar, dass wir das Richtige tun, aber wir hatten auch Angst vor der Veränderung.
|
||||
|
||||
Wenn ich heute auf diese Entscheidung blicke, war das wohl die beste Entscheidung, die wir in den letzten 10 Jahren getroffen haben.
|
||||
Es hat sich viel dadurch verändert. Unser Team ist dadurch sehr viel stärker zusammengewachsen. Wir arbeiten besser zusammen, wir lachen mehr zusammen und machen bessere Produkte.
|
||||
|
||||
Auch das Feedback unserer Kunden ist absolut positiv.
|
||||
|
||||
Wenn man sich einmal überlegt, was alles wegfällt, wenn man sich 90% trennt, dann wird einem klar wie viel Raum das für Kreativität. Man kann wirklich alles daran setzen sein Bestes zu geben.
|
||||
|
||||
|
51
content/posts/productivity-80-20.en.md
Normal file
51
content/posts/productivity-80-20.en.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "Me and the 80/20 Rule"
|
||||
date: 2020-08-21
|
||||
draft: true
|
||||
tags: ["blabla","life","productivity","tips","pareto"]
|
||||
series: [""]
|
||||
featuredImage: "/img/productivity-8020/productivity-8020.png"
|
||||
---
|
||||
# My experience with the Pareto principle - introduction
|
||||
|
||||
I don't want to dance around the Pareto principle, the 80/20 rule or whatever you want to call it. There is an entire industry of life coaches, self-help gurus, and productivity experts studying it in depth.
|
||||
|
||||
So just this: according to the Pareto principle, 20% of the effort is responsible for 80% of the result
|
||||
|
||||
I tried it, very real and very successful ... and yes I read some self-help book, I think it was ["The One Thing"](https://en.wikipedia.org/wiki/The_One_Thing_ (book )).
|
||||
I don't know if I would recommend the book to anyone. It was very good, but because the Pareto principle is very simple, you could easily have saved 75% of the words 😇.
|
||||
|
||||
The aspect that is interesting for me is actually that the Pareto principle has contributed to a very positive change in my life.
|
||||
|
||||
## The realization
|
||||
|
||||
My wife, our employees and I design and produce murals. We sell the art prints in our online store.
|
||||
|
||||
For many years we did it like almost everyone in the industry. More and more designs were created, I think we were at our peak with
|
||||
several hundred designs.
|
||||
One day I sat down and did some math. I wanted to know which products drive most of our sales.
|
||||
I didn't want to believe it at first, but it actually happened that we generated more than 90% of sales with 10% of our products.
|
||||
|
||||
You might think to yourselves now "Of course, that's an easy decision!" - oh no, that is not easy. As already written above, we made our designs ourselves.
|
||||
I.e. no off-the-peg images from any image database, but blood, sweat and tears from us and our graphic designers. It is immeasurably difficult to simply part with so many hours of work.
|
||||
|
||||
Can we really do that and throw 90% of our years of work overboard?
|
||||
|
||||
## The decision
|
||||
|
||||
We decided to do it! It felt like we discussed for weeks. We fought with each other and we really didn't find an easy way to this decision. However, there could only be one decision: 90% of the products have to go.
|
||||
In order to take the opportunity to simply undo everything, we decided to put everything on one card.
|
||||
We have created a completely new online store and geared our entire communication and image to these 10% of the products. No way back.
|
||||
|
||||
## The result
|
||||
|
||||
That was 1 year ago. I admit the first few months were not easy. We knew we were doing the right thing, but we were also afraid of the change.
|
||||
|
||||
When I look at this decision today, it was probably the best decision we have made in the last 10 years.
|
||||
A lot has changed as a result. Our team has grown much closer together. We work better together, we laugh more together, and we make better products.
|
||||
|
||||
The feedback from our customers has also been absolutely positive.
|
||||
|
||||
If you think about what goes away when you part with 90% of the stuff that keeps you busy, then you realize how much room there is for creativity. Now you can finally do your best work, every day.
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user