diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d92c07c..5a85ffd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,6 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] jobs: build: @@ -18,20 +17,22 @@ jobs: uses: actions/setup-python@v2 with: python-version: "3.10.13" - - name: Install dependencies + + - name: Install TLSH run: | - echo Installing dependencies .... - pip install -r ./requirements.txt - - name: Lint with flake8 + echo Installing TLSH dependency .... + make install-tlsh + + - name: Install package and dependencies run: | - echo "Checking synatix errors in files ..." - flake8 --count --show-source --statistics - # - name: Lint with pylint - # run: | - # pylint src --rcfile pyproject.toml - - name: Install package + echo Installing dependencies .... + make install + + - name: Lint with ruff run: | - pip install -e . + echo "Checking synatix and format errors in files ..." + make lint + - name: Test with pytest run: | - pytest -v \ No newline at end of file + make test \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e692190..3803182 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,9 +2,7 @@ name: docs on: push: branches: - - master - main - - dev permissions: contents: write jobs: diff --git a/.gitignore b/.gitignore index 19b3916..79d835f 100644 --- a/.gitignore +++ b/.gitignore @@ -161,5 +161,6 @@ cython_debug/ .DS_Store +/logs/ data/ ./data/* \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 1afe847..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -repos: - - repo: https://github.com/psf/black - rev: 23.9.1 - hooks: - - id: black - # - repo: https://github.com/PyCQA/flake8 - # rev: 3.9.2 - # hooks: - # - id: flake8 - # entry: pflake8 - # additional_dependencies: [pyproject-flake8] \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 7045ca6..d6b73fb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,7 @@ "configurations": [ { "name": "Python: Current File", - "type": "python", + "type": "debugpy", "request": "launch", "program": "${file}", "console": "integratedTerminal", @@ -17,7 +17,7 @@ }, { "name": "Python: Current File - custom env", - "type": "python", + "type": "debugpy", "request": "launch", "program": "${file}", "console": "integratedTerminal", @@ -42,7 +42,7 @@ // }, { "name": "Debug Tests: Current File", - "type": "python", + "type": "debugpy", "request": "launch", // "purpose": [ // "debug-test" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fe24dfc --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +install: + @echo "--- 🚀 Installing project dependencies ---" + pip install -e ".[all]" + +install-for-tests: + @echo "--- 🚀 Installing project dependencies for test ---" + @echo "This ensures that the project is not installed in editable mode" + pip install ".[dev]" + +install-tlsh: + @echo "--- 🚀 Installing TLSH dependency (same version as OSCAR 23.01) ---" + pip download python-tlsh==4.5.0 && \ + tar -xvf python-tlsh-4.5.0.tar.gz && \ + cd python-tlsh-4.5.0 && \ + sed -i 's/set(TLSH_BUCKETS_128 1)/set(TLSH_BUCKETS_256 1)/g; s/set(TLSH_CHECKSUM_1B 1)/set(TLSH_CHECKSUM_3B 1)/g' CMakeLists.txt && \ + python setup.py install && \ + rm -rf ../python-tlsh-4.5.0* + +lint: + @echo "--- 🧹 Running linters ---" + ruff format . # running ruff formatting + ruff check . --fix # running ruff linting + +lint-check: + @echo "--- 🧹 Check is project is linted ---" + # Required for CI to work, otherwise it will just pass + ruff format . --check # running ruff formatting + ruff check **/*.py # running ruff linting + +test: + @echo "--- 🧪 Running tests ---" + pytest --durations=5 ./tests + +pr: + @echo "--- 🚀 Running requirements for a PR ---" + make lint + make test diff --git a/README.md b/README.md index d285280..96a51b9 100644 --- a/README.md +++ b/README.md @@ -208,7 +208,10 @@ cd llm-datasets conda create -n llm-datasets python=3.10 conda activate llm-datasets -pip install -r requirements.txt +make install + +# if you want to use content hash (for deduplication) you need to install TLSH +make install-tlsh ``` Alternatively, you can install the Python package directly from the dev branch: @@ -217,25 +220,19 @@ Alternatively, you can install the Python package directly from the dev branch: pip install git+https://github.com/malteos/llm-datasets.git@dev ``` -### Install the pre-commit hooks - -This repository uses git hooks to validate code quality and formatting. +### Formating and linting -```bash -pre-commit install -git config --bool flake8.strict true # Makes the commit fail if flake8 reports an error -``` +This repository uses Ruff to validate code quality and formatting. -To run the hooks: ```bash -pre-commit run --all-files +make lint ``` ### Testing The tests can be executed with: ```bash -pytest --doctest-modules --cov-report term --cov=llm_datasets +make test ``` ## Acknowledgements diff --git a/docs/images/favicon-16x16.png b/docs/images/favicon-16x16.png new file mode 100644 index 0000000..3bfdc3d Binary files /dev/null and b/docs/images/favicon-16x16.png differ diff --git a/docs/images/favicon-32x32.png b/docs/images/favicon-32x32.png new file mode 100644 index 0000000..d6c2687 Binary files /dev/null and b/docs/images/favicon-32x32.png differ diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000..3cc1a20 Binary files /dev/null and b/docs/images/favicon.ico differ diff --git a/examples/custom_datasets/my_datasets/csv_example.py b/examples/custom_datasets/my_datasets/csv_example.py index 4da5634..ee96256 100644 --- a/examples/custom_datasets/my_datasets/csv_example.py +++ b/examples/custom_datasets/my_datasets/csv_example.py @@ -1,7 +1,8 @@ import logging -import pandas as pd from pathlib import Path -from llm_datasets.datasets.base import BaseDataset, Availability, License + +import pandas as pd +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) @@ -14,9 +15,7 @@ class CSVExampleDataset(BaseDataset): LICENSE = License("mixed") def get_texts(self): - """ - Extract texts from CSV files (format: "documen_id,text,score,url") - """ + """Extract texts from CSV files (format: "documen_id,text,score,url")""" # Iterate over CSV files in raw dataset directory for file_path in self.get_dataset_file_paths(needed_suffix=".csv"): file_name = Path(file_path).name diff --git a/examples/custom_datasets/my_datasets/pg19.py b/examples/custom_datasets/my_datasets/pg19.py index d9fd86e..3a7deea 100644 --- a/examples/custom_datasets/my_datasets/pg19.py +++ b/examples/custom_datasets/my_datasets/pg19.py @@ -1,5 +1,5 @@ +from llm_datasets.datasets.base import Availability, License from llm_datasets.datasets.hf_dataset import HFDataset -from llm_datasets.datasets.base import License, Availability class PG19Dataset(HFDataset): @@ -7,7 +7,8 @@ class PG19Dataset(HFDataset): TITLE = "Project Gutenberg books published before 1919" HOMEPAGE = "https://huggingface.co/datasets/pg19" LICENSE = License( - "Apache License Version 2.0 (or public domain?)", url="https://www.apache.org/licenses/LICENSE-2.0.html" + "Apache License Version 2.0 (or public domain?)", + url="https://www.apache.org/licenses/LICENSE-2.0.html", ) CITATION = r"""@article{raecompressive2019, author = {Rae, Jack W and Potapenko, Anna and Jayakumar, Siddhant M and diff --git a/pyproject.toml b/pyproject.toml index 21ef555..a209613 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,11 +3,9 @@ requires = ["setuptools >= 61.0"] build-backend = "setuptools.build_meta" [project] -name = "llm-datasets" +name = "llm-datasets" version = "0.0.3" -authors = [ - {name = "Malte Ostendorff", email = "malte.ostendorff@dfki.de"}, -] +authors = [{ name = "Malte Ostendorff", email = "malte.ostendorff@dfki.de" }] description = "A collection of datasets for language model training including scripts for downloading, preprocesssing, and sampling." readme = "README.md" classifiers = [ @@ -17,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11" + "Programming Language :: Python :: 3.11", ] requires-python = ">=3.9" dependencies = [ @@ -31,7 +29,7 @@ dependencies = [ "pyarrow>=14.0.1", "dill", ] -license = {text = "Apache 2.0"} +license = { text = "Apache 2.0" } [project.scripts] llm-datasets = "llm_datasets.__main__:main" @@ -48,7 +46,7 @@ datasets = [ "translate-toolkit>=3.9.1", "folia>=2.5.8", "estnltk>=1.7.1", - "Jinja2" + "Jinja2", ] dev = [ "pre-commit", @@ -58,27 +56,30 @@ dev = [ "pytest", "pytest-cov", "pytest-runner", + "pytest-xdist", "coverage", "pylint", "twine", - "jupyter" + "jupyter", + "ruff>=0.0.254", ] docs = [ "mkdocs", "mkdocs-material", "mkdocs-exclude", "mkdocstrings", - "mkdocstrings[python]" -] -viewer = [ - "streamlit", - "ngrok" + "mkdocstrings[python]", ] +viewer = ["streamlit", "ngrok"] +datatrove = ["datatrove[all]>=0.2.0"] + all = [ "llm-datasets[datasets]", "llm-datasets[dev]", "llm-datasets[docs]", - "llm-datasets[viewer]" + "llm-datasets[viewer]", + "llm-datasets[datatrove]", + ] [project.urls] @@ -86,13 +87,6 @@ Documentation = "https://github.com/malteos/llm-datasets/tree/main#readme" Source = "https://github.com/malteos/llm-datasets" Tracker = "https://github.com/malteos/llm-datasets/issues" - -[tool.black] -line-length = 120 -preview = true -unstable = true -fast = true - [tool.coverage.run] branch = true @@ -119,12 +113,7 @@ exclude = [ "images", "docs", ] -ignore = [ - "E722", - "B001", - "W503", - "E203" -] +ignore = ["E722", "B001", "W503", "E203"] reportMissingImports = true reportMissingTypeStubs = false @@ -132,170 +121,48 @@ reportMissingTypeStubs = false pythonVersion = "3.10" pythonPlatform = "Linux" -executionEnvironments = [ - { root = "src" } -] +executionEnvironments = [{ root = "src" }] [tool.pytest.ini_options] -pythonpath = [ - "src" -] +pythonpath = ["src"] testpaths = "tests" -[tool.pylint] -extension-pkg-whitelist= [ - "numpy", - "torch", - "cv2", - "pyodbc", - "pydantic", - "ciso8601", - "netcdf4", - "scipy" -] -ignore="CVS" -ignore-patterns="test.*?py,conftest.py" -init-hook='import sys; sys.setrecursionlimit(8 * sys.getrecursionlimit())' -jobs=0 -limit-inference-results=100 -persistent="yes" -suggestion-mode="yes" -unsafe-load-any-extension="no" - -[tool.pylint.'MESSAGES CONTROL'] -enable="c-extension-no-member" - -[tool.pylint.'REPORTS'] -evaluation="10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)" -output-format="text" -reports="no" -score="yes" - -[tool.pylint.'REFACTORING'] -max-nested-blocks=5 -never-returning-functions="sys.exit" - -[tool.pylint.'BASIC'] -argument-naming-style="snake_case" -attr-naming-style="snake_case" -bad-names= [ - "foo", - "bar" -] -class-attribute-naming-style="any" -class-naming-style="PascalCase" -const-naming-style="UPPER_CASE" -docstring-min-length=-1 -function-naming-style="snake_case" -good-names= [ - "i", - "j", - "k", - "ex", - "Run", - "_" -] -include-naming-hint="yes" -inlinevar-naming-style="any" -method-naming-style="snake_case" -module-naming-style="any" -no-docstring-rgx="^_" -property-classes="abc.abstractproperty" -variable-naming-style="snake_case" - -[tool.pylint.'FORMAT'] -ignore-long-lines="^\\s*(# )?.*['\"]??" -indent-after-paren=4 -indent-string=' ' -max-line-length=120 -max-module-lines=1000 -single-line-class-stmt="no" -single-line-if-stmt="no" - -[tool.pylint.'LOGGING'] -logging-format-style="old" -logging-modules="logging" - -[tool.pylint.'MISCELLANEOUS'] -notes= [ - "FIXME", - "XXX", - "TODO" -] - -[tool.pylint.'SIMILARITIES'] -ignore-comments="yes" -ignore-docstrings="yes" -ignore-imports="yes" -min-similarity-lines=7 - -[tool.pylint.'SPELLING'] -max-spelling-suggestions=4 -spelling-store-unknown-words="no" - -[tool.pylint.'STRING'] -check-str-concat-over-line-jumps="no" - -[tool.pylint.'TYPECHECK'] -contextmanager-decorators="contextlib.contextmanager" -generated-members="numpy.*,np.*,pyspark.sql.functions,collect_list" -ignore-mixin-members="yes" -ignore-none="yes" -ignore-on-opaque-inference="yes" -ignored-classes="optparse.Values,thread._local,_thread._local,numpy,torch,swagger_client" -ignored-modules="numpy,torch,swagger_client,netCDF4,scipy" -missing-member-hint="yes" -missing-member-hint-distance=1 -missing-member-max-choices=1 -[tool.pylint.'VARIABLES'] -additional-builtins="dbutils" -allow-global-unused-variables="yes" -callbacks= [ - "cb_", - "_cb" -] -dummy-variables-rgx="_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_" -ignored-argument-names="_.*|^ignored_|^unused_" -init-import="no" -redefining-builtins-modules="six.moves,past.builtins,future.builtins,builtins,io" - -[tool.pylint.'CLASSES'] -defining-attr-methods= [ - "__init__", - "__new__", - "setUp", - "__post_init__" -] -exclude-protected= [ - "_asdict", - "_fields", - "_replace", - "_source", - "_make" -] -valid-classmethod-first-arg="cls" -valid-metaclass-classmethod-first-arg="cls" - -[tool.pylint.'DESIGN'] -max-args=5 -max-attributes=7 -max-bool-expr=5 -max-branches=12 -max-locals=15 -max-parents=7 -max-public-methods=20 -max-returns=6 -max-statements=50 -min-public-methods=2 - -[tool.pylint.'IMPORTS'] -allow-wildcard-with-all="no" -analyse-fallback-blocks="no" -deprecated-modules="optparse,tkinter.tix" +[tool.ruff] +target-version = "py310" +line-length = 120 -[tool.pylint.'EXCEPTIONS'] -overgeneral-exceptions= [ - "BaseException", - "Exception" -] \ No newline at end of file +[tool.ruff.lint] +select = ["F", "I", "E", "D"] +ignore = [ + "E501", # line too long + "E741", # ambiguous variable name + "F403", # undefined import + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D105", # Missing docstring in magic method + "D104", # Missing docstring in public package + "D107", # Missing docstring in __init__ + "D205", # 1 blank line required between summary line and description + "D415", # First line should end with a period +] + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[tool.ruff.lint.flake8-annotations] +mypy-init-return = true +suppress-none-returning = true + +[tool.semantic_release] +branch = "main" +version_toml = ["pyproject.toml:project.version"] +build_command = "python -m pip install build; python -m build" +tag_format = "{version}" + +[tool.semantic_release.commit_parser_options] +major_types = ["breaking"] +minor_types = ["feat"] +patch_types = ["fix", "perf"] diff --git a/requirements.txt b/requirements.txt index c2436de..c6800b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,8 @@ -r requirements/base.txt -r requirements/datasets.txt -r requirements/dev.txt +-r requirements/docs.txt -r requirements/viewer.txt --r requirements/docs.txt \ No newline at end of file + +# optional +# -r requirements/megatron.txt diff --git a/requirements/base.txt b/requirements/base.txt index 7025bdb..35e12f6 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -23,12 +23,10 @@ datasets>=2.10.1 tokenizers>=0.13.2 huggingface-hub>=0.14.0rc1 accelerate +git+https://github.com/huggingface/hf_transfer.git@aa9d247b4cdb20f49ab517cc6b342273e2c2480e tensorboard>=2.12.0 -# same as docker image -torch==2.0.0 - # https://github.com/miurahr/py7zr #py7zr>=0.20.5 diff --git a/requirements/datatrove.txt b/requirements/datatrove.txt new file mode 100644 index 0000000..3e66921 --- /dev/null +++ b/requirements/datatrove.txt @@ -0,0 +1 @@ +datatrove[all]>=0.2.0 \ No newline at end of file diff --git a/requirements/dev.txt b/requirements/dev.txt index 5a4bbb6..0aabdd5 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -7,8 +7,10 @@ flake8-docstrings pytest pytest-cov pytest-runner +pytest-xdist pytest-mock coverage pylint twine jupyter +ruff>=0.0.254 diff --git a/requirements/docs.txt b/requirements/docs.txt index 7dd0248..2b35546 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -3,4 +3,8 @@ mkdocs mkdocs-material mkdocs-exclude mkdocstrings -mkdocstrings[python] \ No newline at end of file +mkdocstrings[python] + +# plots +seaborn +matplotlib diff --git a/src/llm_datasets/__main__.py b/src/llm_datasets/__main__.py index ca74149..9c88294 100644 --- a/src/llm_datasets/__main__.py +++ b/src/llm_datasets/__main__.py @@ -4,13 +4,13 @@ from llm_datasets.commands.collect_metrics_command import CollectMetricsCommand from llm_datasets.commands.compose_command import ComposeCommand from llm_datasets.commands.convert_parquet_to_jsonl_command import ConvertParquetToJSONLCommand +from llm_datasets.commands.exact_dedup_command import ExactDedupCommand from llm_datasets.commands.extract_text_command import ExtractTextCommand from llm_datasets.commands.hf_upload_command import HFUploadCommand from llm_datasets.commands.print_stats_command import PrintStatsCommand +from llm_datasets.commands.render_docs_command import RenderDocsCommand from llm_datasets.commands.shuffle_command import ShuffleCommand from llm_datasets.commands.train_tokenizer_command import TrainTokenizerCommand -from llm_datasets.commands.render_docs_command import RenderDocsCommand -from llm_datasets.commands.exact_dedup_command import ExactDedupCommand def main(): diff --git a/src/llm_datasets/chunkify_datasets.py b/src/llm_datasets/chunkify_datasets.py index fe5655e..5eaeb55 100644 --- a/src/llm_datasets/chunkify_datasets.py +++ b/src/llm_datasets/chunkify_datasets.py @@ -1,16 +1,14 @@ import os from pathlib import Path -from llm_datasets.utils.config import Config +import pyarrow.parquet as pq +from llm_datasets.utils.config import Config -from .datasets.dataset_registry import get_registered_dataset_classes from .datasets.base import BaseDataset - +from .datasets.dataset_registry import get_datasets_list_from_string, get_registered_dataset_classes from .utils import get_bytes_from_int_or_string, get_parquet_compression -import pyarrow.parquet as pq - def validate_original_and_parts(): # TODO make sure original and parts are the same @@ -31,11 +29,7 @@ def chunkify_datasets(config: Config): id_to_dataset_class = {cls.DATASET_ID: cls for cls in get_registered_dataset_classes()} - datasets_list = config.datasets.split(",") - - if len(datasets_list) == 1 and datasets_list[0] == "all": - # Get list of all non-dummy datasets - datasets_list = id_to_dataset_class.keys() + datasets_list = get_datasets_list_from_string(config.datasets, config) max_uncompressed_bytes_per_chunk = get_bytes_from_int_or_string(config.max_uncompressed_bytes_per_chunk) max_chunk_bytes_with_safety = int(max_uncompressed_bytes_per_chunk * config.safety_factor) diff --git a/src/llm_datasets/collect_metrics.py b/src/llm_datasets/collect_metrics.py index 8c7f2d1..0f2c637 100644 --- a/src/llm_datasets/collect_metrics.py +++ b/src/llm_datasets/collect_metrics.py @@ -1,16 +1,15 @@ import json - from pathlib import Path +from transformers import AutoTokenizer + +from .datasets.base import BaseDataset from .datasets.dataset_registry import ( get_dataset_class_by_id, - get_registered_dataset_ids, + get_datasets_list_from_string, ) -from .datasets.base import BaseDataset from .utils.config import Config -from transformers import AutoTokenizer - def collect_metrics(config: Config): logger = config.init_logger(__name__) @@ -20,21 +19,7 @@ def collect_metrics(config: Config): if save_to_path.exists() and not config.override: raise FileExistsError(f"Cannot save stats because path exists already (fix with --override): {save_to_path}") - datasets_list = config.datasets.split(",") - - if len(datasets_list) == 1: - if datasets_list[0] == "all": - # Get list of all regsitered datasets - datasets_list = get_registered_dataset_ids(config.extra_dataset_registries) - - elif datasets_list[0] == "all_from_source": - # Get registered datasets based on source - if config.source_id is None: - raise ValueError("The argument --source_id must be set.") - - datasets_list = get_registered_dataset_ids( - config.extra_dataset_registries, needed_source_id=config.source_id - ) + datasets_list = get_datasets_list_from_string(config.datasets, config) if config.hf_tokenizer_name_or_path: tokenizer = AutoTokenizer.from_pretrained( @@ -54,12 +39,12 @@ def collect_metrics(config: Config): logger.info(f"Dataset ID: {dataset_id} ({i} / {len(datasets_list)})") if i <= config.skip_datasets: - logger.warning(f"Skip dataset") + logger.warning("Skip dataset") continue dataset_cls = get_dataset_class_by_id(dataset_id, config.extra_dataset_registries) dataset: BaseDataset = dataset_cls( - output_dir=config.output_dir, + text_datasets_dir=config.text_datasets_dir, output_format=config.output_format, shuffled_output_dir=config.shuffled_output_dir, config=config, diff --git a/src/llm_datasets/commands/__init__.py b/src/llm_datasets/commands/__init__.py index 48da6ff..2121715 100644 --- a/src/llm_datasets/commands/__init__.py +++ b/src/llm_datasets/commands/__init__.py @@ -16,7 +16,7 @@ def run(self): def add_common_args( parser: _SubParsersAction, raw_datasets_dir=False, - output=False, + text_datasets_dir=False, extra_dataset_registries=False, configs=False, required_configs=False, @@ -30,9 +30,9 @@ def add_common_args( help="Dataset files are read from this directory (needed for `is_downloaded` field)", ) - if output: + if text_datasets_dir: parser.add_argument( - "--output_dir", + "--text_datasets_dir", default=None, type=str, help="Processed dataset are saved in this directory (need for `has_output_file` field)", diff --git a/src/llm_datasets/commands/chunkify_command.py b/src/llm_datasets/commands/chunkify_command.py index 5769c3e..a58d0dc 100644 --- a/src/llm_datasets/commands/chunkify_command.py +++ b/src/llm_datasets/commands/chunkify_command.py @@ -44,7 +44,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=False, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=False, diff --git a/src/llm_datasets/commands/collect_metrics_command.py b/src/llm_datasets/commands/collect_metrics_command.py index 0a557fe..5b2b6bb 100644 --- a/src/llm_datasets/commands/collect_metrics_command.py +++ b/src/llm_datasets/commands/collect_metrics_command.py @@ -1,11 +1,10 @@ -from argparse import Namespace, _SubParsersAction import logging +from argparse import Namespace, _SubParsersAction from llm_datasets.collect_metrics import collect_metrics from llm_datasets.commands import BaseCLICommand from llm_datasets.utils.config import Config, get_config_from_paths - logger = logging.getLogger(__name__) @@ -18,7 +17,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser.add_argument("datasets", help="Name of datasets to shuffle (comma separated)") subcommand_parser.add_argument( - "--shuffled_output_dir", + "--shuffled_datasets_dir", default=None, type=str, help="Shuffled dataset are saved in this directory", @@ -58,7 +57,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=True, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=False, diff --git a/src/llm_datasets/commands/compose_command.py b/src/llm_datasets/commands/compose_command.py index 6cb12f1..a919b43 100644 --- a/src/llm_datasets/commands/compose_command.py +++ b/src/llm_datasets/commands/compose_command.py @@ -1,12 +1,11 @@ -from argparse import Namespace, _SubParsersAction import logging +from argparse import Namespace, _SubParsersAction -from llm_datasets.compose_dataset import compose_dataset from llm_datasets.commands import BaseCLICommand +from llm_datasets.compose_dataset import compose_dataset from llm_datasets.utils.config import Config, get_config_from_paths from llm_datasets.utils.dataset_generator import DatasetSplit - logger = logging.getLogger(__name__) @@ -21,7 +20,7 @@ def register_subcommand(parser: _SubParsersAction): "--split", type=DatasetSplit, help="Dataset split (full, train, tokenizer_train, validation)" ) subcommand_parser.add_argument( - "--shuffled_output_dir", + "--shuffled_datasets_dir", help="Shuffled output is saved in this directory (/.)", ) subcommand_parser.add_argument( @@ -78,7 +77,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=True, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=True, diff --git a/src/llm_datasets/commands/convert_parquet_to_jsonl_command.py b/src/llm_datasets/commands/convert_parquet_to_jsonl_command.py index bedd770..f369118 100644 --- a/src/llm_datasets/commands/convert_parquet_to_jsonl_command.py +++ b/src/llm_datasets/commands/convert_parquet_to_jsonl_command.py @@ -1,7 +1,7 @@ from argparse import Namespace, _SubParsersAction -from llm_datasets.convert_parquet_to_jsonl import convert_parquet_to_jsonl from llm_datasets.commands import BaseCLICommand +from llm_datasets.convert_parquet_to_jsonl import convert_parquet_to_jsonl from llm_datasets.utils.config import Config diff --git a/src/llm_datasets/commands/exact_dedup_command.py b/src/llm_datasets/commands/exact_dedup_command.py index 952e646..abc66d5 100644 --- a/src/llm_datasets/commands/exact_dedup_command.py +++ b/src/llm_datasets/commands/exact_dedup_command.py @@ -1,12 +1,9 @@ -from argparse import Namespace, _SubParsersAction import logging +from argparse import Namespace, _SubParsersAction -from llm_datasets.dedup import exact_dedup -from llm_datasets.extract_text import extract_text from llm_datasets.commands import BaseCLICommand +from llm_datasets.dedup import exact_dedup from llm_datasets.utils.config import Config, get_config_from_paths -from llm_datasets.utils.settings import DEFAULT_MIN_TEXT_LENGTH - logger = logging.getLogger(__name__) @@ -34,11 +31,6 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, - raw_datasets_dir=False, - output=False, - extra_dataset_registries=False, - configs=False, - required_configs=False, log=True, ) subcommand_parser.set_defaults(func=ExactDedupCommand) diff --git a/src/llm_datasets/commands/extract_text_command.py b/src/llm_datasets/commands/extract_text_command.py index dcb43b0..d614981 100644 --- a/src/llm_datasets/commands/extract_text_command.py +++ b/src/llm_datasets/commands/extract_text_command.py @@ -1,12 +1,11 @@ -from argparse import Namespace, _SubParsersAction import logging +from argparse import Namespace, _SubParsersAction -from llm_datasets.extract_text import extract_text from llm_datasets.commands import BaseCLICommand +from llm_datasets.extract_text import extract_text, extract_text_with_datatrove from llm_datasets.utils.config import Config, get_config_from_paths from llm_datasets.utils.settings import DEFAULT_MIN_TEXT_LENGTH - logger = logging.getLogger(__name__) @@ -15,12 +14,16 @@ class ExtractTextCommand(BaseCLICommand): def register_subcommand(parser: _SubParsersAction): subcommand_parser = parser.add_parser("extract_text", help="Extract text from raw datasets") - subcommand_parser.add_argument("datasets", help="Name of datasets to process (comma separated)") subcommand_parser.add_argument( - "output_dir", - help="Output is saved in this directory (/.)", + "datasets", + help="Name of datasets to process (comma separated, or `all`, `all_from_source` with --source_id)", + ) + subcommand_parser.add_argument( + "text_datasets_dir", + help="Extract text is saved in this directory (/.)", ) subcommand_parser.add_argument("--override", action="store_true", help="Override existing output files") + subcommand_parser.add_argument("--backend", type=str, help="Backend (default, datatrove)") subcommand_parser.add_argument( "--ignore_errors", action="store_true", @@ -74,7 +77,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=True, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=False, @@ -86,4 +89,7 @@ def __init__(self, args: Namespace) -> None: self.config: Config = get_config_from_paths(args.config_paths, override=args.__dict__) def run(self) -> None: - extract_text(config=self.config) + if self.config.backend == "datatrove": + extract_text_with_datatrove(config=self.config) + else: + extract_text(config=self.config) diff --git a/src/llm_datasets/commands/hf_upload_command.py b/src/llm_datasets/commands/hf_upload_command.py index c3ace70..68ba785 100644 --- a/src/llm_datasets/commands/hf_upload_command.py +++ b/src/llm_datasets/commands/hf_upload_command.py @@ -1,17 +1,16 @@ -from argparse import Namespace, _SubParsersAction - -from llm_datasets.commands import BaseCLICommand -from llm_datasets.utils.config import Config - import os +from argparse import Namespace, _SubParsersAction from pathlib import Path + from huggingface_hub import HfApi from tqdm.auto import tqdm +from llm_datasets.commands import BaseCLICommand +from llm_datasets.utils.config import Config + class HFUploadCommand(BaseCLICommand): - """ - A wrapper around the Huggingface Hub Python client that makes uploading large datasets easier. + """A wrapper around the Huggingface Hub Python client that makes uploading large datasets easier. (The original client uploads all files at once in a single commit -> prone to errors -> instead we to multiple commits) """ diff --git a/src/llm_datasets/commands/print_stats_command.py b/src/llm_datasets/commands/print_stats_command.py index 97e23e5..df28c96 100644 --- a/src/llm_datasets/commands/print_stats_command.py +++ b/src/llm_datasets/commands/print_stats_command.py @@ -1,7 +1,7 @@ from argparse import Namespace, _SubParsersAction -from llm_datasets.print_stats import print_stats from llm_datasets.commands import BaseCLICommand +from llm_datasets.print_stats import print_stats from llm_datasets.utils.config import Config, get_config_from_paths @@ -11,7 +11,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = parser.add_parser("print_stats", help="Print dataset statistics as CSV, Markdown, ...") subcommand_parser.add_argument( - "--shuffled_output_dir", + "--shuffled_datasets_dir", default=None, type=str, help="Shuffled dataset are saved in this directory", @@ -64,7 +64,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=True, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=False, diff --git a/src/llm_datasets/commands/render_docs_command.py b/src/llm_datasets/commands/render_docs_command.py index 14d9336..89cbfe6 100644 --- a/src/llm_datasets/commands/render_docs_command.py +++ b/src/llm_datasets/commands/render_docs_command.py @@ -1,15 +1,9 @@ -from argparse import Namespace, _SubParsersAction import os +from argparse import Namespace, _SubParsersAction from pathlib import Path -from typing import Literal -import seaborn as sns -from matplotlib import pyplot as plt - -from llm_datasets.shuffle_datasets import shuffle_datasets from llm_datasets.commands import BaseCLICommand from llm_datasets.utils.config import Config, get_config_from_paths -from llm_datasets.utils.dataframe import get_datasets_as_dataframe from llm_datasets.utils.docs.plots import plot_tokens_by_language, plot_tokens_by_source from llm_datasets.utils.docs.tables import ( add_citation_to_title_row, @@ -19,7 +13,6 @@ tokens_by_source_dataframe_to_markdown, ) from llm_datasets.utils.languages import LANGUAGE_CODE_TO_NAME -from llm_datasets.utils.settings import DEFAULT_MIN_FILE_SIZE_FOR_BUFFERED_SHUFFLING from llm_datasets.viewer.viewer_utils import millify AUTO_GEN_DISCLAIMER_MARKDOWN = "\n\n*This page is automatically generated.*\n\n" @@ -72,11 +65,8 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, - raw_datasets_dir=False, - output=False, extra_dataset_registries=True, configs=True, - required_configs=False, log=True, ) subcommand_parser.set_defaults(func=RenderDocsCommand) @@ -85,6 +75,8 @@ def __init__(self, args: Namespace) -> None: self.config: Config = get_config_from_paths(args.config_paths, override=args.__dict__) def run(self) -> None: + import seaborn as sns + config = self.config logger = config.init_logger(__name__) @@ -126,9 +118,7 @@ def run(self) -> None: logger.info("done") def languages_latex(self, tokens_by_lang_df): - """ - Generate `languages.tex` and `tokens_by_language.pdf` - """ + """Generate `languages.tex` and `tokens_by_language.pdf`""" df = tokens_by_lang_df.copy() langs_tex_path = self.docs_datasets_dir_path / "languages.tex" @@ -161,9 +151,7 @@ def languages_latex(self, tokens_by_lang_df): pass def sources_latex(self, tokens_by_source_df): - """ - Generate `sources.tex` and `sources.bib` - """ + """Generate `sources.tex` and `sources.bib`""" df = tokens_by_source_df.copy() sources_tex_path = self.docs_datasets_dir_path / "sources.tex" @@ -245,8 +233,7 @@ def datasets_index_markdown(self, tokens_df, tokens_by_lang_df, tokens_by_source index_md += ( f"The framework provides {len(tokens_df)} datasets from {len(tokens_by_source_df)} sources in" - f" {len(lang_list)} languages. The languages are as follows: " - + ", ".join(lang_list) + f" {len(lang_list)} languages. The languages are as follows: " + ", ".join(lang_list) ) index_md += "\n\n" diff --git a/src/llm_datasets/commands/shuffle_command.py b/src/llm_datasets/commands/shuffle_command.py index 0a1ddfb..3e96ba8 100644 --- a/src/llm_datasets/commands/shuffle_command.py +++ b/src/llm_datasets/commands/shuffle_command.py @@ -1,7 +1,7 @@ from argparse import Namespace, _SubParsersAction -from llm_datasets.shuffle_datasets import shuffle_datasets from llm_datasets.commands import BaseCLICommand +from llm_datasets.shuffle_datasets import shuffle_datasets from llm_datasets.utils.config import Config, get_config_from_paths from llm_datasets.utils.settings import DEFAULT_MIN_FILE_SIZE_FOR_BUFFERED_SHUFFLING @@ -12,10 +12,9 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = parser.add_parser( "shuffle", help="Shuffle the individual datasets on the file-chunk level (no global shuffle!)" ) - subcommand_parser.add_argument("datasets", help="Name of datasets to shuffle (comma separated)") subcommand_parser.add_argument( - "--shuffled_output_dir", + "--shuffled_datasets_dir", default=None, type=str, help="Shuffled dataset are saved in this directory", @@ -60,7 +59,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=True, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=False, diff --git a/src/llm_datasets/commands/train_tokenizer_command.py b/src/llm_datasets/commands/train_tokenizer_command.py index 95f1749..8f39b99 100644 --- a/src/llm_datasets/commands/train_tokenizer_command.py +++ b/src/llm_datasets/commands/train_tokenizer_command.py @@ -1,9 +1,8 @@ from argparse import Namespace, _SubParsersAction -from llm_datasets.train_sp_tokenizer import train_sp_tokenizer from llm_datasets.commands import BaseCLICommand +from llm_datasets.train_sp_tokenizer import train_sp_tokenizer from llm_datasets.utils.config import Config, get_config_from_paths - from llm_datasets.utils.settings import DEFAULT_TOKENIZER_RATIO @@ -80,7 +79,7 @@ def register_subcommand(parser: _SubParsersAction): subcommand_parser = BaseCLICommand.add_common_args( subcommand_parser, raw_datasets_dir=False, - output=True, + text_datasets_dir=True, extra_dataset_registries=True, configs=True, required_configs=True, diff --git a/src/llm_datasets/compose_dataset.py b/src/llm_datasets/compose_dataset.py index c1ce24c..26cc971 100644 --- a/src/llm_datasets/compose_dataset.py +++ b/src/llm_datasets/compose_dataset.py @@ -1,10 +1,11 @@ import json -from pathlib import Path -from llm_datasets.io.parquet import save_texts_to_parquet_chunks from datetime import datetime +from pathlib import Path + import pyarrow as pa -from llm_datasets.utils import get_bytes_from_int_or_string +from llm_datasets.io.parquet import save_texts_to_parquet_chunks +from llm_datasets.utils import get_bytes_from_int_or_string from llm_datasets.utils.config import Config from llm_datasets.utils.dataset_generator import DatasetGenerator, DatasetSplit @@ -29,7 +30,7 @@ def compose_dataset(config: Config): # Initialize dataset generator (interleaves pre-shuffled datasets) dataset_generator = DatasetGenerator( config, - shuffled_output_dir=config.shuffled_output_dir, + shuffled_datasets_dir=config.shuffled_output_dir, output_format=output_format, save_to_dir=save_to_dir, split=config.split, diff --git a/src/llm_datasets/convert_parquet_to_jsonl.py b/src/llm_datasets/convert_parquet_to_jsonl.py index 2a7bce1..58fc175 100644 --- a/src/llm_datasets/convert_parquet_to_jsonl.py +++ b/src/llm_datasets/convert_parquet_to_jsonl.py @@ -1,14 +1,17 @@ -import argparse +import logging from pathlib import Path from typing import List + import polars as pl -import logging logger = logging.getLogger(__name__) def convert_parquet_to_jsonl( - input_dir_or_file: str, output_dir: str, override: bool = False, input_glob="*.parquet" + input_dir_or_file: str, + output_dir: str, + override: bool = False, + input_glob="*.parquet", ) -> List[str]: output_dir_path = Path(output_dir) input_path = Path(input_dir_or_file) diff --git a/src/llm_datasets/datasets/base.py b/src/llm_datasets/datasets/base.py index 9a7b9b0..958f4f4 100644 --- a/src/llm_datasets/datasets/base.py +++ b/src/llm_datasets/datasets/base.py @@ -1,30 +1,30 @@ -from collections import Counter import datetime import fnmatch import json import logging import os -from enum import Enum import random -from urllib.error import HTTPError -from typing import Iterable, List, Literal, Optional, TextIO, Tuple, Type, Union import uuid +from collections import Counter +from enum import Enum +from pathlib import Path +from typing import Iterable, List, Literal, Optional, TextIO, Tuple, Type, Union +from urllib.error import HTTPError -import wget - +import polars as pl import pyarrow as pa import pyarrow.parquet as pq -import polars as pl +import wget +# from llm_datasets.datasets.document import Document, DocumentSchema +from datatrove.data import Document from smart_open import open as smart_open -from pathlib import Path -from llm_datasets.io.parquet import get_selected_row_groups, save_texts_to_parquet_chunks -from llm_datasets.utils.settings import DEFAULT_MIN_TEXT_LENGTH - -from llm_datasets.utils.systems import get_path_by_system +from llm_datasets.io.parquet import save_texts_to_parquet_chunks from llm_datasets.utils import get_parquet_compression from llm_datasets.utils.config import Config +from llm_datasets.utils.settings import DEFAULT_MIN_TEXT_LENGTH +from llm_datasets.utils.systems import get_path_by_system MILLION = 1_000_000 BILLION = 1_000_000_000 @@ -89,8 +89,7 @@ def __str__(self): class License(object): - """ - Basic licensing information. Set attributions must be verified. If an attribution is unset, it is unknown. + """Basic licensing information. Set attributions must be verified. If an attribution is unset, it is unknown. See https://choosealicense.com/ and https://creativecommons.org/share-your-work/cclicenses/ """ @@ -127,9 +126,7 @@ def __str__(self): class BaseDataset(object): - """ - Base class for all datasets. It implements all generic loading, processing, and writing methods. - """ + """Base class for all datasets. It implements all generic loading, processing, and writing methods.""" DATASET_ID = None SOURCE_ID = None @@ -168,7 +165,7 @@ class BaseDataset(object): def __init__( self, - output_dir: Optional[str] = None, + text_datasets_dir: Optional[str] = None, raw_datasets_dir: Optional[str] = None, workers: int = 1, output_text_field: str = "text", @@ -187,13 +184,13 @@ def __init__( str ] = None, # jsonl: gzip, parquet: ‘NONE’, ‘SNAPPY’, ‘GZIP’, ‘BROTLI’, ‘LZ4’, ‘ZSTD’ output_batch_size: int = 1000, - shuffled_output_dir: Optional[str] = None, + shuffled_datasets_dir: Optional[str] = None, max_output_chunk_uncompressed_bytes: Optional[int] = None, max_output_chunk_rows: Optional[int] = None, config: Union[Config, dict] = None, **kwargs, ) -> None: - self.output_dir = output_dir + self.text_datasets_dir = text_datasets_dir self.raw_datasets_dir = raw_datasets_dir self.workers = workers self.output_text_field = output_text_field @@ -210,7 +207,7 @@ def __init__( self.output_format = output_format self.output_compression = output_compression self.output_batch_size = output_batch_size - self.shuffled_output_dir = shuffled_output_dir + self.shuffled_datasets_dir = shuffled_datasets_dir self.max_output_chunk_uncompressed_bytes = max_output_chunk_uncompressed_bytes self.max_output_chunk_rows = max_output_chunk_rows @@ -299,11 +296,11 @@ def get_output_extension(self, with_dot: bool = True, shuffled: bool = False) -> def get_output_dir(self, shuffled=False): if shuffled: - if self.shuffled_output_dir: - return self.shuffled_output_dir - raise ValueError("shuffled_output_dir is not set") + if self.shuffled_datasets_dir: + return self.shuffled_datasets_dir + raise ValueError("shuffled_datasets_dir is not set") else: - return self.output_dir + return self.text_datasets_dir def get_single_output_file_path(self, shuffled=False) -> str: return os.path.join( @@ -333,24 +330,24 @@ def get_single_or_chunked_output_file_path( else: return self.get_chunked_output_file_path(part, total_parts, shuffled=shuffled) - # def has_output_file(self, min_file_size: int = 1): - # if self.SINGLE_OUTPUT_FILE: - # fps = [self.get_output_file_path()] - # else: - # fps = self.get_output_file_paths() + def filter_texts_or_documents(self, texts_or_documents: Iterable[Union[str, Document]]): + if self.config.use_documents: + return self.filter_documents(texts_or_documents) + else: + return self.filter_texts(texts_or_documents) - # for fp in fps: - # if os.path.exists(fp) and os.stat(fp).st_size >= min_file_size: - # pass - # else: - # return False + def filter_documents(self, documents: Iterable[Document]): + """Applies basic filtering on the texts before saving""" + for doc in documents: + if self.min_length > 0 and len(doc.text) < self.min_length: + # skip because of short text length + self.counter.update({"filtered_short_text": 1}) + continue - # return True + yield doc def filter_texts(self, texts: Iterable[str]): - """ - Applies basic filtering on the texts before saving - """ + """Applies basic filtering on the texts before saving""" for text in texts: if self.min_length > 0 and len(text) < self.min_length: # skip because of short text length @@ -365,9 +362,7 @@ def remove_texts(self): os.remove(fp) def save_texts(self, texts: Iterable[str], append: bool = False): - """ - Save texts in different formats - """ + """Save texts in different formats""" if self.has_output_files() and not self.override_output: raise FileExistsError(f"Output exists already (override not enabled): {self.get_output_file_paths()}") @@ -398,22 +393,26 @@ def save_texts(self, texts: Iterable[str], append: bool = False): return docs_count def save_texts_to_parquet(self, texts: Iterable[str], file_path: Optional[str] = None, apply_filter: bool = True): - """ - Save text in parquet (single column schema, in batches) - """ + """Save text in parquet (single column schema, in batches)""" assert self.output_format == "parquet" if file_path is None: file_path = self.get_output_file_paths(single=True)[0] if apply_filter: - texts = self.filter_texts(texts) + texts = self.filter_texts_or_documents(texts) + + if self.config.use_documents: + # document schema + schema = self.get_document_schema().get_pa_schema() + else: + # text-only schema + schema = pa.schema( + [ + (self.get_output_text_field(), pa.string()), + ] + ) - schema = pa.schema( - [ - (self.get_output_text_field(), pa.string()), - ] - ) # Max. chunk size is multiplied with this factor # (to account for inaccurate chunk sizes due to batching) safety_factor = 0.975 @@ -444,8 +443,7 @@ def save_texts_to_parquet(self, texts: Iterable[str], file_path: Optional[str] = return saved_docs, saved_chunks def save_texts_to_jsonl(self, texts: Iterable[str], append: bool = False): - """ - Write JSONL files to /.jsonl + """Write JSONL files to /.jsonl (each line is a JSON object with "doc" field and text as plain text) """ mode = "a" if append else "w" @@ -649,9 +647,7 @@ def extract_plaintext(self) -> int: return saved_texts_count def get_output_rows_count(self, shuffled: bool = False) -> int: - """ - Read metadata from parquet files and extract number of rows - """ + """Read metadata from parquet files and extract number of rows""" if self.output_format == "parquet": output_paths = list(self.get_output_file_paths(shuffled=shuffled)) @@ -681,9 +677,7 @@ def get_output_rows_count(self, shuffled: bool = False) -> int: raise ValueError(f"Cannot determine the output rows count with {self.output_format=}") def get_compression_from_output_files(self, shuffled=False): - """ - NOTE: Currently only implemented for `parquet` format. - """ + """NOTE: Currently only implemented for `parquet` format.""" if self.output_format == "parquet": for output_path in self.get_output_file_paths(shuffled=shuffled): if os.path.exists(output_path): @@ -709,10 +703,9 @@ def generate_texts_from_output( offset: int = 0, shuffle_output_file_paths: bool = False, reader_implementation: Literal["polars_read_parquet", "pyarrow"] = "pyarrow", + cast_to_py_string: bool = False, ) -> Iterable[Union[str, pa.StringScalar]]: - """ - A iterator over texts from processed output files. - """ + """A iterator over texts from processed output files.""" if batch_size is None: batch_size = self.output_batch_size @@ -781,7 +774,7 @@ def generate_texts_from_output( # TODO before: limit - chunk_start - file_offset logger.debug( - f"Reading file chunk from %s: file [%s - %s]; global [%s - %s]; chunk [%s - %s]", + "Reading file chunk from %s: file [%s - %s]; global [%s - %s]; chunk [%s - %s]", file_path, file_offset, file_limit, @@ -807,11 +800,12 @@ def generate_texts_from_output( logger.debug("break row loop") break - # cast to string - # text = text_column.as_py() - text: pa.StringScalar = text_column + if cast_to_py_string: + # cast to string + text = text_column.as_py() + yield text rows += 1 @@ -879,7 +873,11 @@ def generate_texts_from_output( # Iterate over rows for row in df.iter_rows(): - text = str(row[text_column_index]) + text = row[text_column_index] + + if cast_to_py_string: + text = str(text) + yield text rows += 1 @@ -906,8 +904,7 @@ def generate_texts_from_output( ) def get_estimated_bytes_from_output(self, shuffled: bool = False, read_first_n_rows: int = 1_000) -> int: - """ - Estimate byte size of output text: + """Estimate byte size of output text: - read first N rows of shuffled output files and count their byte size - multiply counted bytes by total number of rows """ @@ -950,9 +947,7 @@ def get_estimated_bytes_from_output(self, shuffled: bool = False, read_first_n_r return total_bytes def get_sampling_factor(self) -> float: - """ - Sampling is defined based on dataset ID, source ID, or language. - """ + """Sampling is defined based on dataset ID, source ID, or language.""" if self.config: if self.DATASET_ID in self.config.sampling_factor_by_dataset_id: return self.config.sampling_factor_by_dataset_id[self.DATASET_ID] @@ -966,9 +961,7 @@ def get_sampling_factor(self) -> float: return 1.0 # default factor def is_selected(self) -> bool: - """ - Is this dataset part of selected datasets or sources? - """ + """Is this dataset part of selected datasets or sources?""" if ( self.DATASET_ID in self.config.selected_dataset_ids or self.get_source_id() in self.config.selected_source_ids @@ -985,12 +978,12 @@ def is_selected(self) -> bool: def get_shuffled_output_file_path(self, unshuffled_output_file_path: str) -> str: output_file_name = Path(unshuffled_output_file_path).name - return os.path.join(self.config.shuffled_output_dir, output_file_name.replace(".parquet", ".shuffled.parquet")) + return os.path.join( + self.config.shuffled_datasets_dir, output_file_name.replace(".parquet", ".shuffled.parquet") + ) def save_stats(self): - """ - Save the processing statistics (counter) into a JSON file in the output directory. - """ + """Save the processing statistics (counter) into a JSON file in the output directory.""" if self.counter is None: logger.error("Cannot save statistics because none were recorded.") return @@ -1015,3 +1008,23 @@ def save_stats(self): logger.info(f"Statistics saved to {stats_file_path}") return stats_file_path + + +class BaseTextDataset(BaseDataset): + def get_texts(self) -> Iterable[str]: + raise NotImplementedError + + def get_documents(self) -> Iterable[Document]: + logger.warning("Generating documents from text dataset.") + for idx, text in enumerate(self.get_texts()): + yield Document(text=text, id=idx) + + +class BaseDocumentDataset(BaseDataset): + def get_texts(self) -> Iterable[str]: + logger.warning("Generating texts from document dataset.") + for doc in self.get_documents(): + yield doc.text + + def get_documents(self) -> Iterable[Document]: + raise NotImplementedError diff --git a/src/llm_datasets/datasets/code/starcoder.py b/src/llm_datasets/datasets/code/starcoder.py index ba33b46..16315b2 100644 --- a/src/llm_datasets/datasets/code/starcoder.py +++ b/src/llm_datasets/datasets/code/starcoder.py @@ -1,14 +1,12 @@ +import logging import os from pathlib import Path -from typing import List, Optional +from typing import List + from llm_datasets.datasets.base import Availability, License from llm_datasets.datasets.hf_dataset import HFDataset - -import logging - from llm_datasets.datasets.parquet_dataset import ParquetDataset - logger = logging.getLogger(__name__) # Dataset IDs: @@ -129,9 +127,7 @@ class StarcoderHFDataset(HFDataset): class StarcoderBaseDataset(ParquetDataset): - """ - Output files: $LOCAL_DIR//train--of-.parquet - """ + """Output files: $LOCAL_DIR//train--of-.parquet""" DATASET_ID = None PROGRAMMING_LANGUAGE = None diff --git a/src/llm_datasets/datasets/cs/cs_en_parallel.py b/src/llm_datasets/datasets/cs/cs_en_parallel.py index 8f7a4f5..ba94da7 100644 --- a/src/llm_datasets/datasets/cs/cs_en_parallel.py +++ b/src/llm_datasets/datasets/cs/cs_en_parallel.py @@ -1,24 +1,16 @@ -from io import BytesIO -import json +import gzip import logging -import argparse -import os -import tarfile -from typing import Iterable -from smart_open import open import re -import gzip - -from llm_datasets.datasets.base import BaseDataset, Availability, License +import tarfile +from io import BytesIO +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) class CzechEnglishParallelDataset(BaseDataset): - """ - This dataset is only using the Czech part of the original parallel corpus. - """ + """This dataset is only using the Czech part of the original parallel corpus.""" DATASET_ID = "cs_en_parallel" TITLE = "Czech-English Parallel Corpus 1.0 (CzEng 1.0)" @@ -48,8 +40,7 @@ def is_downloaded(self): return len(self.get_dataset_file_paths(needed_suffix=".tar")) == len(self.DOWNLOAD_URLS) def get_texts(self): - """ - Extracts all texts from each file. Each file contains several texts, and one line per sentence. + """Extracts all texts from each file. Each file contains several texts, and one line per sentence. This function concatenates all sentences belonging to one text and then outputs the text. """ if not self.is_downloaded(): diff --git a/src/llm_datasets/datasets/cs/syn_v9.py b/src/llm_datasets/datasets/cs/syn_v9.py index c8d4e2d..c268af3 100644 --- a/src/llm_datasets/datasets/cs/syn_v9.py +++ b/src/llm_datasets/datasets/cs/syn_v9.py @@ -1,9 +1,7 @@ import logging - import lzma as xz -from llm_datasets.datasets.base import BaseDataset, Availability, License - +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/da/danewsroom.py b/src/llm_datasets/datasets/da/danewsroom.py index 6e594da..8cac698 100644 --- a/src/llm_datasets/datasets/da/danewsroom.py +++ b/src/llm_datasets/datasets/da/danewsroom.py @@ -1,9 +1,10 @@ import json import logging from typing import Iterable + from smart_open import open -from llm_datasets.datasets.base import GB, BaseDataset, Availability, License +from llm_datasets.datasets.base import GB, Availability, BaseDataset, License logger = logging.getLogger(__name__) @@ -35,16 +36,16 @@ class DANewsroomDataset(BaseDataset): BYTES = 1.5 * GB def download(self): - """ - gdown "https://drive.google.com/u/0/uc?id=1u22Hcs__CUu_GAzY4HQ275gfHvLGOckv&export=download" + """Download the source data set from Google drive via gdown: + + ```console + > gdown "https://drive.google.com/u/0/uc?id=1u22Hcs__CUu_GAzY4HQ275gfHvLGOckv&export=download" + ``` """ pass def get_texts(self) -> Iterable[str]: - """ - Extracts the text from each JSONL file. - """ - + """Extracts the text from each JSONL file.""" with open(self.get_dataset_file_paths(single_file=True, needed_suffix=".jsonl.gz")) as f: for line in f: doc = json.loads(line) diff --git a/src/llm_datasets/datasets/da/danish_parliament_corpus.py b/src/llm_datasets/datasets/da/danish_parliament_corpus.py index 6cb1a9d..5d20518 100644 --- a/src/llm_datasets/datasets/da/danish_parliament_corpus.py +++ b/src/llm_datasets/datasets/da/danish_parliament_corpus.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, Availability +from llm_datasets.datasets.base import Availability, BaseDataset # @DeprecationWarning("Folketinget is already part of Danish GigaWord") diff --git a/src/llm_datasets/datasets/da/dk_clarin.py b/src/llm_datasets/datasets/da/dk_clarin.py index fa16ad8..87271b5 100644 --- a/src/llm_datasets/datasets/da/dk_clarin.py +++ b/src/llm_datasets/datasets/da/dk_clarin.py @@ -1,10 +1,8 @@ import logging -from typing import Iterable - import zipfile +from typing import Iterable - -from llm_datasets.datasets.base import BaseDataset, Availability, GB, License +from llm_datasets.datasets.base import GB, Availability, BaseDataset, License logger = logging.getLogger(__name__) @@ -28,9 +26,7 @@ class DKClarinDataset(BaseDataset): BYTES = 1.4 * GB def get_texts(self) -> Iterable[str]: - """ - Extracts the text from the zip files - """ + """Extracts the text from the zip files""" from bs4 import BeautifulSoup zip_fps = self.get_dataset_file_paths(needed_suffix=".zip") diff --git a/src/llm_datasets/datasets/dataset_registry.py b/src/llm_datasets/datasets/dataset_registry.py index f1058f4..aec6d43 100644 --- a/src/llm_datasets/datasets/dataset_registry.py +++ b/src/llm_datasets/datasets/dataset_registry.py @@ -1,19 +1,23 @@ +import importlib +import logging from typing import List, Optional, Union -from .multilingual.wikimedia import get_wikimedia_auto_classes + +from llm_datasets.utils.config import Config + +from .code.starcoder import get_auto_starcoder_classes +from .en.pile_of_law import get_pile_of_law_auto_classes +from .fr.pleiasbooks import get_pleias_books_auto_classes +from .fr.pleiasnews import get_pleias_news_auto_classes from .multilingual.colossal_oscar import get_colossal_oscar_auto_classes from .multilingual.eurlex import get_eurlex_auto_classes from .multilingual.legal_mc4 import get_legal_mc4_auto_classes -from .fr.pleiasnews import get_pleias_news_auto_classes -from .fr.pleiasbooks import get_pleias_books_auto_classes -from .code.starcoder import get_auto_starcoder_classes +from .multilingual.wikimedia import get_wikimedia_auto_classes from .nl.sonar import get_sonar_classes -from .en.pile_of_law import get_pile_of_law_auto_classes -import importlib -import logging - logger = logging.getLogger(__name__) +ALL_DATASETS = "all" +ALL_DATASETS_FROM_SOURCE = "all_from_source" ALL_DATASET_IMPORTS = [ # multilingual @@ -156,14 +160,12 @@ def get_class_by_import_string( import_string_or_cls: Union[str, object], relative_base_package: str = "llm_datasets.datasets" ): - """ - Import dataset class based on import string + """Import dataset class based on import string Allowed formats: - ".lang.DatasetClass" # relative - "llm_datasets.lang.DatasetClass" # absolute """ - if isinstance(import_string_or_cls, str): # import from string if import_string_or_cls.startswith("."): # relative import @@ -185,15 +187,13 @@ def get_class_by_import_string( def get_registered_dataset_classes( extra_dataset_registries: Optional[Union[str, List[str]]] = None, extra_dataset_classes: Optional[List] = None, - use_default_registry: bool = True, + use_default_dataset_registry: bool = True, ): - """ - Construct list of registered dataset classes - """ + """Construct list of registered dataset classes""" dataset_classes = [] # Predefined dataset classes (default registry) - if use_default_registry: + if use_default_dataset_registry: dataset_classes += ( [get_class_by_import_string(clss) for clss in ALL_DATASET_IMPORTS] + get_eurlex_auto_classes() @@ -217,7 +217,13 @@ def get_registered_dataset_classes( # Iterate over registeries for extra_dataset_registry_str in extra_dataset_registries: logger.info(f"Loading datasets from registry: {extra_dataset_registry_str}") - extra_dataset_registry_package = importlib.import_module(extra_dataset_registry_str) + try: + extra_dataset_registry_package = importlib.import_module(extra_dataset_registry_str) + except ModuleNotFoundError: + raise ModuleNotFoundError( + f"Cannot import dataset registry from `{extra_dataset_registry_str}`. Is the package installed or" + " PYTHONPATH correctly set?" + ) extra_dataset_registry_getter = getattr(extra_dataset_registry_package, "get_registered_dataset_classes") extra_dataset_classes_from_registry = extra_dataset_registry_getter() @@ -230,17 +236,26 @@ def get_registered_dataset_classes( def get_registered_dataset_ids( - extra_dataset_registries: Optional[Union[str, List[str]]] = None, needed_source_id: Optional[str] = None + extra_dataset_registries: Optional[Union[str, List[str]]] = None, + needed_source_id: Optional[str] = None, + extra_dataset_classes=None, + use_default_dataset_registry=True, ): return [ cls.DATASET_ID - for cls in get_registered_dataset_classes(extra_dataset_registries) + for cls in get_registered_dataset_classes( + extra_dataset_registries, + extra_dataset_classes=extra_dataset_classes, + use_default_dataset_registry=use_default_dataset_registry, + ) if needed_source_id is None or cls.SOURCE_ID == needed_source_id ] -def get_dataset_class_by_id(dataset_id, extra_dataset_registries: Optional[Union[str, List[str]]] = None): - id_to_dataset_class = {cls.DATASET_ID: cls for cls in get_registered_dataset_classes(extra_dataset_registries)} +def get_dataset_class_by_id(dataset_id, extra_dataset_registries: Optional[Union[str, List[str]]] = None, **kwargs): + id_to_dataset_class = { + cls.DATASET_ID: cls for cls in get_registered_dataset_classes(extra_dataset_registries, **kwargs) + } if dataset_id in id_to_dataset_class: dataset_cls = id_to_dataset_class[dataset_id] @@ -250,3 +265,34 @@ def get_dataset_class_by_id(dataset_id, extra_dataset_registries: Optional[Union dataset_cls = id_to_dataset_class[dataset_id] return dataset_cls + + +def get_datasets_list_from_string(datasets_str: str, config: Config) -> List[str]: + if isinstance(datasets_str, list): + # input is already a list + return datasets_str + + datasets_list = datasets_str.split(",") + + if len(datasets_list) == 1: + if datasets_list[0] == ALL_DATASETS: + # Get list of all regsitered datasets + datasets_list = get_registered_dataset_ids( + config.extra_dataset_registries, + extra_dataset_classes=config.extra_dataset_classes, + use_default_dataset_registry=config.use_default_dataset_registry, + ) + + elif datasets_list[0] == ALL_DATASETS_FROM_SOURCE: + # Get registered datasets based on source + if config.source_id is None: + raise ValueError("The argument or config `source_id` must be set.") + + datasets_list = get_registered_dataset_ids( + config.extra_dataset_registries, + needed_source_id=config.source_id, + extra_dataset_classes=config.extra_dataset_classes, + use_default_dataset_registry=config.use_default_dataset_registry, + ) + + return datasets_list diff --git a/src/llm_datasets/datasets/de/de_laws.py b/src/llm_datasets/datasets/de/de_laws.py index 7fa2b48..c77b5d6 100644 --- a/src/llm_datasets/datasets/de/de_laws.py +++ b/src/llm_datasets/datasets/de/de_laws.py @@ -1,26 +1,24 @@ +import copy +import logging +import multiprocessing import os -import zipfile import re -import multiprocessing -import requests import time -import logging -import copy - import xml.etree.ElementTree as ET +import zipfile +from typing import Dict, Optional, Union + +import requests from bs4 import BeautifulSoup from tqdm import tqdm -from typing import Dict, Union, Optional -from requests.adapters import HTTPAdapter -from requests.packages.urllib3.util.retry import Retry -from llm_datasets.datasets.base import BaseDataset, Availability, MILLION, License + +from llm_datasets.datasets.base import MILLION, Availability, BaseDataset, License logger = logging.getLogger(__name__) class DELawsDataset(BaseDataset): - """ - Class to download, process and yield a dataset of german law. + """Class to download, process and yield a dataset of german law. Parts of code adapted from: @bundestag https://github.com/bundestag/de_laws_to_json#Apache-2.0-1-ov-file @@ -42,11 +40,9 @@ class DELawsDataset(BaseDataset): TOKENS = 1.5 * MILLION def custom_request(self, url, max_retries=5): - """ - Common requests with a timer for 1s between calls. In case of timeout + """Common requests with a timer for 1s between calls. In case of timeout uses an increasing sleep period. """ - for i in range(max_retries): try: response = requests.get(url) @@ -58,9 +54,7 @@ def custom_request(self, url, max_retries=5): logger.debug(f"Max retries reached. File was not downloaded: {url}") def process_law(self, law): - """ - Function to process each item from the item array. It does the following for each item. - """ + """Function to process each item from the item array. It does the following for each item.""" # Download the zip file item_response = self.custom_request(law["link"]) @@ -80,18 +74,11 @@ def process_law(self, law): return 1 def num_tokens_from_string(string: str) -> int: - """ - Function to count the number of tokens in a string - https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb - """ - encoding = tiktoken.get_encoding("cl100k_base") - num_tokens = len(encoding.encode(string)) - return num_tokens + """Function to count the number of tokens in a string (whitespace separation)""" + return len(string.split()) def convert_xml_to_dict(self, element, expected_type: Optional[type] = None) -> Union[str, Dict]: - """ - Function to recursively convert xml element and its children into dictionary. - """ + """Function to recursively convert xml element and its children into dictionary.""" if element.string: return element.string else: @@ -111,11 +98,9 @@ def convert_xml_to_dict(self, element, expected_type: Optional[type] = None) -> return children_dict def download(self): - """ - List all download URLs and download the zip file with all laws and run + """List all download URLs and download the zip file with all laws and run process_law for each one, saving the XML files. """ - # Download the XML file response = self.custom_request("https://www.gesetze-im-internet.de/gii-toc.xml") @@ -148,9 +133,7 @@ def download(self): pbar.update() def process_text(self, filename): - """ - For each XML file - """ + """For each XML file""" # simple output dict for storing norms output = {"norms": []} # Read file diff --git a/src/llm_datasets/datasets/de/dewac.py b/src/llm_datasets/datasets/de/dewac.py index 9b8e0a1..5a02f93 100644 --- a/src/llm_datasets/datasets/de/dewac.py +++ b/src/llm_datasets/datasets/de/dewac.py @@ -1,15 +1,15 @@ import logging from typing import Iterable -from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License + from smart_open import open +from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License + logger = logging.getLogger(__name__) class DEWacDataset(BaseDataset): - """ - See also: ITWacDataset - """ + """See also: ITWacDataset""" DATASET_ID = "dewac" TITLE = "DeWaC" diff --git a/src/llm_datasets/datasets/de/openlegaldata.py b/src/llm_datasets/datasets/de/openlegaldata.py index 57eddd2..ef83316 100644 --- a/src/llm_datasets/datasets/de/openlegaldata.py +++ b/src/llm_datasets/datasets/de/openlegaldata.py @@ -1,8 +1,10 @@ +from datatrove.data import Document + from llm_datasets.datasets.base import Availability, Genre, License -from llm_datasets.datasets.jsonl_dataset import JSONLDataset +from llm_datasets.datasets.jsonl_dataset import JSONLDocumentDataset -class OpenLegalDataDataset(JSONLDataset): +class OpenLegalDataDataset(JSONLDocumentDataset): DATASET_ID = "openlegaldata" TITLE = "Open Legal Data - German court decisions and laws" HOMEPAGE = "https://openlegaldata.io/" @@ -52,10 +54,10 @@ class OpenLegalDataDataset(JSONLDataset): doc_ids = set() - def get_text_from_item(self, item): + def get_document_from_item(self, item, index: int | None = None) -> Document: # filter by doc ID if item["doc_id"] in self.doc_ids: return None else: self.doc_ids.add(item["doc_id"]) - return item[self.raw_jsonl_text_field] + return Document(text=item[self.raw_jsonl_text_field], id=item["doc_id"]) diff --git a/src/llm_datasets/datasets/el/greek_legal_code.py b/src/llm_datasets/datasets/el/greek_legal_code.py index 0cf2268..947a865 100644 --- a/src/llm_datasets/datasets/el/greek_legal_code.py +++ b/src/llm_datasets/datasets/el/greek_legal_code.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import Availability, MB, License +from llm_datasets.datasets.base import MB, Availability, License from llm_datasets.datasets.hf_dataset import HFDataset diff --git a/src/llm_datasets/datasets/el/greek_web_corpus.py b/src/llm_datasets/datasets/el/greek_web_corpus.py index 657b682..ae0c147 100644 --- a/src/llm_datasets/datasets/el/greek_web_corpus.py +++ b/src/llm_datasets/datasets/el/greek_web_corpus.py @@ -1,7 +1,9 @@ +import logging from typing import Iterable -from llm_datasets.datasets.base import GB, BaseDataset, Availability, QualityWarning, License + from smart_open import open -import logging + +from llm_datasets.datasets.base import GB, Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/en/dialogstudio.py b/src/llm_datasets/datasets/en/dialogstudio.py index 920df3d..1093e81 100644 --- a/src/llm_datasets/datasets/en/dialogstudio.py +++ b/src/llm_datasets/datasets/en/dialogstudio.py @@ -1,8 +1,8 @@ from typing import Iterable + from llm_datasets.datasets.base import Genre from llm_datasets.datasets.hf_dataset import HFDataset - DIALOGSTUDIO_DATASETS = { "natural_language_understanding": [ "ATIS", @@ -105,9 +105,7 @@ class DialogstudioDataset(HFDataset): - """ - Rather a fine-tuning dataset - """ + """Rather a fine-tuning dataset""" DATASET_ID = "dialogstudio" TITLE = "DialogStudio: Unified Dialog Datasets and Instruction-Aware Models for Conversational AI" diff --git a/src/llm_datasets/datasets/en/edgar.py b/src/llm_datasets/datasets/en/edgar.py index 8783879..46e60cb 100644 --- a/src/llm_datasets/datasets/en/edgar.py +++ b/src/llm_datasets/datasets/en/edgar.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import Availability, GB, License +from llm_datasets.datasets.base import GB, Availability, License from llm_datasets.datasets.hf_dataset import HFDataset @@ -41,8 +41,7 @@ class EdgarCorpus(HFDataset): keep_columns = True def get_text_from_item(self, item) -> str: - """ - Subscribing the original method since this dataset + """Subscribing the original method since this dataset has multiple columns. Iterates over the row columns and concatenates the columns content diff --git a/src/llm_datasets/datasets/en/math_amps.py b/src/llm_datasets/datasets/en/math_amps.py index 230718b..ed6d66c 100644 --- a/src/llm_datasets/datasets/en/math_amps.py +++ b/src/llm_datasets/datasets/en/math_amps.py @@ -30,15 +30,11 @@ class MathAMPSDataset(BaseDataset): DOWNLOAD_URLS = ["https://drive.google.com/file/d/1hQsua3TkpEmcJD_UWQx8dmNdEZPyxw23/view?usp=sharing"] def download(self): - """ - Manually download the archive from Google drive. - """ + """Manually download the archive from Google drive.""" pass def decompress(self): - """ - gzip -d ... - """ + """Gzip -d ...""" pass def get_texts(self): diff --git a/src/llm_datasets/datasets/en/pes2o.py b/src/llm_datasets/datasets/en/pes2o.py index 9ac9ad0..55605d2 100644 --- a/src/llm_datasets/datasets/en/pes2o.py +++ b/src/llm_datasets/datasets/en/pes2o.py @@ -3,8 +3,7 @@ class PeS2oDataset(HFDataset): - """ - peS2o V2 + """peS2o V2 Knowledge cutoff: 2023-01-03 Number of documents: 38.97M diff --git a/src/llm_datasets/datasets/en/pile_of_law.py b/src/llm_datasets/datasets/en/pile_of_law.py index efb2f3b..afc5516 100644 --- a/src/llm_datasets/datasets/en/pile_of_law.py +++ b/src/llm_datasets/datasets/en/pile_of_law.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import License, Availability, Genre +from llm_datasets.datasets.base import Availability, Genre, License from llm_datasets.datasets.hf_dataset import HFDataset # OK licenses @@ -68,9 +68,7 @@ class PileOfLawDataset(HFDataset): - """ - NOTE: This dataset uses only selected subsets of the original "Pile of Law". See `HF_DATASET_CONFIGS` - """ + """NOTE: This dataset uses only selected subsets of the original "Pile of Law". See `HF_DATASET_CONFIGS`""" DATASET_ID = "pile_of_law" SOURCE_ID = "pile_of_law" diff --git a/src/llm_datasets/datasets/en/proof_pile.py b/src/llm_datasets/datasets/en/proof_pile.py index 1f4ecf5..12aa496 100644 --- a/src/llm_datasets/datasets/en/proof_pile.py +++ b/src/llm_datasets/datasets/en/proof_pile.py @@ -3,9 +3,7 @@ class ProofPileDataset(HFDataset): - """ - Duplicated content / overlap with arxiv: PeS2oDataset - """ + """Duplicated content / overlap with arxiv: PeS2oDataset""" DATASET_ID = "proof_pile" TITLE = "proof-pile" diff --git a/src/llm_datasets/datasets/en/wikihow.py b/src/llm_datasets/datasets/en/wikihow.py index d90c61a..b214f0d 100644 --- a/src/llm_datasets/datasets/en/wikihow.py +++ b/src/llm_datasets/datasets/en/wikihow.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import Availability, MB, License +from llm_datasets.datasets.base import MB, Availability, License from llm_datasets.datasets.hf_dataset import HFDataset diff --git a/src/llm_datasets/datasets/es/escorpius.py b/src/llm_datasets/datasets/es/escorpius.py index a2da560..352f836 100644 --- a/src/llm_datasets/datasets/es/escorpius.py +++ b/src/llm_datasets/datasets/es/escorpius.py @@ -2,9 +2,7 @@ class ESCorpiusDataset(HFDataset): - """ - OVERLAP with CC/OSCAR - """ + """OVERLAP with CC/OSCAR""" DATASET_ID = "escorpius" TITLE = "esCorpius: A Massive Spanish Crawling Corpus" diff --git a/src/llm_datasets/datasets/es/spanish_legal.py b/src/llm_datasets/datasets/es/spanish_legal.py index 29a8c82..27153fe 100644 --- a/src/llm_datasets/datasets/es/spanish_legal.py +++ b/src/llm_datasets/datasets/es/spanish_legal.py @@ -1,14 +1,13 @@ import logging import zipfile -from llm_datasets.datasets.base import Availability, BaseDataset, Genre, GB, License, QualityWarning + +from llm_datasets.datasets.base import GB, Availability, BaseDataset, Genre, License, QualityWarning logger = logging.getLogger(__name__) class SpanishLegalDataset(BaseDataset): - """ - Warning: Document splitting only done by "\n\n" => short texts and bad line breaks. - """ + r"""Warning: Document splitting only done by "\n\n" => short texts and bad line breaks.""" DATASET_ID = "spanish_legal" TITLE = "Spanish Legal Domain Corpora" diff --git a/src/llm_datasets/datasets/et/ekspress.py b/src/llm_datasets/datasets/et/ekspress.py index 55546e5..86a71cf 100644 --- a/src/llm_datasets/datasets/et/ekspress.py +++ b/src/llm_datasets/datasets/et/ekspress.py @@ -4,7 +4,6 @@ from llm_datasets.datasets.base import BaseDataset, License - logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/et/enc.py b/src/llm_datasets/datasets/et/enc.py index 34ed11b..b8eef5b 100644 --- a/src/llm_datasets/datasets/et/enc.py +++ b/src/llm_datasets/datasets/et/enc.py @@ -1,9 +1,9 @@ import logging from typing import Iterable -from llm_datasets.datasets.base import BaseDataset, License from smart_open import open +from llm_datasets.datasets.base import BaseDataset, License logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/et/estonian_reference_corpus.py b/src/llm_datasets/datasets/et/estonian_reference_corpus.py index c03eae9..fec1b8d 100644 --- a/src/llm_datasets/datasets/et/estonian_reference_corpus.py +++ b/src/llm_datasets/datasets/et/estonian_reference_corpus.py @@ -1,9 +1,9 @@ -from typing import Iterable +import logging import zipfile -from llm_datasets.datasets.base import MILLION, BaseDataset, Availability, QualityWarning, License -from llm_datasets.utils import remove_whitespaces_before_punctuation +from typing import Iterable -import logging +from llm_datasets.datasets.base import MILLION, Availability, BaseDataset, License, QualityWarning +from llm_datasets.utils import remove_whitespaces_before_punctuation logger = logging.getLogger(__name__) @@ -60,11 +60,8 @@ def is_downloaded(self): return len(self.get_dataset_file_paths(needed_suffix=(".tar.gz", ".zip"))) == len(self.DOWNLOAD_URLS) def get_texts(self) -> Iterable[str]: - """ - Adapted from https://github.com/estnltk/estnltk/blob/123fadf204fb99661da5320cf95172aa9b61c697/tutorials/corpus_processing/importing_text_objects_from_corpora.ipynb # noqa - """ - from estnltk.corpus_processing.parse_koondkorpus import get_div_target - from estnltk.corpus_processing.parse_koondkorpus import parse_tei_corpus_file_content + """Adapted from https://github.com/estnltk/estnltk/blob/123fadf204fb99661da5320cf95172aa9b61c697/tutorials/corpus_processing/importing_text_objects_from_corpora.ipynb # noqa""" + from estnltk.corpus_processing.parse_koondkorpus import get_div_target, parse_tei_corpus_file_content if not self.is_downloaded(): self.download() diff --git a/src/llm_datasets/datasets/fi/ylenews.py b/src/llm_datasets/datasets/fi/ylenews.py index a5040ae..94da305 100644 --- a/src/llm_datasets/datasets/fi/ylenews.py +++ b/src/llm_datasets/datasets/fi/ylenews.py @@ -1,9 +1,11 @@ import json -from llm_datasets.datasets.base import BaseDataset, Availability, License -import zipfile import logging +import zipfile + from tqdm.auto import tqdm +from llm_datasets.datasets.base import Availability, BaseDataset, License + logger = logging.getLogger(__name__) @@ -27,7 +29,7 @@ class YLENewsDataset(BaseDataset): LANGUAGES = ["fi"] def get_texts(self): - """ """ + """Extract text from JSON within zip files""" zip_fps = self.get_dataset_file_paths(needed_suffix=".zip") for zip_fp in zip_fps: diff --git a/src/llm_datasets/datasets/fr/cabernet.py b/src/llm_datasets/datasets/fr/cabernet.py index 5a4aa66..fffc682 100644 --- a/src/llm_datasets/datasets/fr/cabernet.py +++ b/src/llm_datasets/datasets/fr/cabernet.py @@ -1,13 +1,13 @@ import logging import tarfile -from llm_datasets.datasets.base import Availability, BaseDataset, QualityWarning, License + +from llm_datasets.datasets.base import Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) class CaBeRnetDataset(BaseDataset): - """ - Contents: + """Contents: - Fiction - Acad (Wikiepdia) - Oral diff --git a/src/llm_datasets/datasets/fr/pleiasbooks.py b/src/llm_datasets/datasets/fr/pleiasbooks.py index 5096997..2015be4 100644 --- a/src/llm_datasets/datasets/fr/pleiasbooks.py +++ b/src/llm_datasets/datasets/fr/pleiasbooks.py @@ -1,14 +1,10 @@ import logging +from typing import List, Optional -from typing import Dict, List, Optional +from datasets import load_dataset -from llm_datasets.datasets.base import Availability, License from llm_datasets.datasets.hf_dataset import HFDataset - -from datasets import load_dataset, DatasetDict - - logger = logging.getLogger(__name__) @@ -59,9 +55,7 @@ def get_texts(self): def get_pleias_books_auto_classes(): - """ - Auto generate classes for each decade. - """ + """Auto generate classes for each decade.""" decades = [ 1920, 1540, diff --git a/src/llm_datasets/datasets/fr/pleiasnews.py b/src/llm_datasets/datasets/fr/pleiasnews.py index 64186e5..5bbfcb7 100644 --- a/src/llm_datasets/datasets/fr/pleiasnews.py +++ b/src/llm_datasets/datasets/fr/pleiasnews.py @@ -1,14 +1,10 @@ import logging +from typing import List, Optional -from typing import Dict, List, Optional +from datasets import load_dataset -from llm_datasets.datasets.base import Availability, License from llm_datasets.datasets.hf_dataset import HFDataset - -from datasets import load_dataset, DatasetDict - - logger = logging.getLogger(__name__) @@ -22,11 +18,9 @@ class PleiasNewsBase(HFDataset): remove_columns = ["file_id", "ocr", "author", "page_count", "word_count", "character_count"] def process(self, example): - """ - Function for batch processing of the date column on the PLeias News Dataset. + """Function for batch processing of the date column on the PLeias News Dataset. Groups date by decade. If no date is provided return the row as is. """ - try: date = list(example["date"])[0:3] date.append("0") @@ -75,9 +69,7 @@ def get_texts(self): def get_pleias_news_auto_classes(): - """ - Auto generate classes for each decade. - """ + """Auto generate classes for each decade.""" decades = [ 1920, 1670, diff --git a/src/llm_datasets/datasets/ga/ga_bilingual_legistation.py b/src/llm_datasets/datasets/ga/ga_bilingual_legistation.py index 526c7c6..bbee247 100644 --- a/src/llm_datasets/datasets/ga/ga_bilingual_legistation.py +++ b/src/llm_datasets/datasets/ga/ga_bilingual_legistation.py @@ -1,14 +1,18 @@ import logging -from llm_datasets.datasets.base import BaseDataset, MB, Availability, License, QualityWarning +from llm_datasets.datasets.base import ( + MB, + Availability, + BaseDataset, + License, + QualityWarning, +) logger = logging.getLogger(__name__) class GABilingualLegislationDataset(BaseDataset): - """ - Quality warning: only sentences no documents - """ + """Quality warning: only sentences no documents""" DATASET_ID = "ga_bilingual_legistation" TITLE = "The Gaois bilingual corpus of English-Irish legislation (Irish legislation)" diff --git a/src/llm_datasets/datasets/ga/ga_universal_dependencies.py b/src/llm_datasets/datasets/ga/ga_universal_dependencies.py index a77f9cf..b5bfcdb 100644 --- a/src/llm_datasets/datasets/ga/ga_universal_dependencies.py +++ b/src/llm_datasets/datasets/ga/ga_universal_dependencies.py @@ -1,20 +1,12 @@ import logging -import os -from llm_datasets.datasets.base import BaseDataset, MB, Availability, License, QualityWarning -from llm_datasets.utils.systems import get_path_by_system -import wget +from llm_datasets.datasets.base import MB, Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) class GAUniversalDependenciesDataset(BaseDataset): - """ - - TODO only sentences no documents - - - """ + """TODO only sentences no documents""" DATASET_ID = "ga_universal_dependencies" TITLE = "Irish Universal Dependencies" diff --git a/src/llm_datasets/datasets/hf_dataset.py b/src/llm_datasets/datasets/hf_dataset.py index 34db0ff..7bb22c3 100644 --- a/src/llm_datasets/datasets/hf_dataset.py +++ b/src/llm_datasets/datasets/hf_dataset.py @@ -1,15 +1,15 @@ import logging -from datasets import load_dataset, DatasetDict +from typing import Dict, Iterable, List, Optional -from typing import Dict, List, Optional - -from llm_datasets.datasets.base import BaseDataset +from datasets import DatasetDict, load_dataset +from datatrove.data import Document +from llm_datasets.datasets.base import BaseDocumentDataset logger = logging.getLogger(__name__) -class HFDataset(BaseDataset): +class HFDataset(BaseDocumentDataset): HF_DATASET_ID: str = None HF_DATASET_SPLIT: Optional[str] = None HF_DATASET_CONFIGS: Optional[List[str]] = None @@ -18,8 +18,10 @@ class HFDataset(BaseDataset): HF_REVISION: Optional[str] = None config_to_dataset: Optional[Dict] = None + id_column_name = None text_column_name = "text" title_column_name = None + metadata_column_names = None remove_columns = None streaming = False keep_columns = False @@ -97,8 +99,12 @@ def download(self): def get_filter_func(self): return None - def get_text_from_item(self, item) -> str: - return item[self.text_column_name] + def get_document_from_item(self, item, index: Optional[int] = None) -> Document: + return Document( + text=item[self.text_column_name], + id=item[self.id_column_name] if self.id_column_name else index, + metadata={col: item[col] for col in self.metadata_column_names} if self.metadata_column_names else {}, + ) def prepend_title(self, example): example[self.text_column_name] = ( @@ -107,9 +113,9 @@ def prepend_title(self, example): return example - def get_texts(self): + def get_documents(self) -> Iterable[Document]: self.download() - + doc_idx = 0 # drop all non-text columns for ds_idx, config in enumerate(self.config_to_dataset): # remove non-text and non-title columns @@ -134,8 +140,9 @@ def get_texts(self): ds_iterator = iter(self.config_to_dataset[config]) for item in ds_iterator: - if hasattr(self, "get_texts_from_item"): - # multiple texts from a single item - yield from self.get_texts_from_item(item) + if hasattr(self, "get_documents_from_item"): + # multiple documents from a single item + yield from self.get_documents_from_item(item) else: - yield self.get_text_from_item(item) + yield self.get_document_from_item(item, doc_idx) + doc_idx += 1 diff --git a/src/llm_datasets/datasets/hr/croatian_news_engri.py b/src/llm_datasets/datasets/hr/croatian_news_engri.py index f459a6f..d2334c3 100644 --- a/src/llm_datasets/datasets/hr/croatian_news_engri.py +++ b/src/llm_datasets/datasets/hr/croatian_news_engri.py @@ -1,27 +1,16 @@ -""" - -https://repository.pfri.uniri.hr/islandora/object/pfri%3A2156/datastream/DATASET0/download - -""" +"""https://repository.pfri.uniri.hr/islandora/object/pfri%3A2156/datastream/DATASET0/download""" import logging - -from llm_datasets.datasets.base import BaseDataset, Availability, License - - from smart_open import open +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) class CroatianNewsENGRIDataset(BaseDataset): - """ - - https://www.clarin.si/repository/xmlui/handle/11356/1416 - - """ + """https://www.clarin.si/repository/xmlui/handle/11356/1416""" DATASET_ID = "croatian_news_engri" TITLE = "Corpus of Croatian news portals ENGRI (2014-2018)" diff --git a/src/llm_datasets/datasets/hr/hrwac.py b/src/llm_datasets/datasets/hr/hrwac.py index d54be5e..b4c9456 100644 --- a/src/llm_datasets/datasets/hr/hrwac.py +++ b/src/llm_datasets/datasets/hr/hrwac.py @@ -1,17 +1,15 @@ -import logging -from llm_datasets.datasets.base import BaseDataset, Availability, License - import html +import logging from smart_open import open +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) class HRWACDataset(BaseDataset): - """ - TODO only paragraphs no documents + """TODO only paragraphs no documents curl --remote-name-all https://www.clarin.si/repository/xmlui/bitstream/handle/11356/1064{/hrWaC2.1.01.xml.gz,/hrWaC2.1.02.xml.gz,/hrWaC2.1.03.xml.gz,/hrWaC2.1.04.xml.gz,/hrWaC2.1.05.xml.gz,/hrWaC2.1.05.xml.gz,/hrWaC2.1.06.xml.gz,/hrWaC2.1.07.xml.gz,/hrWaC2.1.08.xml.gz,/hrWaC2.1.09.xml.gz,/hrWaC2.1.10.xml.gz,/hrWaC2.1.11.xml.gz,/hrWaC2.1.12.xml.gz,/hrWaC2.1.13.xml.gz,/hrWaC2.1.14.xml.gz} # noqa """ diff --git a/src/llm_datasets/datasets/hr/styria_news.py b/src/llm_datasets/datasets/hr/styria_news.py index d03623c..fe96965 100644 --- a/src/llm_datasets/datasets/hr/styria_news.py +++ b/src/llm_datasets/datasets/hr/styria_news.py @@ -2,15 +2,13 @@ import pandas as pd -from llm_datasets.datasets.base import BaseDataset, GB, Availability, Genre, License - +from llm_datasets.datasets.base import GB, Availability, BaseDataset, Genre, License logger = logging.getLogger(__name__) class StyriaNewsDataset(BaseDataset): - """ - https://www.clarin.si/repository/xmlui/bitstream/handle/11356/1410/Styria-articles.csv + """https://www.clarin.si/repository/xmlui/bitstream/handle/11356/1410/Styria-articles.csv https://www.clarin.si/repository/xmlui/bitstream/handle/11356/1399/Styria-user-comments.zip?sequence=7&isAllowed=y """ diff --git a/src/llm_datasets/datasets/it/itwac.py b/src/llm_datasets/datasets/it/itwac.py index 9e8d753..31dbd45 100644 --- a/src/llm_datasets/datasets/it/itwac.py +++ b/src/llm_datasets/datasets/it/itwac.py @@ -1,15 +1,15 @@ import logging from typing import Iterable -from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License + from smart_open import open +from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License + logger = logging.getLogger(__name__) class ITWacDataset(BaseDataset): - """ - See also: DeWacDataset - """ + """See also: DeWacDataset""" DATASET_ID = "itwac" TITLE = "ITWaC" diff --git a/src/llm_datasets/datasets/jsonl_dataset.py b/src/llm_datasets/datasets/jsonl_dataset.py index 28524eb..537c3a0 100644 --- a/src/llm_datasets/datasets/jsonl_dataset.py +++ b/src/llm_datasets/datasets/jsonl_dataset.py @@ -1,24 +1,20 @@ -import logging +import io import json -import multiprocessing -import multiprocess - +import logging import os - -from smart_open import open +from pathlib import Path +from typing import Iterable, Optional import zstandard as zstd -import io - - -from llm_datasets.datasets.base import BaseDataset -from llm_datasets.utils.flatmap import flatmap +from datatrove.data import Document +from smart_open import open +from llm_datasets.datasets.base import BaseDocumentDataset, BaseTextDataset logger = logging.getLogger(__name__) -class JSONLDataset(BaseDataset): +class JSONLMixin(object): raw_jsonl_paths = None raw_jsonl_text_field = "text" @@ -43,32 +39,46 @@ def get_raw_jsonl_paths(self): raise FileExistsError("Dataset directory does not exist") for fp in self.raw_jsonl_paths: - if fp.startswith("*"): - # find based on suffix - yield from self.get_dataset_file_paths( - dataset_dir=dataset_dir, subdirectories=True, single_file=False, needed_suffix=fp.lstrip("*") - ) + if isinstance(fp, Path): + yield fp else: - yield os.path.join(dataset_dir, fp) - - def get_text_from_item(self, item): - """ - This simply returns the text field from item (but dataset classes can override this to implement filtering etc.) - """ + if fp.startswith("*"): + # find based on suffix + yield from self.get_dataset_file_paths( + dataset_dir=dataset_dir, subdirectories=True, single_file=False, needed_suffix=fp.lstrip("*") + ) + else: + yield os.path.join(dataset_dir, fp) + + +class JSONLDataset(JSONLMixin, BaseTextDataset): # TODO rename to JSONLTextDataset + def get_text_from_item(self, item) -> str: + """This simply returns the text field from item (but dataset classes can override this to implement filtering etc.)""" return item[self.raw_jsonl_text_field] + def get_document_from_item(self, item) -> Document: + """This simply returns the document with a text field from item (but dataset classes can override this to implement filtering etc.)""" + return Document(text=item[self.raw_jsonl_text_field]) + def get_texts_from_file_handler(self, file_handler): + if hasattr(self.config, "use_documents") and self.config.use_documents: + getter_func = self.get_document_from_item + else: + getter_func = self.get_text_from_item + for line in file_handler: item = json.loads(line) - text = self.get_text_from_item(item) + text = getter_func(item) if text: yield text - def get_texts_from_file_path(self, file_path: str): + def get_texts_from_file_path(self, file_path: str | Path): logger.info(f"Reading from {file_path}") - if file_path.endswith(".zst"): # zstd compression + if ( + isinstance(file_path, str) and file_path.endswith(".zst") + ) or file_path.suffix == ".zst": # zstd compression with open(file_path, "rb") as zf: dctx = zstd.ZstdDecompressor() # uncompress zstd with dctx.stream_reader(zf) as reader: @@ -79,18 +89,14 @@ def get_texts_from_file_path(self, file_path: str): yield from self.get_texts_from_file_handler(f) def get_texts(self): - """ - Iterate over all input files and read JSON from each line. - """ + """Iterate over all input files and read JSON from each line.""" # if self.workers == 1: yield from self.get_texts_with_single_proc() # else: # yield from self.get_texts_with_multi_proc() def get_texts_with_multi_proc(self): - """ - Iterate over all input files in parallel and read JSON from each line. - """ + """Iterate over all input files in parallel and read JSON from each line.""" raise NotImplementedError() # # with multiprocessing.Pool(self.workers) as pool: # with multiprocess.Pool(self.workers) as pool: @@ -100,9 +106,7 @@ def get_texts_with_multi_proc(self): # print("all files done") def get_texts_with_single_proc(self): - """ - Iterate over all input files and read JSON from each line. - """ + """Iterate over all input files and read JSON from each line.""" processed_files = 0 for file_path in self.get_raw_jsonl_paths(): yield from self.get_texts_from_file_path(file_path) @@ -111,3 +115,47 @@ def get_texts_with_single_proc(self): if processed_files == 0: logger.warning("No file has been processed.") + + +class JSONLDocumentDataset(JSONLMixin, BaseDocumentDataset): # TODO rename to JSONLTextDataset + INDEX_OFFSET_PER_FILE = 10_000_000 + + def get_document_from_item(self, item, index: Optional[int] = None) -> Document: + """This simply returns the document with a text field from item (but dataset classes can override this to implement filtering etc.)""" + return Document(text=item[self.raw_jsonl_text_field], id=index) + + def get_documents_from_file_handler(self, file_handler, file_index: Optional[int] = None) -> Iterable[Document]: + file_index = file_index * self.INDEX_OFFSET_PER_FILE + + for line_index, line in enumerate(file_handler): + item = json.loads(line) + text = self.get_document_from_item(item, index=file_index + line_index) + + if text: + yield text + + def get_documents_from_file_path(self, file_path: str, file_index: Optional[int] = None) -> Iterable[Document]: + logger.info(f"Reading from {file_path}") + + if file_path.endswith(".zst"): # zstd compression + with open(file_path, "rb") as zf: + dctx = zstd.ZstdDecompressor() # uncompress zstd + with dctx.stream_reader(zf) as reader: + f = io.BufferedReader(reader) + yield from self.get_documents_from_file_handler(f, file_index) + else: + with open(file_path) as f: # jsonl or jsonl.fz (via smart_open) + yield from self.get_documents_from_file_handler(f, file_index) + + def get_documents(self) -> Iterable[Document]: + """Iterate over all input files and read JSON from each line.""" + yield from self.get_documents_with_single_proc() + + def get_documents_with_single_proc(self) -> Iterable[Document]: + """Iterate over all input files and read JSON from each line.""" + file_index = -1 + for file_index, file_path in enumerate(self.get_raw_jsonl_paths()): + yield from self.get_documents_from_file_path(file_path, file_index) + + if file_index == -1: + logger.warning("No file has been processed.") diff --git a/src/llm_datasets/datasets/lt/seimas_lt_en.py b/src/llm_datasets/datasets/lt/seimas_lt_en.py index a98486b..4c4c99e 100644 --- a/src/llm_datasets/datasets/lt/seimas_lt_en.py +++ b/src/llm_datasets/datasets/lt/seimas_lt_en.py @@ -1,4 +1,5 @@ import zipfile + from llm_datasets.datasets.base import BaseDataset, Genre, License diff --git a/src/llm_datasets/datasets/mt/korpus_malti.py b/src/llm_datasets/datasets/mt/korpus_malti.py index 4982360..c2fc81e 100644 --- a/src/llm_datasets/datasets/mt/korpus_malti.py +++ b/src/llm_datasets/datasets/mt/korpus_malti.py @@ -1,9 +1,10 @@ import json +import logging from pathlib import Path -from llm_datasets.datasets.base import BaseDataset, Availability, License from tqdm.auto import tqdm -import logging + +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) @@ -76,9 +77,7 @@ class KorpusMaltiDataset(BaseDataset): ] def download(self): - """ - git clone --depth 1 https://$HF_LOGIN:$HF_PASSWORD@huggingface.co/datasets/MLRS/korpus_malti - """ + """Git clone --depth 1 https://$HF_LOGIN:$HF_PASSWORD@huggingface.co/datasets/MLRS/korpus_malti""" pass def get_texts(self): diff --git a/src/llm_datasets/datasets/multilingual/colossal_oscar.py b/src/llm_datasets/datasets/multilingual/colossal_oscar.py index c862f5a..16c4092 100644 --- a/src/llm_datasets/datasets/multilingual/colossal_oscar.py +++ b/src/llm_datasets/datasets/multilingual/colossal_oscar.py @@ -1,12 +1,12 @@ import logging import os from pathlib import Path +from typing import Optional -import numpy as np +from datatrove.data import Document from llm_datasets.datasets.base import Availability, License -from llm_datasets.datasets.jsonl_dataset import JSONLDataset - +from llm_datasets.datasets.jsonl_dataset import JSONLDocumentDataset logger = logging.getLogger(__name__) @@ -15,15 +15,8 @@ DEFAULT_OSCAR_MIN_HARMFUL_PP = 25.0 DEFAULT_OSCAR_MAX_HARMFUL_PP = 100_000 -""" -Extract list: -",".join([f"colossal_oscar_{dump}_ca" for dump in OSCAR_DUMPS]) -'colossal_oscar_05-06-23_bg,colossal_oscar_05-06-23_cs,colossal_oscar_05-06-23_da,colossal_oscar_05-06-23_el,colossal_oscar_05-06-23_et,colossal_oscar_05-06-23_fi,colossal_oscar_05-06-23_fr,colossal_oscar_05-06-23_ga,colossal_oscar_05-06-23_hr,colossal_oscar_05-06-23_hu,colossal_oscar_05-06-23_lt,colossal_oscar_05-06-23_lv,colossal_oscar_05-06-23_mt,colossal_oscar_05-06-23_nl,colossal_oscar_05-06-23_pl,colossal_oscar_05-06-23_pt,colossal_oscar_05-06-23_ro,colossal_oscar_05-06-23_sk,colossal_oscar_05-06-23_sl,colossal_oscar_05-06-23_sv,colossal_oscar_05-06-23_uk,colossal_oscar_05-06-23_sr,colossal_oscar_05-06-23_sh,colossal_oscar_05-06-23_nn,colossal_oscar_05-06-23_no,colossal_oscar_05-06-23_eu,colossal_oscar_05-06-23_ca,colossal_oscar_05-06-23_gl,colossal_oscar_03-04-23_bg,colossal_oscar_03-04-23_cs,colossal_oscar_03-04-23_da,colossal_oscar_03-04-23_el,colossal_oscar_03-04-23_et,colossal_oscar_03-04-23_fi,colossal_oscar_03-04-23_fr,colossal_oscar_03-04-23_ga,colossal_oscar_03-04-23_hr,colossal_oscar_03-04-23_hu,colossal_oscar_03-04-23_lt,colossal_oscar_03-04-23_lv,colossal_oscar_03-04-23_mt,colossal_oscar_03-04-23_nl,colossal_oscar_03-04-23_pl,colossal_oscar_03-04-23_pt,colossal_oscar_03-04-23_ro,colossal_oscar_03-04-23_sk,colossal_oscar_03-04-23_sl,colossal_oscar_03-04-23_sv,colossal_oscar_03-04-23_uk,colossal_oscar_03-04-23_sr,colossal_oscar_03-04-23_sh,colossal_oscar_03-04-23_nn,colossal_oscar_03-04-23_no,colossal_oscar_03-04-23_eu,colossal_oscar_03-04-23_ca,colossal_oscar_03-04-23_gl' -""" # noqa -# all dumps: 2015-14 2016-40 2017-43 2018-47 2019-22 2020-24 2020-45 2021-49 2022-27 2022-49 2023-14 2023-23 -# first sample: -# OSCAR_DUMPS = ["05-06-23", "03-04-23"] -OSCAR_DUMPS = [ +# Offical OSCAR released dumps +COLOSSAL_OSCAR_V1_DUMPS = [ "2015-14", "2016-40", "2017-43", @@ -37,6 +30,19 @@ "2023-14", "2023-23", ] + +# Dumps released by the community (OpenGPT-X, BSC, ...) +COMMUNITY_DUMPS = [ + "2014-42", + "2022-40", + "2021-31", + "2018-30", + "2015-48", + "2017-13", + "2016-22", + "2023-06", +] +OSCAR_DUMPS = COLOSSAL_OSCAR_V1_DUMPS + COMMUNITY_DUMPS EURO_LANGUAGES = "bg cs da el et fi ga hr hu lt lv mt nl pl pt ro sk sl sv uk sr sh nn no eu ca gl".split( " " ) # removed fr @@ -215,13 +221,12 @@ } -class ColossalOscarBaseDataset(JSONLDataset): - """ - Read OSCAR output from jsonl.zst files (as provided on HF) - """ +class ColossalOscarBaseDataset(JSONLDocumentDataset): + """Read OSCAR output from jsonl.zst files (as provided on HF)""" DATASET_ID = None LANGUAGES = None + DUMP_VERSION = None SOURCE_ID = "colossal_oscar" TITLE = "Colossal OSCAR 1.0" @@ -242,7 +247,6 @@ class ColossalOscarBaseDataset(JSONLDataset): primaryClass={cs.CL} }""" # noqa - DUMP_VERSION = "05-06-23" WEB_CRAWLED = True LICENSE = License( @@ -282,36 +286,44 @@ def download(self): " https://huggingface.co/datasets/oscar-corpus/colossal-oscar-1.0#downloading-the-data" ) - def get_text_from_item(self, doc): - if doc["metadata"]["quality_warnings"]: + def get_document_from_item(self, item, index: Optional[int] = None) -> Document: + """Apply filters and return document (computationally cheap before expensive filters)""" + if item["metadata"]["quality_warnings"]: self.counter.update({"filtered_quality_warnings": 1}) return None elif ( - "harmful_pp" in doc["metadata"] - and doc["metadata"]["harmful_pp"] - and doc["metadata"]["harmful_pp"] < self.min_harmful_pp + "harmful_pp" in item["metadata"] + and item["metadata"]["harmful_pp"] + and item["metadata"]["harmful_pp"] < self.min_harmful_pp ): self.counter.update({"min_filtered_harmful_pp": 1}) return None elif ( - "harmful_pp" in doc["metadata"] - and doc["metadata"]["harmful_pp"] - and doc["metadata"]["harmful_pp"] > self.max_harmful_pp + "harmful_pp" in item["metadata"] + and item["metadata"]["harmful_pp"] + and item["metadata"]["harmful_pp"] > self.max_harmful_pp ): self.counter.update({"max_filtered_harmful_pp": 1}) return None - elif doc["metadata"]["categories"] and len(set(doc["metadata"]["categories"]) & EXCLUDE_CATEGORIES) > 0: + elif item["metadata"]["categories"] and len(set(item["metadata"]["categories"]) & EXCLUDE_CATEGORIES) > 0: self.counter.update({"filtered_categories": 1}) return None else: - return doc["content"] + return Document( + text=item["content"], + id=str(index), # cast to string + metadata={ + "tlsh": item["metadata"]["tlsh"], + "url": item["warc_headers"]["warc-target-uri"], + }, + ) def get_raw_jsonl_paths(self): lang = self.get_language_code() dataset_path = Path(os.path.join(self.get_local_dataset_dir(), self.DUMP_VERSION, f"{lang}_meta")) if not dataset_path.exists(): - raise FileNotFoundError(f"Dataset path does not exist: {dataset_path}") + raise FileNotFoundError(f"Raw dataset path does not exist: {dataset_path}") return sorted([str(p) for p in dataset_path.glob("*.jsonl.zst")]) @@ -333,10 +345,7 @@ class ColossalOscarDataset(ColossalOscarBaseDataset): def get_colossal_oscar_auto_classes(): - """ - Auto generate dataset classes - """ - + """Auto generate dataset classes""" return [ get_colossal_oscar_class(lang, dump_version) for dump_version in OSCAR_DUMPS diff --git a/src/llm_datasets/datasets/multilingual/curlicat.py b/src/llm_datasets/datasets/multilingual/curlicat.py index 6653b52..882c218 100644 --- a/src/llm_datasets/datasets/multilingual/curlicat.py +++ b/src/llm_datasets/datasets/multilingual/curlicat.py @@ -1,19 +1,17 @@ import logging from typing import Iterable -from smart_open import open -from llm_datasets.datasets.base import BaseDataset, Availability, License +from smart_open import open from tqdm.auto import tqdm +from llm_datasets.datasets.base import Availability, BaseDataset, License from llm_datasets.io.conllu_file import get_texts_from_conllu_file logger = logging.getLogger(__name__) class CurlicatBaseDataset(BaseDataset): - """ - Licenses are mostly mixed. See https://aclanthology.org/2022.lrec-1.11.pdf - """ + """Licenses are mostly mixed. See https://aclanthology.org/2022.lrec-1.11.pdf""" SOURCE_ID = "curlicat" TITLE = "CURLICAT Corpus" @@ -92,10 +90,7 @@ def get_curclicat_file_paths(self): return self.get_dataset_file_paths(needed_suffix=".conllup") def get_texts(self) -> Iterable[str]: - """ - Extracts the text from each conllu file. - """ - + """Extracts the text from each conllu file.""" # TODO read directly from compressed files fps = self.get_curclicat_file_paths() for i, fp in tqdm(enumerate(fps), total=len(fps), desc="Reading files"): @@ -129,8 +124,7 @@ class CurlicatBGDataset(CurlicatBaseDataset): class CurlicatHRDataset(CurlicatBaseDataset): - """ - unzip and move to raw dir + """unzip and move to raw dir find hr_curlicat_2023-01-13 -name '*.*' -exec mv {} /home/mostendorff/experiments/eulm/data/ele/hr/curlicat_hr; """ @@ -162,8 +156,7 @@ def get_curclicat_file_paths(self): class CurlicatPLDataset(CurlicatBaseDataset): - """ - unzip and move to raw dir + """unzip and move to raw dir find pl-20221026-annotated -name '*.*' -exec mv {} /home/mostendorff/experiments/eulm/data/ele/pl/curlicat_pl; """ diff --git a/src/llm_datasets/datasets/multilingual/eurlex.py b/src/llm_datasets/datasets/multilingual/eurlex.py index 201dbed..2925aaf 100644 --- a/src/llm_datasets/datasets/multilingual/eurlex.py +++ b/src/llm_datasets/datasets/multilingual/eurlex.py @@ -1,4 +1,5 @@ import os + from llm_datasets.datasets.base import Availability, Genre, License from llm_datasets.datasets.jsonl_dataset import JSONLDataset @@ -30,9 +31,7 @@ class EURLexBaseDataset(JSONLDataset): - """ - Read preprocessed JSONL files + token counts (see EULM repo: extract_text_eurlex.py) - """ + """Read preprocessed JSONL files + token counts (see EULM repo: extract_text_eurlex.py)""" SOURCE_ID = "eurlex" DESCRIPTION = "A Corpus Covering the Largest EURLEX Resources." @@ -66,9 +65,7 @@ class EURLexLanguageDataset(EURLexBaseDataset): def get_eurlex_auto_classes(): - """ - Generate automatically dataset classes with token count - """ + """Generate automatically dataset classes with token count""" pass lang_to_tokens = {row.split("\t")[0]: int(row.split("\t")[1]) for row in RAW_LANG_TO_TOKENS.splitlines()} diff --git a/src/llm_datasets/datasets/multilingual/legal_mc4.py b/src/llm_datasets/datasets/multilingual/legal_mc4.py index 147da5e..4a4b616 100644 --- a/src/llm_datasets/datasets/multilingual/legal_mc4.py +++ b/src/llm_datasets/datasets/multilingual/legal_mc4.py @@ -1,7 +1,6 @@ from llm_datasets.datasets.base import Availability, Genre, License from llm_datasets.datasets.hf_dataset import HFDataset - # From https://docs.google.com/spreadsheets/d/1_rfLKa_Kq09YI0BPnfmoSL6-U3SHrW8tRwmk3-Qchzo/edit#gid=1206328236 RAW_LANG_TO_TOKENS = """bg 2390349 cs 1840827375 @@ -30,7 +29,9 @@ class LegalMC4BaseDataset(HFDataset): SOURCE_ID = "legal_mc4" - DESCRIPTION = "MC4_Legal: A Corpus Covering the Legal Part of MC4 for European Languages" + DESCRIPTION = ( + "MC4_Legal: A Corpus Covering the Legal Part of MC4 for European Languages" + ) HOMEPAGE = "https://huggingface.co/datasets/joelito/legal-mc4" AVAILIBILITY = Availability.DIRECT_DOWNLOAD WEB_CRAWLED = True @@ -47,8 +48,12 @@ class LegalMC4BaseDataset(HFDataset): HF_DATASET_ID = "joelito/legal-mc4" HF_DATASET_SPLIT = "train" HF_DATASET_CONFIGS = None # is set by language version - + HF_KWARGS = dict( + trust_remote_code=True, + ) streaming = True + keep_columns = True + metadata_column_names = ["url", "timestamp"] def get_legal_mc4_auto_cls_by_language(lang, tokens): @@ -66,9 +71,13 @@ def HF_DATASET_CONFIGS(self): def get_legal_mc4_auto_classes(): - """ - Auto generate dataset classes with token count - """ - lang_to_tokens = {row.split("\t")[0]: int(row.split("\t")[1]) for row in RAW_LANG_TO_TOKENS.splitlines()} + """Auto generate dataset classes with token count""" + lang_to_tokens = { + row.split("\t")[0]: int(row.split("\t")[1]) + for row in RAW_LANG_TO_TOKENS.splitlines() + } - return [get_legal_mc4_auto_cls_by_language(lang, tokens) for lang, tokens in lang_to_tokens.items()] + return [ + get_legal_mc4_auto_cls_by_language(lang, tokens) + for lang, tokens in lang_to_tokens.items() + ] diff --git a/src/llm_datasets/datasets/multilingual/macocu.py b/src/llm_datasets/datasets/multilingual/macocu.py index e0a4720..31c35f6 100644 --- a/src/llm_datasets/datasets/multilingual/macocu.py +++ b/src/llm_datasets/datasets/multilingual/macocu.py @@ -1,9 +1,9 @@ -from io import TextIOWrapper import logging -from typing import Set import zipfile -from llm_datasets.datasets.base import BaseDataset, Availability, QualityWarning, License +from io import TextIOWrapper +from typing import Set +from llm_datasets.datasets.base import Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) @@ -101,8 +101,7 @@ class MacocuBGDataset(MacocuBaseDataset): class MacocuHRDataset(MacocuBaseDataset): - """ - Partially bad quality + """Partially bad quality TODO maybe encoding error """ diff --git a/src/llm_datasets/datasets/multilingual/redpajama.py b/src/llm_datasets/datasets/multilingual/redpajama.py index 1062217..852d4c6 100644 --- a/src/llm_datasets/datasets/multilingual/redpajama.py +++ b/src/llm_datasets/datasets/multilingual/redpajama.py @@ -1,11 +1,11 @@ import os -from llm_datasets.datasets.base import Availability, BILLION, License + +from llm_datasets.datasets.base import BILLION, Availability, License from llm_datasets.datasets.hf_dataset import HFDataset class RedPajamaBaseDataset(HFDataset): - """ - # full dataset + """# full dataset wget 'https://data.together.xyz/redpajama-data-1T/v1.0.0/urls.txt' while read line; do dload_loc=${line#https://data.together.xyz/redpajama-data-1T/v1.0.0/} diff --git a/src/llm_datasets/datasets/multilingual/wikimedia.py b/src/llm_datasets/datasets/multilingual/wikimedia.py index 6f53435..bbda6ee 100644 --- a/src/llm_datasets/datasets/multilingual/wikimedia.py +++ b/src/llm_datasets/datasets/multilingual/wikimedia.py @@ -1,13 +1,12 @@ -import os import logging -from llm_datasets.datasets.base import Availability, BaseDataset, TOKENS_PER_BYTE, License -from llm_datasets.utils.wikimedia import parse_and_clean_wikicode - - +import os import xml.etree.cElementTree as etree from smart_open import open +from llm_datasets.datasets.base import TOKENS_PER_BYTE, Availability, BaseDataset, License +from llm_datasets.utils.wikimedia import parse_and_clean_wikicode + logger = logging.getLogger(__name__) @@ -356,10 +355,7 @@ class WikimediaLanguageDataset(WikimediaBaseDataset): def get_wikimedia_auto_classes(): - """ - Auto generate dataset classes with token count - """ - + """Auto generate dataset classes with token count""" return [ get_wikimedia_auto_cls_by_language(lang, s, b) for lang, source_bytes in bytes_per_language_and_source.items() diff --git a/src/llm_datasets/datasets/multilingual/wura.py b/src/llm_datasets/datasets/multilingual/wura.py index 176eaf1..54c441e 100644 --- a/src/llm_datasets/datasets/multilingual/wura.py +++ b/src/llm_datasets/datasets/multilingual/wura.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import Availability, GB, License +from llm_datasets.datasets.base import Availability, License from llm_datasets.datasets.hf_dataset import HFDataset diff --git a/src/llm_datasets/datasets/nl/sonar.py b/src/llm_datasets/datasets/nl/sonar.py index af8ca45..136859f 100644 --- a/src/llm_datasets/datasets/nl/sonar.py +++ b/src/llm_datasets/datasets/nl/sonar.py @@ -1,12 +1,10 @@ import logging import os - from multiprocessing.pool import Pool -from llm_datasets.datasets.base import BaseDataset, Availability, QualityWarning, License +from llm_datasets.datasets.base import Availability, BaseDataset, License, QualityWarning from llm_datasets.utils import remove_whitespaces_before_punctuation - logger = logging.getLogger(__name__) try: @@ -50,10 +48,7 @@ def decompress(self): pass def get_text_from_item(self, item) -> str: - """ - item: file path - """ - + """item: file path""" doc = folia.Document(file=item) text = doc.text() text = remove_whitespaces_before_punctuation(text) diff --git a/src/llm_datasets/datasets/nl/sonar_new_media.py b/src/llm_datasets/datasets/nl/sonar_new_media.py index 64d7b9f..71826d9 100644 --- a/src/llm_datasets/datasets/nl/sonar_new_media.py +++ b/src/llm_datasets/datasets/nl/sonar_new_media.py @@ -1,10 +1,7 @@ import logging - - -from llm_datasets.datasets.base import BaseDataset, Availability, QualityWarning - import zipfile +from llm_datasets.datasets.base import Availability, BaseDataset, QualityWarning logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/no/maalfrid_2021.py b/src/llm_datasets/datasets/no/maalfrid_2021.py index 663e0b7..17865bd 100644 --- a/src/llm_datasets/datasets/no/maalfrid_2021.py +++ b/src/llm_datasets/datasets/no/maalfrid_2021.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, BILLION, Availability, License +from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License class Maalfrid2021Dataset(BaseDataset): @@ -7,7 +7,9 @@ class Maalfrid2021Dataset(BaseDataset): HOMEPAGE = "https://hdl.handle.net/21.11146/69" AVAILIBILITY = Availability.DIRECT_DOWNLOAD LICENSE = License( - "Norwegian Licence for Open Government Data (NLOD)", url="https://data.norge.no/nlod/en/2.0", attribution=True + "Norwegian Licence for Open Government Data (NLOD)", + url="https://data.norge.no/nlod/en/2.0", + attribution=True, ) LANGUAGES = ["nb", "nn", "en", "se", "other"] DESCRIPTION = ( diff --git a/src/llm_datasets/datasets/no/nak.py b/src/llm_datasets/datasets/no/nak.py index 705576a..608845c 100644 --- a/src/llm_datasets/datasets/no/nak.py +++ b/src/llm_datasets/datasets/no/nak.py @@ -1,6 +1,7 @@ import os import tarfile -from llm_datasets.datasets.base import BaseDataset, BILLION, MILLION, Availability, License, Genre + +from llm_datasets.datasets.base import BILLION, MILLION, Availability, BaseDataset, Genre, License from llm_datasets.utils.systems import get_path_by_system diff --git a/src/llm_datasets/datasets/no/nbdigital.py b/src/llm_datasets/datasets/no/nbdigital.py index 485e5f9..28c7a25 100644 --- a/src/llm_datasets/datasets/no/nbdigital.py +++ b/src/llm_datasets/datasets/no/nbdigital.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, GB, Availability, License +from llm_datasets.datasets.base import GB, Availability, BaseDataset, License class NBDigitalDataset(BaseDataset): @@ -16,7 +16,10 @@ class NBDigitalDataset(BaseDataset): " public institutions for publically available material)." ) PII = "I have not checked the data source for personally identifiable or sensitive information." - LICENSE = License("Creative_Commons-ZERO (CC-ZERO)", url="https://creativecommons.org/publicdomain/zero/1.0/") + LICENSE = License( + "Creative_Commons-ZERO (CC-ZERO)", + url="https://creativecommons.org/publicdomain/zero/1.0/", + ) # Size: 26344 books BYTES = 2.7 * GB diff --git a/src/llm_datasets/datasets/no/norwegian_cc.py b/src/llm_datasets/datasets/no/norwegian_cc.py index 153d69d..baffb57 100644 --- a/src/llm_datasets/datasets/no/norwegian_cc.py +++ b/src/llm_datasets/datasets/no/norwegian_cc.py @@ -3,8 +3,7 @@ class NorwegianCCBaseDataset(HFDataset): - """ - Licenses: + """Licenses: government_nb, government_nn, parliament, publicreports, lovdata_cd_*, maalfrid_* NLOD 2.0 newspapers_ocr, newspapers_pdf, books CC0 1.0 diff --git a/src/llm_datasets/datasets/no/parlamint.py b/src/llm_datasets/datasets/no/parlamint.py index 6edb24b..0563bac 100644 --- a/src/llm_datasets/datasets/no/parlamint.py +++ b/src/llm_datasets/datasets/no/parlamint.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, MILLION +from llm_datasets.datasets.base import MILLION, BaseDataset class ParlaMintDataset(BaseDataset): diff --git a/src/llm_datasets/datasets/no/parliamentary_proceedings.py b/src/llm_datasets/datasets/no/parliamentary_proceedings.py index 13e7040..f8242e9 100644 --- a/src/llm_datasets/datasets/no/parliamentary_proceedings.py +++ b/src/llm_datasets/datasets/no/parliamentary_proceedings.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, BILLION +from llm_datasets.datasets.base import BILLION, BaseDataset class ParliamentaryProceedingsDataset(BaseDataset): diff --git a/src/llm_datasets/datasets/no/sakspapir_nno.py b/src/llm_datasets/datasets/no/sakspapir_nno.py index 14b4c66..ebf19b3 100644 --- a/src/llm_datasets/datasets/no/sakspapir_nno.py +++ b/src/llm_datasets/datasets/no/sakspapir_nno.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, MILLION, Availability, License +from llm_datasets.datasets.base import MILLION, Availability, BaseDataset, License class SakspapirNNODataset(BaseDataset): @@ -15,7 +15,10 @@ class SakspapirNNODataset(BaseDataset): " Municipalities (see lnk.no)." ) PII = "I have not checked the data source for personally identifiable or sensitive information." - LICENSE = License("Creative_Commons-ZERO (CC-ZERO)", url="https://creativecommons.org/publicdomain/zero/1.0/") + LICENSE = License( + "Creative_Commons-ZERO (CC-ZERO)", + url="https://creativecommons.org/publicdomain/zero/1.0/", + ) # Size: 127 million tokens TOKENS = 127 * MILLION diff --git a/src/llm_datasets/datasets/parquet_dataset.py b/src/llm_datasets/datasets/parquet_dataset.py index 100a979..1701fba 100644 --- a/src/llm_datasets/datasets/parquet_dataset.py +++ b/src/llm_datasets/datasets/parquet_dataset.py @@ -1,5 +1,6 @@ from pathlib import Path from typing import Iterable + from llm_datasets.datasets.base import BaseDataset @@ -26,9 +27,7 @@ def extract_plaintext(self): class ShuffledParquetDataset(ParquetDataset): - """ - The raw dataset files are already shuffled. - """ + """The raw dataset files are already shuffled.""" def get_file_name_glob_pattern(self): raise NotImplementedError() diff --git a/src/llm_datasets/datasets/pl/luna_pl.py b/src/llm_datasets/datasets/pl/luna_pl.py index a73c9ea..3813ad5 100644 --- a/src/llm_datasets/datasets/pl/luna_pl.py +++ b/src/llm_datasets/datasets/pl/luna_pl.py @@ -1,16 +1,14 @@ import logging import tarfile from typing import Iterable -from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.base import BaseDataset logger = logging.getLogger(__name__) class LunaPL(BaseDataset): - """ - Original text cannot be reconstructed from TEI XML. - """ + """Original text cannot be reconstructed from TEI XML.""" DATASET_ID = "luna_pl" TITLE = "LUNA.PL corpus" diff --git a/src/llm_datasets/datasets/pl/pl_nkjp.py b/src/llm_datasets/datasets/pl/pl_nkjp.py index 165365f..8783b6d 100644 --- a/src/llm_datasets/datasets/pl/pl_nkjp.py +++ b/src/llm_datasets/datasets/pl/pl_nkjp.py @@ -1,17 +1,15 @@ import logging import tarfile - import xml.etree.cElementTree as ET +from llm_datasets.datasets.base import MILLION, Availability, BaseDataset, License, QualityWarning from tqdm.auto import tqdm -from llm_datasets.datasets.base import MILLION, BaseDataset, QualityWarning, Availability, License logger = logging.getLogger(__name__) class NKJPPodkorpusMilionowyDataset(BaseDataset): - """ - DOWNLOAD + """DOWNLOAD ----------- Instruction diff --git a/src/llm_datasets/datasets/pl/pl_parliamentary_corpus.py b/src/llm_datasets/datasets/pl/pl_parliamentary_corpus.py index b1151a2..0e62241 100644 --- a/src/llm_datasets/datasets/pl/pl_parliamentary_corpus.py +++ b/src/llm_datasets/datasets/pl/pl_parliamentary_corpus.py @@ -1,18 +1,15 @@ import logging import tarfile -from tqdm.auto import tqdm - import xml.etree.cElementTree as ET -from llm_datasets.datasets.base import BaseDataset, Genre, License, Availability - +from llm_datasets.datasets.base import Availability, BaseDataset, Genre, License +from tqdm.auto import tqdm logger = logging.getLogger(__name__) class PLParliamentaryCorpusDataset(BaseDataset): - """ - DOWNLOAD + """DOWNLOAD ----------- Instruction diff --git a/src/llm_datasets/datasets/pt/brwac.py b/src/llm_datasets/datasets/pt/brwac.py index 10f35f2..0fa2d5d 100644 --- a/src/llm_datasets/datasets/pt/brwac.py +++ b/src/llm_datasets/datasets/pt/brwac.py @@ -1,10 +1,9 @@ -from llm_datasets.datasets.base import Availability, BILLION, License +from llm_datasets.datasets.base import BILLION, Availability, License from llm_datasets.datasets.hf_dataset import HFDataset class BrWacDataset(HFDataset): - """ - Download instructions: + """Download instructions: You need to 1. Manually download `brwac.vert.gz` from https://www.inf.ufrgs.br/pln/wiki/index.php?title=BrWaC diff --git a/src/llm_datasets/datasets/pt/parlamento_pt.py b/src/llm_datasets/datasets/pt/parlamento_pt.py index 415e8f9..993e77f 100644 --- a/src/llm_datasets/datasets/pt/parlamento_pt.py +++ b/src/llm_datasets/datasets/pt/parlamento_pt.py @@ -1,8 +1,8 @@ -from llm_datasets.datasets.base import Availability, GB, License -from llm_datasets.datasets.hf_dataset import HFDataset - import logging +from llm_datasets.datasets.base import GB, Availability, License +from llm_datasets.datasets.hf_dataset import HFDataset + logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/ro/marcell_legislative_subcorpus_v2.py b/src/llm_datasets/datasets/ro/marcell_legislative_subcorpus_v2.py index fe71a92..f0c1456 100644 --- a/src/llm_datasets/datasets/ro/marcell_legislative_subcorpus_v2.py +++ b/src/llm_datasets/datasets/ro/marcell_legislative_subcorpus_v2.py @@ -1,7 +1,9 @@ import logging import zipfile + from tqdm.auto import tqdm -from llm_datasets.datasets.base import BaseDataset, MILLION, Genre, Availability, License + +from llm_datasets.datasets.base import MILLION, Availability, BaseDataset, Genre, License logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/sk/sk_court_decisions.py b/src/llm_datasets/datasets/sk/sk_court_decisions.py index 030ecef..628a755 100644 --- a/src/llm_datasets/datasets/sk/sk_court_decisions.py +++ b/src/llm_datasets/datasets/sk/sk_court_decisions.py @@ -1,5 +1,6 @@ from typing import List -from llm_datasets.datasets.base import BaseDataset, Genre, License, Availability + +from llm_datasets.datasets.base import Availability, BaseDataset, Genre, License class SKCourtDecisionsDataset(BaseDataset): diff --git a/src/llm_datasets/datasets/sk/sk_laws.py b/src/llm_datasets/datasets/sk/sk_laws.py index f988de0..373f988 100644 --- a/src/llm_datasets/datasets/sk/sk_laws.py +++ b/src/llm_datasets/datasets/sk/sk_laws.py @@ -1,4 +1,5 @@ from typing import List + from llm_datasets.datasets.base import BaseDataset, Genre, License diff --git a/src/llm_datasets/datasets/sl/academic_slovene_kas.py b/src/llm_datasets/datasets/sl/academic_slovene_kas.py index ec2e201..fc2d922 100644 --- a/src/llm_datasets/datasets/sl/academic_slovene_kas.py +++ b/src/llm_datasets/datasets/sl/academic_slovene_kas.py @@ -1,11 +1,10 @@ import json import logging -from llm_datasets.datasets.base import BaseDataset, Availability, License - -from tqdm.auto import tqdm from smart_open import open +from tqdm.auto import tqdm +from llm_datasets.datasets.base import Availability, BaseDataset, License logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/sl/cc_gigafida.py b/src/llm_datasets/datasets/sl/cc_gigafida.py index 329b8f7..290cd77 100644 --- a/src/llm_datasets/datasets/sl/cc_gigafida.py +++ b/src/llm_datasets/datasets/sl/cc_gigafida.py @@ -1,4 +1,4 @@ -from llm_datasets.datasets.base import BaseDataset, Availability, License +from llm_datasets.datasets.base import Availability, BaseDataset, License class CCGigaFidaDataset(BaseDataset): diff --git a/src/llm_datasets/datasets/sl/slwac_web.py b/src/llm_datasets/datasets/sl/slwac_web.py index 257be63..fab999b 100644 --- a/src/llm_datasets/datasets/sl/slwac_web.py +++ b/src/llm_datasets/datasets/sl/slwac_web.py @@ -1,8 +1,10 @@ from typing import List -from llm_datasets.datasets.base import BILLION, BaseDataset, Availability, License -from llm_datasets.utils import generate_texts_from_tab_columns_in_xml + from smart_open import open +from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License +from llm_datasets.utils import generate_texts_from_tab_columns_in_xml + class SLWaCWebDataset(BaseDataset): DATASET_ID = "slwac_web" diff --git a/src/llm_datasets/datasets/sr/srpkor.py b/src/llm_datasets/datasets/sr/srpkor.py index 3100fdb..e010ee5 100644 --- a/src/llm_datasets/datasets/sr/srpkor.py +++ b/src/llm_datasets/datasets/sr/srpkor.py @@ -1,8 +1,9 @@ import json -from typing import Iterable -from llm_datasets.datasets.base import BaseDataset, Availability, QualityWarning, License -import zipfile import logging +import zipfile +from typing import Iterable + +from llm_datasets.datasets.base import Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/sv/sv_gigaword.py b/src/llm_datasets/datasets/sv/sv_gigaword.py index fe6b3d8..b142ba4 100644 --- a/src/llm_datasets/datasets/sv/sv_gigaword.py +++ b/src/llm_datasets/datasets/sv/sv_gigaword.py @@ -1,12 +1,9 @@ -from io import BytesIO -import logging - import bz2 - +import logging import tarfile +from io import BytesIO -from llm_datasets.datasets.base import BaseDataset, Availability, BILLION, QualityWarning, License - +from llm_datasets.datasets.base import BILLION, Availability, BaseDataset, License, QualityWarning logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datasets/uk/uk_laws.py b/src/llm_datasets/datasets/uk/uk_laws.py index 112bbca..ce569f1 100644 --- a/src/llm_datasets/datasets/uk/uk_laws.py +++ b/src/llm_datasets/datasets/uk/uk_laws.py @@ -1,9 +1,9 @@ import logging + from smart_open import open from llm_datasets.datasets.base import Availability, BaseDataset, License - logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/datatrove_reader.py b/src/llm_datasets/datatrove_reader.py new file mode 100644 index 0000000..2622e08 --- /dev/null +++ b/src/llm_datasets/datatrove_reader.py @@ -0,0 +1,91 @@ +from typing import Callable, List + +from datatrove.data import DocumentsPipeline +from datatrove.pipeline.readers.base import BaseReader +from loguru import logger + +from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.dataset_registry import get_dataset_class_by_id, get_datasets_list_from_string +from llm_datasets.utils.config import Config + + +class LLMDatasetsDatatroveReader(BaseReader): + """A datatrove-compatible reader for integrated datasets""" + + name = "🦜 LLM-Datasets" + + def __init__( + self, + dataset_ids: List[str] | str, + config: Config, + limit: int = -1, + progress: bool = False, + adapter: Callable = None, + text_key: str = "text", + id_key: str = "id", + default_metadata: dict = None, + ): + super().__init__(limit, progress, adapter, text_key, id_key, default_metadata) + + # Build list of datasets + self.datasets_list = get_datasets_list_from_string(dataset_ids, config) + self.config = config + + def run(self, data: DocumentsPipeline = None, rank: int = 0, world_size: int = 1) -> DocumentsPipeline: + """Will get this rank's shard and sequentially read each file in the shard, yielding Document. + + Args: + data: any existing data from previous pipeline stages + rank: rank of the current task + world_size: total number of tasks + + Returns: + DocumentsPipeline + """ + if data: + yield from data + + config = self.config + li = 0 + # Iterate over datasets + for i, dataset_id in enumerate(self.datasets_list, 1): + logger.info(f"Dataset ID: {dataset_id} ({i} / {len(self.datasets_list)})") + dataset_cls = get_dataset_class_by_id( + dataset_id, + config.extra_dataset_registries, + extra_dataset_classes=config.extra_dataset_classes, + use_default_dataset_registry=config.use_default_dataset_registry, + ) + dataset: BaseDataset = dataset_cls( + raw_datasets_dir=config.raw_datasets_dir, + # workers=get_auto_workers(config.workers), + # skip_items=config.skip_items, + # min_length=config.min_text_length, + config=config, + **config.get_extra_dataset_kwargs(dataset_id), + ) + # Yield documents from each dataset + for doc in dataset.get_documents(): + if doc is None: + # skip empty docs + continue + + self.update_doc_stats(doc) + yield doc + + li += 1 + + if self.limit > 0 and li >= self.limit: + # doc level break + break + + # log stats + for k, v in dataset.counter.items(): + logger.info("sttats {k}") + self.stat_update(f"{dataset_id}.{k}", value=v, unit="documents") + + if self.limit > 0 and li >= self.limit: + # dataset level break + break + + logger.info("Reader completed") diff --git a/src/llm_datasets/dedup/__init__.py b/src/llm_datasets/dedup/__init__.py index 4373954..e711e53 100644 --- a/src/llm_datasets/dedup/__init__.py +++ b/src/llm_datasets/dedup/__init__.py @@ -1,19 +1,18 @@ -""" -TODO this needs to be compatible with OSCAR's implementation +"""TODO this needs to be compatible with OSCAR's implementation https://oscar-project.github.io/documentation/versions/oscar-2301/#locality-sentitive-hashing """ -from collections import defaultdict +import datetime import json import logging import multiprocessing import os -import datetime -import polars as pl +from collections import defaultdict from pathlib import Path -from smart_open import open +import polars as pl +from smart_open import open from tqdm.auto import tqdm logger = logging.getLogger(__name__) @@ -108,7 +107,7 @@ def get_existing_hash_and_position(file_path): # Step 2: extract hash values to CSV file if not hash_temp_path.exists(): - logger.info(f"Extracting hash values") + logger.info("Extracting hash values") with open(hash_temp_path, "w") as out_f: # header @@ -140,7 +139,7 @@ def get_existing_hash_and_position(file_path): logger.info(f"Dedup extracted hashes from {hash_temp_path} ...") hashes_df = pl.read_csv(hash_temp_path) logger.info(f"Loaded {len(hashes_df)} hashes ...") - r = hashes_df.unique( + hashes_df.unique( "hash", keep="any", ).write_csv(dedup_hash_temp_path) diff --git a/src/llm_datasets/extract_text.py b/src/llm_datasets/extract_text.py index 9af96fc..e69f501 100644 --- a/src/llm_datasets/extract_text.py +++ b/src/llm_datasets/extract_text.py @@ -1,37 +1,25 @@ -import argparse +import os +import shutil +from pathlib import Path +from typing import IO -import logging +from datatrove.executor import LocalPipelineExecutor +from datatrove.pipeline.writers import JsonlWriter, ParquetWriter -from llm_datasets.utils import get_auto_workers, get_bytes_from_int_or_string -from llm_datasets.utils.settings import DEFAULT_MIN_TEXT_LENGTH - -from .datasets.dataset_registry import ( +from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.dataset_registry import ( get_dataset_class_by_id, - get_registered_dataset_classes, - get_registered_dataset_ids, + get_datasets_list_from_string, ) -from .datasets.base import BaseDataset -from .utils.config import Config, get_common_argparser, parse_args_and_get_config +from llm_datasets.datatrove_reader import LLMDatasetsDatatroveReader +from llm_datasets.utils import get_auto_workers, get_bytes_from_int_or_string +from llm_datasets.utils.config import Config def extract_text(config: Config): logger = config.init_logger(__name__) - datasets_list = config.datasets.split(",") - - if len(datasets_list) == 1: - if datasets_list[0] == "all": - # Get list of all regsitered datasets - datasets_list = get_registered_dataset_ids(config.extra_dataset_registries) - - elif datasets_list[0] == "all_from_source": - # Get registered datasets based on source - if config.source_id is None: - raise ValueError("The argument or config `source_id` must be set.") - - datasets_list = get_registered_dataset_ids( - config.extra_dataset_registries, needed_source_id=config.source_id - ) + datasets_list = get_datasets_list_from_string(config.datasets, config) # Iterate over datasets for i, dataset_id in enumerate(datasets_list, 1): @@ -41,7 +29,7 @@ def extract_text(config: Config): dataset_cls = get_dataset_class_by_id(dataset_id, config.extra_dataset_registries) dataset: BaseDataset = dataset_cls( raw_datasets_dir=config.raw_datasets_dir, - output_dir=config.output_dir, + text_datasets_dir=config.text_datasets_dir, workers=get_auto_workers(config.workers), limit=config.limit, override_output=config.override, @@ -62,6 +50,10 @@ def extract_text(config: Config): logger.warning(f"Skipping {dataset_id} (cannot extract from dummy datasets)") continue + if config.only_selected_datasets and not dataset.is_selected(): + logger.info("Skip %s (not part of selected datasets or sources)", dataset_id) + continue + try: dataset.extract_plaintext() except FileExistsError as e: @@ -76,3 +68,94 @@ def extract_text(config: Config): raise e logger.info("Done") + + +def extract_text_with_datatrove(config: Config): + """Using DataTrove framework to extract text and write to dataset specific outputs.""" + logger = config.init_logger(__name__) + log_file_path = Path(config.log_file) + logging_dir = log_file_path.parent / log_file_path.stem + + if logging_dir.exists() and config.override: + logger.warning("Removing existing logging dir (override is enabled): %s", logging_dir) + shutil.rmtree(logging_dir) + + if config.output_format == "jsonl": + output_stage_cls = JsonlWriter + elif config.output_format == "parquet": + import pyarrow as pa + import pyarrow.parquet as pq + + class DatatroveParquetWriterWithSchema(ParquetWriter): + # TODO hard-coded schema + def _write_batch(self, filename): + if not self._batches[filename]: + return + import pyarrow as pa + + # prepare batch + batch = pa.RecordBatch.from_pylist(self._batches.pop(filename)) + # write batch + try: + self._writers[filename].write_batch(batch) + except ValueError as e: + print(batch) + raise e + + def _write(self, document: dict, file_handler: IO, filename: str): + parquet_schema = pa.schema( + [ + ("text", pa.string()), + ("id", pa.string()), + ( + "metadata", + pa.struct( + [ + ("tlsh", pa.string()), + ("url", pa.string()), + ] + ), + ), + ] + ) + + if filename not in self._writers: + self._writers[filename] = pq.ParquetWriter(file_handler, schema=parquet_schema) + self._batches[filename].append(document) + if len(self._batches[filename]) == self.batch_size: + self._write_batch(filename) + + output_stage_cls = DatatroveParquetWriterWithSchema # ParquetWriter + else: + raise ValueError(f"Unsupported output format: {config.output_format }") + + datasets_list = get_datasets_list_from_string(config.datasets, config) + + # Iterate over datasets + for i, dataset_id in enumerate(datasets_list, 1): + logger.info(f"Dataset ID: {dataset_id} ({i} / {len(datasets_list)})") + + dataset_output_dir = os.path.join(config.text_datasets_dir, dataset_id) + + if not os.path.exists(dataset_output_dir): + os.makedirs(dataset_output_dir) + + output_kwargs = dict( + output_folder=dataset_output_dir, + output_filename="${rank}." + config.output_format, + # compression=config.output_compression, # parquet compression not supported! + max_file_size=get_bytes_from_int_or_string(config.max_output_chunk_uncompressed_bytes), + ) + + executor = LocalPipelineExecutor( + pipeline=[ + LLMDatasetsDatatroveReader(dataset_id, config, limit=config.limit), + output_stage_cls(**output_kwargs), # JSONL or Parquet writer + ], + logging_dir=str(logging_dir), + tasks=1, + workers=get_auto_workers(config.workers), + ) + executor.run() + + logger.info("Done") diff --git a/src/llm_datasets/hf_tokenize_parquet_dataset.py b/src/llm_datasets/hf_tokenize_parquet_dataset.py index 3ca7448..e45097c 100644 --- a/src/llm_datasets/hf_tokenize_parquet_dataset.py +++ b/src/llm_datasets/hf_tokenize_parquet_dataset.py @@ -1,45 +1,33 @@ -from dataclasses import dataclass, field -from itertools import chain import logging +import multiprocessing import os -from pathlib import Path import re -import sys -from typing import Dict, Literal, Optional, Union -from transformers import AutoTokenizer -from transformers import ( - AutoTokenizer, - HfArgumentParser, -) -from tqdm.auto import tqdm import signal - -import multiprocessing -from pathlib import Path -from typing import Iterable, List - +import sys +import uuid +from dataclasses import dataclass, field +from functools import partial from itertools import chain +from pathlib import Path +from typing import Dict, Iterable, List, Literal, Optional, Union import pyarrow as pa -from pyarrow.dataset import dataset as pa_dataset - -from pyarrow.dataset import write_dataset, ParquetFileFormat +from datasets import Dataset, Value from pyarrow import RecordBatch - -from transformers import AutoTokenizer +from pyarrow.dataset import ParquetFileFormat, write_dataset +from pyarrow.dataset import dataset as pa_dataset from tqdm.auto import tqdm - -from functools import partial -from datasets import Dataset, Value +from transformers import ( + AutoTokenizer, + HfArgumentParser, +) logger = logging.getLogger(__name__) @dataclass class ScriptArguments: - """ - Arguments for this script - """ + """Arguments for this script""" tokenizer_name_or_path: str = field( metadata={"help": "Tokenizer name or path"}, @@ -139,9 +127,6 @@ class ScriptArguments: ) -import uuid - - class _DatasetGeneratorPickleHack: def __init__(self, generator, generator_id=None): self.generator = generator @@ -165,10 +150,7 @@ def generate_texts( row_limit: Optional[int] = None, text_column_name: str = "text", ) -> Iterable[List[str]]: - """ - Reads PyArrow dataset in batches and generates texts - """ - + """Reads PyArrow dataset in batches and generates texts""" batch_iter = pyarrow_dataset.to_batches(columns=[text_column_name], batch_size=reader_batch_size) max_batches = round(row_limit / reader_batch_size) if row_limit is not None and row_limit > 0 else None @@ -270,9 +252,7 @@ def generate_texts( ) def group_texts(examples): - """ - Main data processing function that will concatenate all texts from our dataset and generate chunks of max_seq_length. - """ + """Main data processing function that will concatenate all texts from our dataset and generate chunks of max_seq_length.""" # Concatenate all texts. concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} total_length = len(concatenated_examples[list(examples.keys())[0]]) @@ -293,8 +273,7 @@ def group_texts(examples): return result def tokenize_texts(list_of_text: List[str]) -> dict: - """ - Perform the actual tokenization (is called by worker threads) + """Perform the actual tokenization (is called by worker threads) Tokenized data is grouped if `do_group` is enabled. """ @@ -401,9 +380,7 @@ def gen_from_iterable_dataset(iterable_ds): output_file_names = [] # written file names are saved here via `file_visitor` def file_visitor(written_file): - """ - Keep track of written files (for later renaming) - """ + """Keep track of written files (for later renaming)""" file_name = Path(written_file.path).name logger.debug("Writing to %s", file_name) diff --git a/src/llm_datasets/io/conllu_file.py b/src/llm_datasets/io/conllu_file.py index a8fd3e1..a804979 100644 --- a/src/llm_datasets/io/conllu_file.py +++ b/src/llm_datasets/io/conllu_file.py @@ -1,5 +1,5 @@ -import typing as T import logging +import typing as T logger = logging.getLogger(__name__) @@ -10,13 +10,13 @@ def get_texts_from_conllu_file( sentence_delimiter: str = " ", skip_sentence_prefixes: T.Optional[T.Iterable[str]] = None, ): - """ - Reads CONLLU and CONLLU-Plus format: https://universaldependencies.org/ext-format.html + """Reads CONLLU and CONLLU-Plus format: https://universaldependencies.org/ext-format.html https://github.com/EmilStenstrom/conllu/ """ import conllu + from conllu.exceptions import ParseException from conllu.parser import ( _FieldParserType, _MetadataParserType, @@ -24,7 +24,6 @@ def get_texts_from_conllu_file( parse_sentences, parse_token_and_metadata, ) - from conllu.exceptions import ParseException # Custom parse function that handles errors def conllu_parse_incr( diff --git a/src/llm_datasets/io/parquet.py b/src/llm_datasets/io/parquet.py index 3bb8509..241633c 100644 --- a/src/llm_datasets/io/parquet.py +++ b/src/llm_datasets/io/parquet.py @@ -1,24 +1,18 @@ -import asyncio +import logging import os import types -import pyarrow.parquet as pq -import logging - -import itertools +from itertools import islice from typing import Any, Generator, Iterable, Iterator, List, Optional, Tuple, Union import pyarrow as pa -import polars as pl - -from itertools import islice - +import pyarrow.parquet as pq logger = logging.getLogger(__name__) def open_parquet_file_with_retries(file_path, retries: int = 2): - """ - A little hack to avoid the "[Errno 14] Error reading bytes from file. Detail: [errno 14] Bad address" + """A little hack to avoid the following error: + > "[Errno 14] Error reading bytes from file. Detail: [errno 14] Bad address" """ for retry in range(1, retries): try: @@ -43,7 +37,9 @@ def chunked(generator, size): # async genator gen = aiter(generator) - make_chunk = lambda: list(islice(gen, size)) + def make_chunk(): + return list(islice(gen, size)) + return iter(make_chunk, []) @@ -81,7 +77,8 @@ def get_parquet_batches(rows_iterator: Iterator[Union[str, dict]], schema, batch if len(batched_columns[0]) == batch_size: yield pa.RecordBatch.from_arrays( - [pa.array(batched_column) for batched_column in batched_columns], schema=schema + [pa.array(batched_column) for batched_column in batched_columns], + schema=schema, ) # reset @@ -90,7 +87,8 @@ def get_parquet_batches(rows_iterator: Iterator[Union[str, dict]], schema, batch # last batch if len(batched_columns[0]) > 0: yield pa.RecordBatch.from_arrays( - [pa.array(batched_column) for batched_column in batched_columns], schema=schema + [pa.array(batched_column) for batched_column in batched_columns], + schema=schema, ) # else: @@ -144,8 +142,7 @@ def write_to_parquet_chunks( print_write_progress: int = 10_000, limit: int = 0, ) -> Tuple[int, int]: - """ - This could be replaced by `pa.write_dataset` -- however their implementation + """This could be replaced by `pa.write_dataset` -- however their implementation does not support crtl+c (?) thus we do our own implementation. """ max_chunks = 9999 @@ -184,10 +181,10 @@ def write_to_parquet_chunks( # chunk_buffer_size += batch.get_total_buffer_size() if total_rows > 0 and print_write_progress > 0 and (total_rows % print_write_progress) == 0: - logger.info(f"Written %s rows ...", total_rows) + logger.info("Written %s rows ...", total_rows) if limit > 0 and total_rows >= limit: - logger.warning(f"Limit reached (%s rows)", total_rows) + logger.warning("Limit reached (%s rows)", total_rows) limit_reached = True break @@ -228,14 +225,16 @@ def write_to_parquet_chunks( def get_selected_row_groups( parquet_file: pq.ParquetFile, file_offset: int, file_limit: int ) -> Tuple[List[int], Union[dict, None]]: - """ - Find the row groups that should be read for `file_offset` and `file_limit` - """ + """Find the row groups that should be read for `file_offset` and `file_limit`""" group_idx_to_offset_last_row: dict[int, Tuple[int, int]] = {} row_groups = [] group_offset = 0 - logger.debug("Selecting the row groups within offset=%s and limit=%s", file_offset, file_limit) + logger.debug( + "Selecting the row groups within offset=%s and limit=%s", + file_offset, + file_limit, + ) if file_limit == 0 and file_offset == 0: return list(range(parquet_file.num_row_groups)), None diff --git a/src/llm_datasets/io/prevert_file.py b/src/llm_datasets/io/prevert_file.py index 7602051..acb3fe0 100644 --- a/src/llm_datasets/io/prevert_file.py +++ b/src/llm_datasets/io/prevert_file.py @@ -1,13 +1,11 @@ -import prevert import warnings - from typing import TextIO +import prevert + class PrevertFile(prevert.dataset): - """ - Work-around for `prevert` dataset be directly read from file handlers - """ + """Work-around for `prevert` dataset be directly read from file handlers""" def __init__(self, file: TextIO, xml=True): self.file = file diff --git a/src/llm_datasets/megatron_tokenize_parquet_dataset.py b/src/llm_datasets/megatron_tokenize_parquet_dataset.py index 9471705..8f63c78 100644 --- a/src/llm_datasets/megatron_tokenize_parquet_dataset.py +++ b/src/llm_datasets/megatron_tokenize_parquet_dataset.py @@ -1,5 +1,4 @@ -""" -Based on https://github.com/NVIDIA/NeMo/blob/62508c2d980d0eb108a3fb55ab3a753acac833d3/scripts/nlp_language_modeling/preprocess_data_for_megatron.py +"""Based on https://github.com/NVIDIA/NeMo/blob/62508c2d980d0eb108a3fb55ab3a753acac833d3/scripts/nlp_language_modeling/preprocess_data_for_megatron.py -- but with parquet support @@ -12,8 +11,7 @@ pip install "nltk>=3.6.5" jieba pangu rapidfuzz zarr "opencc<1.1.7" ftfy boto3 -Example - +Example: ```bash # /netscratch/mostendorff/experiments/eulm/data/docs_by_language/de # /netscratch/mostendorff/datasets/lm-datasets_data/euro_dataset_v1_composed/ @@ -28,23 +26,7 @@ --workers=48 ``` -""" - -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Processing data for megatron pretraining. +Processing data for megatron pretraining. It can be used to convert the text data into indexed dataset for BERT, GPT, T5, RETRO models etc. @@ -115,7 +97,6 @@ """ import argparse -import gzip import json import multiprocessing import os @@ -124,8 +105,9 @@ import time from typing import Dict, Optional -import pyarrow as pa import pyarrow.parquet as pq +import torch +from tqdm.auto import tqdm try: import ftfy @@ -134,8 +116,6 @@ except ImportError: ftfy_available = False -import torch - try: import nltk @@ -143,8 +123,6 @@ except ImportError: nltk_available = False -from tqdm.auto import tqdm - # https://stackoverflow.com/questions/33139531/preserve-empty-lines-with-nltks-punkt-tokenizer class CustomLanguageVars(nltk.tokenize.punkt.PunktLanguageVars): @@ -277,13 +255,22 @@ def get_args( ), ) group.add_argument( - "--json-keys", nargs="+", default=["text"], help="space separate listed of keys to extract from json" + "--json-keys", + nargs="+", + default=["text"], + help="space separate listed of keys to extract from json", ) group.add_argument( - "--parquet_text_column", default="text", help="Column name of Parquet input files that hold the text" + "--parquet_text_column", + default="text", + help="Column name of Parquet input files that hold the text", ) group.add_argument("--split-sentences", action="store_true", help="Split documents into sentences.") - group.add_argument("--keep-newlines", action="store_true", help="Keep newlines between sentences when splitting.") + group.add_argument( + "--keep-newlines", + action="store_true", + help="Keep newlines between sentences when splitting.", + ) group.add_argument("--text_file", action="store_true", help="Use text file instead of json.") group = parser.add_argument_group(title="tokenizer") group.add_argument( @@ -308,11 +295,29 @@ def get_args( ) group.add_argument("--vocab-file", type=str, default=None, help="Path to the vocab file") group.add_argument("--files-filter", type=str, default="**/*.json*", help="files filter str") - group.add_argument("--merge-file", type=str, default=None, help="Path to the BPE merge file (if necessary).") - group.add_argument("--delimiter", type=str, default=None, help="delimiter used for tabular tokenizer") - group.add_argument("--append-eod", action="store_true", help="Append an token to the end of a document.") + group.add_argument( + "--merge-file", + type=str, + default=None, + help="Path to the BPE merge file (if necessary).", + ) + group.add_argument( + "--delimiter", + type=str, + default=None, + help="delimiter used for tabular tokenizer", + ) + group.add_argument( + "--append-eod", + action="store_true", + help="Append an token to the end of a document.", + ) group.add_argument("--retrieval-db", action="store_true", help="Dataset used for retrieval.") - group.add_argument("--need-pad-id", action="store_true", help="Whether we need the pad id for the tokenizer") + group.add_argument( + "--need-pad-id", + action="store_true", + help="Whether we need the pad id for the tokenizer", + ) group = parser.add_argument_group(title="output data") group.add_argument( "--output-prefix", @@ -321,16 +326,29 @@ def get_args( default=output_prefix, help="Path to binary output file without suffix", ) - group.add_argument("--dataset-impl", type=str, default="mmap", choices=["lazy", "cached", "mmap", "retmmap"]) + group.add_argument( + "--dataset-impl", + type=str, + default="mmap", + choices=["lazy", "cached", "mmap", "retmmap"], + ) group = parser.add_argument_group(title="runtime") group.add_argument("--workers", type=int, default=1, help="Number of worker processes to launch") group.add_argument("--chunk_size", type=int, default=64, help="chunk size used for retrieval") group.add_argument( - "--chunk_stride_size", type=int, default=64, help="the stride size for neighbor chunks used for retrieval" + "--chunk_stride_size", + type=int, + default=64, + help="the stride size for neighbor chunks used for retrieval", ) - group.add_argument("--log-interval", type=int, default=100, help="Interval between progress updates") + group.add_argument( + "--log-interval", + type=int, + default=100, + help="Interval between progress updates", + ) group.add_argument( "--preproc-folder", action="store_true", @@ -339,9 +357,16 @@ def get_args( " via the --input arg" ), ) - group.add_argument("--apply-ftfy", action="store_true", help="If set, will apply ftfy to the input text") group.add_argument( - "--nemo_path", type=str, default=None, help="Path to Nemo repo (set if not available in PYTHONPATH)" + "--apply-ftfy", + action="store_true", + help="If set, will apply ftfy to the input text", + ) + group.add_argument( + "--nemo_path", + type=str, + default=None, + help="Path to Nemo repo (set if not available in PYTHONPATH)", ) group.add_argument( "--stats_file", @@ -349,10 +374,22 @@ def get_args( default=None, help="Path to JSON stats file (used to compute total number of documents)", ) - group.add_argument("--use_fast_tokenizer", action="store_true", help="Use fast HF tokenizer implementation") - group.add_argument("--input_docs_limit", type=int, default=0, help="Limit number of input docs (for debugging)") group.add_argument( - "--max_text_length", type=int, default=500_000, help="Documents longer than this length are truncated" + "--use_fast_tokenizer", + action="store_true", + help="Use fast HF tokenizer implementation", + ) + group.add_argument( + "--input_docs_limit", + type=int, + default=0, + help="Limit number of input docs (for debugging)", + ) + group.add_argument( + "--max_text_length", + type=int, + default=500_000, + help="Documents longer than this length are truncated", ) args = parser.parse_args() @@ -455,7 +492,7 @@ def main( ) startup_end = time.time() - proc_start = time.time() + time.time() total_bytes_processed = 0 print("Time to startup:", startup_end - startup_start) @@ -486,7 +523,11 @@ def text_iterator(): else: # shorten too long texts if len(text) > args.max_text_length: - print("WARNING: too long text ", len(text), args.max_text_length) + print( + "WARNING: too long text ", + len(text), + args.max_text_length, + ) yield text[: args.max_text_length] diff --git a/src/llm_datasets/shuffle_datasets.py b/src/llm_datasets/shuffle_datasets.py index 298452a..cf01eb7 100644 --- a/src/llm_datasets/shuffle_datasets.py +++ b/src/llm_datasets/shuffle_datasets.py @@ -1,28 +1,25 @@ import os +import random +import pyarrow as pa +import pyarrow.parquet as pq +from datasets import load_dataset +from pyarrow.parquet import ParquetDataset +from tqdm.auto import tqdm + +from .datasets.base import BaseDataset from .datasets.dataset_registry import ( get_dataset_class_by_id, - get_registered_dataset_ids, + get_datasets_list_from_string, ) -from .datasets.base import BaseDataset from .utils.config import Config -from datasets import load_dataset - -from tqdm.auto import tqdm - -import pyarrow.parquet as pq - -import polars as pl - def shuffle_datasets(config: Config): - """ - input: parquet files, configs + """input: parquet files, configs output: shuffled files """ - logger = config.init_logger(__name__) if config.output_format != "parquet": @@ -35,21 +32,7 @@ def shuffle_datasets(config: Config): shuffle_buffer_size = config.shuffle_buffer_size - datasets_list = config.datasets.split(",") - - if len(datasets_list) == 1: - if datasets_list[0] == "all": - # Get list of all regsitered datasets - datasets_list = get_registered_dataset_ids(config.extra_dataset_registries) - - elif datasets_list[0] == "all_from_source": - # Get registered datasets based on source - if config.source_id is None: - raise ValueError("The argument --source_id must be set.") - - datasets_list = get_registered_dataset_ids( - config.extra_dataset_registries, needed_source_id=config.source_id - ) + datasets_list = get_datasets_list_from_string(config.datasets, config) min_file_size_for_buffered_shuffling = config.min_file_size_for_buffered_shuffling @@ -59,16 +42,16 @@ def shuffle_datasets(config: Config): dataset_cls = get_dataset_class_by_id(dataset_id, config.extra_dataset_registries) dataset: BaseDataset = dataset_cls( - output_dir=config.output_dir, + text_datasets_dir=config.text_datasets_dir, output_format=config.output_format, output_batch_size=shuffle_buffer_size, output_compression=config.output_compression, - shuffled_output_dir=config.shuffled_output_dir, + shuffled_datasets_dir=config.shuffled_datasets_dir, config=config, ) if not dataset.has_output_files(): - logger.warning(f"Skipping {dataset_id}: cannot shuffle dataset without processed output files") + logger.warning(f"Skipping {dataset_id}: cannot shuffle dataset without text dataset files") continue unshuffled_output_file_paths = dataset.get_output_file_paths() @@ -107,18 +90,26 @@ def shuffle_datasets(config: Config): logger.info("Initializing HF streaming dataset ...") hf_dataset = load_dataset( - "parquet", data_files={"train": unshuffled_file_path}, split="train", streaming=True + "parquet", + data_files={"train": unshuffled_file_path}, + split="train", + streaming=True, ) logger.info("Shuffling and writing to new file ...") def generate_text(): - for item in tqdm(hf_dataset.shuffle(buffer_size=shuffle_buffer_size, seed=seed), total=docs_count): + for item in tqdm( + hf_dataset.shuffle(buffer_size=shuffle_buffer_size, seed=seed), + total=docs_count, + ): yield str(item[dataset.get_output_text_field()]) # force to str # Writer shuffled_docs_count, saved_chunks = dataset.save_texts_to_parquet( - generate_text(), file_path=shuffled_output_file_path, apply_filter=False + generate_text(), + file_path=shuffled_output_file_path, + apply_filter=False, ) if docs_count != shuffled_docs_count: @@ -128,13 +119,35 @@ def generate_text(): else: # Shuffle in memory - selected_columns = [dataset.get_output_text_field()] - logger.info("Initializing PL in-memory dataframe (%s) ...", selected_columns) - df = pl.read_parquet(unshuffled_file_path, columns=selected_columns) + # Polars implementation + # selected_columns = [dataset.get_output_text_field()] + # logger.info("Initializing PL in-memory dataframe (%s) ...", selected_columns) + # df = pl.read_parquet(unshuffled_file_path, columns=selected_columns) + + # logger.info("Shuffling and writing to new file ...") + # df = df.sample(fraction=1, shuffle=True, seed=seed).write_parquet( + # shuffled_output_file_path, compression="zstd" + # ) + # PyArrow implementation + logger.info("Initializing PyArrow in-memory dataframe ...") + pq_ds = ParquetDataset( + unshuffled_file_path, + memory_map=True, + ) + pq_table = pq_ds.read() # load data into memory + + random.seed(seed) + indices = list(range(pq_table.num_rows)) + random.shuffle(indices) logger.info("Shuffling and writing to new file ...") - df = df.sample(fraction=1, shuffle=True, seed=seed).write_parquet( - shuffled_output_file_path, compression="zstd" - ) + + # Don't use take() + # https://issues.apache.org/jira/browse/ARROW-9773 + # https://github.com/huggingface/datasets/pull/645 + # shuffled_table = pq_table.take(indices) + # + shuffled_table = pa.concat_tables(pq_table.slice(i, 1) for i in indices) + pq.write_table(shuffled_table, shuffled_output_file_path, compression="zstd") logger.info("Done") diff --git a/src/llm_datasets/train_sp_tokenizer.py b/src/llm_datasets/train_sp_tokenizer.py index a2b7284..85af790 100644 --- a/src/llm_datasets/train_sp_tokenizer.py +++ b/src/llm_datasets/train_sp_tokenizer.py @@ -2,17 +2,20 @@ import json import math import os -from pathlib import Path import time +from pathlib import Path from typing import Iterable + from pyarrow import parquet as pq +from transformers.convert_slow_tokenizer import import_protobuf + from llm_datasets.utils import get_auto_workers from llm_datasets.utils.config import Config -import sentencepiece as spm -from transformers.convert_slow_tokenizer import import_protobuf def train_sp_tokenizer(config: Config): + import sentencepiece as spm + logger = config.init_logger(__name__) # from_pretrained_model_path = "" # existing SP model @@ -51,9 +54,7 @@ def train_sp_tokenizer(config: Config): logger.info("Dataset has %i total rows", total_train_row_count) def generate_texts(pq_file_paths, row_limit=0, text_column="text", sentence_splitting: bool = False) -> Iterable: - """ - Stream text data from parquet files - """ + """Stream text data from parquet files""" pq_dataset = pq.ParquetDataset(path_or_paths=pq_file_paths) logger.info("Dataset initialized with %i fragments", len(pq_dataset.fragments)) @@ -232,7 +233,7 @@ def generate_texts(pq_file_paths, row_limit=0, text_column="text", sentence_spli logger.info("SP train settings: %s", trainer_kwargs) # train with combination of user settings and source model settings - train_res = spm.SentencePieceTrainer.train( + spm.SentencePieceTrainer.train( **trainer_kwargs, ) diff --git a/src/llm_datasets/utils/__init__.py b/src/llm_datasets/utils/__init__.py index 739e042..21ad65b 100644 --- a/src/llm_datasets/utils/__init__.py +++ b/src/llm_datasets/utils/__init__.py @@ -1,8 +1,7 @@ -import re import logging +import re from typing import Iterable, List, Union - logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/utils/config.py b/src/llm_datasets/utils/config.py index 7fb6793..f4a32a3 100644 --- a/src/llm_datasets/utils/config.py +++ b/src/llm_datasets/utils/config.py @@ -1,9 +1,9 @@ import argparse -import os -from typing import Dict, List, Iterable, Literal, Union -import yaml import logging +import os +from typing import Dict, Iterable, List, Literal, Union +import yaml logger = logging.getLogger(__name__) @@ -53,17 +53,21 @@ def get_common_argparser(required_configs: bool = False): type=str, help="Log file is saved at this path", ) - common_parser.add_argument("--verbose", action="store_true", help="Enable verbose logging (log level = debug)") + common_parser.add_argument( + "--verbose", + action="store_true", + help="Enable verbose logging (log level = debug)", + ) return common_parser class Config(object): - output_dir = None + text_datasets_dir = None output_format = "jsonl" output_compression = None raw_datasets_dir = None - shuffled_output_dir = None + shuffled_datasets_dir = None composed_dataset_dir = None # composed dataset (train/val split) is saved into this directory local_dirs_by_dataset_id = {} @@ -97,10 +101,15 @@ class Config(object): # Datasets are initialized with these kwargs extra_dataset_kwargs: dict[str, dict] = {} + use_documents: bool = False + workers: int = 0 + limit: int = 0 + skip_items = 0 job_id = None save_stats = True verbose = False log_file = None + override = False def __init__(self, **entries): self.__dict__.update(entries) @@ -139,9 +148,7 @@ def get_selected_dataset_ids(self, mode: Literal["all", "exact", "fnmatch"] = "a return self.selected_dataset_ids def get_job_id(self) -> Union[None, str]: - """ - Returns manually set job ID or from environment variable (SLURM_JOBID) - """ + """Returns manually set job ID or from environment variable (SLURM_JOBID)""" if self.job_id is None: self.job_id = os.environ.get("SLURM_JOBID", "0") @@ -159,8 +166,10 @@ def get_config_from_paths(config_paths: Iterable, override: dict = None) -> Conf logger.info("Loading config: %s", config_path) with open(config_path) as f: _config = yaml.safe_load(f) - - config.update(_config) + if _config is None: + raise ValueError("Cannot read from config: %s", config_path) + else: + config.update(_config) if override: # Override with args config.update(override) diff --git a/src/llm_datasets/utils/dataframe.py b/src/llm_datasets/utils/dataframe.py index 27dd085..7c6fc4a 100644 --- a/src/llm_datasets/utils/dataframe.py +++ b/src/llm_datasets/utils/dataframe.py @@ -1,11 +1,13 @@ -import logging import json +import logging from pathlib import Path -from typing import Iterable, List, Optional +from typing import Iterable, Optional + import pandas as pd from tqdm.auto import tqdm + +from llm_datasets.datasets.base import BaseDataset, License from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes -from llm_datasets.datasets.base import TOKENS_PER_BYTE, BaseDataset, License from llm_datasets.utils.config import Config logger = logging.getLogger(__name__) diff --git a/src/llm_datasets/utils/dataset_generator.py b/src/llm_datasets/utils/dataset_generator.py index 823d6a4..be8f4ab 100644 --- a/src/llm_datasets/utils/dataset_generator.py +++ b/src/llm_datasets/utils/dataset_generator.py @@ -1,25 +1,23 @@ -import asyncio +import logging import math -from pathlib import Path import random +from enum import Enum +from pathlib import Path from typing import Iterable, Iterator, List, Optional, Tuple, Union -from llm_datasets.datasets.base import BaseDataset -from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes -from llm_datasets.utils.config import Config -from tqdm.auto import tqdm import numpy as np import pyarrow as pa -from enum import Enum -import logging +from tqdm.auto import tqdm +from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes +from llm_datasets.utils.config import Config logger = logging.getLogger(__name__) class DatasetSplit(str, Enum): - """ - Full dataset: + """Full dataset: [-------------] @@ -56,9 +54,7 @@ def iter_random_indices( probabilities: List[float], random_batch_size: int = 100, ) -> Iterator[int]: - """ - Get an infinite iterator that randomly samples the index of the source to pick examples from. - """ + """Get an infinite iterator that randomly samples the index of the source to pick examples from.""" assert len(probabilities) == num_sources while True: @@ -72,8 +68,7 @@ def interleave_dataset_iterators( random_indicies_batch_size: int = 100, datasets_prefixes: Optional[List] = None, ) -> Iterator: - """ - Interleave dataset iterators. + """Interleave dataset iterators. Implementation based on Huggingface's datasets library @@ -129,7 +124,12 @@ def interleave_dataset_iterators( def sampled_dataset_iterator( - iterator_func, true_dataset_rows, target_dataset_rows, offset, limit, **iterator_func_kwargs + iterator_func, + true_dataset_rows, + target_dataset_rows, + offset, + limit, + **iterator_func_kwargs, ) -> Iterator: if target_dataset_rows > true_dataset_rows: # upsampling @@ -137,7 +137,11 @@ def sampled_dataset_iterator( last_partial_read = (target_dataset_rows / true_dataset_rows) - full_reads last_partial_read_n = math.floor(last_partial_read * true_dataset_rows) - logger.debug("Upsample dataset. Full reads: %s times; Last read: %s rows", full_reads, last_partial_read_n) + logger.debug( + "Upsample dataset. Full reads: %s times; Last read: %s rows", + full_reads, + last_partial_read_n, + ) # full read (no limit): repeated reading from the dataset for _ in range(full_reads): @@ -159,8 +163,7 @@ def sampled_dataset_iterator( class DatasetGenerator(object): - """ - Dataset generator class + """Dataset generator class Generate function needs to be implemented as a class to make the collected statistics accessible for an iterator. @@ -176,13 +179,13 @@ class DatasetGenerator(object): def __init__( self, config: Config, - shuffled_output_dir, + shuffled_datasets_dir, output_format, save_to_dir: Union[str, Path], split: DatasetSplit = DatasetSplit.TRAIN, ) -> None: self.config = config - self.shuffled_output_dir = shuffled_output_dir + self.shuffled_datasets_dir = shuffled_datasets_dir self.output_format = output_format self.split = split @@ -195,7 +198,7 @@ def prepare_datasets(self, use_sampling: bool = False, print_progress: bool = Fa available_dataset_classes = get_registered_dataset_classes( extra_dataset_registries=self.config.extra_dataset_registries, extra_dataset_classes=self.config.extra_dataset_classes, - use_default_registry=self.config.use_default_dataset_registry, + use_default_dataset_registry=self.config.use_default_dataset_registry, ) selected_dataset_ids = self.config.selected_dataset_ids selected_source_ids = self.config.selected_source_ids @@ -211,10 +214,10 @@ def prepare_datasets(self, use_sampling: bool = False, print_progress: bool = Fa for ds_cls in available_dataset_classes: ds: BaseDataset = ds_cls( - output_dir=None, + # output_dir=None, output_format=self.output_format, - raw_datasets_dir=None, - shuffled_output_dir=self.shuffled_output_dir, + # raw_datasets_dir=None, + shuffled_datasets_dir=self.shuffled_datasets_dir, config=self.config, ) dataset_id = ds.DATASET_ID @@ -274,7 +277,9 @@ def generate_texts_from_single_dataset( if print_progress: dataset_iterator = tqdm( - dataset_iterator, desc=f"Generating from {dataset_id}", total=args["limit"] - args["offset"] + dataset_iterator, + desc=f"Generating from {dataset_id}", + total=args["limit"] - args["offset"], ) yield from dataset_iterator @@ -286,9 +291,7 @@ def generate_texts_from_interleaved_datasets( generate_dataset_ids: bool = False, print_progress: bool = False, ) -> Iterator: - """ - Generate texts based on split or full datasets and the given config. - """ + """Generate texts based on split or full datasets and the given config.""" if not self.dataset_id_to_args: raise ValueError("Dataset args are not set. Did you run `prepare_datasets`?") @@ -333,7 +336,10 @@ def select_by_indicies(list, indices): select_by_indicies(self.list_of_dataset_iterators, dataset_indices), select_by_indicies(probabilities, dataset_indices), datasets_prefixes=( - pa.array(select_by_indicies(self.list_of_dataset_ids, dataset_indices), type=pa.string()) + pa.array( + select_by_indicies(self.list_of_dataset_ids, dataset_indices), + type=pa.string(), + ) if generate_dataset_ids else None ), @@ -364,10 +370,9 @@ def generate_texts_from_dataset( split: DatasetSplit = None, split_offset_limit: Optional[DatasetSplitOffsetLimit] = None, use_shuffled_output: bool = True, + **kwargs, ): - """ - - Full dataset: + """Full dataset: [-------------] @@ -384,26 +389,29 @@ def generate_texts_from_dataset( [----][xx][---] """ - if split_offset_limit is None: split_offset_limit = get_splits_as_offsets_and_limits(dataset, use_shuffled_output=use_shuffled_output) dataset_offset, dataset_limit = split_offset_limit[split] - logger.info("Generating texts for split=%s with offset=%s and limit=%s", split, dataset_offset, dataset_limit) + logger.info( + "Generating texts for split=%s with offset=%s and limit=%s", + split, + dataset_offset, + dataset_limit, + ) yield from dataset.generate_texts_from_output( shuffled=use_shuffled_output, shuffle_output_file_paths=use_shuffled_output, offset=dataset_offset, limit=dataset_limit, + **kwargs, ) def get_splits_as_offsets_and_limits(dataset: BaseDataset, use_shuffled_output: bool = True) -> DatasetSplitOffsetLimit: - """ - Generate splits as offsets and limit depending on total rows and defined split settings (ratio, min. doc count etc.) - """ + """Generate splits as offsets and limit depending on total rows and defined split settings (ratio, min. doc count etc.)""" if dataset.config is None: raise ValueError("dataset config is not set") @@ -413,7 +421,10 @@ def get_splits_as_offsets_and_limits(dataset: BaseDataset, use_shuffled_output: # Compute offsets + limits for split selection if dataset.HAS_PREDEFINED_VALIDATION_SET: - logger.warning("No validation split - because a predefined validation set exists: %s", dataset.DATASET_ID) + logger.warning( + "No validation split - because a predefined validation set exists: %s", + dataset.DATASET_ID, + ) validation_n_docs = 0 elif dataset.config.validation_min_total_docs is not None and n_docs < dataset.config.validation_min_total_docs: logger.warning( diff --git a/src/llm_datasets/utils/docs/__init__.py b/src/llm_datasets/utils/docs/__init__.py index 95e38a9..7a680bc 100644 --- a/src/llm_datasets/utils/docs/__init__.py +++ b/src/llm_datasets/utils/docs/__init__.py @@ -1,4 +1,3 @@ from typing import Literal - TokensColumn = Literal["estimated_tokens", "reported_tokens"] diff --git a/src/llm_datasets/utils/docs/plots.py b/src/llm_datasets/utils/docs/plots.py index 74c183e..a54d21c 100644 --- a/src/llm_datasets/utils/docs/plots.py +++ b/src/llm_datasets/utils/docs/plots.py @@ -1,39 +1,15 @@ -import re -import tempfile - -import sys - -import seaborn as sns -from matplotlib import pyplot as plt -import pandas as pd - -from llm_datasets.utils.dataframe import get_datasets_as_dataframe - -from llm_datasets.datasets.base import BaseDataset -from llm_datasets.utils.config import Config - -from llm_datasets.utils.docs import TokensColumn -from llm_datasets.viewer.viewer_utils import millify - -from pathlib import Path -import matplotlib.ticker as ticker - -import itertools -import logging -import locale import math -from numbers import Integral +import matplotlib as mpl +import matplotlib.ticker as ticker import numpy as np +from matplotlib import pyplot as plt -import matplotlib as mpl -from matplotlib import _api, cbook -from matplotlib import transforms as mtransforms +from llm_datasets.utils.docs import TokensColumn class CustomEngFormatter(ticker.EngFormatter): - """ - Format axis values using engineering prefixes to represent powers + """Format axis values using engineering prefixes to represent powers of 1000, plus a specified unit, e.g., 10 MHz instead of 1e7. """ @@ -59,8 +35,7 @@ class CustomEngFormatter(ticker.EngFormatter): } def __init__(self, unit="", places=None, sep=" ", *, usetex=None, useMathText=None): - r""" - Parameters + r"""Parameters ---------- unit : str, default: "" Unit symbol to use, suitable for use with single-letter @@ -129,8 +104,7 @@ def __call__(self, x, pos=None): return self.fix_minus(s) def format_eng(self, num): - """ - Format a number in engineering notation, appending a letter + """Format a number in engineering notation, appending a letter representing the power of 1000 of the original number. Some examples: @@ -187,6 +161,8 @@ def plot_tokens_by_language( language_col="language", top_k=0, ): + import seaborn as sns + xlabel = "Languages" if top_k > 0: @@ -221,6 +197,8 @@ def plot_tokens_by_source( top_k=15, xticks_rotate=90, # 45 for latex ): + import seaborn as sns + if top_k > 0: df = df.head(n=top_k) diff --git a/src/llm_datasets/utils/docs/tables.py b/src/llm_datasets/utils/docs/tables.py index 6510771..ecafa18 100644 --- a/src/llm_datasets/utils/docs/tables.py +++ b/src/llm_datasets/utils/docs/tables.py @@ -1,12 +1,7 @@ import re -from typing import Literal -from llm_datasets.utils.config import Config from llm_datasets.utils.dataframe import get_datasets_as_dataframe - - from llm_datasets.utils.docs import TokensColumn -from llm_datasets.viewer.viewer_utils import millify def get_tokens_dataframe(config, **dataframe_kwargs): @@ -28,7 +23,13 @@ def get_tokens_dataframe(config, **dataframe_kwargs): **dataframe_kwargs, ) # rename tokens - df.rename(columns={"tokens": "reported_tokens", "total_estimated_tokens": "estimated_tokens"}, inplace=True) + df.rename( + columns={ + "tokens": "reported_tokens", + "total_estimated_tokens": "estimated_tokens", + }, + inplace=True, + ) return df @@ -58,9 +59,7 @@ def get_tokens_by_source_datafame(df, tokens_col: TokensColumn = "estimated_toke def get_title_without_subset(title): - """ - Subset identifier are marked with " [subset name]" in the end of dataset titles. - """ + """Subset identifier are marked with " [subset name]" in the end of dataset titles.""" return re.sub(r" \[(.*?)\]$", "", title) diff --git a/src/llm_datasets/utils/flatmap.py b/src/llm_datasets/utils/flatmap.py index 8d7dbb3..67ff1f1 100644 --- a/src/llm_datasets/utils/flatmap.py +++ b/src/llm_datasets/utils/flatmap.py @@ -1,11 +1,8 @@ -""" - -Mostly based on MisterMiyagi's answer https://stackoverflow.com/a/71019318 - -""" +"""Mostly based on MisterMiyagi's answer https://stackoverflow.com/a/71019318""" import functools -from multiprocess import Pool, Manager, Queue + +from multiprocess import Manager, Pool, Queue # from multiprocessing import Pool, Manager, Queue diff --git a/src/llm_datasets/utils/shuffle_big_file.py b/src/llm_datasets/utils/shuffle_big_file.py index 310b99a..ac88e90 100644 --- a/src/llm_datasets/utils/shuffle_big_file.py +++ b/src/llm_datasets/utils/shuffle_big_file.py @@ -1,17 +1,17 @@ -""" -Take from https://raw.githubusercontent.com/YaYaB/shuffle-big-file/master/shuffle_big_file/shuffle_big_file.py +"""Take from https://raw.githubusercontent.com/YaYaB/shuffle-big-file/master/shuffle_big_file/shuffle_big_file.py This tool helps you shuffle by line a big file that does not fit in memory. Given the batch_size that your machine can put in memory it will shuffle the whole file by reading as many times as necessary. """ -import os -from datetime import datetime, timedelta + +import argparse +import logging import math +import os import random -import argparse import sys -import logging +from datetime import datetime, timedelta RANDOM_SEED = 1337 @@ -30,8 +30,7 @@ def get_args(): def compute_nb_read(path_file, batch_size): - """ - :param path_file: path file for which we count the number of lines + """:param path_file: path file for which we count the number of lines :param batch_size: batch size that the machine can handle :return: number of lines and number of read necessary """ @@ -47,8 +46,7 @@ def compute_nb_read(path_file, batch_size): def compute_shuffled_index(nb_lines): - """ - :param nb_lines: number of lines + """:param nb_lines: number of lines :return: shuffled index of the number of lines """ # Create index @@ -61,10 +59,10 @@ def compute_shuffled_index(nb_lines): def generate_random_string( - length=500, alphabet="azertyuiop^$qsdfghjklmù*wxcvbn,;:!1234567890°+¨£%µ§/.?<>AZERTYUIOPQSDFGHJKLMWXCVBN&é'(-è_çà)=" + length=500, + alphabet="azertyuiop^$qsdfghjklmù*wxcvbn,;:!1234567890°+¨£%µ§/.?<>AZERTYUIOPQSDFGHJKLMWXCVBN&é'(-è_çà)=", ): - """ - :param length: length of string wanted + """:param length: length of string wanted :param alphabet: alphabet from witch characters are sampled :return: random string of size `length` """ @@ -72,8 +70,7 @@ def generate_random_string( def generate_random_file(path_file="./random_file.txt", nb_lines=10000, max_line_length=1000): - """ - :param path_file: path file that will be created + """:param path_file: path file that will be created :param nb_lines: number of lines wanted :param max_lines_length: maximum number of characters per line """ @@ -84,17 +81,31 @@ def generate_random_file(path_file="./random_file.txt", nb_lines=10000, max_line def generate_random_file_cli(): parser = argparse.ArgumentParser("generate random file containing a string per line") - parser.add_argument("--path_file", type=str, default="./random_file.txt", help="Path to file that will be created") - parser.add_argument("--nb_lines", type=int, default=10000, help="Number of lines wanted for the file") - parser.add_argument("--max_line_length", type=int, default=1000, help="Max number of characters per line") + parser.add_argument( + "--path_file", + type=str, + default="./random_file.txt", + help="Path to file that will be created", + ) + parser.add_argument( + "--nb_lines", + type=int, + default=10000, + help="Number of lines wanted for the file", + ) + parser.add_argument( + "--max_line_length", + type=int, + default=1000, + help="Max number of characters per line", + ) opt = parser.parse_args() generate_random_file(opt.path_file, opt.nb_lines, opt.max_line_length) def shuffle(input_file, output_file, idx_shuffled, nb_read, batch_size): - """ - :param input_file: path file that will be created + """:param input_file: path file that will be created :param output_file: number of lines wanted :param idx_shuffled: index shuffled :param nb_read: number of read necessary @@ -121,7 +132,7 @@ def shuffle(input_file, output_file, idx_shuffled, nb_read, batch_size): try: waiting_line = idx_sort[j] # If fails that means it exceds the max_line - except: + except IndexError: break # Shuffle the batch created @@ -138,13 +149,11 @@ def shuffle(input_file, output_file, idx_shuffled, nb_read, batch_size): def shuffle_big_file(input_file, output_file, batch_size, seed=RANDOM_SEED): - """ - :param input_file: path of the inputfile + """:param input_file: path of the inputfile :param batch_size: batch size used :param output_file: path of the output file :param seed: seed for the random generator """ - assert os.path.exists(input_file) assert not os.path.exists(output_file) @@ -172,10 +181,7 @@ def shuffle_big_file(input_file, output_file, batch_size, seed=RANDOM_SEED): def shuffle_big_file_cli(): - """ - Main function of the program - """ - + """Main function of the program""" # Get arguments passed in CLI opt = get_args() diff --git a/src/llm_datasets/utils/systems.py b/src/llm_datasets/utils/systems.py index f08de83..d490509 100644 --- a/src/llm_datasets/utils/systems.py +++ b/src/llm_datasets/utils/systems.py @@ -1,11 +1,10 @@ -import os import logging +import os from enum import Enum from typing import List from llm_datasets.utils.config import Config - logger = logging.getLogger(__name__) @@ -27,7 +26,10 @@ def get_current_system(allow_default: bool = True) -> System: def get_path_by_system( - possible_paths: List[str], allow_default: bool = True, default_path: str = "/dev/null", config: Config = None + possible_paths: List[str], + allow_default: bool = True, + default_path: str = "/dev/null", + config: Config = None, ) -> str: current_system = get_current_system(allow_default) diff --git a/src/llm_datasets/utils/wikimedia.py b/src/llm_datasets/utils/wikimedia.py index 716a2dc..248b1fd 100644 --- a/src/llm_datasets/utils/wikimedia.py +++ b/src/llm_datasets/utils/wikimedia.py @@ -1,6 +1,5 @@ -""" -Taken from https://huggingface.co/datasets/wikipedia/blob/main/wikipedia.py -""" +"""Taken from https://huggingface.co/datasets/wikipedia/blob/main/wikipedia.py""" + import re # Source: https://en.wikipedia.org/wiki/List_of_Wikipedias (accessed 3/1/2019) @@ -519,7 +518,16 @@ "sk": ["Súbor", "Obrázok", "Médiá"], "sl": ["Slika", "Datoteka"], "sq": ["Figura", "Skeda"], - "sr": ["Датотека", "Medij", "Slika", "Медија", "Datoteka", "Медиј", "Medija", "Слика"], + "sr": [ + "Датотека", + "Medij", + "Slika", + "Медија", + "Datoteka", + "Медиј", + "Medija", + "Слика", + ], "srn": ["Afbeelding", "Gefre"], "stq": ["Bielde", "Bild"], "su": ["Média", "Gambar"], @@ -691,7 +699,15 @@ "koi": ["Категория"], "krc": ["Категория"], "ks": ["زٲژ"], - "ksh": ["Saachjropp", "Saachjrop", "Katejori", "Kategorie", "Saachjrupp", "Kattejori", "Sachjrop"], + "ksh": [ + "Saachjropp", + "Saachjrop", + "Katejori", + "Kategorie", + "Saachjrupp", + "Kattejori", + "Sachjrop", + ], "ku": ["Kategorî", "پۆل"], "kv": ["Категория"], "kw": ["Class", "Klass"], @@ -833,7 +849,7 @@ def get_namespace(tag): tag : str Namespace or tag. - Returns + Returns: ------- str Matched namespace or tag. diff --git a/src/llm_datasets/viewer/app.py b/src/llm_datasets/viewer/app.py index 2105b93..a2e0e67 100644 --- a/src/llm_datasets/viewer/app.py +++ b/src/llm_datasets/viewer/app.py @@ -1,28 +1,19 @@ -""" -Streamlit app -""" +"""Streamlit app""" +import argparse +import logging import math import os -from pathlib import Path -import streamlit as st -import numpy as np -import pandas as pd -import textwrap -import sys -import pyarrow.parquet as pq import random -import logging -from textwrap import TextWrapper -import argparse -from viewer_utils import millify, sizeof_fmt - -from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes +import pandas as pd +import pyarrow.parquet as pq +import streamlit as st from llm_datasets.datasets.base import BaseDataset -from llm_datasets.utils.dataframe import get_datasets_as_dataframe +from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes from llm_datasets.utils.config import get_common_argparser, parse_args_and_get_config from llm_datasets.utils.dataframe import get_datasets_as_dataframe +from viewer_utils import millify logging.basicConfig( format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", @@ -226,7 +217,11 @@ def load_data(): # ) # View selected columbs of dataframe - st.dataframe(data=df[selected_columns], use_container_width=True, height=(len(df) + 1) * 35 + 3) + st.dataframe( + data=df[selected_columns], + use_container_width=True, + height=(len(df) + 1) * 35 + 3, + ) elif mode == "stats": @@ -249,7 +244,10 @@ def load_data(): st.plotly_chart(fig, use_container_width=True) fig = px.pie( - tokens_by_web_crawled, names="web_crawled", values="tokens", title="Tokens by Web-crawled (1) or not (0)" + tokens_by_web_crawled, + names="web_crawled", + values="tokens", + title="Tokens by Web-crawled (1) or not (0)", ) st.plotly_chart(fig, use_container_width=True) diff --git a/src/llm_datasets/viewer/ngrok-app.py b/src/llm_datasets/viewer/ngrok-app.py index bba876a..e792c51 100644 --- a/src/llm_datasets/viewer/ngrok-app.py +++ b/src/llm_datasets/viewer/ngrok-app.py @@ -2,12 +2,13 @@ # # For basic launch, run: # python ngrok.py +import asyncio import os -from pathlib import Path import sys -import asyncio, ngrok -import click +from pathlib import Path +import click +import ngrok from streamlit.web.bootstrap import run NGROK_PORT = int(os.environ.get("NGROK_PORT", "8501")) @@ -44,4 +45,9 @@ async def setup_tunnel(): asyncio.run(setup_tunnel()) # forward sys.argv -run(str(Path(__file__).parent / "app.py"), command_line=None, args=sys.argv[2:], flag_options={}) +run( + str(Path(__file__).parent / "app.py"), + command_line=None, + args=sys.argv[2:], + flag_options={}, +) diff --git a/tests/conftest.py b/tests/conftest.py index 38bcdb1..363dc23 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,8 @@ +import os +import random from pathlib import Path + import pytest -import random -import os TESTS_DIR = Path(__file__).parent FIXTURES_DIR = TESTS_DIR / "fixtures" diff --git a/tests/dummy_datasets.py b/tests/dummy_datasets.py index 026f42d..ce700d9 100644 --- a/tests/dummy_datasets.py +++ b/tests/dummy_datasets.py @@ -1,12 +1,10 @@ -from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.base import BaseDataset, BaseTextDataset from llm_datasets.datasets.dataset_registry import get_registered_dataset_classes from llm_datasets.utils.config import Config -class DummyBaseDataset(BaseDataset): - """ - A dummy dataset for debugging and unit tests. - """ +class DummyBaseDataset(BaseTextDataset): + """A dummy dataset for debugging and unit tests.""" DATASET_ID = None SOURCE_ID = "dummy" @@ -17,9 +15,7 @@ def get_output_rows_count(self, shuffled: bool = False) -> int: return self.SIZE def get_texts(self): - """ - Each dataset sample is string reflected the sample index, optinally with a datatset prefix. - """ + """Each dataset sample is string reflected the sample index, optinally with a datatset prefix.""" for i in range(self.SIZE): text = self.PREFIX + str(i) @@ -53,11 +49,11 @@ def save_texts_for_temp_datasets( for ds_cls in get_registered_dataset_classes( extra_dataset_registries=config.extra_dataset_registries, extra_dataset_classes=config.extra_dataset_classes, - use_default_registry=config.use_default_dataset_registry, + use_default_dataset_registry=config.use_default_dataset_registry, ): ds: BaseDataset = ds_cls( - output_dir=temp_dir, - shuffled_output_dir=temp_dir, + text_datasets_dir=temp_dir, + shuffled_datasets_dir=temp_dir, max_output_chunk_rows=max_output_chunk_rows, max_output_chunk_uncompressed_bytes=max_output_chunk_uncompressed_bytes, output_batch_size=output_batch_size, diff --git a/tests/fixtures/configs/dummy_config.yml b/tests/fixtures/configs/dummy_config.yml new file mode 100644 index 0000000..472ff91 --- /dev/null +++ b/tests/fixtures/configs/dummy_config.yml @@ -0,0 +1,2 @@ +# this is a dummy config for testing +seed: 42 \ No newline at end of file diff --git a/tests/fixtures/oscar_2301_texts_and_hashes.json b/tests/fixtures/oscar_2301_texts_and_hashes.json new file mode 100644 index 0000000..67b9e62 --- /dev/null +++ b/tests/fixtures/oscar_2301_texts_and_hashes.json @@ -0,0 +1 @@ +{"text": ["Eine lebendige Stadt, ist ein Ort, der dazu einl\u00e4dt, soziales Leben stattfinden zu lassen: Spielen, Freunde treffen, es sich gem\u00fctlich machen.\nHandel und Gewerbe zeichnen Bamberg aus. Die vielen inhabergef\u00fchrten L\u00e4den, die M\u00e4rkte und die zahlreichen Dienstleistungsbetriebe im Welterbe versorgen die Bamberger:innen und die Besucher:innen der Stadt.\nDie mitunter historischen Gartenanlagen, Parks und Gr\u00fcnfl\u00e4chen in und rund um das Welterbe herum bieten Raum f\u00fcr Naherholung und Ruhe und stellen einen wichtigen Kontrast zu bebauten Fl\u00e4chen dar.\nDas historische Stadtbild Bambergs ist nicht nur ein bedeutender touristischer Faktor, sondern auch Identit\u00e4tsstiftend.\nBamberg ist Kultur- und Bildungsstadt. Nicht nur die Universit\u00e4t pr\u00e4gt das Stadtbild ma\u00dfgeblich, auch auf zahlreiche kulturelle Leuchtt\u00fcrme wie das E.T.A. Hoffmann \u2013 Theater oder die Bamberger Symphoniker blickt die Stadtgesellschaft mit Stolz.\nWas beeintr\u00e4chtigt ein lebenswertes Bamberg?\nAutos verpesten nicht nur die Luft und sind laut, sie ben\u00f6tigen auch zu viel Platz, der im historischen Stra\u00dfenbild Bambergs sehr begrenzt zur Verf\u00fcgung steht. So entstehen Konflikte, die die Verkehrssicherheit beeintr\u00e4chtigen und soziales und kulturelles Leben in der Stadt verdr\u00e4ngen.\nSo sch\u00f6n das historische Welterbe auch ist, der Platz zwischen den H\u00e4usern ist nur einmal da: Die derzeitige Bevorzugung des Autos bedeutet zwangsl\u00e4ufig, wenig Gr\u00fcn, Fl\u00e4chenversiegelung, kaum Platz f\u00fcr Menschen und Kinder und all die weiteren Nutzungen der Stadt.\nWas muss sich f\u00fcr ein lebenswertes Bamberg \u00e4ndern?\nIn einem auch zuk\u00fcnftig lebenswertem Welterbe m\u00fcssen die verf\u00fcgbaren Fl\u00e4chen fair aufgeteilt werden. Die Dominanz des Autos muss zugunsten gemeinsam genutzter Verkehrfl\u00e4chen gebrochen werden. So entsteht Platz f\u00fcr mehr Gr\u00fcn, Menschen, Gastronomie und vieles mehr.\nDies muss Hand in Hand gehen, mit einem vielf\u00e4ltigen Mobilit\u00e4tsangebot, das alle Menschen mitnimmt, den verf\u00fcgbaren Raum ber\u00fccksichtigt und das klimavertr\u00e4glich gestaltet ist. Mobilit\u00e4t wird an den Bed\u00fcrfnissen der Menschen orientiert, nicht an einzelnen Verkehrsmitteln.", "Vor etwa einer Woche entschied ich mich dazu, einmal einen neuen Vermarkter f\u00fcr die Layer in der Galerie zu testen. Nach einigem Suchen kam ich zu euros4clicks. Warum dieser Anbieter? Nun, nach dem hin und her zwischen Layerads und Binlayer wollte ich einen g\u00e4nzlich andeen probieren. E4C wirbt auf der Homepage mit Verg\u00fctungen von 5-7 Euro. Toll, das w\u00e4re mehr als ich bei LA bekomme. Also angemeldet und die ersten Stunden voller Spannung auf die Statistik geschaut.\nDie ersen 2 Tage sah alles super aus, sch\u00f6n. Als ich dann nach dem 4. Tag erneut in den Statistikbereich schaute, da traute ich meinen Augen nicht. Die Einnahmen waren um nichteinmal 3\u20ac gestiegen. Die Verg\u00fctung wurde von E4C ohne Mitteilung auf 2 Euro herab gesetzt.\nMomentmal, da stand doch etwas von 5-7 Euro, warum nun 2? Anscheinend ist es so, dass unsere Webseite E4C nicht attraktiv genug ist. Ich habe daraufhin eine e-Mail an den Support geschrieben und um Details gebeten. Bisher habe ich darauf gar keine Antwort bekommen, nichts, nichteinmal einen Textblock.\nSoetwas verstehe ich nicht gerade unter Service oder Kundenbindung \u2013 und da bin ich doch von Layer-Ads anderes gewohnt.\nMein Fazit aufgrund der Erfahrungen also:\nE4C ist nicht Kundenfreundlich, senkt Verg\u00fcntungen ohne konkrete Begr\u00fcndung herab, reagiert nicht auf e-Mails \u2013 also eine erneute Mogelpackung? Ich kann hier leider keine Empfehlung aussprechen.\nSchlagw\u00f6rter bin layer, binlayer, e4c, euros4clicks, la, layer, layer ads, layerads, Vermarktung, Werbung", "Wenn ADA 30 Jahre alt wird, ist es wichtig, sich daran zu erinnern, dass es bei ADA um Inklusivit\u00e4t geht, nicht um Exklusivit\u00e4t. Hier sind einige Tipps f\u00fcr FMs, um das Gesetz einzuhalten.\nRelated Posts\nWhat to know concerning the new Texas abortion legislation\nLawsuit argues South Carolina college masks mandate ban violates\u2026\nNeighborhood organizations sue Mountain View for \u2018unconstitutional\u2019\u2026\nWussten Sie, dass Ihr Verkaufs- und Serviceschalter eine H\u00f6he von 36 Zoll (34 Zoll in Kalifornien) nicht \u00fcberschreiten darf? Wussten Sie, dass die meisten Rechtsstreitigkeiten in Bezug auf Barrierefreiheit auf Ihrem Parkplatz beginnen? Wussten Sie, dass zwischen Ihren Kleiderverkaufsregalen 36 Zoll erforderlich sind, um eine zug\u00e4ngliche Route aufrechtzuerhalten? Das Gesetz \u00fcber Amerikaner mit Behinderungen von 1990 (ADA) ist f\u00fcr alle Unternehmen von Bedeutung. Das Gesetz besagt, dass es illegal ist, \u201eWaren und Dienstleistungen f\u00fcr die \u00d6ffentlichkeit\u201c bereitzustellen, die auch f\u00fcr Menschen mit Behinderungen nicht leicht zug\u00e4nglich sind. Die ADA sch\u00fctzt die Rechte von Menschen mit Behinderungen in allen Aspekten der Besch\u00e4ftigung, beim Zugang zu \u00f6ffentlichen Dienstleistungen wie dem lokalen Busverkehr und bei der Gew\u00e4hrleistung des Zugangs zu Einrichtungen in Privatbesitz (auch als Orte \u00f6ffentlicher Unterk\u00fcnfte bekannt) wie Restaurants, Trinkgelegenheiten und Einzelhandelsgesch\u00e4ften , Hotels und sogar Nagelstudios (einschlie\u00dflich der bequemen Spa-Fu\u00dfst\u00fchle).\nHeute haben mehr als 60 Millionen Amerikaner eine dokumentierte Behinderung. Laut ADA National Network wird Behinderung als \u201ek\u00f6rperliche oder geistige Beeintr\u00e4chtigung, die eine oder mehrere wichtige Lebensaktivit\u00e4ten erheblich einschr\u00e4nkt\u201c definiert.\n(Behindertenparkplatz durch Picknicktische blockiert, Longwood, Florida; Bild von Susan Berry mit Disability Smart Solutions, Florida)\nTrotz des gestiegenen Bewusstseins und der Gesetzgebung sind Millionen von Menschen mit einer dokumentierten Behinderung immer noch mit Zug\u00e4nglichkeitsproblemen im Zusammenhang mit Verst\u00f6\u00dfen konfrontiert. Die ADA verbietet die Bereitstellung von Waren oder Dienstleistungen f\u00fcr die \u00d6ffentlichkeit, die f\u00fcr Menschen mit Behinderungen nicht zug\u00e4nglich sind. Es ist von entscheidender Bedeutung zu erkennen, dass der ADA f\u00fcr alle Gesch\u00e4ftstypen von Bedeutung ist. Eigent\u00fcmer von Immobilien und Unternehmen sowie Facility- und Leasingmanager sollten sich an die Einhaltung der ADA halten und sich der m\u00f6glichen gesch\u00e4ftlichen Auswirkungen von Verst\u00f6\u00dfen bewusst sein.\nZus\u00e4tzlich zu den traditionellen, legitimen Anspr\u00fcchen, die von betroffenen Personen geltend gemacht werden, sollten Immobilien- und Gesch\u00e4ftsinhaber sowie Facility- oder Leasingmanager die m\u00f6glichen Auswirkungen von Serienstreitigkeiten, Drive-by-Klagen und Cyber-Klagen aufgrund nicht konformer Elemente ber\u00fccksichtigen , Merkmale und Funktionen, die im Rahmen der ADA-Bestimmungen durchsetzbar sind. Abrechnungen k\u00f6nnen kostspielig und zeitaufw\u00e4ndig sein, Tausende von Dollar pro Versto\u00df kosten und sich schnell auf Millionen erh\u00f6hen. Leider hat sich dieser Trend in den letzten Jahren beschleunigt. Laut Acessible360 wurden im Jahr 2016 262 Bundesf\u00e4lle nur f\u00fcr die Barrierefreiheit von Websites eingereicht, und bis Ende 2020 stieg die Zahl auf mehr als 3.500 F\u00e4lle. Der Anstieg betraf zwischen 2019 und 2020 haupts\u00e4chlich Big Box- und Online-H\u00e4ndler.\n(Deaktivierte Zugangsschilder; Bild von https://disabilityspeaks.weebly.com/accessibility-fails.html)\nIn der Vergangenheit wurden h\u00e4ufig Zug\u00e4nglichkeitsklagen eingereicht, wenn behinderte Menschen auf physische Hindernisse stie\u00dfen, die den Zugang zu Waren und Dienstleistungen verhinderten. Heutzutage ergeben sich Zug\u00e4nglichkeitsklagen nicht nur aus pers\u00f6nlicher k\u00f6rperlicher Erfahrung, sondern k\u00f6nnen auch von Personen mit Anspr\u00fcchen auf pers\u00f6nlichen Gewinn betr\u00fcgerisch eingereicht werden. Immobilieneigent\u00fcmer, Immobilienverwalter und Gesch\u00e4ftsinhaber sind sich m\u00f6glicherweise potenzieller Verbindlichkeiten aus der Vielzahl verwirrender Zug\u00e4nglichkeitsbestimmungen f\u00fcr eine \u00f6ffentliche Unterkunftseinrichtung nicht bewusst (z. B. Geltungsbereich von ADA Titel I bis V, lokale Bauvorschriften, WCAG usw.).\nAls Geb\u00e4udeeigent\u00fcmer oder Facility Manager m\u00f6chten Sie den Titel III der ADA behalten, der Orte f\u00fcr \u00f6ffentliche Unterk\u00fcnfte und gewerbliche Einrichtungen regelt \u2013 nicht nur f\u00fcr den Bau neuer, sondern auch f\u00fcr bestehende Einrichtungen. Titel III sieht vor, dass architektonische Barrieren in bestehenden Einrichtungen beseitigt werden, es sei denn, dies ist \u201enicht ohne weiteres erreichbar\u201c.\nDie ADA definiert leicht erreichbar als \u201cleicht erreichbar und ohne gro\u00dfe Schwierigkeiten oder Kosten durchf\u00fchrbar\u201d.\nDar\u00fcber hinaus enth\u00e4lt Titel III eine Safe-Harbor-Bestimmung, die besagt, dass Teile einer Anlage, die vor dem 15. M\u00e4rz 2012 gebaut oder ge\u00e4ndert wurden und den Standards von 1991 entsprechen, nicht ge\u00e4ndert werden m\u00fcssen. Es gibt jedoch einige Einrichtungen, die nicht in der Safe-Harbor-Bestimmung enthalten sind. Diese schlie\u00dfen ein:\nWohneinrichtungen und Wohneinheiten\nFahrgesch\u00e4fte\nFreizeitschifffahrt\nGolfanlagen\nSpielbereiche\nSchwimmbecken\nBei allen Vorschriften und Ausnahmen ist es wichtig, einen geschulten Berater zu beauftragen, der Ihnen dabei helfen kann, festzustellen, wo sich Hindernisse in Ihrer Einrichtung befinden und ob diese leicht zu beseitigen sind. Es gibt jedoch einige Dinge, die Sie heute tun k\u00f6nnen, um Ihre Einrichtung zug\u00e4nglicher zu machen.\nWas Sie heute tun k\u00f6nnen\nIhre Parkpl\u00e4tze sollten eine Neigung von nicht mehr als 2,08 Prozent haben. Die Steigungen der Fahrbahn k\u00f6nnen sich mit Temperaturschwankungen \u00e4ndern. Daher kann das Klima bei Ihrem n\u00e4chsten Parkplatzwechsel oder Ihrer n\u00e4chsten Reparatur eine wichtige Rolle spielen.\nBordsteinkanten d\u00fcrfen nicht mehr als 8,33 Prozent betragen, und die Bordsteinlandungen m\u00fcssen eben sein. Bordsteinrampen sind auch wichtig, um sicherzustellen, dass Ihr Geb\u00e4ude f\u00fcr Rollstuhlfahrer zug\u00e4nglich ist.\nStellen Sie sicher, dass der \u00f6ffentliche Zugang zur Einrichtung einen konformen B\u00fcrgersteig bietet.\nAuf dieser Website finden Sie die ADA-Standards von 1991 oder die ADA-Standards von 2010.\nDie ADA trat vor 30 Jahren in Kraft, aber die Welt der Barrierefreiheit ver\u00e4ndert sich noch heute, da Fachleute ein besseres Verst\u00e4ndnis erlangen und all die verschiedenen Vorschriften und B\u00fcrgerrechtsgesetze in ihre Praktiken integrieren. Es ist wichtig, einen Fachmann zu beauftragen, um durch das Labyrinth der Barrierefreiheit zu navigieren und zu verstehen, wie ein Standort oder Geb\u00e4ude ordnungsgem\u00e4\u00df umrissen werden kann, um Ressourcen zu sch\u00fctzen und kostspielige Vergleiche oder Rechtsstreitigkeiten zu vermeiden. Kenntnisse und Vorbereitung helfen Immobilienbesitzern, Gesch\u00e4ftsinhabern und Facility Managern, die Anforderungen an die Barrierefreiheit zu erf\u00fcllen und gleichzeitig Rechtsstreitigkeiten zu vermeiden. Wir m\u00fcssen verstehen, dass es um Inklusion und nicht um Exklusion geht. Bei der Barrierefreiheit geht es darum, das Richtige zu tun, und die Nichteinhaltung von Vorschriften kann kostspielig sein. Wenn Sie Waren und Dienstleistungen in einer permanenten Einrichtung f\u00fcr die \u00d6ffentlichkeit bereitstellen oder Online-Dienste anbieten, ergreifen Sie jetzt die Initiative, w\u00e4hrend Sie Ihr finanzielles Wohlergehen sch\u00fctzen und sich daf\u00fcr einsetzen, dass alle zug\u00e4nglich sind.\nPhillip Chuor, CASP Nr. 708, ADAC, ICC-PE / BI, TCI-CI ist ein Senior Accessibility- und ADA-Spezialist mit Sitz in Terracons B\u00fcro in Nashville. Registriert und lizenziert als California Certified Access Specialist (CASp) und national registriert als ADA Coordinator (ADAC). Er verf\u00fcgt \u00fcber mehr als 20 Jahre Erfahrung als leitender Pr\u00fcfer f\u00fcr Baupl\u00e4ne, Inspektor f\u00fcr Kombinationscodes, Entwurf von Wohn- und Gesch\u00e4ftsgeb\u00e4uden, Bau von Energie- und Green-Codes sowie Beratung f\u00fcr Bauvorschriften.\nEine kurze Geschichte der Behindertenrechte: Wie sind wir heute gekommen?\nDie Behindertenrechtsbewegung begann bereits im 19. Jahrhundert. Hier sind einige wichtige Daten in der Entwicklung dieser Bewegung:\n1817 wurde in Hartford, Connecticut, die American School for the Deaf gegr\u00fcndet. Dies war die erste Schule f\u00fcr Kinder mit Behinderungen auf der westlichen Hemisph\u00e4re.\n1919 wurde eine gemeinn\u00fctzige Organisation namens National Society for Crippled Children, auch bekannt als Easter Seals oder Easterseals, entwickelt, um auf die Bed\u00fcrfnisse von Menschen mit Behinderungen einzugehen und ihnen zu helfen, ihr volles Potenzial auszusch\u00f6pfen.\n1935 wurde die Liga der K\u00f6rperbehinderten in New York City von der Works Progress Administration (WPA) gegr\u00fcndet. Sp\u00e4ter wurde das Gesetz \u00fcber soziale Sicherheit zum US-amerikanischen Gesetz, das staatlich finanzierte Altersleistungen und Mittel f\u00fcr Staaten zur Unterst\u00fctzung blinder Menschen und behinderter Kinder bereitstellt.\n1961 wurde das American National Standard Institute (ANSI) ver\u00f6ffentlicht, das bis heute in Gebrauch ist. ANSI \u00fcberwacht eine Vielzahl von Standards, die sich mit sozialer Verantwortung in der gebauten Umwelt befassen.\n1964 verabschiedete der US-Kongress das Gesetz 88-352 (bekannt als Titel VI des Civil Rights Act von 1964 (42 USC \u00a7 2000d ff.), Das Diskriminierung aufgrund von Rasse, Hautfarbe, Religion, Geschlecht oder nationaler Herkunft verbietet Das Gesetz enth\u00e4lt auch Bestimmungen \u00fcber die Rasse bei der Einstellung, Bef\u00f6rderung und Entlassung.\n1968 wurde das Architectural Barriers Act (ABA) in den USA gesetzlich vorgeschrieben und forderte, dass alle Geb\u00e4ude in Bundesbesitz und gemietet, die f\u00fcr die \u00d6ffentlichkeit bestimmt sind, f\u00fcr behinderte Menschen zug\u00e4nglich sind.\n1972 entschied das US-Bezirksgericht f\u00fcr den District of Columbia in der Rechtssache Mills gegen Board of Education des District of Columbia, dass jedes Kind, unabh\u00e4ngig von Art und Schweregrad seiner Behinderung, Anspruch auf eine kostenlose \u00f6ffentliche Bildung hat.\n1973 verbot das Rehabilitationsgesetz die Diskriminierung aufgrund einer Behinderung in Programmen, die von Bundesbeh\u00f6rden angeboten wurden, in Programmen, die finanzielle Unterst\u00fctzung des Bundes erhalten, in Bundesbesch\u00e4ftigung und in der Besch\u00e4ftigung von Bundesunternehmern.\nIm Jahr 1984 wurden die Uniform Federal Accessibility Standards (UFAS) entwickelt, in denen der Geltungsbereich und die technischen Anforderungen festgelegt wurden, die erstmals im Architectural Barriers Act von 1968 gefordert wurden.\n1988 wurde das Gesetz \u00fcber faires Wohnen von 1968 ge\u00e4ndert, um Menschen mit Behinderungen vor Diskriminierung aufgrund von Wohnverh\u00e4ltnissen in den Bereichen Vermietung, Verkauf und Finanzierung zu sch\u00fctzen, wie im B\u00fcrgerrechtsgesetz von 1968 dargelegt. Die \u00c4nderung f\u00fcgte hinzu, dass angemessene \u00c4nderungen an vorgenommen werden m\u00fcssen Bestehende Geb\u00e4ude und Zug\u00e4nglichkeit mussten in den Bau neuer Mehrfamilienh\u00e4user und -entwicklungen einbezogen werden. 1991 wurden dann die Richtlinien f\u00fcr die Barrierefreiheit von Wohnungen entwickelt, um den Geltungsbereich und die technischen Kriterien f\u00fcr die Einhaltung der FHA festzulegen.\n1990 wurde das Gesetz \u00fcber Amerikaner mit Behinderungen (ADA) zum Gesetz und bot Menschen mit Behinderungen einen umfassenden Schutz der B\u00fcrgerrechte. Die ADA wurde nach dem Civil Rights Act modelliert. Section 504 des Gesetzes wurde zur umfassendsten Gesetzgebung zu Behindertenrechten in der amerikanischen Geschichte. Die ADA hat vorgeschrieben, dass alle lokalen, staatlichen und f\u00f6deralen Regierungen und Programme zug\u00e4nglich sein m\u00fcssen. Die ADA ist ein f\u00f6derales B\u00fcrgerrechtsgesetz, keine Bauordnung. Das Gesetz ist einfach in f\u00fcnf wichtige Titel unterteilt: Titel I \u2013 Besch\u00e4ftigung, Titel II \u2013 Staat und Kommunalverwaltung, Titel III \u2013 Orte \u00f6ffentlicher Unterk\u00fcnfte und gewerblicher Einrichtungen, Titel IV \u2013 Telekommunikation und Titel V \u2013 Verschiedenes.\n1991 entwickelten das US-Justizministerium (DOJ) und das US-Verkehrsministerium (DOT) in zwei getrennten Dokumenten jeweils einen ADA-Standard (ADAS) f\u00fcr barrierefreies Design, der den Umfang und die technischen Anforderungen f\u00fcr die Umsetzung des ADA von 1990 festlegte. Beide Das DOJ und das DOT haben die ADAAG (Americans with Disabilities Act Accessible Guidelines) als Standards f\u00fcr ADA-Titel III f\u00fcr Neubauten und \u00c4nderungen \u00fcbernommen.\n1994 wurde die Einheitliche Bauordnung als erste Bauordnung mit Konzepten der ADAS-Bestimmungen zur technischen Zug\u00e4nglichkeit f\u00fcr Neubauten und Umbauten versehen. Die Bauvorschriften werden von der lokalen und / oder staatlichen Regierung im Dreijahresrhythmus offiziell verabschiedet.\nSchlie\u00dflich ver\u00f6ffentlichte das Justizministerium am 15. September 2010 \u00dcberarbeitungen der Bestimmungen des ADA-Titels II und des ADA-Titels III von 1990, die im Bundesregister aufgef\u00fchrt sind. In den Vorschriften wurden die neu \u00fcberarbeiteten, neu formatierten und durchsetzbaren Barrierefreiheitsstandards \u00fcbernommen, die wir jetzt als \u201cAmericans with Disabilities Act Standards\u201d (ADAS) f\u00fcr barrierefreies Design von 2010 bezeichnen. Am 15. M\u00e4rz 2012 trat es f\u00fcr Neubauten und \u00c4nderungen unter Titel II und Titel III in Kraft.", "Mit dem Zugriff auf \u201eEXPATS FORUM\u201c (\u201ehttp://expat.bplaced.net/forum\u201c) wird zwischen dir und dem Betreiber ein Vertrag mit folgenden Regelungen geschlossen:\n1. Nutzungsvertrag\nMit dem Zugriff auf \u201eEXPATS FORUM\u201c (im Folgenden \u201edas Board\u201c) schlie\u00dft du einen Nutzungsvertrag mit dem Betreiber des Boards ab (im Folgenden \u201eBetreiber\u201c) und erkl\u00e4rst dich mit den nachfolgenden Regelungen einverstanden.\nWenn du mit diesen Regelungen nicht einverstanden bist, so darfst du das Board nicht weiter nutzen. F\u00fcr die Nutzung des Boards gelten jeweils die an dieser Stelle ver\u00f6ffentlichten Regelungen.\nDer Nutzungsvertrag wird auf unbestimmte Zeit geschlossen und kann von beiden Seiten ohne Einhaltung einer Frist jederzeit gek\u00fcndigt werden.\n2. Einr\u00e4umung von Nutzungsrechten\nMit dem Erstellen eines Beitrags erteilst du dem Betreiber ein einfaches, zeitlich und r\u00e4umlich unbeschr\u00e4nktes und unentgeltliches Recht, deinen Beitrag im Rahmen des Boards zu nutzen.\nDas Nutzungsrecht nach Punkt 2, Unterpunkt a bleibt auch nach K\u00fcndigung des Nutzungsvertrages bestehen.\n3. Pflichten des Nutzers\nDu erkl\u00e4rst mit der Erstellung eines Beitrags, dass er keine Inhalte enth\u00e4lt, die gegen geltendes Recht oder die guten Sitten versto\u00dfen. Du erkl\u00e4rst insbesondere, dass du das Recht besitzt, die in deinen Beitr\u00e4gen verwendeten Links und Bilder zu setzen bzw. zu verwenden.\nDer Betreiber des Boards \u00fcbt das Hausrecht aus. Bei Verst\u00f6\u00dfen gegen diese Nutzungsbedingungen oder anderer im Board ver\u00f6ffentlichten Regeln kann der Betreiber dich nach Abmahnung zeitweise oder dauerhaft von der Nutzung dieses Boards ausschlie\u00dfen und dir ein Hausverbot erteilen.\nDu nimmst zur Kenntnis, dass der Betreiber keine Verantwortung f\u00fcr die Inhalte von Beitr\u00e4gen \u00fcbernimmt, die er nicht selbst erstellt hat oder die er nicht zur Kenntnis genommen hat. Du gestattest dem Betreiber, dein Benutzerkonto, Beitr\u00e4ge und Funktionen jederzeit zu l\u00f6schen oder zu sperren.\nDu gestattest dem Betreiber dar\u00fcber hinaus, deine Beitr\u00e4ge abzu\u00e4ndern, sofern sie gegen o. g. Regeln versto\u00dfen oder geeignet sind, dem Betreiber oder einem Dritten Schaden zuzuf\u00fcgen.\n4. General Public License\nDu nimmst zur Kenntnis, dass es sich bei phpBB um eine unter der \u201eGNU General Public License v2\u201c (GPL) bereitgestellten Foren-Software von phpBB Limited (www.phpbb.com) handelt; deutschsprachige Informationen werden durch die deutschsprachige Community unter www.phpbb.de zur Verf\u00fcgung gestellt. Beide haben keinen Einfluss auf die Art und Weise, wie die Software verwendet wird. Sie k\u00f6nnen insbesondere die Verwendung der Software f\u00fcr bestimmte Zwecke nicht untersagen oder auf Inhalte fremder Foren Einfluss nehmen.\n5. Gew\u00e4hrleistung\nDer Betreiber haftet mit Ausnahme der Verletzung von Leben, K\u00f6rper und Gesundheit und der Verletzung wesentlicher Vertragspflichten (Kardinalpflichten) nur f\u00fcr Sch\u00e4den, die auf ein vors\u00e4tzliches oder grob fahrl\u00e4ssiges Verhalten zur\u00fcckzuf\u00fchren sind. Dies gilt auch f\u00fcr mittelbare Folgesch\u00e4den wie insbesondere entgangenen Gewinn.\nDie Haftung ist gegen\u00fcber Verbrauchern au\u00dfer bei vors\u00e4tzlichem oder grob fahrl\u00e4ssigem Verhalten oder bei Sch\u00e4den aus der Verletzung von Leben, K\u00f6rper und Gesundheit und der Verletzung wesentlicher Vertragspflichten (Kardinalpflichten) auf die bei Vertragsschluss typischerweise vorhersehbaren Sch\u00e4den und im \u00fcbrigen der H\u00f6he nach auf die vertragstypischen Durchschnittssch\u00e4den begrenzt. Dies gilt auch f\u00fcr mittelbare Folgesch\u00e4den wie insbesondere entgangenen Gewinn.\nDie Haftung ist gegen\u00fcber Unternehmern au\u00dfer bei der Verletzung von Leben, K\u00f6rper und Gesundheit oder vors\u00e4tzlichem oder grob fahrl\u00e4ssigem Verhalten des Betreibers auf die bei Vertragsschluss typischerweise vorhersehbaren Sch\u00e4den und im \u00dcbrigen der H\u00f6he nach auf die vertragstypischen Durchschnittssch\u00e4den begrenzt. Dies gilt auch f\u00fcr mittelbare Sch\u00e4den, insbesondere entgangenen Gewinn.\nDie Haftungsbegrenzung der Abs\u00e4tze a bis c gilt sinngem\u00e4\u00df auch zugunsten der Mitarbeiter und Erf\u00fcllungsgehilfen des Betreibers.\nAnspr\u00fcche f\u00fcr eine Haftung aus zwingendem nationalem Recht bleiben unber\u00fchrt.\n6. \u00c4nderungsvorbehalt\nDer Betreiber ist berechtigt, die Nutzungsbedingungen und die Datenschutzerkl\u00e4rung zu \u00e4ndern. Die \u00c4nderung wird dem Nutzer per E-Mail mitgeteilt.\nDer Nutzer ist berechtigt, den \u00c4nderungen zu widersprechen. Im Falle des Widerspruchs erlischt das zwischen dem Betreiber und dem Nutzer bestehende Vertragsverh\u00e4ltnis mit sofortiger Wirkung.\nDie \u00c4nderungen gelten als anerkannt und verbindlich, wenn der Nutzer den \u00c4nderungen zugestimmt hat.\nInformationen \u00fcber den Umgang mit deinen pers\u00f6nlichen Daten sind in der Datenschutzerkl\u00e4rung enthalten.", "Am 19.11.2022 stand f\u00fcr die Gr\u00fcn-Wei\u00dfen das Spiel gegen den direkten Tabellennachbarn Ortrand an. In dieser Partie duellierten sich die beiden letzten Pl\u00e4tze der aktuellen Saison. Da die Mannschaft von Ortrand dieses Jahr noch keinen Sieg einfahren konnte, wollten wir nat\u00fcrlich nicht die ersten Gegner sein, die Punkte abgeben. Dabei ging es mit einer voll besetzten Bank sowie einer gut gef\u00fcllten Halle in die Partie.\nDie erste Halbzeit begann f\u00fcr beide Vereine ziemlich schlecht. Es wurden schlechte W\u00fcrfe aus dem R\u00fcckraum genommen und die Torh\u00fcter hatten nicht viel zu tun. Somit stand es nach sieben Minuten gerade einmal 2:2, wobei jede Mannschaft bereits einen 7-Meter verwandelte. Im Anschluss ging es in \u00e4hnlichem Tempo weiter und Plessa und Ortrand tauschten Tor um Tor. Durch gutes R\u00fcckzugsverhalten von Ortrand war es f\u00fcr die M\u00e4nner aus Plessa schwer die gehaltenen B\u00e4lle in Konter umzuwandeln. Wir mussten immer wieder aus dem gebundenen Spiel eine L\u00f6sung finden. Auf Grund von Fehlw\u00fcrfen und Paraden auf beiden Seiten erarbeiteten sich die G\u00e4ste in der 21. Minute eine F\u00fchrung von 6:8. Nach unserem Team-Time-Out wurde der Angriff umgestellt, mit zwei Kreisl\u00e4ufern sollte versucht werden, die gegnerische Abwehr vor neue Aufgaben zu stellen. Mit einem einfachen Kleingruppenspiel konnte dann der Abschluss \u00fcber Au\u00dfen oder Kreis erfolgen und brachte und innerhalb von einer Minuten den Ausgleich zum 8:8. Die Abwehr legte ebenfalls einen Gang zu und unterbrach das Aufbauspiel von Ortrand zeitnah. Auch die Auszeit der G\u00e4ste in der 23. Minute konnte unseren Lauf nicht stoppen. Mit einem Konter sowie gut ausgespielten Offensivaktionen f\u00fchrten wir zur Halbzeit mit 12:9.\nIn die zweite H\u00e4lfte wollten wir so starten, wie wir zum Ende der vorherigen Halbzeit aufgeh\u00f6rt hatten. Einfache B\u00e4lle an unsere Kreisl\u00e4ufer oder ein Abschluss \u00fcber Au\u00dfen. Leider hatte sich Ortrand nach der Pause gut auf unsere Angriffsformation eingestellt und machte es den Gr\u00fcn-Wei\u00dfen nun schwerer. Bis zur 38. Minute gelangen uns weder vorne, noch hinten gute Aktionen und Ortrand holte sich mit dem 13:15 die F\u00fchrung zur\u00fcck. In unserem Angriff folgte ein Fehlwurf dem n\u00e4chsten, in der Defensive stand Plessa nicht kompakt genug und Paraden gab es genauso wenig. Der kurze Einbruch hat die gesamte Partie bis zum Ende spannend gehalten. \u00dcber die Spielst\u00e4nde 16:16 (40. Minute), 19:20 (50. Minute) und 22:22 (58. Minute) tauschten die Vereine Tore auf Augenh\u00f6he. Hierbei machte sich bei den Gr\u00fcn-Wei\u00dfen wieder bemerkbar, dass man sich dem Spielstil des Gegners anpasste und wenig selbst gestaltete. Am Ende hat der HVP den letzten Angriff des SV Eintracht Ortrand parieren k\u00f6nnen, sodass am Ende mit einem Stand von 24:23 die zwei Punkte in der heimischen Halle behalten werden konnten.\nDer Start war wieder gepr\u00e4gt von Fehlern, gerade im Angriff. Es wurde kaum ein schnelles Spiel von beiden Mannschaften in Erw\u00e4gung gezogen, da die Abwehrreihen z\u00fcgig zur\u00fcck waren. Die Umstellung im Angriff hat Ortrand in der ersten H\u00e4lfte \u00fcberrascht und vor neue Herausforderungen gestellt. Nach der Pause hat der HVP den erarbeiteten Vorsprung leichtsinnig hergegeben und somit fast die Partie verschenkt. Es folgte ein insgesamt ebenb\u00fcrtiger Schlagabtausch bis zur letzten Minute. Zum Schluss belohnten sich die Plessaer M\u00e4nner mit einem \u201eHappy End\u201c.\nAls n\u00e4chstes steht die Partie ausw\u00e4rts gegen Bad Liebenwerda II am 3.12.2022 an.\nHV Plessa: Tom Hauwetter (TW); Andr\u00e9 P\u00f6tsch; Jonas Siegemund (8); Sven Hietzke; Mario G\u00e4rtner; Sebastian Haupt (2); Lukas Alkier; Robert Strehlow; Tom B\u00f6ttger (6/2); Dave Hartig; Cedric B\u00e4r (2); Chris Hasenbein (4); Steven Poppe (1)", "Br\u00fccken bauen f\u00fcr ein Gemeindefest in M\u00f6serAm 27. Februar, 18.00 Uhr treffen sich engagierte B\u00fcrger der Ortschaft M\u00f6ser, die die Initiatoren f\u00fcr ein neues Gemeindefest sind. Die Konzeption f\u00fcr das Fest soll vorbildhaft f\u00fcr zuk\u00fcnftige Events in der Gemeinde gestaltet werden und soll zum Nachahmen einladen. Dabei werden derzeit Themen wie die Beteiligung m\u00f6glichst vieler B\u00fcrger, Vereine und Unternehmen diskutiert. Nat\u00fcrlich auch der Umfang eines Festwochenendes und was die M\u00f6seraner und G\u00e4ste aus der Region anlockt und die Tage zu einem echten Erlebnis werden l\u00e4sst. Und nicht zuletzt wird \u00fcber das Geld gesprochen: Was k\u00f6nnen wir uns leisten? Wer sind unsere Unterst\u00fctzer?\n21. Februar 2018\nBr\u00fccken bauen f\u00fcr ein Gemeindefest in M\u00f6ser\nAm 27. Februar, 18.00 Uhr treffen sich engagierte B\u00fcrger der Ortschaft M\u00f6ser, die die Initiatoren f\u00fcr ein neues Gemeindefest sind. Die Konzeption f\u00fcr das Fest soll vorbildhaft f\u00fcr zuk\u00fcnftige Events in der Gemeinde gestaltet werden und soll zum Nachahmen einladen.\nDabei werden derzeit Themen wie die Beteiligung m\u00f6glichst vieler B\u00fcrger, Vereine und Unternehmen diskutiert. Nat\u00fcrlich auch der Umfang eines Festwochenendes und was die M\u00f6seraner und G\u00e4ste aus der Region anlockt und die Tage zu einem echten Erlebnis werden l\u00e4sst. Und nicht zuletzt wird \u00fcber das Geld gesprochen: Was k\u00f6nnen wir uns leisten? Wer sind unsere Unterst\u00fctzer?", "2 \u2013 schiffige Hallenkirche mit hohem s\u00fcdlichen Hauptschiff und kleinerem Nordschiff; eingezogener 3 \u2013 geschossiger Bruchstein \u2013 Westturm, Eckquaderung ab dem 2. Stockwerk, spitzbogige Zwillingsarkaden mit Ma\u00dfwerk im Glockengescho\u00df, hoher 8 \u2013 eckiger Helm \u00fcber profiliertem Werksteintraufgesims; moderne Backsteinvorhalle; s\u00fcdliche Schiffwand bis Kaffgesims der Strebepfeiler aus Bruchstein, dar\u00fcber in Backstein erneuert, 4 Joche mit spitzbogigen Ma\u00dfwerkfenstern;\n3 / 8 \u2013 Chorschlu\u00df; n\u00f6rdliches Seitenschiff in den \u00f6stlichen Teilen bis Traufh\u00f6he Bruchstein, ansonsten in Backstein erneuert; Hauptschiff Satteldach, Seitenschiff querliegende Walmd\u00e4cher; innen 2 \u2013 schiffige Halle mit gleich hohen Kreuzrippengew\u00f6lben, auf Konsolen an der S\u00fcdseite, an der Nordwand Trennung der Schiffe durch spitzbogige Arkaden auf Rundpfeilern, 8 \u2013 eckiger Sockel, 8 \u2013 eckiger K\u00e4mpfer, an der Ostseite des Seitenschiffe stark verwittertes Fresko der Hl. Katharina; Alt\u00e4re, Beichtst\u00fchle, Konsolfiguren, Chorgest\u00fchl und Hauptaltar 19. Jh.,\nKanzel datiert 1512; \u00fcber Sakristeieingang Grablegung, A. 17. Jh.; im Clemen erw\u00e4hnter Paramentenschrank kriegszerst\u00f6rt; in der Nordwand des Chores eingesetzt Sakramentsnische des 15. Jh. aus Sandstein mit erneuerter T\u00fcr des 19. Jh.; im Kirchenschiff Kronleuchter um 1600, Messing mit 12 Armen, als Aufsatz Muttergottes mit Kind; im Seitenschiff auf Konsole der Hl. Michael als Bezwinger des Teufels, 2. H. 18. Jh., Ton bemalt; im Hauptschiff Standfigur auf Konsole der Hl. Barbara, m\u00f6glicherweise 15. Jh., Holz farbig gefa\u00dft; Standfigur des Hl. Hubertus, wohl 17. Jh., farbig gefa\u00dft; im Chor Standfigur auf Konsole des Hl. Kornelius im Papstornat, 18. Jh., Holz neu gefa\u00dft; im westlichen Teil der Kirche Einbau einer Orgelempore, E. 19. Jh., auf gusseisernen S\u00e4ulen mit Blausteinpodesten;\nZugeh\u00f6riger Kirchhof mit in die Mauer eingelassenen Blaustein \u2013 Grabkreuzen des 17. und 18. Jh.\nBedeutend f\u00fcr die Geschichte des Menschen, erhaltenswert aus k\u00fcnstlerischen, wissenschaftlichen, besonders architektur \u2013 und ortsgeschichtlichen sowie st\u00e4dtebaulichen Gr\u00fcnden.", "Dann sagte er zu ihnen: Geht hinaus in die ganze Welt, und verk\u00fcndet das Evangelium allen Gesch\u00f6pfen! Mk 16,15\nWie sehe wohl unsere Welt aus, h\u00e4tten die J\u00fcnger nach Jesu Tod geschwiegen und die Botschaft nicht weitergetragen? Wie sehe wohl unser Pfarrleben aus, g\u00e4be es nicht ein Team, dass alle Informationen, Termine und Mitteilungen verbreitet, und zwar mit den unterschiedlichsten Medien:\nAls Nachbarpfarren teilen wir uns mit der Pfarre St. Martin nicht nur den Pfarrer sondern auch den PFARRBOTEN. Seit 2017 erhalten alle Bewohner beider Pfarren viertelj\u00e4hrlich die wichtigsten Informationen direkt in den Postkasten. Pfarrboten verlegt oder nicht erhalten? Auch online kann nachgelesen werden\u2026\nUm die Inhalte der SCHAUK\u00c4STEN und der PINW\u00c4NDE in der Pfarrkirche k\u00fcmmert sich Pfarrsekret\u00e4rin Angelika Burgstaller. Dort werden w\u00f6chentlich Gottesdienstordnung und Verlautbarungen bekanntgegeben, Veranstaltungen beworben, zu Festen und Feiern eingeladen, mit Fotocollagen \u00fcber Vergangenes berichtet. (Mail: pfarre.neumarkt@aon.at)\nDie HOMEPAGE wird von Susanne Pichelmann betreut. (Mail: pichelmann@gmx.at)\nAuch auf FACEBOOK ist die Pfarre vertreten. Anna Fromhund k\u00fcmmert sich um aktuelle Infos und Posts, damit alle Facebook-Freunde immer auf dem Laufenden sind.\nTeammitglieder\nHildegard Dorninger, Anna Fromhund, Julia Burgstaller, Angelika Burgstaller, Roman Dachsberger und Susanne Pichelmann\nLinks\nPfarrbote\nFacebook\nDie Vielfalt und Professionalit\u00e4t unserer \u00d6ffentlichkeitsarbeit wurde 2018 beim Pfarrmedienwettbewerb der Di\u00f6zese St. P\u00f6lten ausgezeichnet! Vier Kategorien, 100 Einreichungen und der 2. Platz (sowie \u20ac 1000,-) f\u00fcr unsere Pfarre in der Kategorie \u201cGesamtkonzept\u201d! Die Gesamtheit (Pfarrbote, Fotocollagen, Homepage,\u2026) und die Vernetzung der einzelnen Medien wurde bei der Einreichung von Hildegard Dorninger besonders hervorgehoben.", "Sie g\u00f6nnen sich regelm\u00e4\u00dfig Wellness oder sind ein Fan von Strandurlaub in s\u00fcdlichen Gefilden? Dann ist f\u00fcr Sie der Kauf von Badeschuhen eine wirklich sinnvolle Anschaffung. In Saunen, am Pool und in Schwimmb\u00e4dern sch\u00fctzt man sich damit vor unangenehmen Krankheiten und Infektionen wie Fu\u00dfpilz. Das Tragen von Badeschuhen in Wassern\u00e4he ist nicht nur aus hygienischen Gr\u00fcnden empfehlenswert. Zum Gl\u00fcck sind die meisten Modelle heutzutage obendrein rutschfest. So vermeiden Sie unwillkommene Verletzungen durch Ausrutschen.\nF\u00fcr Ihren n\u00e4chsten Urlaub am Meer geh\u00f6ren Ihre neuen Badeschuhe sinnvollerweise in den Koffer. Betreten Sie den Traumstrand von Ihrem ausgew\u00e4hlten Urlaubsort mit Badeschuhen, sind Sie vor dem hei\u00dfen Sand, achtlos entsorgten Glasscherben und scharfkantigen Steinen bestens gesch\u00fctzt. Des Weiteren bewahren Sie Ihre F\u00fc\u00dfe beim erfrischenden Bad im Meer vor schmerzhaften Erfahrungen mit Meerestieren wie Seeigeln, Krebsen und Quallen. Au\u00dferdem verhindern Ihre Badeschuhe l\u00e4stige Absch\u00fcrfungen und Schrammen beim Besteigen von kantigen Felsen und spitzen Korallenriffen.\nMehrere Modelle im Angebot \u2013 modische Badeschuhe f\u00fcr Damen\nEntscheiden Sie sich f\u00fcr den Kauf von neuen Badeschuhen, bietet der Einzelhandel der modernen Frau von heute eine vielf\u00e4ltige Auswahl. Geschickt k\u00f6nnen Sie nach Art der Nutzung und Ihrem Geschmack ausw\u00e4hlen, erh\u00e4ltlich sind die verschiedensten Muster und Farben.\nAquaschuhe sind f\u00fcr alle Strandaktivit\u00e4ten und Wassersportarten speziell Schwimmen, Schnorcheln, Tauchen und Surfen optimal geeignet. Diese Badeschuhe sind geschlossen und verhindern daher jegliches Eindringen von Wasser und anderen Fremdk\u00f6rpern. Atmungsaktiv unterbinden Sie idealerweise das Schwitzen von Ihrem Fu\u00df.\nBadesandalen sind inzwischen in jedem Schwimmbad, in Saunen und in Wellnesscentern eine hygienische Notwendigkeit. Die Badesandale ist nicht f\u00fcr die Benutzung im Wasser geeignet, sondern dient als Schutz gegen Keime und Infizierungen. Dieser Badeschuh ist sehr schlichtes, doch durchaus bequemes Modell, entweder versehen mit einem breiten Riemchen oder einer Stange zwischen den Zehen. Durch seine Rutschfestigkeit verhindert die Badesandale die Gefahr des Ausrutschens. Eine weitere erfreuliche Annehmlichkeit ist das extrem schnelle An- und Ausziehen.\nBadeschuhe f\u00fcr Damen \u2013 wichtige Informationen vor dem Kauf\nDie richtige Schuhgr\u00f6\u00dfe ist beim Kauf von Wassersportschuhen entscheidend, da sie sehr gut am Fu\u00df sitzen m\u00fcssen. Bei Freiraum in diesem Schuh wird durch Wasseransammlung die Bewegungsf\u00e4higkeit eingeschr\u00e4nkt. Sitzt der Badeschuh zu locker, geht er im Wasser sehr schnell verloren.\nBadeschuhe werden aus verschiedenen Materialien hergestellt. F\u00fcr den Einsatz im Wasser werden \u00fcberwiegend Wassersportschuhe aus flexiblen Materialien empfohlen. Kauft man den Badeschuh f\u00fcr das Laufen am Strand oder im Schwimmbad sind im Besonderen Schuhe aus festeren Materialien gut geeignet.", "Seit August 2005 sind die Deutsche Schule Lunden und der Deutsche Kindergarten Lunden unter dem Namen Kindercampus Lunden zu einer Institution fusioniert.\nDer Kindercampus liegt harmonisch eingebettet zwischen Wiesen und Feldern und bietet durch das gro\u00dfe Gel\u00e4nde mit eigenem Wald und Schulgarten viele Anreize zum naturnahen Spielen und Lernen.\nDie Schulabteilung ist mit einer Kinderzahl von 20\u201325 eine \u00fcberschaubare Einheit, in der Kinder, Lehrer und Eltern einen engen Kontakt zur Schule, zum Kindergarten und untereinander pflegen k\u00f6nnen. In der Schule arbeiten wir sowohl im Klassenunterricht als auch in jahrgangs\u00fcbergreifenden Lerngruppen. Wir lernen h\u00e4ufig an Projekten. In der 1.-4. Klasse gibt es einmal in der Woche einen regelm\u00e4\u00dfigen Projekttag. Die Lehrpl\u00e4ne sind mit den \u00f6ffentlichen \"F\u00e6lles M\u00e5l\" sowie mit den Lehrpl\u00e4nen in Schleswig-Holstein abgestimmt. Unterrichtssprache ist deutsch. Besonders am Herzen liegt uns die F\u00f6rderung des Lesens.\nUnser Kindergarten gibt den Kindern verl\u00e4ssliche Partner, ein anregendes Umfeld und Raum zum Wachsen, Spielen und Lernen. Die gr\u00f6\u00dferen Kinder nehmen im Schulclub regelm\u00e4\u00dfig an gemeinsamen Projekten mit den Vorschulkindern teil. Durch einen spielerischen Einstieg in das eigenst\u00e4ndige Lernen f\u00e4llt der \u00dcbergang in die Schule leicht.\nEin besonderer Vorzug unserer Einrichtung ist die w\u00f6chentliche Fahrt zum Schwimmunterricht, bei dem wir auch den Kindergarten einbeziehen.\nAm Nachmittag bietet unsere SFO eine abwechslungsreiche Freizeitbetreuung von Sch\u00fclern bis zur 3. Klasse.\nEs gibt vielf\u00e4ltige Pausen- und Freizeitangebote, u.a. Tischtennis, Tischfu\u00dfball, Benutzung der Bibliothek in den Pausen sowie Klassenfahrten, Ausfl\u00fcge, Feste und vieles mehr.", "Das Wochenende steht vor der T\u00fcr \u2013 und damit hoffentlich viele Stunden Familienzeit. Das ElternMagazin Fritz+Fr\u00e4nzi fasst in dieser Serie Tipps f\u00fcr einen Kurztrip mit Kindern zusammen. Diesmal geht es nach Basel.\nGut zu wissen \u2026\n\u2026 Je nach Bed\u00fcrfnis und Planung empfiehlt sich die Basel-Card mit attraktiven Angeboten wie: kostenlose Stadtf\u00fchrung, freier Eintritt in den Zoo, kostenlose F\u00e4hrfahrt, 50 Prozent Reduktion auf den Eintritt in manche Museen oder Erm\u00e4ssigung in verschiedenen Restaurants.\nKosten f\u00fcr 24 Stunden: Erwachsene 24, Kinder (bis 16 Jahre) 10 Franken; f\u00fcr 48 Stunden: 27 bzw. 13 Franken 50. Die BaselCard ist an den Tourist-Informationsstellen von Basel Tourismus oder online erh\u00e4ltlich. www.basel.com/baselcard\nSo kann sich Basel im Winter pr\u00e4sentieren, zum Beispiel am Weihnachtsmarkt auf dem M\u00fcnsterplatz.\nErleben \u2026\n\u2026 Eine unterhaltsame M\u00f6glichkeit, Eindr\u00fccke von der Stadt zu erhalten, ist die \u00abSchatzsuche mit Basil\u00bb. Vom Tinguely-Brunnen mit den verspielten Maschinenskulpturen im Wasserbecken f\u00fchrt der Streifzug \u00fcber zehn weitere Stationen, an denen Aufgaben zu l\u00f6sen und Antworten zu finden sind. Begleitet werden Sie auf dem eineinhalbst\u00fcndigen Parcours, der f\u00fcr Familien mit Kindern im Alter von vier bis vierzehn Jahren geschaffen wurde, vom Drachen Basil.\nKosten: ein Kind und eine erwachsene Person: 20 Franken, pro weiteres Kind 10, pro weitere erwachsene Person 5 Franken. T\u00e4glich begehbar. www.basel.com \u203a Suche: Schatzsuche\n\u2026 Wenige Gehminuten vom Stadtzentrum entfernt liegt der Zolli. Er ist nicht nur der \u00e4lteste Zoo der Schweiz, sondern beherbergt in seiner eher kleinen, aber feinen Anlage auch am meisten Tiere: mehr als 7000 aus \u00fcber 600 Arten. Und er geh\u00f6rt wegen seiner Zuchterfolge zu den bedeutendsten europ\u00e4ischen Tierg\u00e4rten. Zurzeit sind Jungtiere etwa bei den L\u00f6wen, Schneeleoparden, Giraffen, Schimpansen oder ein gut zwei Jahre altes Nashorn zu beobachten. Ausserdem spazieren von November bis Februar die K\u00f6nigspinguine um etwa 11 Uhr im Garten, sofern die Temperatur unter 10 Grad f\u00e4llt und es nicht stark regnet.\nZoo, Binningerstrasse 40. Eintritt: Kinder 6 bis 15 Jahre 7, Jugendliche bis 24 Jahre 12, Erwachsene 18, Familien (Eltern mit eigenen Kindern unter 20 Jahren) 39 Franken. www.zoobasel.ch\nAber auch der Zoll ist zu jeder Jahreszeit einen Besuch wert.\nGeniessen \u2026\n\u2026 In beste Adventsstimmung versetzt werden Sie und Ihre Kinder von den lichter\u00fcberzogenen Rheinbr\u00fccken und in der geschm\u00fcckten historischen Altstadt vom Weihnachtsmarkt auf dem Barf\u00fcsserplatz und dem M\u00fcnsterplatz. Dort bieten H\u00e4ndler und Kunsthandwerker in kleinen Holz-Chalets ihre Waren an, und auch f\u00fcr Gaumenfreuden ist gesorgt, sei es mit Raclette, Grillw\u00fcrsten, Waffeln oder Basler L\u00e4ckerli. Wer mehr \u00fcber diese Spezialit\u00e4t erfahren m\u00f6chte, besucht in Frenkendorf das L\u00e4ckerli-Huus (www.laeckerli-huus.ch). Auf spezielle Art abrunden l\u00e4sst sich der Tag im Foyer des Theaters Basel, wo t\u00e4glich um 17 Uhr die T\u00fcrchen eines besonderen Adventskalenders ge\u00f6ffnet werden \u2013 bei einer kleinen literarischen oder musikalischen \u00dcberraschung, von denen manche auch die Kinder ansprechen.\nDer Weihnachtsmarkt am Barf\u00fcsser- und M\u00fcnsterplatz, sowie am Theater Basel sind w\u00e4hrend der Adventszeit t\u00e4glich ge\u00f6ffnet.\n\u2026 In der Markthalle, in Zoo- und Bahnhofn\u00e4he, kaufen Sie ganz nach Ihrem Gusto an den St\u00e4nden am Tagesmarkt ein, wo es viele Sitzm\u00f6glichkeiten gibt, um sich vor Ort zu verpflegen. Haben Sie Lust auf eine traditionelle und saisongerechte Mahlzeit aus regionalen Produkten? Dann sind Sie beim Mittagstisch im Restaurant und Caf\u00e9 Papierm\u00fchle richtig. Auf der kleinen Karte findet sich was f\u00fcr den kleinen wie f\u00fcr den grossen Hunger, bis zum hausgemachten Kuchen. F\u00fcr geistige Nahrung ist gleich nebenan in der Papierm\u00fchle, dem Museum f\u00fcr Papier, Schrift und Druck, gesorgt, wo man eigenes Papier sch\u00f6pfen und bedrucken kann. Oder Sie nehmen die nahe gelegene St.-Alban-F\u00e4hre \u00abWild Maa\u00bb und spazieren zum Tinguely-Museum.\nwww.markthalle-basel.ch, Papierm\u00fchle, St.-Alban-Tal 35, www.papiermuehle.ch. Museum: St.-Alban-Tal 37, www.papiermuseum.ch. Basler F\u00e4hren: www.faehri.ch. Tinguely-Museum, Paul-Sacher-Anlage 1, www.tinguely.ch\nSchlafen \u2026\n\u2026 Als g\u00fcnstige familienfreundliche Unterkunft in der N\u00e4he der Papierm\u00fchle empfiehlt sich die Jugendherberge (4-Bett-Zimmer mit Lavabo: 175 Franken/Nacht). Oder das Basel Backpack auf dem Gundeldinger Feld (4-Bett-Zimmer 159 Franken/Nacht) mit M\u00f6glichkeit, selber zu kochen.\nJugendherberge Basel, St.-Alban-Kirchrain 10, Telefon 061 272 05 72, www.youthhostel.ch/basel. Basel Backpack, Dornacherstrasse 192, Telefon 061 333 00 37, www.baselbackpack.com\n\u2026 Gastfreundschaft und modernes Design verspricht Ihnen Das Breite-Hotel in einer grossst\u00e4dtischen Umgebung mit Autobahn, Eisenbahn, Hauptstrasse und Tram, das Sie in wenigen Minuten ins Stadtzentrum bringt.\nDas Breite-Hotel, Z\u00fcrcherstrasse 149, Telefon 061 315 65 65, Preisbeispiel Familien-Special (mit einem oder zwei Kindern): 247 Franken. www.dasbreitehotel.ch", "StartseiteDie WacheDer RTWDie MitarbeiterEhrenamtSchulsanit\u00e4tsdienstStellenangeboteKontaktImpressumIntern\nGirls'Day 2017\nMittlerweile schon traditionsgem\u00e4\u00df nutzten anl\u00e4sslich des Girls\u2019Day auch in diesem Jahr wieder viele M\u00e4dchen die Gelegenheit um f\u00fcr einen Tag in das zumeist von M\u00e4nnern dominierte Berufsfeld des \u00f6ffentlichen Rettungsdienst zu schnuppern.\nEinige der Teilnehmerinnen hatten schon eine lange Anreise hinter sich, als sie fr\u00fch morgens auf der Rettungswache in Bad M\u00fcnstereifel eintrafen, denn auch in diesem Jahr waren wieder Teilnehmer von au\u00dferhalb des Kreises Euskirchen nach Bad M\u00fcnstereifel gekommen.\nDie Arbeit im Rettungsdienst wurde vom Malteser Hilfsdienst an diesem Vormittag anschaulich vorgestellt. Neben praktischen \u00dcbungen zur Erstrettung konnten sich die M\u00e4dchen von Lehrrettungsassistent Henning Hesse unter anderem den Rettungswagen und die Rettungswache zeigen und erkl\u00e4ren lassen.", "Die erste Runde der Tarifverhandlungen zum TV\u00f6D ist gestartet. Wir als GdP waren vor dem Verhandlungshotel in Potsdam und haben lautstark auf unsere Forderungen aufmerksam gemacht.\nMit einer Entgeltforderung von 10,5 Prozent, jedoch mindestens 500 Euro, f\u00fcr Auszubildende 200 Euro, gehen die Gewerkschaften des \u00f6ffentlichen Dienstes (\u00f6D) in die Tarifverhandlungen f\u00fcr die etwa 2,5 Millionen Tarifbesch\u00e4ftigten in Bund und Kommunen. Die Laufzeit soll zw\u00f6lf Monate betragen. \u201eAktuell geraten gro\u00dfe Teile der Bev\u00f6lkerung zunehmend in finanzielle Bedr\u00e4ngnis, darunter auch nicht wenige Besch\u00e4ftigte im \u00f6ffentlichen Dienst. Es muss auch in der Tarifrunde f\u00fcr unsere Kolleginnen und Kollegen einen ordentlichen Wumms geben\u201c, sagte der Bundesvorsitzende der Gewerkschaft der Polizei (GdP) Jochen Kopelke.\nUmso \u00fcberraschter zeigte sich die GdP \u00fcber das ausbleibende Angebot der Arbeitgeberseite in dieser ersten Tarifrunde. \u201eDas Gejammere \u00fcber schwierige Kassenlagen der Arbeitgeber geben wir postwendend zur\u00fcck. Knappe Kassen sind f\u00fcr unsere Kolleginnen und Kollegen im \u00f6ffentlichen Dienst trauriger Alltag. Damit muss jetzt Schluss sein\u201c, sagte der stellvertretende GdP-Bundesvorsitzender und Tarifexperte Ren\u00e9 Klemmer am Dienstag in Potsdam. Die Blaulichtfamilie leiste trotz immenser pers\u00f6nlicher Belastung erstklassige Arbeit f\u00fcr die Sicherheit der Gesellschaft 24/7, betonte der Gewerkschafter. \u201eVon der oft zitierten Zeitenwende der Bundesregierung sp\u00fcren wir herzlich wenig. In Krisen muss man sich nicht mit langwierigen Verhandlungen besch\u00e4ftigen, weil allen klar ist: Wir brauchen einen Inflationsausgleich\u201c, sagte der Tarifexperte.\nF\u00fcr die n\u00e4chste Verhandlungsrunde w\u00fcnsche er sich \u201eweniger Worte und mehr Wumms\u201c von der Arbeitgeberseite. Au\u00dfergew\u00f6hnliche Zeiten erforderten au\u00dfergew\u00f6hnliche Ma\u00dfnahmen. An die Arbeitgeberseite gerichtet, sagte Klemmer: \u201eUnsere Kolleginnen und Kollegen werden ausgepresst wie Zitronen. Das schmerzt!\u201c\nF\u00fcr die kommende Verhandlungsrunde Ende Februar erwarte die Gewerkschaft der Polizei ernsthafte Gespr\u00e4che. \u201eNoch mehr verschwendete Zeit hilft niemandem. W\u00e4hrend die Besch\u00e4ftigten bei Minusgraden drau\u00dfen ausharren, sitzen die Arbeitgeber im Warmen, drehen D\u00e4umchen und treten auf der Stelle\u201c, so Klemmer.", "Als Hobby oder professionell f\u00fcr die B\u00fchne, als Casting-Vorbereitung oder f\u00fcr den Chor. In einer unverbindlichen Probestunde k\u00f6nnen bereits viele Antworten f\u00fcr die stimmlichen M\u00f6glichkeiten gegeben werden.\n\u200b\nDurch Stimmbildung, Atemtechnik und Ausdruck wird die Stimme sowie das K\u00f6rper- und Lebensgef\u00fchl positiv ver\u00e4ndert. Es ist erstaunlich, welche stimmlichen und pers\u00f6nlichen Entwicklungen m\u00f6glich sind, wenn Atmung, K\u00f6rper und Stimme in der richtigen Weise zusammenfinden.\n\u200b\nDie richtige und schonende Gesangstechnik ist wichtig, um die stimmlichen M\u00f6glichkeiten f\u00fcr die Bereiche Pop, Musical, Jazz/ Entertainment und Klassik voll einsetzen zu k\u00f6nnen und die Stimme ein Leben lang jung und gesund zu erhalten.\nDas Instrument Stimme kann geformt und ausgebaut werden. Mikrofontraining und Ausdruck geh\u00f6ren ebenfalls zum Unterrichtsumfang.", "Zeppelin ist die Bezeichnung f\u00fcr ein von Motoren angetriebenes Starrluftschiff. Die Zeppelin- Luftschiffe sind benannt nach ihrem Erfinder, Ferdinand Graf von Zeppelin (1838 - 1917). Nachdem er als w\u00fcrttembergischer Offizier im Alter von 52 Jahren aus dem Armeedienst ausschied, entwickelte er das erste brauchbare Starrluftschiff.\nAm 13. August 1898 erhielt Ferdinand Graf von Zeppelin durch das Kaiserliche Patentamt ein Patent f\u00fcr einen \u201eLenkbaren Luftfahrzug mit mehreren hintereinander angeordneten Tragk\u00f6rpern\u201c.\nDer Bau dieses ersten Luftschiffes begann im Jahre 1899 in einer schwimmenden Montagehalle auf dem Bodensee. Der erste Flug der LZ 1 \u00fcber den Bodensee fand am 2. Juli 1900 statt, musste aber schon nach 18 Minuten wieder abgebrochen werden, weil ein technischer Defekt vorlag.\nFerdinand Graf von Zeppelins Geldmittel waren zu diesem Zeitpunkt v\u00f6llig aufgebraucht und er musste die von ihm gegr\u00fcndete \u201eGesellschaft zur F\u00f6rderung der Luftschifffahrt\u201c aufl\u00f6sen und konnte seine Arbeiten zun\u00e4chst nicht fortsetzen.\nEine neue Chance bekam die Zeppelin-Idee haupts\u00e4chlich durch die luftfahrtbegeisterte Bev\u00f6lkerung. Durch Spenden, die Einnahmen aus einer Lotterie und Privatverm\u00f6gen des Grafen wurde das ben\u00f6tigte Geld aufgebracht.\nDas erm\u00f6glichte es dem Grafen, seine Technik so weit zu entwickeln, dass sie f\u00fcr sowohl f\u00fcr die zivile als auch f\u00fcr milit\u00e4rische Einsatzzwecke interessant wurde.\nDie LZ 2 war ebenso gro\u00df wie die LZ 1 und stieg am 17. Januar 1906 auf. Sie wurde durch einen aufkommenden Sturm zur Notlandung gezwungen und dabei so stark besch\u00e4digt, dass sie nicht mehr zu reparieren war.\nDas Nachfolgemodell, die LZ3, war der erste erfolgreiche Zeppelin. Er macht bis 1908 insgesamt 45 Fahrten und wurde dann vom deutschen Milit\u00e4r gekauft und als Schulschiff eingesetzt.\nDie von Ferdinand Graf von Zeppelin entwickelten Luftschiffe bestanden aus einem gro\u00dfen zigarrenf\u00f6rmigen Wasserstoffbeh\u00e4lter, der als Auftriebsk\u00f6rper diente.\nAn diesem Beh\u00e4lter, der mit dem brennbaren Gas Helium gef\u00fcllt war, befanden sich Gondeln und Vortriebsmotoren.\nAb 1930 wurden die Zeppeline weiterentwickelt und auch f\u00fcr Transatlantikfl\u00fcge eingesetzt. Bei einer Fluggeschwindigkeit von 150 km in der Stunde konnten sie bis zu 50 Flugg\u00e4ste bef\u00f6rdern.\nAls die \u201eHindenburg\u201c, das gr\u00f6\u00dfte je im Einsatz befindliche Luftschiff, am 6. Mai bei Lakehurst (New Jersey / USA) explodierte und 35 Menschen dabei ums Leben kamen, wurde der Bau von Luftschiffen in Deutschland eingestellt. Die Ursache dieser Explosion konnte bis heute nicht gekl\u00e4rt werden.\nHeute sind nur noch Kleinluftschiffe mit Helium als Treibgas im Einsatz, die meistens zu Werbezwecken eingesetzt werden.\nQuelle:\nFoto 1: http://commons.wikimedia.org/wiki/Image:First_Zeppelin_ascent.jpg\nFirst Zeppelin flight at Lake Constance on July 2, 1900 - Print & Photographs (P&P) Online Catalog of the Library of\nThis file has been released into the public domain by the copyright holder, its copyright has expired, or it is ineligible for copyright. This applies worldwide.\nFoto 2: http://commons.wikimedia.org/wiki/Image:Uss_los_angeles_airship_over_Manhattan.jpg\nThis image is in the public domain because it contains materials that originally came from the United States Navy\nUSS Los Angeles (ZR-3) flying over southern Manhattan Island, New York City, circa 1924-1932. - U.S. Naval Historical Center, Photo #: NH 944", "35 Jahre GR\u00dcNE Politik in Speyer hat viel bewegt und bewirkt. Darauf sind wir stolz und gehen tatkr\u00e4ftig, engagiert und mutig in die Zukunft.\nRund 80 G\u00e4ste waren zu unserer Jubil\u00e4umsfeier in die Jugendf\u00f6rderung Speyer gekommen, um gemeinsam mit uns \u201cGeburtstag zu feiern\u201d. Unter den G\u00e4sten waren Oberb\u00fcrgermeister Hansj\u00f6rg Eger, die in Speyer ans\u00e4ssige Rheinland-pf\u00e4lzische Familien- und Integrationsministerin Anne Spiegel sowie die Vorsitzende der Gr\u00fcnen / EFA-Fraktion im Europ\u00e4ischen Parlament Ska Keller.\nAnne Spiegel und Ska Keller waren als Rednerinnen zu aktuellen politischen Zielen und Herausforderungen von B\u00dcNDNIS 90/ die GR\u00dcNEN auf Landes-, Bundes- und europ\u00e4ischer Ebene \u201cangereist\u201d.\n35 Jahre GR\u00dcNE Politik lie\u00dfen wir durch die Erz\u00e4hlungen der Gr\u00fcnderInnen Ilse Dingler und Clemens Schnell Revue passieren. Alle Anwesenden konnten somit ein St\u00fcck Zeitgeschichte \u201cschmecken\u201d und die neuen Mitglieder des KV Speyer ihr Engagement f\u00fcr GR\u00dcNE Politik im geschichtlichen Kontext der Partei verorten.\nLukas Lambert (neuer Vorstandssprecher) und Julia Jawhari (erweiterter Vorstand) nutzten die Gelegenheit, sich bei den anwesenden GR\u00dcNEN Parteimitgliedern bekannt zu machen.", "Kategorie: Alle Mensch und Gemeinschaft Rechte und Pflichten Gleichberechtigung von M\u00e4dchen und Jungen\nGleichberechtigt und doch benachteiligt?\nBei uns gibt es keine Benachteiligungen von M\u00e4dchen mehr.\nOder doch? Lies dir den folgenden Text genau durch:\nAlle M\u00e4dchen und alle Jungen gehen zur Grundschule. M\u00e4dchen besuchen ebenso h\u00e4ufig wie Jungen weiterf\u00fchrende Schulen und machen mittlerweile sogar die besseren Schulabschl\u00fcsse.\nM\u00e4dchen erreichen heute ebenso h\u00e4ufig wie Jungen einen Berufsabschluss. Bei der Suche nach einem Ausbildungsplatz helfen den M\u00e4dchen die besseren Schulabschl\u00fcsse aber zun\u00e4chst wenig.\nM\u00e4dchen m\u00fcssen sich h\u00e4ufiger als Jungen bewerben, um einen Ausbildungsplatz zu bekommen und k\u00f6nnen seltener als Jungen ihren Wunschberuf erlernen.\nNach dem Abitur beginnen mehr M\u00e4dchen als Jungen ein Studium, aber weniger M\u00e4dchen und Jungen beenden es auch. In fast allen Bereichen haben junge Frauen sp\u00e4ter schlechtere Einkommens- und Aufstiegschancen als junge M\u00e4nner.\n\u00dcbrigens: Die Schulbildung aus dem Ausland zugewanderter M\u00e4dchen und Jungen ist deutlich schlechter als die der deutschen. Und obwohl junge Ausl\u00e4nderinnen bessere Schulabschl\u00fcsse erzielen als ihre m\u00e4nnlichen Altersgenossen, haben sie besonders gro\u00dfe Schwierigkeiten, eine Berufsausbildung zu machen.\nDie meisten Ausl\u00e4nderinnen nehmen eine ungelernte oder eine Anlernt\u00e4tigkeit auf.\nQuelle:\nMit freundlicher Genehmigung und Unterst\u00fctzung von: http://www.unicef.de\nKategorie: Alle Mensch und Gemeinschaft Rechte und Pflichten Gleichberechtigung von M\u00e4dchen und Jungen", "Diese Richtlinie beschreibt, wie \u201e\u201c (\u201ehttps://www.heimkinoclub-muc.de\u201c) (im Folgenden \u201eder Betreiber\u201c) die Daten verwendet, die w\u00e4hrend deines Foren-Besuchs gesammelt werden.\nUmfang und Art der Datenspeicherung\nDeine Daten werden auf vier verschiedene Arten gesammelt:\nDie Forensoftware phpBB erstellt bei deinem Besuch des Boards mehrere Cookies. Cookies sind kleine Textdateien, die dein Browser als tempor\u00e4re Dateien ablegt und die zwischen den einzelnen Aufrufen des Boards erhalten bleiben. In diesen Cookies sind die aktuelle ID deiner Sitzung (damit dir alle Seitenaufrufe zugeordnet werden k\u00f6nnen), Informationen \u00fcber die von dir gelesenen Beitr\u00e4ge (zur Markierung dieser als gelesen/ungelesen; sofern du nicht angemeldet bist) sowie Informationen \u00fcber deine Teilnahme an Umfragen (sofern du nicht angemeldet bist) gespeichert. Ferner werden deine Benutzer-ID, ein Authentifizierungsschl\u00fcssel und eine Session-ID gespeichert. Die Cookies haben standardm\u00e4\u00dfig eine G\u00fcltigkeit von einem Jahr. Alle Cookies kannst du jederzeit \u00fcber die Funktion \u201eAlle Cookies l\u00f6schen\u201c l\u00f6schen.\nWeiterhin werden die Daten gespeichert, die du bei der Registrierung, in deinem Profil oder deinem pers\u00f6nlichem Bereich angibst. F\u00fcr die Registrierung sind mindestens ein eindeutiger Benutzername, eine E-Mail-Adresse und ein Passwort notwendig. Wenn durch den Betreiber weitere Daten als notwendig festgelegt wurden, so ist dies f\u00fcr dich vor deren Eingabe ersichtlich.\nWenn du einen Beitrag oder eine private Nachricht erstellst, so werden die dort eingegebenen Daten ebenfalls gespeichert. Gleiches gilt, wenn du einen Beitrag als Entwurf zwischenspeicherst. In diesen F\u00e4llen wird auch deine IP-Adresse gespeichert. Die IP-Adresse wird weiterhin bei folgenden Aktionen gespeichert: L\u00f6schen und \u00c4ndern von Beitr\u00e4gen (dazu z\u00e4hlen Private Nachrichten und Umfragen), \u00c4nderungen an zentralen Profildaten (E-Mail-Adresse, Kontoaktivierung, Benutzer-Passwort) und gescheiterte Anmeldeversuche. Die von deinem Browser \u00fcbermittelte Browser-Kennzeichnung (User Agent) wird nur in der \u201eWer ist online?\u201c-Funktion angezeigt und nicht dauerhaft gespeichert.\nSchlie\u00dflich erfordern einzelne Funktionen des Boards, dass weitere Daten gespeichert werden. Dazu geh\u00f6ren dein Abstimmungsverhalten bei Umfragen, der Gelesen-Status von deinen Beitr\u00e4gen oder explizit von dir gesetzte Lesezeichen oder Benachrichtigungsfunktionen.\nDein Passwort wird mit einer Einwege-Verschl\u00fcsselung (Hash) gespeichert, so dass es sicher ist. Jedoch wird dir empfohlen, dieses Passwort nicht auf einer Vielzahl von Webseiten zu verwenden. Das Passwort ist dein Schl\u00fcssel zu deinem Benutzerkonto f\u00fcr das Board, also geh mit ihm sorgsam um. Insbesondere wird dich kein Vertreter des Betreibers, von phpBB Limited oder ein Dritter berechtigterweise nach deinem Passwort fragen. Solltest du dein Passwort vergessen haben, so kannst du die Funktion \u201eIch habe mein Passwort vergessen\u201c benutzen. Die phpBB-Software fragt dich dann nach deinem Benutzernamen und deiner E-Mail-Adresse und sendet anschlie\u00dfend ein neu generiertes Passwort an diese Adresse, mit dem du dann auf das Board zugreifen kannst.\nGestattung der Datenspeicherung\nDu gestattest dem Betreiber, die von dir eingegebenen und oben n\u00e4her spezifizierten Daten zu speichern, um das Board betreiben und anbieten zu k\u00f6nnen.\nDar\u00fcber hinaus ist der Betreiber berechtigt, im Rahmen einer Interessenabw\u00e4gung zwischen deinen und seinen Interessen sowie den Interessen Dritter, Zeitpunkte von Zugriffen und Aktionen zusammen mit deiner IP-Adresse und der von deinem Browser \u00fcbermittelter Browser-Kennung zu speichern, sofern dies zur Gefahrenabwehr oder zur rechtlichen Nachverfolgbarkeit notwendig ist.\nRegelungen bez\u00fcglich der Weitergabe deiner Daten\nZweck eines Boards ist es, einen Austausch mit anderen Personen zu erm\u00f6glichen. Du bist dir daher bewusst, dass die Daten deines Profils und die von dir erstellten Beitr\u00e4ge im Internet \u00f6ffentlich zug\u00e4nglich sein k\u00f6nnen. Der Betreiber kann jedoch festlegen, dass einzelne Informationen nur f\u00fcr einen eingeschr\u00e4nkten Nutzerkreis (z. B. andere registrierte Benutzer, Administratoren etc.) zug\u00e4nglich sind. Wenn du Fragen dazu hast, suche nach entsprechenden Informationen im Forum oder kontaktiere den Betreiber. Die E-Mail-Adresse aus deinem Profil ist dabei jedoch nur f\u00fcr den Betreiber und von ihm beauftragte Personen (Administratoren) zug\u00e4nglich.\nAndere als die oben genannten Daten wird der Betreiber nur mit deiner Zustimmung an Dritte weitergeben. Dies gilt nicht, sofern er auf Grund gesetzlicher Regelungen zur Weitergabe der Daten (z. B. an Strafverfolgungsbeh\u00f6rden) verpflichtet ist oder die Daten zur Durchsetzung rechtlicher Interessen erforderlich sind.\nGestattung der Kontaktaufnahme\nDu gestattest dem Betreiber dar\u00fcber hinaus, dich unter den von dir angegebenen Kontaktdaten zu kontaktieren, sofern dies zur \u00dcbermittlung zentraler Informationen \u00fcber das Board erforderlich ist. Dar\u00fcber hinaus d\u00fcrfen er und andere Benutzer dich kontaktieren, sofern du dies in deinem pers\u00f6nlichen Bereich gestattet hast.\nGeltungsbereich dieser Richtlinie\nDiese Richtlinie umfasst nur den Bereich der Seiten, die die phpBB-Software umfassen. Sofern der Betreiber in anderen Bereichen seiner Software weitere personenbezogene Daten verarbeitet, wird er dich dar\u00fcber gesondert informieren.\nAuskunftsrecht\nDer Betreiber erteilt dir auf Anfrage Auskunft, welche Daten \u00fcber dich gespeichert sind.\nDu kannst jederzeit die L\u00f6schung bzw. Sperrung deiner Daten verlangen. Kontaktiere hierzu bitte den Betreiber.", "Rechtsanwalt und Notar Wolfgang Borsum ist Gr\u00fcnder der gleichnamigen Rechtsanwaltskanzlei. Nach dem Studium an der Leibniz Universit\u00e4t Hannover ist der Kopf und Namensgeber seit 1984 als Rechtsanwalt t\u00e4tig.\nDie Kanzlei wurde im Jahr 1987 gegr\u00fcndet und ist seither stetig gewachsen. Die R\u00e4ume in der Sedanstrasse wurden 1991 bezogen. Sie finden uns in der Innenstadt Hannovers, direkt am Hauptbahnhof und in unmittelbarer N\u00e4he des Amts- und Landgerichts Hannover.\nMit \u00f6ffentlichen Verkehrsmitteln erreichen Sie die Kanzlei \u00fcber den nahegelegenen Hauptbahnhof und Zentralen Omnibusbahnhof mit Regionalz\u00fcgen, den Stadtbahnlinien 1,2,3,7,9 sowie verschiedenen Buslinien.\nKompetenzen\nUnsere Anw\u00e4lte sind zugelassen an allen Amts-, Land- und Oberlandesgerichten. Wir stehen Privatpersonen und mittelst\u00e4ndischen Unternehmen aus der Region Hannover und dar\u00fcber hinaus in nahezu allen juristischen Fragen zur Seite.\nUnser Schwerpunkt liegt im Bereich des Zivilrechts. Mit unseren Erfahrungen aus langj\u00e4hriger T\u00e4tigkeit und Kenntnissen aus verschiedenen juristischen Fachbereichen bieten wir unseren Mandanten eine umfassende, individuelle Rechtsberatung. Dabei legen wir besonderen Wert auf eine partnerschaftliche und vertrauensvolle Zusammenarbeit.\nViele unserer Mandanten schenken uns bereits seit vielen Jahren ihr Vertrauen. In diesen langfristig gewachsenen Beziehungen sehen wir uns weniger als kurzfristiger Retter in der Not, sondern vielmehr als zuverl\u00e4ssiger, dauerhafter Begleiter. Nach M\u00f6glichkeit ist dabei die Vermeidung von Konflikten und die au\u00dfergerichtliche Kl\u00e4rung ihrer Angelegenheiten unser erstes Anliegen.\nUm den hohen Anforderungen unserer Mandanten gerecht zu werden arbeiten wir kooperativ mit Kanzleien in D\u00fcsseldorf, Frankfurt am Main, Hamburg, Berlin, Stuttgart, M\u00fcnchen, sowie im Ausland in den St\u00e4dten Wien, Rom und San Francisco.", "Im frisch renovierten Eiskeller, der dank einer gro\u00dfartigen Orga-Mannschaft selbst im C-Jahr 2020 (C kann dabei auch f\u00fcr Chaos stehen) Rennen hinbekommt , wird die T\u00fcr ab 09.00 Uhr aufgeschlossen.\nHINWEIS:\nEingedenk der Allgemeinsituation im C-Jahr steht dieser Termin unter Vorbehalt. Somit muss bis dahin mit Geduld und Nachsicht darauf gehofft werden, dass das Rennen auch stattfinden kann!\nAuf jeden Fall freuen sich Kay und Ralf als DTM-Masters-Chefs auf fahrerisch ausgehungerte DTM-Fans, deren letztes Rennen am 22.02.2020 bei Kasu in Kayhude stattfand.\nImmerhin geht es damit zum 4. Rennen der Saison. Einer Zahl, die in den vergangenen Jahren \u00fcblich war. Dank eines v\u00f6llig Slot-Infizierten DTM-Fans ging dieser Saison-Auftakt erstmalig im ostfriesischen Ardorf mit 15 Startern los. Rennen 2 erfolgte planm\u00e4ssig mit ebenfalls 15 Startern in Hude.\nAusgerechnet Rennen 4 in Wolfsburg, der Stadt des Titelverteidigers Wolfgang, wurde sozusagen staatlich angeordnet zum Streichergebnis. Das \u201eC\u201c machte ein \u201eP\u201c vor den gleichermassen geliebten, wie auch gehassten Stadtkurs im DTM-Rennkalender.\nDas Punkte-Polster von Wolfgang sollte dennoch reichen, die beeindruckende Troph\u00e4e in der Autostadt zu belassen. Ob es seinen Verfolgern dennoch gelingen kann, den Titel streitig zu machen, wird der Tag zeigen.\nAlso Slot-Fans; Motorhomes best\u00fcckt und ab gen legend\u00e4ren Eiskeller am 31.10.2020.\nWillkommen sind alle Slothungrigen, die DTM-Boliden aus zwei Klassen Ihr Eigen nennen und dem DTM Masters Nord-Reglement entsprechen. Typische Kaheffzett von Klasse 1 (bis 1997) und 2 (ab 2000) sind zum Beispiel der (Tamiya) Alfa Romeo 155 sowie die (Revell) C-Klasse.\nDie DTM-Truppe freut sich auf Euch und ein Finale, dass hoffentlich stattfinden kann. Schlie\u00dflich geben sich die Eiskeller-Jungs redlich M\u00fche trotz bestehender Auflagen eine spannende Rennatmosph\u00e4re zu zaubern.\nUnd das gelang bisher immer. Schon mal vielen Dank daf\u00fcr und gute Anreise!\nKeep Racing\nEuer Deichkurier\nP.S.: M\u00f6glicherweise hat sich herum gesprochen, dass ich (Holger HP) Krebs habe. \u2013Und zwar Lymphknoten-Krebs. \u00dcblicherweise sind Lymphknoten 2 \u2013 3 mm klein. Mein gr\u00f6\u00dfter Mutant misst unglaubliche 12 cm. Zwischen Leiste und Hals scheine ich fleissig in sehr unterschiedlichen Gr\u00f6\u00dfen gesammelt zu haben. Irgendwas muss ich da wohl falsch verstanden haben?!\nDas Gute: Dank bisher bereits 4-fach erfolgter Chemotherapie (bis Ende des Jahres werden es 12) bin ich auf \u00e4rztlich versprochenem (!), sehr guten Wege. Mir geht es einfach gut. Dabei darf es auch bleiben.\nIn diesem Zusammenhang w\u00fcnsche ich allen Betroffenen das Gl\u00fcck und die Zuversicht, wie ich sie seit dem 09.09.(Diagnose-Mitteilung) leben darf.", "ich biete Euch Sitzbadges f\u00fcr euren Hyundai I20N an. Diese sind aus hochwertiger Kunstseide gefertigt.\nDie Sitzaufkleber sind sowohl f\u00fcr Stoff als auch f\u00fcr Ledersitze geeignet. Sie sind ca. 6cm breit und 2,5cm hoch, damit \u00fcberdecken sie das eingestanzte Logo der vorderen I20N Sitze minimal.\nDer Klebstoff dieser selbstklebenden Aufkleber ist R\u00fcckstandslos entfernbar, bietet aber dennoch eine sehr gute Haftung auf Leder und Textil.\nDer Effekt dieser kleinen Sitzbadges ist enorm! Es wertet den Innenraum deutlich auf.\nEigenschaften:\nSelbstklebend, R\u00fcckstandslos wieder entfernbar\nOptimale Haftung auf Leder und Textil\nhochwertiges Material\nDie Badges werden als Set (2 St\u00fcck) angeboten, f\u00fcr die vordere und hintere Sitzreihe werden zwei Sets ben\u00f6tigt.\nUnsere SitzBadges werden mit jeweils einem Alkoholpad zur Vorreinigung der Klebefl\u00e4che geliefert.\nDie Montage unserer SitzBadges ist kinderleicht. Sie m\u00fcssen lediglich wie bei jedem anderen normalen Aufkleber darauf achten das die Montagestelle sauber, fettfrei und trocken ist. Bedenkt dabei auch das viele Lederpflegen eine r\u00fcckfettende Eigenschaft besitzen und daher kontraproduktiv f\u00fcr die Klebkraft unserer SitzBadges sind. Sobald die SitzBadges einmal kleben sollten Sie nicht mehr umpositioniert werden, da sonst nicht mehr die volle Klebekraft vorhanden ein kann. Nach entsprechender Vorbereitung und Positionierung einfach vorsichtig glatt streichen. Fertig!\nAchtung: Die Sitzbadges d\u00fcrfen nicht feucht gereinigt werden. Wie jeder Aufkleber ist dieser auch nicht f\u00fcr die Ewigkeit gemacht und unterliegt einem gewissen Verschlei\u00df, je nach Beanspruchung. Bei Fein-, Wildleder oder Alcantara bitte vorher an einer unauff\u00e4lligen Stelle testen.", "Sozialarbeiter*innen und Sozialp\u00e4dagog*innen arbeiten mit Kindern, Jugendlichen, jungen Erwachsenen und ihren Familien aus dem Stadtbezirk Moosach und Neuhausen. Die Hilfen sind familienerg\u00e4nzend und richten sich an Familien und junge Erwachsene, die sich in Krisensituationen befinden und diese aus eigener Kraft nicht bew\u00e4ltigen k\u00f6nnen.\nDas Angebot ist kostenfrei, es ist zeitlich begrenzt und soll die Betroffenen in die Lage versetzen, k\u00fcnftige Krisen eigenst\u00e4ndig und erfolgreich zu meistern. Angeboten werden im Auftrag des Stadtjugendamtes M\u00fcnchen Soziale Gruppenarbeit, Erziehungsbeistandschaft, Sozialp\u00e4dagogische Familienhilfe, Intensive sozialp\u00e4dagogische Einzelbetreuung und Hilfe f\u00fcr junge Erwachsene.\nRechtsgrundlagen bilden die \u00a7\u00a7 27, 29, 30, 31, 35 und 41 SGB VIII (Kinder- und Jugendhilfe).\nVerbindliche Grundlage f\u00fcr die Zusammenarbeit zwischen Stadtjugendamt (StJA) M\u00fcnchen sowie den freien Tr\u00e4gern der Ambulanten Erziehungshilfen (AEH) ist die aktuelle Rahmenleistungsvereinbarung.\nUnterschiedliche Formen der Gruppenarbeit, Einzel-, Familien- und Elternberatung, Krisenintervention und Freizeitp\u00e4dagogik sind \u201eBausteine\", aus denen sich ein individuelles Angebot zusammensetzen kann.\nWir orientieren uns am Sozialraum, sind kompetenter Teil seiner sozialen Infrastruktur, nutzen seine Ressourcen und entwickeln diese mit anderen Sozialraumakteuren weiter.", "Startseite\u00b7 Aktuelles \u00b7 Prozessanalyse des pseudo-plastischen Verformungsverhaltens von unidirektional verst\u00e4rkten Stapelfaser-Organoblechen\nProzessanalyse des pseudo-plastischen Verformungsverhaltens von unidirektional verst\u00e4rkten Stapelfaser-Organoblechen\n09.05.2023 Aktuelles1News25\nIm Projekt \u201eProzessanalyse des pseudo-plastischen Verformungsverhaltens von unidirektional verst\u00e4rkten Stapelfaser-Organoblechen\u201c wird der Einsatz von Stapelfasergarnen aus rezyklierten Kohlenstofffasern (rCF-SF) zur Herstellung von Organoblechen und deren Verhalten im Thermoformverfahren erforscht.\nOrganobleche haben sich im Bereich der faserverst\u00e4rkten Thermoplaste etabliert, weil sie die M\u00f6glichkeit bieten, in kurzen Zykluszeiten im Thermoformprozess zu Bauteilen verarbeitet zu werden. Sie besitzen au\u00dferdem eine gute Lagerf\u00e4higkeit, ein unkompliziertes Handling und bieten durch die kontinuierliche Verst\u00e4rkung mit Geweben/Gelegen hervorragende mechanische Eigenschaften. Ein wesentlicher Nachteil ist jedoch, dass sie durch die kontinuierliche Faserverst\u00e4rkung nicht plastisch verformbar sind. Die Belastung der kontinuierlichen Fasern f\u00fchrt aufgrund der geringen Bruchdehnung nahezu direkt zum Materialversagen. Organobleche sind lediglich drapierbar und erlauben daher eine vergleichsweise begrenzte geometrische Bauteilkomplexit\u00e4t.\nMit dem verst\u00e4rkten Einsatz von CFK wird es zuk\u00fcnftig auch zunehmend CFK-Bauteile geben, die am Ende ihrer Lebensdauer recycelt werden m\u00fcssen. Aktuell sind jedoch insbesondere Produktionsabf\u00e4lle zu recyceln, die w\u00e4hrend der Bauteilherstellung als Ausschussteile oder CF-Halbzeug-Abf\u00e4lle anfallen. Diese m\u00fcssen wiederum in bereits mit Matrix impr\u00e4gnierte CF-Halbzeuge und trockene CF-Abf\u00e4lle unterteilt werden. Bei den in betr\u00e4chtlichen Mengen anfallenden trockenen Abf\u00e4lle handelt es sich zum einen um Spulenreste oder Fehlproduktionen bei der CF-Herstellung und zum anderen um Verschnittreste aus der Herstellung textiler Vorprodukte.\nEine M\u00f6glichkeit diese trockenen CF-Abf\u00e4lle in ein weiterverarbeitbares Halbzeug mit m\u00f6glichst gro\u00dfer Faserl\u00e4nge und maximaler Orientierung zu \u00fcberf\u00fchren, ist die Herstellung sogenannter Stapelfasergarne. Der Prozess beginnt mit der Voraufl\u00f6sung und Reinigung der Abf\u00e4lle. Im Kardierprozess werden die Faserflocken bis zur Einzelfaser aufgel\u00f6st, parallelisiert und weiter gereinigt, wobei Kurzfasern entfernt und ein Faserband gebildet werden. In den nachfolgenden Prozessschritten werden die parallelisierten Fasern verstreckt und weiter parallelisiert. Im letzten Schritt, dem Garnbildungsprozess, wird das Faserband auf die gew\u00fcnschte Garnfeinheit verstreckt und zur Verfestigung kompaktiert. Die Kompaktierung erfolgt - je nach Garnbildungsverfahren - durch Drehung, Umwindung des Faserverbandes oder Umh\u00fcllung mit Mantelfasern.\nIm Projekt \u201eProzessanalyse des pseudo-plastischen Verformungsverhaltens von unidirektional verst\u00e4rkten Stapelfaser-Organoblechen\u201c werden Stapelfasergarne aus rCF und PA6 Fasern der Firma Wagenfelder Spinnerei GmbH in einem modifizierten Impr\u00e4gnier- und Kalandrierprozess zu Tape-Halbzeugen weiterverarbeitet. Durch ein erstes Rollenpaar werden Garne von Spulen abgezogen und vorkompaktiert. Die Garne werden durch Hei\u00dfgasd\u00fcsen \u00fcber die Schmelztemperatur des Polymers erw\u00e4rmt und durch eine Geschwindigkeitsdifferenz zum zweiten Rollenpaar verstreckt, um die Faserausrichtung der recycelten Carbonfasern zu verbessern. Im zweiten Rollenpaar werden die verstreckten Garne impr\u00e4gniert und zu einem Stapelfaser-Tape (SF-Tape) konsolidiert. Der Einfluss der entscheidenden Prozessparameter (Temperatur, Prozessgeschwindigkeit und Verstreckung) auf den Grad der Faserorientierung und die resultierende Breite und Dicke des Tapes werden durch den Einsatz einer Polarisationskamera bzw. mit Hilfe eines Laserprofilsensors erfasst. Der Konsolidierungsgrad, die Faserverteilung und -ausrichtung der Tapes werden mittels mikroskopischen Untersuchungen bestimmt. Durch die Digitalisierung der SF\u2011Tape\u2011Charakteristik k\u00f6nnen m\u00f6gliche Problem- und Fragestellungen entlang der Prozesskette bis zum Thermoformergebnis direkt auf das SF-Tape zur\u00fcckgef\u00fchrt werden.\nDie hergestellten rCF-SF-Tapes werden im Tapelegeprozess unter zus\u00e4tzlicher Verstreckung zu Stapelfaser-Organoblechen (SF-OB) weiterverarbeitet. Die dabei auftretende Ausd\u00fcnnung der SF\u2011Tapes durch die zus\u00e4tzliche Verstreckung wird durch zus\u00e4tzliche Tapelagen in Plattenbreite und -dicke kompensiert. Um eine vergleichbare Laminatqualit\u00e4t zu gew\u00e4hrleisten, werden alle Laminate vor deren Charakterisierung im Autoklaven nachkonsolidiert. Die in Zug- und Biegepr\u00fcfungen ermittelten Kennwerte der SF-OB werden auf Kennwerte von Laminaten aus Tape-Neuware bezogen, um ein Bewertungsma\u00df f\u00fcr die Faserausrichtung zu definieren. Dar\u00fcber hinaus werden die SF-OB in temperierten Zugversuchen hinsichtlich ihres pseudo-plastischen Materialverhaltens detailliert analysiert. Hierzu wurde ein neuartiges Pr\u00fcfmodul entwickelt, welche die Zugprobek\u00f6rper in der Belastungszone homogen temperiert und im Anschluss an den Zugversuch rekonsolidiert. Die Erkenntnisse aus den temperierten Zugversuchen werden im Thermoformprozess verifiziert und aufbauend auf diesen Ergebnissen wird ein bestehendes Beschreibungsmodell zum Prozessverhalten im Thermoformprozess kalibriert.\n\u00dcbergeordnetes Ziel des Vorhabens ist es, durch eine innovative Prozesskette sowohl die Verwertung von CF-Prim\u00e4rabf\u00e4llen als auch neue Anwendungsfelder durch ein neuartiges pseudo-plastisches Verformungsverhalten beim Thermoformen zu erm\u00f6glichen.\nDas Projekt \u201eProzessanalyse des pseudo-plastischen Verformungsverhaltens von unidirektional verst\u00e4rkten Stapelfaser-Organoblechen\u201c wird gef\u00f6rdert durch die Deutsche Forschungsgemeinschaft (DFG) \u2013 F\u00f6rderkennzeichen 471480678.", "13.03.09 / Dramatische Zuspitzung an der Moldau / Vor siebzig Jahren wurde mit der Schaffung des \u201eProtektorats B\u00f6hmen und M\u00e4hren\u201c der erste tschechoslowakische Staat beseitigt\n\u00a9 JUNGE FREIHEIT Verlag GmbH & Co. www.jungefreiheit.de 12/09 13. M\u00e4rz 2009\nDramatische Zuspitzung an der Moldau\nVor siebzig Jahren wurde mit der Schaffung des \u201eProtektorats B\u00f6hmen und M\u00e4hren\u201c der erste tschechoslowakische Staat beseitigt\nStefan Scheil\nEs gab einmal einen Staat namens Tschechoslowakei, den heute bereits die Achtzehnj\u00e4hrigen nicht mehr aus eigener Erfahrung kennen, nicht einmal in der abgespeckten Form, in der er bis 1992 existierte. Von 1918 bis 1939 bestand aber schon einmal ein gr\u00f6\u00dferer und zersplitterter Vorl\u00e4uferstaat namens Tschechoslowakei, den die Siegerm\u00e4chte des Ersten Weltkriegs aus dem Staatsgebiet \u00d6sterreich-Ungarns herausgeschnitten hatten. Gerd Schultze-Rhonhof geht auf die dramatischen Zeitumst\u00e4nde ein, unter denen dieser Staat entstehen und eine Weile existieren konnte.\nWie man es aus seiner Abhandlung \u00fcber den \u201eKrieg, der viele V\u00e4ter hatte\u201c kennt, verzichtet der Autor bewu\u00dft auf umfangreiche Auseinandersetzungen mit der von Historikern verfa\u00dften Literatur. Er will ein breites Publikum erreichen, das mit den heute zeittypisch begrenzten Vorinformationen liest und erz\u00e4hlt die Geschichte des Vielv\u00f6lkerstaates Tschechoslowakei deshalb auf Basis einer Anzahl ausgew\u00e4hlter Quellen und Autoren. Dabei greift er bis ins Mittelalter und die Zeit der Hussitenkriege zur\u00fcck, um den schlie\u00dflich so scharfen tschechisch-deutschen Gegensatz zu begr\u00fcnden. Seit dem neunzehnten Jahrhundert entdeckten die tschechischen Einwohner B\u00f6hmens und M\u00e4hrens ihre Sprache und Nationalit\u00e4t wieder f\u00fcr sich, stellt er fest. 1848 weigerten sie sich, an der Wahl zum Frankfurter Paulskirchenparlament teilzunehmen. Zu einem deutschen Nationalstaat wollten sie nicht geh\u00f6ren.\nDa der solcherma\u00dfen gef\u00fcrchtete deutsche Nationalstaat weder 1848 noch in der Folgezeit errichtet werden konnte, brach genau dieser Konflikt erst wieder in voller Sch\u00e4rfe aus, als die deutsche Republik 1918 tats\u00e4chlich ausgerufen wurde. Zwischen Maas, Memel, Etsch und Belt wollten die Deutschen ein Teil von ihr werden und brachten dies in Parlamentsbeschl\u00fcssen und Abstimmungen zum Ausdruck, so in Tirol, in Deutsch\u00f6sterreich und eben auch in den Gebieten, die nach dem Willen der Siegerm\u00e4chte k\u00fcnftig zur Tschechoslowakischen Republik geh\u00f6ren sollten.\nTschechische Truppen setzten die von Prag aus kommandierte Okkupation mit Gewalt durch. Wer nun meint, er kenne dies alles, wird bei Schultze-Rhonhof etliche Aspekte und Details aus dem politischen Alltagsleben der Zwischenzeit finden, die ihm neu sein werden. Insgesamt lief die politische Praxis im neuerrichteten tschechischen Staat von Anfang an darauf hinaus, der deutschen Kultur auf seinem Staatsgebiet die Gleichheit, wenn nicht gar die Existenzberechtigung im Prinzip abzusprechen. Schon der Staatsname Tschechoslowakei ignorierte mit den Deutschen das zweitst\u00e4rkste Staatsvolk und gab damit ein Signal. Dies verdichtete sich zu den bekannten Vertreibungspl\u00e4nen, deren Durchsetzbarkeit Staatschef Edvard Bene\u0161 bereits 1938 im Umfeld der M\u00fcnchner Krise bei den Westm\u00e4chten sondieren lie\u00df.\nIn diesen Tagen j\u00e4hrt sich das Ende der ersten Tschechoslowakei zum siebzigsten Mal. Die verschiedenen Minderheiten des Landes und die Nachbarstaaten machten nach der M\u00fcnchner Konferenz ihre Anspr\u00fcche geltend, Ungarn ebenso wie Polen. Schlie\u00dflich erkl\u00e4rte sich die Slowakei f\u00fcr unabh\u00e4ngig und der tschechische Pr\u00e4sident Emil H\u00e1cha unterschrieb in Berlin den Vertrag \u00fcber die Errichtung des \u201eProtektorats B\u00f6hmen und M\u00e4hren\u201c. Schultze-Rhonhof bezeichnet diesen Vertrag als rechtsg\u00fcltig, was sicher auf Bedenken sto\u00dfen wird. Er sieht im deutschen Marsch nach Prag vom M\u00e4rz 1939 ausdr\u00fccklich auch keinen Bruch des M\u00fcnchner Abkommens, erstaunlicherweise aber einen Bruch des in M\u00fcnchen auf englischen Wunsch von Hitler und Chamberlain pers\u00f6nlich unterzeichneten deutsch-englischen Konsultationsabkommens. Deshalb habe England im M\u00e4rz 1939 eigentlich das Recht gehabt, \u201ewegen gebrochener Versprechen\u201c gegen Deutschland Krieg zu f\u00fchren. In jedem Fall sei damit das im Herbst 1938 verk\u00fcndete englische Hochr\u00fcstungsprogramm \u201enachtr\u00e4glich gerechtfertigt\u201c.\nErstaunlich ist dies, da die englische Regierung selbst erkl\u00e4ren lie\u00df, das Konsultationsabkommen sei im M\u00e4rz 1939 nicht gebrochen worden \u2013 unabh\u00e4ngig von der Frage, ob \u201egebrochene Versprechen\u201c einen Krieg legitimieren. Auch kann die hier vorgenommene Umkehrung von Ursache und Wirkung nicht \u00fcberzeugen. Gerade das nach M\u00fcnchen ohne Konsultation verk\u00fcndete und gegen den Konsultationspartner gerichtete englische R\u00fcstungsprogramm schlug in Deutschland wie eine Bombe ein. Es trug zur Vergiftung der Szenerie und zum Ende der Tschechoslowakei entscheidend mit bei.\nInsgesamt mu\u00df man dem Autor darin zustimmen, da\u00df die Tschechoslowakei an inneren Konflikten gescheitert ist, die von der Sturheit der Zentralregierung gef\u00f6rdert wurden, die aber tiefere Ursachen hatten. Er zieht Parallelen zum Zerfall Jugoslawiens, dessen Zerbrechlichkeit bereits 1941 erkennbar wurde, das aber ebenso wie die Tschechoslowakei eine Restauration durch die Siegerm\u00e4chte erlebte, um erst mit dem Ende der Nachkriegsordnung 1989 seinen Existenzzwang zu verlieren. Schlie\u00dflich habe sich die Entwicklung geradezu umgekehrt, als das urspr\u00fcnglich vom Westen konstruierte Staatsgebilde Jugoslawien schlie\u00dflich durch den Milit\u00e4reinsatz des Westb\u00fcndnisses Nato aus Teilen seines Staatsgebiets wie dem Kosovo herausgebombt wurde. Die heutigen Bewertungsma\u00dfst\u00e4be von Moral und V\u00f6lkerrecht w\u00fcrden f\u00fcr vergleichbare Vorg\u00e4nge von 1938/39 nicht angewandt, schlie\u00dft Schultze-Rhonhof. Eine treffende Feststellung.\nGerd Schultze-Rhonhof: Das tschechisch-deutsche Drama 1918\u20141939, M\u00fcnchen 2008, gebunden, 512 Seiten, Abbildungen, 34 Euro\nFoto: \u00c4nderung der Landkarten von Europa im Londoner Geographie-Instituts George Philips & Sons nach dem Einmarsch der deutschen Truppen in Prag 1939: Kein Bruch des M\u00fcnchner Abkommens", "\u00a9 2022 | Andreasgemeinde Lemgo \u2022 Grevenmarschstr. 32 \u2022 32657 Lemgo | Impressum | Datenschutz | Cookie-Richtlinien (EU) | Kontakt | WebTeam\nCookie-Zustimmung verwalten\nDiese Webseite verwendet Cookies\nDiese Internetseite verwendet Cookies f\u00fcr die Analyse und Statistik. Cookies helfen uns, die Benutzerfreundlichkeit unserer Website zu verbessern. Durch die weitere Nutzung der Website stimmen Sie der Verwendung zu. Weitere Informationen hierzu finden Sie in unserem Datenschutz.\nFunktional Funktional Immer aktiv\nDie technische Speicherung oder der Zugang ist unbedingt erforderlich f\u00fcr den rechtm\u00e4\u00dfigen Zweck, die Nutzung eines bestimmten Dienstes zu erm\u00f6glichen, der vom Teilnehmer oder Nutzer ausdr\u00fccklich gew\u00fcnscht wird, oder f\u00fcr den alleinigen Zweck, die \u00dcbertragung einer Nachricht \u00fcber ein elektronisches Kommunikationsnetz durchzuf\u00fchren.\nVorlieben Vorlieben\nDie technische Speicherung oder der Zugriff ist f\u00fcr den rechtm\u00e4\u00dfigen Zweck der Speicherung von Pr\u00e4ferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.\nStatistiken Statistiken\nDie technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zus\u00e4tzliche Aufzeichnungen von Dritten k\u00f6nnen die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.\nMarketing Marketing\nDie technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder \u00fcber mehrere Websites hinweg zu \u00e4hnlichen Marketingzwecken zu verfolgen.", "Birkenzucker oder Xylit (engl. Xylitol) \u2013 ein F\u00fcnffachzucker - ist genau so s\u00fc\u00df wie gew\u00f6hnlicher Haushaltszucker und ist ebenso ein Kohlenhydrat. Birkenzucker sieht aus wie Zucker, schmeckt wie Zucker und hat die Eigenschaft, unseren K\u00f6rper gesund zu erhalten, weil er unsere Abwehrkraft st\u00e4rkt, da er das Wachstum von einigen sch\u00e4dlichen Bakterien im Mund hemmt.\nBereits vor 100 Jahren wurde Xylit vom deutschen Chemiker und Nobelpreistr\u00e4ger Emil Fischer synthetisiert. Die gr\u00f6\u00dfere Aufmerksamkeit erhielt Xylit jedoch in Finnland. W\u00e4hrend des zweiten Weltkrieges gab es in Finnland einen gro\u00dfen Mangel an Nahrungsmitteln. Um die Menschen besser versorgen zu k\u00f6nnen, wurde dort aus Birkenholz der Stoff Xylit entwickelt, daher kommt der Name Birkenzucker. Seitdem erfreut sich dieser Zuckeraustauschstoff in den skandinavischen L\u00e4ndern und auch in Asien gr\u00f6\u00dfter Beliebtheit, weil seine besonderen gesundheitlichen Vorz\u00fcge dort sehr schnell erkannt wurden.\nBirkenzucker ist f\u00fcr unseren K\u00f6rpern kein unbekannter Stoff, weil er im Glukosestoffwechsel ein regelm\u00e4\u00dfig vorkommendes Zwischenprodukt ist und sich in allen menschlichen Geweben, haupts\u00e4chlich jedoch in der Leber, befindet. Xylit ist in der Natur in vielen Fr\u00fcchten, Beeren und Gem\u00fcsepflanzen vorhanden, besonders reichlich aber im Birkenholz und im Mais.\nVerwendung und Wirkungsweise\nBirkenzucker, in der 1 kg Dose\n2.5 kg Nachf\u00fcllbeutel\nBirkenzucker eignet sich zum S\u00fcssen von Getr\u00e4nken, zum Kochen und zum Backen (Ausnahme: Hefeteig, da Hefepilze Xylit nicht verstoffwechseln k\u00f6nnen).\nXylit entzieht dem Speichel W\u00e4rme - deshalb sp\u00fcrt man einen k\u00fchlenden Effekt bei der Aufl\u00f6sung im Mund. Xylit hat 40 % weniger Kalorien als Zucker und wird vom K\u00f6rper langsam verstoffwechselt und resorbiert. Der Insulinspiegel ver\u00e4ndert sich nur geringf\u00fcgig, deshalb ist Xylit in geringen Mengen f\u00fcr Diabetiker sehr gut vertr\u00e4glich.\nEtwa 80 % des Xylitstoffwechsels findet in der Leber statt, der Rest wird im Verdauungstrakt des Dickdarms von Darmbakterien zu kurzkettigen Fetts\u00e4uren abgebaut. Menschen, die weniger als 80 % in der Leber vestoffwechseln, reagieren auf Xylit h\u00e4ufig mit Durchfall und Bl\u00e4hungen, weil Xylit im Dickdarm wasseranziehend wirkt und beim Abbau zu Fetts\u00e4uren durch Dambakterien Gase entstehen.\nBirkenzucker sollte Anfangs nur in geringen Mengen zu sich genommen werden, da der Stoff leicht abf\u00fchrende Wirkung hat. 50 g Xylit pro Tag werden von Erwachsenen problemlos vertragen. Kinder zeigen nach einer Einzeldosis von 10 g pro Tag keine negativen Effekte. Der K\u00f6rper gew\u00f6hnt sich bereits nach kurzer Zeit an Xylit. Kleinkinder unter einem Jahr sollten kein Xylit verzehren, weil ihr K\u00f6rper Xylit noch nicht verstoffwechseln kann.\nF\u00fcr verschiedene Haustiere (u.a. Hunde, Ziegen und Kaninchen) ist Birkenzucker ungeeignet, da es bei Ihnen eine hohe Insulinaussch\u00fcttung provoziert, die den Blutzuckerspiegel stark senkt. Sollte Ihr Haustier unbeabsichtigt Birkenzucker fressen, f\u00fcttern sie sofort den normalen Zucker.\nXylit - bessere Mundgesundheit und weniger \u00dcbergewicht\nXylitol-Zahnpasta SANTE Bio-Minze - ohne Fluorid\nMan glaubt es kaum, doch einen ganz besonderen gesundheitlichen Effekt, neben vielen anderen, erzielt man mit Birkenzucker f\u00fcr die Z\u00e4hne. Xylit ist ein F\u00fcnffach-Kohlenstoff-Zucker, d.h. er hat eine antimikrobielle Wirkung und kann auf diese Weise anaerobes Bakterienwachstum hemmen. Die meisten sch\u00e4dlichen Mikroorganismen in unserer Mundh\u00f6hle k\u00f6nnen Xylit nicht verstoffwechseln und hungern quasi aus.\nKlinische Studien in Finnland (Turku-Zuckerstudien) haben ergeben, dass mit Birkenzucker Karies um bis zu 90 % reduziert wird, S\u00e4ure bildende Bakterien stark reduziert werden, Zahnplaque zur\u00fcckgeht und dadurch die Remineralisation der Z\u00e4hne durch den Speichel gef\u00f6rdert wird.\nF\u00fcr Schwangere und M\u00fctter ist Xylit sehr zu empfehlen, da sich das Kariesrisiko f\u00fcr ihre Kinder drastisch reduziert. Wenn M\u00fctter t\u00e4glich Xylit anwenden, werden die Bakterien, die Karies und Zahnfleischentz\u00fcndungen provozieren, reduziert und die \u00dcbertragung dieser Bakterien auf die Kinder stark reduziert. Die ersten Z\u00e4hne werden viel weniger anf\u00e4llig f\u00fcr Karies und k\u00f6nnen sich gesund entwickeln.\nWenn die Z\u00e4hne t\u00e4glich mit ca. 10 Gramm Xylit in Verbindung kommen, k\u00f6nnen Sie schon ein sehr guten Schutz vor Karies und Zahnfleischentz\u00fcndungen erzielen.\nNehmen Sie morgens und abends nach der Zahnreinigung einen gestrichenen Teel\u00f6ffel Xylit pur (ohne Wasser) in den Mund und sp\u00fclen 2 bis 3 Minuten kr\u00e4ftig die Mundh\u00f6hle, dann ausspucken und eine halbe Stunde nichts trinken. Der deutliche Effekt zeigt sich schon nach kurzer Zeit. Die Z\u00e4hne werden wei\u00dfer, der Zahnbelag geht deutlich zur\u00fcck, man hat ein unglaubliches Sauberkeitsgef\u00fchl im Mund und kaum noch bzw. gar keinen schlechten Geschmack und Mundgeruch mehr.\nMenschen, die gerne abnehmen m\u00f6chten und m\u00fcssen, sollten anstelle von k\u00fcnstlichen S\u00fc\u00dfungsmitteln, die im K\u00f6rper Schaden anrichten k\u00f6nnen, besser den Zuckerersatz Xylit in Ihre Ern\u00e4hrung einbinden. Die k\u00fcnstlichen S\u00fc\u00dfungsmittel signalisieren dem K\u00f6rper n\u00e4mlich \"jetzt kommt mit dem s\u00fcssen Geschmack Energie\", die Energie kommt aber nicht, die Folge ist, das Gehirn signalisiert \"jetzt wieder und noch mehr essen\", provoziert also erneut ein Hungergef\u00fchl und das Abnehmen funktioniert nicht bzw. wird deshalb immer schwerer.", "Die Blogreihe #33Frauen (mehr dazu) handelt von 33 Frauen, die mich in der Frage wie man Kunst, Kinder, Karriere und eine gute Beziehung harmonisch und gl\u00fccklich in sein Leben integrieren kann, inspiriert haben. Und ich beginne \u2013 mit meiner Mutter, Ilse-Charlotte Kaufmann.\nIch bin ein wenig aufgeregt, da mir klar geworden ist, dass ich vor dieser Blogreihe noch nie so offen, pers\u00f6nlich und \u00f6ffentlich \u00fcber mich oder meine Einstellung zum Leben, zu Kunst, Politik und Gesellschaft gesprochen habe. Aber \u2013 darum geht es wohl in dieser Blogreihe und ganz allgemein beim Schreiben. Und, dass ich mit meiner Mutter beginne, macht es nicht unbedingt leichter.\nIlle\nMeine Mutter hat den Namen meines Vaters angenommen, hie\u00df also Bongard. Doch sie wurde von allen nie Ilse-Charlotte, sondern immer nur Ille genannt. Ich will hier trotzdem mit ihrem vollst\u00e4ndigen Vornamen und ihrem Geburtsnamen \u00fcber sie reden, da er f\u00fcr mich die gr\u00f6\u00dfere Einheit ist. Der Name, der ihr Leben vor der Ehe einschlie\u00dft. Die j\u00fcdischen Wurzeln, ihren k\u00fcnstlerisch begabten Vater.\nIch dachte eigentlich, dass ich diesen Beitrag am besten am Muttertag herausbringe, doch meine Mutter war kein gro\u00dfer Fan des Muttertags. Wahrscheinlich hat sie ihn gehasst. Und damit ist schon viel \u00fcber sie gesagt. Sie hatte eindeutige Meinungen zu Menschen, Politik, Kunst und Kultur. Und auch zu Institutionen oder Traditionen.\nIch habe mich als Kind oft gewundert, wenn andere (Ehe-)frauen/M\u00fctter keine Meinung hatten. Da kenne ich mich nicht aus. // Da wei\u00df ich nicht Bescheid. //Dazu habe ich keine Meinung. So etwas gab es bei uns nicht und das lag an meiner Mutter. Sie hatte eine Meinung. \u00dcberhaupt habe ich erst beim Scheiben dieses Blogbeitrags bemerkt, in wie vielen Aspekten ich von ihr beeinflusst worden bin und was sie mir alles \u2013 ganz unauff\u00e4llig \u2013 beigebracht hat.\nDie Mutter\nIch will gleich vorweg sagen, dass meine Mutter und ich uns gut verstanden haben, aber auch \u00fcbelste Auseinandersetzungen hatten. Dies hier ist also keine Hymne auf meine Mutter, sondern das Ergebnis vieler K\u00e4mpfe.\nBei einem Streit hat sie mich einmal als Monster bezeichnet und ich w\u00fcrde sagen, sie hat sehr recht gehabt. Wenn ich um mein Selbstwertgef\u00fchl, meine Unabh\u00e4ngigkeit und Freiheit k\u00e4mpfe, werde ich monstr\u00f6s. Sie war da anders. Zarter, weicher, unsicherer. Und gerade damit hat sie mich zu einer K\u00e4mpferin gemacht. An ihr musste ich mich abarbeiten. Doch neben diesen K\u00e4mpfen und Auseinandersetzungen gab es auch Bereiche, in denen sie mich gar nicht beeinflussen wollte. Das fand ich am spannendsten. Wenn sie etwas gemacht hat, das ich nur beobachtet habe und so lernen konnte. Das war ganz besonders in diesen drei Bereichen der Fall:\nLiteratur\nMusik\nBeziehung & Muttersein\nLiteratur & Lesen\nMeine Mutter hat viel gelesen. Vor allem Literatur. Viel Literatur. Keine Schm\u00f6ker, die kamen \u00fcberhaupt nicht vor. Aber auch Sach- und Fach- und wissenschaftliche B\u00fccher.\nSchreiben war f\u00fcr sie Kunst, und Lesen hie\u00df, Kunst zu wertsch\u00e4tzen. Mit Respekt f\u00fcr eine gute Sprache, f\u00fcr intelligente Gedanken, f\u00fcr tiefgehende Emotionen, f\u00fcr Offenheit und eine Stellungnahme in der Welt. Lesen hie\u00df zu wachsen. Von ihr habe ich gelernt: Ein gutes Buch ist ein Kunstwerk. Die Autor*\u00ecn muss ihr Handwerk beherrschen, doch sie ist haupts\u00e4chlich K\u00fcnstler*in und damit auch erste k\u00fcnstlerische Instanz f\u00fcr ihr Werk.. \u00c4ndere bitte dies \u2013 weil es sich besser verkauft//uns nicht gef\u00e4llt//wir es nicht m\u00f6gen \u2013 war f\u00fcr sie undenkbar. Zu einem guten Buch geh\u00f6rt eine Autor*in mit einem starken R\u00fcckgrat und einer klaren k\u00fcnstlerischen Vision.\nUnd das habe ich nicht nur bewundert, sondern sofort verstanden. Wenn die K\u00fcnstler*in nicht den Mut und die Kraft hat, f\u00fcr ihre Ideen einzustehen \u2013 wer dann?\nMeine Mutter ist auch diejenige gewesen, die mit mir zur Bibliothek gegangen ist, um mir meinen ersten Bibliotheksausweis ausstellen zu lassen. In die heiligen Hallen. Sie hat mich zur Vielleserin gemacht hat \u2013 drei B\u00fccher am Tag.\nDurch meiner Mutter habe ich gesehen, dass mit und durch B\u00fccher alles m\u00f6glich ist. Dass man sich mit dem Wissen und den Erkenntnissen, die in B\u00fcchern stecken, die Welt erobern kann.\nIch habe auch mitbekommen, wie sie mit Mitte 40, versp\u00e4tet ihr Studium beendet und ihre Doktorarbeit geschrieben hat. Immer umgeben von einem Stapel B\u00fccher. \u00dcberall Spuren vom Thema. In, durch und mit B\u00fcchern kann man alles erreichen. Damit war meine Mutter besser ausgebildet als mein Vater, der seine Doktorarbeit nie beendet hat. Allerdings ist er Professor geworden und sie blieb nur Dozentin. Auch das eine interessante Beobachtung.\nSchreiben\nEtwas sp\u00e4ter wurde mir klar, dass meine Mutter nicht nur viel gelesen, sondern auch einmal selbst geschrieben hat. Ich wei\u00df nicht, wann sie mir ihre Gedichte gezeigt hat. Huschig, eigentlich fast im Vor\u00fcbergehen und mir wurde klar: Es gab ein Leben vor mir. In einer kleinen Studentenbude mit einer Kofferschreibmaschine und der Ambition, irgendwann mal einen Roman zu schreiben.\nUnd es gab dieses kleine B\u00fcchlein mit dem Schloss, das ich jetzt geerbt habe, mit ihren Gedichten. Okay, die kann man also selbst machen. Wie Marmelade einkochen und Pullover stricken. Wie Fahrradreifen flicken und Gl\u00fchbirnen auswechseln.\nMan kann selbst Gedichte schreiben.\nSelbst B\u00fccher schreiben. Und das war die gr\u00f6\u00dfte Ermunterung. Ich wollte nie Schriftstellerin werden. Aber nicht, weil ich es mir nicht zugetraut h\u00e4tte. Denn der Weg zum Schreiben war immer da, stand immer offen, war m\u00f6glich.\nOper & Musicals\nAlles, was in der Kindheit passiert, nimmt man als normal hin. So ist das eben. Und erst sp\u00e4ter wird einem klar, dass es anderswo anders ist. Meine Mutter hat Opern geliebt. Regelm\u00e4\u00dfig wurden Sonntags Opernplatten aufgelegt. Carmen, La Travita, Der Barbier von Sevilla. Oder lyrischer Gesang. Meine Eltern waren beide Musikliebhaber, mein Vater hat Klavier gespielt, mein Mutter fast immer in irgendeinem Chor gesungen. Musik geh\u00f6rte dazu, doch wurde sie von meiner Mutter besonders zelebriert. Nicht mal eben nebenbei, sondern zur festlichen Stunde. Dann wurde die Platte aufgelegt und zugeh\u00f6rt.\nF\u00fcr mich waren Opern gesungene Geschichten. Gesungene Texte auf italienisch oder deutsch. Tragische Geschichten mit gro\u00dfen Emotionen. Vollendeter Gesang. Das war eine erstaunlich andere Seite an meiner Mutter, die doch sonst die Meisterin der Ironie war, einen messerscharfen Verstand hatte und niemals sentimental oder r\u00fchrselig wurde. Schwarzer Humor, Scharfz\u00fcngigkeit. Jane-Austen-like. Manchmal provokant. Aber da gab es eben dieses verletzliche Innenleben, das sich in Musik ausdr\u00fcckte.\nAls meine Mutter und ich einmal zusammen das Musical West Side Story im Fernsehen gesehen haben, war ich vielleicht neun. Und meine Mutter hat geweint. Damals habe ich nicht verstanden, was einen an dieser Geschichte so zu Tr\u00e4nen r\u00fchren kann. Aber es hat mich tief beeindruckt, dass ein Musical so tiefe Gef\u00fchle bei meiner Mutter, die ich \u00fcberhaupt nur zwei oder dreimal in meinem Leben habe weinen sehen, ausl\u00f6sen konnte.\nDass Emotionen in Geschichten geh\u00f6ren, sogar unbedingt dazugeh\u00f6ren, war nichts, was man mir in der Schule beigebracht hat. Da ging es um Kafka und Sprache und Form. Wie wichtig Emotionen f\u00fcr Geschichten sind, habe ich durch meine Mutter gelernt.\nBeziehung, Ehe und Arbeit\nDie Beziehung meiner Eltern war gut. Manchmal sehr gut, g\u00f6ttlich, dann auch wieder zerfleischend. Sie haben sich sehr geliebt, Liebe auf den ersten Blick, in G\u00f6ttingen im Vorlesungsaal, dazu eine starke k\u00f6rperliche Anziehung, ein Sturm. Meine Eltern waren Gegens\u00e4tze und die Beziehung ein wilder Mix.\nEs gab ein intellektuelles Gleichgewicht, doch obwohl meine Eltern geistig und intellektuell ebenb\u00fcrtig waren, gab es keine Gleichberechtigung. Und das lag weniger an meinem Vater (obwohl der auch ein Macho sein konnte), als an der Gesellschaft, der Situation in den 60er Jahren, an der Struktur von Ehe- und Familienleben.\n\u201cKinder kriegen\u201d war ein Job, den die Frau am besten nebenher erledigte. Unbezahlt, versteht sich. (Erziehungsgeld war damals noch kein Thema und Kindergeld ein Witz). Und wenn die Frau gleichzeitig Karriere machen wollte \u2026 dann hatte sie eben zwei Jobs und musste sehen, wie sie das hinkriegte. Mein Vater war Professor, f\u00fcr seine Arbeit zahlte der Staat. F\u00fcr ihn war es sein Geld, auch wenn er es nat\u00fcrlich in die Ehe gegeben hat. Doch bei einer Scheidung (und davon gab es viel im Umfeld) \u2026 h\u00e4tte er normal weiter verdient und meine Mutter beruflich bei Null starten m\u00fcssen. Dar\u00fcber haben wir oft geredet.\nDie gesellschaftliche Ungleichbehandlung von Arbeit f\u00fcr die Gesellschaft in einem Job und Arbeit f\u00fcr die Gesellschaft = Kinder bekommen, war ein Problem, das die Ehe meiner Eltern sehr belastet hat.\nMeine Mutter war viel zu schlau, das Hausm\u00fctterchen zu spielen und auch viel zu l\u00e4ssig. Mein Vater \u2013 gelegentlich sehr akribisch \u2013 h\u00e4tte die K\u00fcche mit dem Q-Tip geputzt und in unserer Familie stand alles auf Alarm, wenn er \u201cden Keller aufr\u00e4umen\u201d ging. Vielleicht w\u00e4re er der bessere Hausmann gewesen, aber der Switch hat bei beiden nie funktioniert.\nEs war genial, eine solche Beziehung aus n\u00e4chster N\u00e4he zu studieren. Okay, als Kind studiert man seine Eltern nicht, man wird hin- und hergerockt. Stellt Fragen, versteht Dinge nicht, wundert sich, ist verwirrt. Und oft stand ich auch genau in der Mitte. \u201cHeirate nie!\u201d// M\u00e4nner sind \u2026 was auch immer. // Deine Mutter macht ihren Job nicht. Ich verdiene das Geld und sie \u2026 was auch immer.\nMeine Mutter hat eigenes Geld verdient, trotz der vier Kindern und einem Haushalt, der ohne m\u00e4nnliche Beteiligung bew\u00e4ltigt werden musste. Um vieles hat sie nicht gek\u00e4mpft, das lag ihr \u00fcberhaupt nicht. Sie ist aber in eine Frauengruppe gegangen und hat auf ein eigenes Konto bestanden.\nWas ich aus all diesen Beobachtungen und Diskussionen gelernt habe: Du musst als Frau unbedingt selbstst\u00e4ndig sein. Du musst weiter an deiner Ausbildung arbeiten, auch in der Beziehung/Ehe, auch mit Kindern. Und du brauchst dein eigenes Geld.\nMuttersein\nMuttertag: Danke, Mama, dass du all das f\u00fcr uns tust! Und nie an dich denkst.\nFuck! Muttertag. Okay, so h\u00e4tte meine Mutter das nie gesagt. Aber hinter ihrer Stirn, angesichts des Szenarios: Die Kinder \u00fcbernehmen am Muttertag (gezwungen von deinem Mann) das Fr\u00fchst\u00fcck \u2013 konnte man es sehen. Muttertag. Bullshit.\nSie h\u00e4tte gesagt: Ich verzichte auf den Blumenstrau\u00df und die sch\u00f6nen Worte, ich will einen Mann, der kapiert, dass Kinder haben auch sein Job ist. Und, nein, Geld verdienen ist nur ein sehr kleiner Teil davon. Ich will einen Staat, der kapiert, dass es mit Kinder- oder sogar Erziehungsgeld nicht getan ist. Weil man keine m\u00fcndigen und intelligenten und liebevollen Staatsb\u00fcrger heranziehen kann, wenn man auf dem Zahnfleisch l\u00e4uft. Vier Kinder, die ersten drei innerhalb von vier Jahren (auf dem Bild die ersten drei).\nDie (\u00dcber-)anstrengung meiner Mutter als Mutter in diesem Job, der ja im Grunde g\u00e4nzlich von der Anerkennung des Partners abh\u00e4ngt und in der Regel in der Pubert\u00e4t auch noch von den Kindern bel\u00e4chelt wird, habe ich sehr genau registriert. Feminismus passierte f\u00fcr mich dort. Vorort. Nicht in irgendwelchen Seminaren oder Panels, wo Feministinnen Vortr\u00e4ge hielten. Oder halten. Nicht in theoretischen Diskussionen, die vielleicht auch wichtig sind, aber sehr oft an der Realit\u00e4t vorbeigehen. Ich lernte: Hier muss sich etwas \u00e4ndern. Auch die Frauen selbst, die sich ihrer Macht und St\u00e4rke bewusst werden m\u00fcssen.\nMeine Mutter\nMeine Mutter war als Mutter: Genial. Das habe ich erst sp\u00e4ter begriffen. Vorher habe ich die liebevolle gemachten Pausenbrote vermisst. Die herzige Umarmung, wenn ich zur Schule ging, das Dauerl\u00e4cheln, die Nettigkeit, die anderen M\u00fcttern offenbar so leicht fiel.\nErst als diese Familien und Ehen zerbr\u00f6selten, das gr\u00f6\u00dfere Bild sichtbar wurde, habe ich begriffen, wie wertvoll ihre Erziehung war. Dass sie mich in Ruhe gelassen hat, mich niemals bewertet, herausgeputzt oder bemuttert hat. Und mich schon gar nix ht heruntergeputzt hat. Daf\u00fcr hat sie mir etwas sehr Wichtigeres mitgegeben:\nSei so, wie du bist. Bleib so, wie du bist. K\u00fcmmere dich nicht um die Menschen, die dich auf Grund von Angst ma\u00dfregeln oder zurechtweisen wollen. Geh deinen Weg. Mach dein Ding.\n#lebendig\nAuch, wenn meine Mutter immer gesagt hat, sie h\u00e4tte nie richtig gelernt, gl\u00fccklich zu sein, konnte sie leben. Genie\u00dfen. Gutes Essen und Wein. Mit K\u00e4se. Und Reisen und Kunst, Theater, Konzerte. Diskussionen und Gespr\u00e4che und Bewegung.\nUnd wenn ich an sie denke, dann denke ich: #lebendig.\nPodcast\nEs gibt eine Podcastreihe zu den 33Frauen auf dem Literatur Radio H\u00f6rbahn. Jeder Blogbeitrag wird um einen Podcast erg\u00e4nzt. Den Podcast zu diesem Beitrag findest du hier.", "Into the ClubPlay With MeChased by DarknesThe EmbercoreThors Lost EmblemsMade of StoneThe Valley Left UnconqueredHer Burning HideawayFootmen of a Troubled GodRising MysteriesThe Soulborns JourneyIjoma - Theme (Piano)The ForestThe Final OperationNow Leaving TokioHome BaseThe Club\nCookie-Zustimmung verwalten\nUm dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Ger\u00e4teinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, k\u00f6nnen wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zur\u00fcckziehst, k\u00f6nnen bestimmte Merkmale und Funktionen beeintr\u00e4chtigt werden.\nFunktional Funktional Immer aktiv\nDie technische Speicherung oder der Zugang ist unbedingt erforderlich f\u00fcr den rechtm\u00e4\u00dfigen Zweck, die Nutzung eines bestimmten Dienstes zu erm\u00f6glichen, der vom Teilnehmer oder Nutzer ausdr\u00fccklich gew\u00fcnscht wird, oder f\u00fcr den alleinigen Zweck, die \u00dcbertragung einer Nachricht \u00fcber ein elektronisches Kommunikationsnetz durchzuf\u00fchren.\nVorlieben Vorlieben\nDie technische Speicherung oder der Zugriff ist f\u00fcr den rechtm\u00e4\u00dfigen Zweck der Speicherung von Pr\u00e4ferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.\nStatistiken Statistiken\nDie technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zus\u00e4tzliche Aufzeichnungen von Dritten k\u00f6nnen die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.\nMarketing Marketing\nDie technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder \u00fcber mehrere Websites hinweg zu \u00e4hnlichen Marketingzwecken zu verfolgen.", "Warum muss ich das eigentlich lernen? Eine Frage, die sich Sch\u00fclerinnen und Sch\u00fcler h\u00e4ufiger stellen. Damit sich fr\u00fch Perspektiven zeigen, beginnen wir ab der Jahrgangsstufe 8 mit der Berufsorientierung.\nErziehungskonsens\nUnsere Werte und Leitbilder rund um Fragen zur Erziehung unserer Sch\u00fclerinnen und Sch\u00fcler \u2013 auch im Umgang mit Medien \u2013 finden Sie hier.\nSoziales Lernen\nF\u00e4higkeiten wie Kritikf\u00e4higkeit, Verantwortungsbereitschaft, Courage und Empathie sind in unserer Gesellschaft und speziell in der Arbeitswelt so wichtig wie nie. Wir st\u00e4rken diese F\u00e4higkeiten daher in unterschiedlichen Zusammenh\u00e4ngen. \u00dcber einige k\u00f6nnen Sie sich hier informieren.", "F\u00fcr sch\u00fctzenswerte Geb\u00e4ude und Anwesen vor allem im Ortskern sind schnellstens Bebauungspl\u00e4ne zu erstellen, die den Dorfcharakter wahren. Praktische Beispiele f\u00fcr eine gute Umsetzung finden sich im Beitrag Erfolgreiche Renovierungen.\nDie Dorferhaltungs- und Gestaltungssatzung muss verbindlich sein.\nEs m\u00fcssen Bauprojekte gef\u00f6rdert werden f\u00fcr Menschen, die gemeinschaftlich bauen und wohnen wollen und somit bezahlbaren Wohnraum schaffen.\nWir fordern die Gemeinde auf, sich daf\u00fcr einzusetzen, dass auch Bahnhof- und Pariser Stra\u00dfe in verkehrsberuhigte Ma\u00dfnahmen einbezogen werden.\nEine schnelle und kosteng\u00fcnstige L\u00f6sung f\u00fcr mehr Verkehrssicherheit ist die eindeutige Kennzeichnung und Erweiterung des inner\u00f6rtlichen Tempo 30-Limits.\nWeiterhin m\u00fcssen zus\u00e4tzlich Radwege mit sinnvoller Streckenf\u00fchrung und sichere \u00dcberg\u00e4nge an verkehrsreichen Stra\u00dfen sowie an Kinderg\u00e4rten und Schule geschaffen werden.\nIm Ort w\u00fcnschen wir uns gr\u00fcne Oasen und Pl\u00e4tze zum Verweilen. Nachhaltigkeit und Klimaschutz sollten bei allen Entscheidungen richtungsweisend sein.\nWir wollen geh\u00f6rt werden und mitreden. Daher haben wir eine BI gegr\u00fcndet, die unter anderem die zuvor genannten Ziele und L\u00f6sungen verfolgt. Dazu wollen wir \u00d6ffentlichkeit und Transparenz schaffen und die Einwohner*innen fr\u00fchzeitig informieren. Wir m\u00f6chten auf die Verantwortlichen im Sinne der Ziele und L\u00f6sungen einwirken und vor allem im Bau- sowie dem Mobilit\u00e4tsausschuss Rede- und Fragerecht bekommen. Gerne vernetzen wir uns mit weiteren Interessensgemeinschaften.\nJe mehr Unterst\u00fctzer*innen sich in der BI organisieren, um so gr\u00f6\u00dfer wird unser Einfluss. Haben Sie Kenntnis von \u00e4hnlichen Bestrebungen oder Interessensgemeinschaften, dann teilen Sie uns dies bitte mit.", "Philip T\u00f6llner schloss 2014 sein Master Maschinenbaustudium an der Universit\u00e4t Rostock mit den Vertiefungen Str\u00f6mungsmaschinen, -technik und thermische Prozesse ab.\nAnschlie\u00dfend hat Philip ca. 3 Jahre im BMBF gef\u00f6rderten Verbundprojekt BeMobil (Bewegungsf\u00e4higkeit und Mobilit\u00e4t wiedererlangen) im Teilprojekt C1 (Messtechnikbasierte Gangbildoptimierung bei Oberschenkelamputierten) bei der Rehabtech Research Lab GmbH in Berlin gearbeitet. Die Arbeitsgruppe besch\u00e4ftigte sich mit der Mobilmachung der Ganganalyse durch tragbare Sensoren. So wurde die Kinematik anstatt mit markerbasiertes Tracking (station\u00e4r) durch Inertialsensoren (mobil) und die Kinetik anstatt mit Kraftmessplatten (station\u00e4r) durch einen in die Prothese integrierbaren 6 DOF Kraft- und Momentensensor (mobil) gel\u00f6st. Die Sensoren und Algorithmen wurden entwickelt, an Pr\u00fcfst\u00e4nden zur Ganganalyse und Prothesenkomponentenpr\u00fcfung validiert und anschlie\u00dfend an Probanden im Vergleich zum Goldstandard (station\u00e4re Ganganalyse) evaluiert. Philips Aufgaben im Forschungsverbund bezogen sich auf die Verbesserung von soft- und hardwarerelevanten Elementen an verschiedenen Pr\u00fcfst\u00e4nden. Seine Aufgaben umfassten die Teilgebiete: Konstruktion, Kalibrierung, Instandsetzung und Aufbereitung, Entwickeln von Pr\u00fcfszenarien und Validierung.\nIm Jahr 2018 hat Philip beim Fraunhofer IZI in Rostock als Wissenschaftler angefangen und Fragestellungen bez\u00fcglich Blutreinigungsverfahren bearbeitet.\nSeit M\u00e4rz 2019 ist Philip am Lehrstuhl f\u00fcr Mikrofluidik der Universit\u00e4t Rostock in der Position einer Haushaltsstelle besch\u00e4ftigt.\nSein Aufgabengebiet umschlie\u00dft den Bereich der additiven Fertigung insbesondere das CEM-Verfahren (composite extrusion modeling), welches am Lehrstuhl entwickelt wurde.", "Suchbegriff1 Index1 Beliebig Signatur ISBN Titel Verfasser Schlagw\u00f6rter Operator1 UND ODER NICHT Aufbl\u00e4ttern 1\nSuchbegriff2 Index2 Verfasser Beliebig Signatur ISBN Titel Schlagw\u00f6rter Operator2 UND ODER NICHT Aufbl\u00e4ttern 2\nSuchbegriff3 Index3 Titel Verfasser Beliebig Signatur ISBN Schlagw\u00f6rter Operator3 UND ODER NICHT Aufbl\u00e4ttern 3\nSuchbegriff4 Index4 ISBN Titel Verfasser Beliebig Signatur Schlagw\u00f6rter Operator4 UND ODER NICHT Aufbl\u00e4ttern 4\nSuchbegriff5 Index5 Signatur ISBN Titel Verfasser Beliebig Schlagw\u00f6rter Operator5 UND ODER NICHT Aufbl\u00e4ttern 5\nEinschr\u00e4nken von Erscheinungsjahr bis Erscheinungsjahr\nDatens\u00e4tze pro Seite anzeigen 10 20 30 40 50 100 200\nEinschr\u00e4nken nach Zweigstellen Alle Zweigstellen 01 - Studium fundamentale 02 - Wirtschaftswissenschaften 03 - Medizin 04 - Zahnmedizin 07 Pflegewissenschaft 09 - IBAM Magazin 1 --> Bitte hier klicken! Magazin 2 --> Bitte hier klicken!\nEinschr\u00e4nken nach Medientyp Alle Medientypen Ausstellungskatalog Kongress Buch CD Datenbank online Dissertation DVD (Film) DVD-ROM elektronische Zeitschrift elektronischer Volltext Gesamttitel Lernprogramm Loseblattsammlung Medienkombination Schriftenreihe sonstige Medien Tontr\u00e4ger Video Zeitschrift\nEinschr\u00e4nken nach Literaturabteilung Alle Literaturabteilungen Allg. u. vergl. Sprach- und Literaturwissenschaft Allgemeines Anglistik Architektur. Bauingenieurwesen. Vermessungswesen Astronomie Autoren Geisteswissenschaften Biologie Chemie Elektrotechnik Erziehungswissenschaft Geowissenschaften Germanistik Geschichte Informatik Kunstwissenschaften Land- und Forstwirtschaft. Haushalts-, Ern\u00e4hrungs- und Lebensmittelwissenschaften Maschinenbau Mathematik Medizin Naturwissenschaften allgemein Philosophie Physik Politikwissenschaft Psychologie Rechtswissenschaft Religionswissenschaft. Theologie Romanistik Sonstige Gebiete der Technik Sonstige Philologien Sozialwissenschaften allgemein Soziologie Sportwissenschaft Technik allgemein Wirtschaftswissenschaften Zahn-, Mund- und Kieferheilkunde\nSortierpr\u00e4ferenz 5 - Erscheinungsjahr absteigend 0 - Standard 1 - Titel, Erscheinungsjahr 2 - Erscheinungsjahr, Titel 3 - Erscheinungsjahr, Verfasser 4 - Verfasser, Erscheinungsjahr 6 - Regalstandort 7 - Verfasser, Titel\nErweiterte Suche\nGeben Sie einen oder mehrere Suchbegriff/e ein, w\u00e4hlen Sie die entsprechenden gew\u00fcnschten Indexe aus und klicken anschlie\u00dfend auf den Knopf \"Suchen\" um Ihre Suche zu starten. Alternativ k\u00f6nnen Sie auch die \"EINGABETASTE\" verwenden.\nSie k\u00f6nnen au\u00dferdem das Erscheinungsjahr von und bis Erscheinungsjahr eingeben, um nur diejenigen Medien zu erhalten, die in dem entsprechenden Zeitraum publiziert wurden.\nZus\u00e4tzlich ist das Einschr\u00e4nken nach Medientyp oder Literaturabteilung m\u00f6glich. Zum Ausw\u00e4hlen der Begriffe die Dropdownbox herunterklappen.\nWeiterhin k\u00f6nnen Sie die gew\u00fcnschte Anzahl der Ergebnisse pro Seite und Ihre Sortierung einstellen.\nIndex aufbl\u00e4ttern\nDurch Anklicken der Schaltfl\u00e4che Index aufbl\u00e4ttern wird nach Eingabe eines Suchbegriffes die Liste der Suchindizes angezeigt.\nBildschirminhalt l\u00f6schen\nDie Schaltfl\u00e4che L\u00f6schen bewirkt, dass alle eingegebenen Informationen gel\u00f6scht werden, um eine neue Suchanfrage eingeben zu k\u00f6nnen.", "Vereinbaren Sie mit uns einen pers\u00f6nlichen Termin. Dies k\u00f6nnen Sie telefonisch, per E-Mail oder Chat tun.\nTreffen mit dem Maler-Experten. Mit gezielten Fragen stellen wir Ihre Bed\u00fcrfnisse fest und beraten Sie gerne wie das Projekt optimal umgesetzt werden kann.\n03\nAngebot erhalten\nIhr individuelles Angebot erhalten Sie von uns am n\u00e4chsten Tag. Darin enthalten: detaillierte Beschreibung und Terminangabe.", "Gesundheit ist h\u00e4ufig keine Gl\u00fcckssache. Viel h\u00e4ngt von der Lebensweise ab. Ob jemand sich gesund und wohlf\u00fchlt, liegt zum gro\u00dfen Teil in der eigenen Verantwortung. Als Experten der Pharmazie sind wir Ihre Partner bei allen Problemen, die Ihre Gesundheit betreffen.\nUnser Leistungsspektrum ist umfassend und basiert auf den neuesten Erkenntnissen der modernen Medizin. Unsere qualifizierten Mitarbeiter setzen sich engagiert f\u00fcr die Anliegen der Patienten ein.\nLernen Sie unsere Apotheke online kennen. Vor allem aber freuen wir uns \u00fcber einen pers\u00f6nlichen Besuch.\nIhr Team der Meier'schen Apotheke:\nFrau Dr. Apothekerin Bettina Salzer, Herr Apotheker Michael Meier, Frau Apothekerin Stephanie St\u00f6cker, Frau Apothekerin Van Duong, Frau Apothekerin Ana Diemer, Frau Verena Heeke und Frau Thuy Meier", "Weitere Optionen Index Beliebig Verfasser Titel ISBN Schlagw\u00f6rter Signatur Bitte w\u00e4hlen Sie Ihre bevorzugte Sortierung aus: 5 - Erscheinungsjahr absteigend 0 - Standard 1 - Titel, Erscheinungsjahr 2 - Erscheinungsjahr, Titel 3 - Erscheinungsjahr, Verfasser 4 - Verfasser, Erscheinungsjahr 6 - Regalstandort 7 - Verfasser, Titel Einschr\u00e4nken nach Zweigstellen Alle Zweigstellen 01 - Studium fundamentale 02 - Wirtschaftswissenschaften 03 - Medizin 04 - Zahnmedizin 07 Pflegewissenschaft 09 - IBAM Magazin 1 --> Bitte hier klicken! Magazin 2 --> Bitte hier klicken! Phrasensuche einschalten Einschr\u00e4nken von Erscheinungsjahr bis Erscheinungsjahr Datens\u00e4tze pro Seite anzeigen 10 20 30 40 50 100 200\nEinfache Suche\nGeben Sie ihren Suchbegriff ein und klicken anschlie\u00dfend auf den Knopf \"Suchen\" um Ihre Suche zu starten. Alternativ k\u00f6nnen Sie auch die \"EINGABETASTE\" verwenden.\nIndex aufbl\u00e4ttern\nDurch Anklicken der Schaltfl\u00e4che Index aufbl\u00e4ttern nach Eingabe eines Suchbegriffes wird die Liste der Suchindizes angezeigt.\nBildschirminhalt l\u00f6schen\nDie Schaltfl\u00e4che L\u00f6schen bewirkt, dass alle eingegebenen Informationen gel\u00f6scht werden, um eine neue Suchanfrage eingeben zu k\u00f6nnen. Sie k\u00f6nnen au\u00dferdem das Erscheinungsjahr von und bis Erscheinungsjahr eingeben, um nur diejenigen Medien zu erhalten, die in dem entsprechenden Zeitraum publiziert wurden.\n(HilfeSimp.dat)\nBeliebte Suchbegriffe\n- BERGER PETER L- BOCKEMUEHL MICHAEL- BRUHN MANFRED- GEMEINSAME WISSENSCHAFTSKONFERENZ- HOEFFE OTFRIED- LANDESBETRIEB INFORMATION UND TECHNIK NORDRHEINWESTFALEN- NORDRHEINWESTFALEN LANDESAMT FUER DATENVERARBEITUNG UND STATISTIK- SCHELLING FRIEDRICH WILHELM JOSEPH VON- WALGER GERD- WOOLF VIRGINIA-", "Regeneration - wir alle wissen wie wichtig sie ist und auch, dass wir unser volles Potenzial nur entfaltet k\u00f6nnen, wenn nach...\nDER WEG ZUR GESUNDHEIT F\u00dcHRT DURCH DIE K\u00dcCHE, NICHT DURCH DIE APOTHEKE.\nGetreu diesem Motto von Sebastian Kneipp durften wir, d.h. mein Mann J\u00fcrgen hinter den Kameras und am Mischpult und ich wirbelnd in der...\n\u00d6TILL\u00d6 SWIMRUN Weltmeisterschaft in Schweden\n65 km Laufen mit Neopren und Paddels, 10 km Schwimmen mit Laufschuhen. 15 Grad kaltes Ostseewasser und 24 Inseln, die es zu durchqueren...\nChallenge Roth\nGibt es was Sch\u00f6neres als anderen bei der Verwirklichung ihrer Tr\u00e4ume helfen zu d\u00fcrfen? Wohl kaum. Gestern war wieder einer dieser...\nFantastische Race Ergebnisse meiner Athleten\nWas bin ich stolz auf die Leistungen meiner Athleten! Die letzten Wochen liefen einfach super und viele konnten endlich zeigen wie gut...", "Es gibt verschiedene Schutz-Mechanismen um E-Mail-Adressen im Quelltext einer Website vor Spam-Bots zu sch\u00fctzen. Wie effektiv diese wirklich sind, hat Dr. David R. Nadeau in einem Test untersucht. Die Tests sind Bestandteil seiner Artikel-Serie \u201eEffective methods to protect email addresses from spammers\u201c\nIn seinem 1. Test \u201eSpam-Bots durch verschleiern der E-Mail-Adresse stoppen\u201c folgende Methoden getestet:\nErsetzen des \u201e@\u201c durch einen Zeichencode\nErsetzen der ganzen Adresse durch Zeichencodes\nErsetzen der Adresse in einem mailto Link mit URL-Zeichencodes\nNutzung von CSS um eine umgekehrte E-Mail-Adresse zur\u00fcck zu kehren\nNutzung des Tags um eine umgekehrte E-Mail-Adresse zur\u00fcck zu kehren\nDas Ergebnis (zusammengefasst):\nE-Mail-Adressen durch ASCII-Zeichencodes zu verschleiern (1-3) ist eine verbreitete Methode, die nicht (mehr) erfolgreich wirkt.\nR\u00fcckw\u00e4rts geschriebene E-Mail-Adressen (4-5) werden von Spam-Bots meist (noch) nicht erkannt/erfasst. Diese Methode ist nur so lange effektiv, bis sie bekannter wird (Spam-Bots r\u00fcsten auch nach).\nZudem hat sie eine schlechte Nutzbarkeit und Zug\u00e4nglichkeit. Die E-Mail-Adresse wird zwar im Browser \u201arichtig\u2018 herum dargestellt, kann jedoch nur \u201afalsch\u2018 herum \u00fcber die Zwischenablage kopiert werden. Screenreader k\u00f6nnen diese ebenfalls nicht \u201aumdrehen\u2018.\nEmpfehlung: Man sollte sich nicht auf die Verschleierung von E-Mail-Adressen verlassen. Spammer kennen diese Tricks inzwischen.", "Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Ger\u00e4teinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, k\u00f6nnen wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zur\u00fcckziehst, k\u00f6nnen bestimmte Merkmale und Funktionen beeintr\u00e4chtigt werden.\nFunktional Funktional Immer aktiv\nDie technische Speicherung oder der Zugang ist unbedingt erforderlich f\u00fcr den rechtm\u00e4\u00dfigen Zweck, die Nutzung eines bestimmten Dienstes zu erm\u00f6glichen, der vom Teilnehmer oder Nutzer ausdr\u00fccklich gew\u00fcnscht wird, oder f\u00fcr den alleinigen Zweck, die \u00dcbertragung einer Nachricht \u00fcber ein elektronisches Kommunikationsnetz durchzuf\u00fchren.\nVorlieben Vorlieben\nDie technische Speicherung oder der Zugriff ist f\u00fcr den rechtm\u00e4\u00dfigen Zweck der Speicherung von Pr\u00e4ferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.\nStatistiken Statistiken\nDie technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zus\u00e4tzliche Aufzeichnungen von Dritten k\u00f6nnen die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.\nMarketing Marketing\nDie technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder \u00fcber mehrere Websites hinweg zu \u00e4hnlichen Marketingzwecken zu verfolgen.", "Der SV-DJK Kolbermoor (im Folgenden [Abk\u00fcrzung Verein]) nimmt als Anbieter der WebSite www.bmx-kolbermoor.de und verantwortliche Stelle die Verpflichtung zum Datenschutz sehr ernst und gestaltet seine WebSite so, dass nur so wenige personenbezogene Daten wie n\u00f6tig erhoben, verarbeitet und genutzt werden. Unter keinen Umst\u00e4nden werden personenbezogene Daten zu Werbezwecken an Dritte vermietet oder verkauft. Ohne die ausdr\u00fcckliche Einwilligung des Besuchers werden keine personenbezogenen Daten f\u00fcr Werbe- oder Marketingzwecke genutzt.\nZugriff auf personenbezogene Daten haben beim Verein nur solche Personen, die diese Daten zur Durchf\u00fchrung ihrer Aufgaben innerhalb der verantwortlichen Stelle ben\u00f6tigen, die \u00fcber die gesetzlichen Bestimmungen zum Datenschutz informiert sind und sich gem\u00e4\u00df der geltenden gesetzlichen Bestimmungen (\u00a7 5 Bundesdatenschutzgesetzes [BDSG], bzw. Art. 5 der EU-Datenschutzgrundverordnung [EU-DSGVO]) verpflichtet haben, diese einzuhalten. Die Erhebung, Verarbeitung, Nutzung und \u00dcbermittlung der erhobenen personenbezogenen Daten erfolgt nach \u00a7 28 Abs. 1 und Abs. 3 BDSG, bzw., ab dem 25.05.2018, Art. 6. Abs. 1 EU-DSGVO, jeweils nur in dem Umfang, der f\u00fcr die Durchf\u00fchrung eines Vertragsverh\u00e4ltnisses zwischen dem Verein, als verantwortlicher Stelle, und dem Besucher, als Betroffenem, erforderlich ist.\nZweck\u00e4nderungen der Verarbeitung und Datennutzung\nDa sich auf Grund des technischen Fortschritts und organisatorischer \u00c4nderungen der eingesetzten Verarbeitungsverfahren \u00e4ndern/weiterentwickeln k\u00f6nnen behalten wir uns vor, die vorliegende Datenschutzerkl\u00e4rung gem\u00e4\u00df den neuen technischen Rahmenbedingungen weiterzuentwickeln. Wir bitten Sie deshalb die Datenschutzerkl\u00e4rung von www.bmx-kolbermoor.de von Zeit zu Zeit zu \u00fcberpr\u00fcfen. Sollten Sie mit den im Verlaufe der Zeit auftretenden Weiterentwicklungen nicht einverstanden sein, so k\u00f6nnen Sie schriftlich, gem\u00e4\u00df\nArt. 17 EU-DSGVO, eine L\u00f6schung der Daten, die nicht auf Grundlage anderer gesetzlicher Vorgaben, wie handelsrechtlicher oder steuerrechtlicher Aufbewahrungspflichten, gespeichert werden, verlangen.\nAnonyme Datenerhebung\nSie k\u00f6nnen die Webseiten der verantwortlichen Stelle grunds\u00e4tzlich besuchen, ohne uns mitzuteilen, wer Sie sind. Wir erfahren nur den Namen Ihres Internet Service Providers, die Webseite, von der aus Sie uns besuchen, und die Webseiten, die Sie bei uns besuchen. Diese Informationen werden zu statistischen Zwecken ausgewertet. Sie bleiben als einzelner Nutzer hierbei anonym.\nErhebung und Verarbeitung personenbe- zogener Daten\nPersonenbezogene Daten werden nur erhoben, wenn Sie uns diese von sich aus, zum Beispiel zum Zwecke der Durchf\u00fchrung eines Vertragsverh\u00e4ltnisses zwischen dem Verein, als verantwortlicher Stelle, und dem Besucher, als Betroffenem, mitteilen. Die verantwortliche Stelle h\u00e4lt sich dabei an die Vorgaben der Art. 5 und 6 EU-DSGVO. Im Rahmen der personalisierten Dienste der verantwortlichen Stelle werden Ihre Registrierungsdaten unter der Voraussetzung Ihrer Einwilligung zum Zwecke der Zusendung unseres Newsletters, bzw. zur bedarfsgerechten Gestaltung der angebotenen elektronischen Dienste verarbeitet. Sie haben jederzeit die M\u00f6glichkeit, der Speicherung ihrer personenbezogenen Daten zu widersprechen. Bitte senden Sie dazu eine E-Mail an info@svdjk.de mit dem Betreff \"Datenbest\u00e4nde austragen\".\nDie Verarbeitung und Nutzung Ihrer personenbezogenen Daten erfolgt nach den Vorgaben des BDSG bzw., ab 25.05.2018, der EU-DSGVO.\nExport und Verarbeitung der Daten in Staaten au\u00dferhalb des Europ\u00e4ischen Wirtschafts- raumes\nEs findet kein Export ihrer personenbezogenen Daten in Staaten au\u00dferhalb des Europ\u00e4ischen Wirtschaftsraumes (im Folgenden EWR) statt.\nTrotzdem k\u00f6nnen, soweit Sie sich in Facebook eingeloggt haben oder einen Twitter-Account oder ein Instagram-Account besitzen, personenbezogene Daten in die USA exportiert werden. Zu n\u00e4heren Erl\u00e4uterungen und zu M\u00f6glichkeiten diesen Datenexport zu verhindern lesen Sie bitte den Gliederungspunkt \u201eVerwendung von Facebook Social Plugins\u201c, bzw. \u201eVerwendung von Twitter\u201c, bzw. \u201eVerwendung von Instagram Social Plugins\u201c der vorliegenden Datenschutzerkl\u00e4rung.\nEine \u00dcbermittlung von personenbezogenen Daten an Google im Rahmen der Nutzung von Analyseprogrammen durch die verantwortliche Stelle findet hingegen nicht statt, da Ihre IP-Adresse nur anonymisiert \u00fcbermittelt wird. Lesen Sie dazu bitte den Punkt \u201eVerwendung von Analyseprogrammen\u201c der vorliegenden Datenschutzerkl\u00e4rung.\nSoweit Sie sich bei Google eingeloggt haben oder Youtube-Account besitzen, k\u00f6nnen personenbezogene Daten in die USA exportiert werden. Zu n\u00e4heren Erl\u00e4uterungen und zu M\u00f6glichkeiten diesen Datenexport zu verhindern beachten Sie bitte den Gliederungspunkt \u201eVerwendung von YouTube-Plugins\u201c.\nDie von der verantwortlichen Stelle eingeschalteten Dienstleister haben ihren Sitz und betreiben ihre IT-Infrastruktur ausschlie\u00dflich innerhalb des EWR. Dies gilt auch f\u00fcr eine eventuelle Nutzung von Cloud-basierenden Diensten. Mit den Dienstleistern bestehen Vertr\u00e4ge die die Datenschutz- und Datensicherheits-Vorgaben der Europ\u00e4ischen Datenschutzrichtlinie (95/46/EG) und des deutschen Datenschutzrechts, bzw., ab dem 25.05.2018, der EU-DSGVO entsprechen. Auch im Falle der Einschaltung von externen Dienstleistern bleibt der Verein die f\u00fcr die Verarbeitung verantwortliche Stelle.\nNutzung und Weitergabe personenbezogener Daten\nDie im Rahmen der Webseiten der verantwortlichen Stelle erhobenen personenbezogenen Daten werden ohne Ihre Einwilligung nur zur Vertragsabwicklung und Bearbeitung Ihrer Anfragen genutzt. Dar\u00fcber hinaus erfolgt eine Nutzung Ihrer Daten f\u00fcr Zwecke der Werbung und Marktforschung der verantwortlichen Stelle nur, wenn Sie hierzu zuvor Ihre Einwilligung erteilt haben. Im \u00dcbrigen findet keine Weitergabe an sonstige Dritte statt. Ihre jeweilige Einwilligung k\u00f6nnen Sie selbstverst\u00e4ndlich jederzeit mit Wirkung f\u00fcr die Zukunft widerrufen.\nExterne Links\nZu Ihrer Information finden Sie auf unseren Seiten Links, die auf Seiten Dritter verweisen. Soweit dies nicht offensichtlich erkennbar ist, weisen wir Sie darauf hin, dass es sich um einen externen Link handelt. Die verantwortliche Stelle hat keinerlei Einfluss auf den Inhalt und die Gestaltung dieser Seiten anderer Anbieter. Die Garantien dieser Datenschutzerkl\u00e4rung gelten daher f\u00fcr externe Anbieter nicht.\nEinsatz von Cookies\nDie verantwortliche Stelle verwendet sogenannte \"Cookies\", um die Online-Erfahrung und Online-Zeit des Kunden individuell auszugestalten und zu optimieren. Ein Cookie ist eine Textdatei, die entweder tempor\u00e4r im Arbeitsspeicher des Computers abgelegt (\"Sitzungscookie\") oder auf der Festplatte gespeichert wird (\"permanenter\" Cookie). Cookies enthalten z.B. Informationen \u00fcber die bisherigen Zugriffe des Nutzers auf den entsprechenden Server bzw. Informationen dar\u00fcber, welche Angebote bisher aufgerufen wurden. Cookies werden nicht dazu eingesetzt, um Programme auszuf\u00fchren oder Viren auf Ihren Computer zu laden. Hauptzweck von Cookies ist vielmehr, ein speziell auf den Kunden zugeschnittenes Angebot bereitzustellen und die Nutzung des Service so komfortabel wie m\u00f6glich zu gestalten.\nDie verantwortliche Stelle verwendet Sitzungscookies sowie permanente Cookies.\nSitzungscookies\nDie verantwortliche Stelle verwendet \u00fcberwiegend \"Sitzungscookies\", die nicht auf der Festplatte des Kunden gespeichert werden und die mit Verlassen des Browsers gel\u00f6scht werden. Sitzungscookies werden hierbei zur Login-Authentifizierung und zum Load-Balancing (Ausgleich der System-Belastung) verwendet.\nPermanente Cookies\nDar\u00fcber hinaus verwendet die verantwortliche Stelle \u201epermanente Cookies\u201c, um die pers\u00f6nlichen Nutzungseinstellungen, die ein Kunde bei der Nutzung der Services der verantwortlichen Stelle eingibt, zu speichern und so eine Personalisierung und Verbesserung des Service vornehmen zu k\u00f6nnen. Durch die permanenten Cookies wird sichergestellt, dass der Kunde bei einem erneuten Besuch der Webseiten der verantwortlichen Stelle seine pers\u00f6nlichen Einstellungen wieder vorfindet. Daneben verwenden die Dienstleister, die die verantwortliche Stelle mit der Analyse des Nutzerverhaltens beauftragt hat, permanente Cookies, um wiederkehrende Nutzer erkennen zu k\u00f6nnen. Diese Dienste speichern die vom Cookie \u00fcbermittelten Daten ausschlie\u00dflich anonym ab. Eine Zuordnung zur IP-Adresse des Kunden wird nicht vorgehalten.\nVermeidung von Cookies\nDer Besucher hat jederzeit die M\u00f6glichkeit, das Setzen von Cookies abzulehnen. Dies geschieht in der Regel durch die Wahl der entsprechenden Option in den Einstellungen des Browsers oder durch zus\u00e4tzliche Programme. N\u00e4heres ist der Hilfe-Funktion des kundenseitig verwendeten Browsers zu entnehmen. Entscheidet sich der Kunde f\u00fcr die Ausschaltung von Cookies, kann dies den Leistungsumfang des Services mindern und sich bei der Nutzung der Dienste der verantwortlichen negativ bemerkbar machen.\nVerwendung von Analyseprogrammen\nDie verantwortliche Stelle f\u00fchrt Analysen \u00fcber das Verhalten seiner Kunden im Rahmen der Nutzung seines Service durch bzw. l\u00e4sst diese durchf\u00fchren. Zu diesem Zweck werden anonymisierte oder pseudonymisierte Nutzungsprofile erstellt. Die Erstellung der Nutzungsprofile erfolgt zu dem alleinigen Zweck, den Service der verantwortlichen Stelle st\u00e4ndig zu verbessern.\nDie verantwortliche Stelle verwendet im Rahmen der Web-Analyse auch Google Analytics, einen Web-Analysedienst der Google Inc. (\"Google\"), den die verantwortliche Stelle Google Analytics mit der Erweiterung \u201e_anonymizeIp()\u201c nutzt. Dadurch werden die IP-Adressen nur gek\u00fcrzt verarbeitet, um eine direkte Personenbeziehbarkeit auszuschlie\u00dfen. Der in diesem Zusammenhang stattfindenden Datenerhebung und -speicherung kann jederzeit mit Wirkung f\u00fcr die Zukunft widersprochen werden. Bitte wenden Sie sich dazu direkt an Google\nGoogle gibt seinen Nutzern, wie beispielsweise der verantwortlichen Stelle vor, die nachfolgende Belehrung in ihren Datenschutzerkl\u00e4rungen zu verwenden. Dieser Aufforderung kommt der Verein mit der Wiedergabe des folgenden Textes nach:\n\"Google Analytics verwendet sog. \u201eCookies\u201c, Textdateien, die auf Ihrem Computer gespeichert werden und die eine Analyse der Benutzung der Website durch Sie erm\u00f6glichen. Die durch den Cookie er-zeugten Informationen \u00fcber Ihre Benutzung dieser Website (einschlie\u00dflich Ihrer IP-Adresse) werden an einen Server von Google in den USA \u00fcbertragen und dort gespeichert. Google wird diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports \u00fcber die Websiteaktivit\u00e4ten f\u00fcr die Websitebetreiber zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen zu erbringen. Auch wird Google diese Informationen gegebenenfalls an Dritte \u00fcbertragen, sofern dies gesetzlich vorgeschrieben oder soweit Dritte diese Daten im Auftrag von Google verarbeiten. Google wird in keinem Fall Ihre IP-Adresse mit anderen Daten von Google in Verbindung bringen. Sie k\u00f6nnen die Installation der Cookies durch eine entsprechende Einstellung Ihrer Browser Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht s\u00e4mtliche Funktionen dieser Website vollumf\u00e4nglich nutzen k\u00f6nnen. Durch die Nutzung dieser Website erkl\u00e4ren Sie sich mit der Bearbeitung der \u00fcber Sie erhobenen Daten durch Google in der zuvor beschriebenen Art und Weise und zu dem zuvor benannten Zweck einverstanden.\"\nVerwendung von Facebook Social Plugins\nDie verantwortliche Stelle verwendet auf ihrer Website Social Plugins (\"Plugins\") des sozialen Netzwerkes facebook.com, welches von der Facebook Inc., 1601 S. California Ave, Palo Alto, CA 94304, USA betrieben wird (\"Facebook\"). Die Plugins sind mit einem Facebook Logo gekennzeichnet. Wenn der Kunde eine Webseite der verantwortlichen Stelle aufruft, die ein solches PlugIn enth\u00e4lt, baut der Browser des Kunden eine direkte Verbindung mit den Servern von Facebook auf. Der Inhalt des Plugins wird von Facebook direkt an den Browser des Kunden \u00fcbermittelt und von diesem in die Webseite eingebunden.\nDurch die Einbindung der Plugins erh\u00e4lt Facebook die Information, dass der Kunde die entsprechende Seite des Internetauftritts der verantwortlichen Stelle aufgerufen hat. Ist der Kunde bei Facebook eingeloggt, kann Facebook den Besuch des Kunden seinem Facebook-Konto zuordnen. Wenn der Kunde mit den Plugins interagiert, zum Beispiel den \"Gef\u00e4llt mir\" Button bet\u00e4tigen oder einen Kommentar abgibt, wird die entsprechende Information von dem Browser des Kunden direkt an Facebook \u00fcbermittelt und dort gespeichert.\nZweck und Umfang der Datenerhebung und die weitere Verarbeitung und Nutzung der Daten durch Facebook sowie diesbez\u00fcgliche Rechte und Einstellungsm\u00f6glichkeiten des Kunden zum Schutz seiner Privatsph\u00e4re ist den Datenschutzhinweisen von Facebook zu entnehmen.\nSollte der Kunde nicht wollen, dass Facebook in der vorbeschriebenen Weise Daten sammelt, muss der Kunde sich vor seinem Besuch des Internetauftritts der verantwortlichen Stelle bei Facebook ausloggen.\nVerwendung von Twitter\nDie verantwortliche Stelle verwendet auf ihrer Website Funktionen des Dienstes Twitter. Diese Funktionen werden angeboten durch die Twitter Inc., Twitter, Inc. 1355 Market St, Suite 900, San Francisco, CA 94103, USA. Durch das Benutzen von Twitter und der Funktion \"Re-Tweet\" werden die von Ihnen besuchten Webseiten mit Ihrem Twitter-Account verkn\u00fcpft und anderen Nutzern bekannt gegeben. Dabei werden auch Daten an Twitter \u00fcbertragen.\nWir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der \u00fcbermittelten Daten sowie deren Nutzung durch Twitter erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerkl\u00e4rung von Twitter unter:\nwww.twitter.com/privacy\nIhre Datenschutzeinstellungen bei Twitter k\u00f6nnen Sie in den Konto-Einstellungen \u00e4ndern unter:\nwww.twitter.com/account/settings.\nVerwendung von Instagram Social Plugins\nDie verantwortliche Stelle verwendet auf ihrer Website Social Plugins (\u201ePlugins\u201c) von Instagram, das von der Instagram LLC., 1601 Willow Road, Menlo Park, CA 94025, USA (\u201eInstagram\u201c) betrieben wird. Die Plugins sind mit einem Instagram-Logo beispielsweise in Form einer \u201eInstagram-Kamera\u201c gekennzeichnet. Eine \u00dcbersicht \u00fcber die Instagram Plugins und deren Aussehen finden Sie hier:\nhttp://blog.instagram.com/post/36222022872/introducing-instagram-badges\nWenn Sie eine Seite unseres Webauftritts aufrufen, die ein solches Plugin enth\u00e4lt, stellt Ihr Browser eine direkte Verbindung zu den Servern von Instagram her. Der Inhalt des Plugins wird von Instagram direkt an Ihren Browser \u00fcbermittelt und in die Seite eingebunden. Durch diese Einbindung erh\u00e4lt Instagram die Information, dass Ihr Browser die entsprechende Seite unseres Webauftritts aufgerufen hat, auch wenn Sie kein Instagram-Profil besitzen oder gerade nicht bei Instagram eingeloggt sind. Diese Information (einschlie\u00dflich Ihrer IP-Adresse) wird von Ihrem Browser direkt an einen Server von Instagram in die USA \u00fcbermittelt und dort gespeichert.\nSind Sie bei Instagram eingeloggt, kann Instagram den Besuch unserer Website Ihrem Instagram-Account unmittelbar zuordnen. Wenn Sie mit den Plugins interagieren, zum Beispiel das \u201eInstagram\u201c-Button bet\u00e4tigen, wird diese Information ebenfalls direkt an einen Server von Instagram \u00fcbermittelt und dort gespeichert. Die Informationen werden au\u00dferdem auf Ihrem Instagram-Account ver\u00f6ffentlicht und dort Ihren Kontakten angezeigt.\nZweck und Umfang der Datenerhebung und die weitere Verarbeitung und Nutzung der Daten durch Instagram sowie Ihre diesbez\u00fcglichen Rechte und Einstellungsm\u00f6glichkeiten zum Schutz Ihrer Privatsph\u00e4re entnehmen Sie bitte den Datenschutzhinweisen von Instagram:\nhttps://help.instagram.com/155833707900388/\nWenn Sie nicht m\u00f6chten, dass Instagram die \u00fcber unseren Webauftritt gesammelten Daten unmittelbar Ihrem Instagram-Account zuordnet, m\u00fcssen Sie sich vor Ihrem Besuch unserer Website bei Instagram ausloggen. Sie k\u00f6nnen das Laden der Instagram Plugins auch mit Add-Ons f\u00fcr Ihren Browser komplett verhindern, z.B. mit dem Skript-Blocker \u201eNoScript\u201c (http://noscript.net/).\nVerwendung von YouTube-Plugins\nDie verantwortliche Stelle nutzt f\u00fcr die Einbindung von Videos u.a. den Anbieter YouTube. YouTube wird betrieben von YouTube LLC mit Hauptgesch\u00e4ftssitz in 901 Cherry Avenue, San Bruno, CA 94066, USA. YouTube wird vertreten durch Google Inc. mit Sitz in 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA.\nDie verantwortliche Stelle verwendet auf ihrer Website Plugins des Anbieters YouTube. Wenn Sie unsere mit einem YouTube Plugin versehene Internetpr\u00e4senz aufrufen wird eine Verbindung zu den Servern von YouTube hergestellt. Hierdurch wird an den YouTube-Server \u00fcbermittelt, welche Internetseiten Sie besucht haben.\nSind Sie dabei als Mitglied bei YouTube eingeloggt, ordnet YouTube diese Information Ihrem pers\u00f6nlichen Benutzerkonto zu. Bei Nutzung des Plugins wie z.B. Anklicken des Start-Buttons eines Videos wird diese Information ebenfalls Ihrem Benutzerkonto zugeordnet.\nSie k\u00f6nnen diese Zuordnung verhindern, indem Sie sich vor der Nutzung unserer Internetseite aus ihrem YouTube-Benutzerkonto sowie anderen Benutzerkonten der Firmen YouTube LLC und Google Inc. abmelden und die entsprechenden Cookies der Firmen l\u00f6schen.\nWeitere Informationen zur Datenverarbeitung und Hinweise zum Datenschutz durch YouTube (Google) finden Sie unter www.google.de/intl/de/policies/privacy/.\nWeitere Informationen und Kontakte\nWenn Sie weitere Fragen zum Thema \u201cDatenschutz bei der verantwortlichen Stelle\u201d haben, wenden Sie sich an den Datenschutzbeauftragten des Verein. Sie k\u00f6nnen erfragen, welche Ihrer Daten bei uns gespeichert sind. Dar\u00fcber hinaus k\u00f6nnen Sie Ausk\u00fcnfte, L\u00f6schungs- und Berichtigungsw\u00fcnsche zu Ihren Daten und gerne auch Anregungen jederzeit per Brief oder E-Mail an folgende Adresse senden:\nProfessor Dr. Rolf Lauser\nDatenschutzbeauftragter des BLSV\nDr. Gerhard-Hanke-Weg 31\nD-85221 Dachau\nE-Mail: rolf@lauser-nhk.de\" target=\"_blank\" title=\"eMail an Prof. Dr. Rolf Lauser\">rolf(at)lauser-nhk.de", "CBD-\u00d6l ist ein unglaubliches Naturheilmittel, das aus der Cannabispflanze gewonnen wird und das keinerlei psychoaktiven Effekte hervorruft. Viele Menschen haben entdeckt, dass dieses einzigartige \u00d6l ihnen dabei helfen kann, zahlreiche Krankheiten und gesundheitliche Probleme zu lindern, ohne sie dabei den unerw\u00fcnschten Nebenwirkungen traditioneller Medikamente auszusetzen. Dutch-Headshop Blog - CBD \u00d6l - H\u00e4ufig gestellte Fragen uber CBD-\u00d6l: Die 25 h\u00e4ufigsten Fragen uber CBD \u00d6l CBD-\u00d6l wird aus der Hanfpflanze gewonnen und ist in den meisten europ\u00e4ischen L\u00e4ndern legal. Das \u00d6l wird als Nahrungserg\u00e4nzungsmittel verwendet, und viele Menschen profitieren von diesem Produkt. Da es viele Fragen zu CBD-\u00d6l gibt, werden wir f\u00fcr Sie die am h\u00e4ufigsten gestellten Fragen der CBD \u00d6l herstellen? (Cannabis, Nutzhanf) - gutefrage Guten Tag Zusammen, da ich noch 1 Kg Nutzhanf Bl\u00fcten mit einem CBD Gehalt von insgesamt 11% habe w\u00fcrde ich gerne CBD \u00d6l herstellen. Die Frage ist dabei nur welches \u00d6l man verwenden kann.\nCBD \u00d6l herstellen? (Cannabis, Nutzhanf) - gutefrage\nCBD ist ein kraftvoller Antioxidans, der uns dabei helfen kann gesund zu bleiben, indem er freie Radikale bek\u00e4mpft. Vor allem in unsere modernen Welt sind wir st\u00e4ndig Toxinen ausgesetzt (Umweltgifte, Alkohol, Zigaretten, oder einfach zu viel Stress). CBD kann uns helfen, diesem oxidativen Stress entgegenzuwirken. Hier noch weitere Punkte, bei CBD - Cannabidiol CBD wirkt auf viele verschiedene Arten im K\u00f6rper. Nach dem CBD-Experten Dr. med. Franjo Grotenhermen geh\u00f6ren die folgenden Wirkmechanismen zu den wichtigsten: CBD stimuliert den Vanilloid-Rezeptor Typ 1 mit maximaler Wirkung, \u00e4hnlich wie das Capsaicin im Cayenne-Pfeffer. Das erkl\u00e4rt einen Teil der schmerzhemmenden Wirkung von CBD. Der ultimative CBD \u00d6l Leitfaden: Was ist CBD \u00d6l? - CBD \u00d6l Die Frage, was CBD \u00d6l wirklich ist, haben sich viele gestellt. Auf dieser Seite werden wir Sie dar\u00fcber aufkl\u00e4ren. Viele haben vielleicht von Hasch, Skunk und Marihuana geh\u00f6rt. Dies sind \u2026 CBD Kapseln | Gr\u00f6\u00dfte Auswahl | Bester Preis - Zamnesia CBD Softgel-Kapseln 4% (Zamnesia) Mit Zamnesia CBD Weichgelatinekapseln wird die Dosierung von CBD leichter als je zuvor. Jede Kapsel enth\u00e4lt 6,4mg unverf\u00e4lschtes CBD, so dass Du Deine Dosis starke Cannabinoide bekommst, egal wo Du bist.\nHanfextrakt \u2013 das CBD-\u00d6l \u2013 gegen Anspannung und \u00c4ngste\nAls CBD \u00d6l f\u00fcr Fortgeschrittene w\u00fcrden wir allgemein erstmal CBD \u00d6l mit einer CBD Konzentration von 10% und mehr bezeichnen. Mit etwas mehr Erfahrung empfiehlt es sich, CBD \u00d6l mit h\u00f6herer Konzentration zu kaufen. Daf\u00fcr kommt CBD \u00d6l mit mindestens 10% CBD in Frage. CBD \u00d6l Dosierung, Dosierungsrechner Bei CBD Hanf\u00f6len und getrockneten Bl\u00fcten und Bl\u00e4ttern mit CBD Gehalt ist es aber sehr schwierig zu errechnen, wie viel CBD man in einer Dose einnehmen soll, bzw. wie viel CBD soll ein Mensch pro Tag und bei welcher Erkrankung einnehmen. Deswegen listen wir ein paar generelle Hinweise zur CBD Dosierung in diesem Artikel auf. Bestenliste 2019 CBD \u00d6l. Welcher Hersteller bietet das beste CBD CBD wirkt antibakteriell, verbessert den Schlaf, stimuliert das Knochenwachstum, hemmt Tumorzellen und s tabilisiert des Blutzuckergehalt. A llerdings gibt es gro\u00dfe Unterschiede bei der Reinheit und Wirkung der CBD Produkte auf dem Markt. CBD-\u00d6l bestellen | OptimaCBD | Hochwertiges CBD in CBD Kristalle k\u00f6nnen ebenfalls oral unter die Zunge gelegt werden oder wie CBD-Bl\u00fcten mittels Vaporizer verdampft und inhaliert werden. Mithilfe dieser Darreichungsform tritt der Effekt unmittelbar nach der Inhalation ein. Die Wirkungsdauer h\u00e4ngt dabei von der Dosiermenge ab, klingt aber im Regelfall nach wenigen Stunden ab.\nCBD \u00d6l / Cannabis\u00f6l KAUFEN! Hier auf bio-cbd.de verkaufen wir nur hochwertiges CBD \u00d6l der Marke Nordic Oil. Sie k\u00f6nnen hier aber nicht nur CBD \u00d6l kaufen sondern auch wertvolle Informationen \u00fcber CBD \u00d6l f\u00fcr Tiere, Bio Cannabis\u00f6l, medizinisches Cannabis und die verschiedenen Cannabinoide erfahren.", "Alle mishmish Ketten, Ringe, Amb\u00e4nder, Ohrringe und Anh\u00e4nger sind bezaubernde Unikate. Stilbr\u00fcche sind gewollt und sorgen f\u00fcr noch mehr Individualit\u00e4t.\nNachdem ich meine sorgf\u00e4ltig ausgew\u00e4hlten Sch\u00e4tze aufbereitet (gereinigt, poliert, mattiert oder repariert) habe, werden sie bei mir in M\u00fcnchen in einem 1Mann Betrieb mit 18k Ros\u00e9gold oder mit 999 Feinsilber plattiert.\nSo entstehen wundersch\u00f6ne Einzelteile, die mit Stil und einem guten Gef\u00fchl gerne getragen und auch verschenkt werden.\nDie Kette wird in einer wundersch\u00f6nen MishMish Schmuckbox (in D\u00e4nemark hergestellt) geliefert.\n1 inkl. MwSt.\nImpressum | AGB | Widerrufsbelehrung und -formular | Liefer- und Zahlungsbedingungen | Datenschutz | Cookie-Richtlinie", "Aktuelle Informationen rund um den Podcast findet ihr dr\u00fcben auf Twitter @GeekTalkDaily. Dar\u00fcber kommuniziere ich auch etwaige Ausf\u00e4lle oder sonstige Neuigkeiten.\nAuch auf Twitter findet ihr, unter @GeekTalk_CH t\u00e4glich Neuigkeiten aus dem Pokipsie Network. Blogbeitr\u00e4ge und neue Podcast Episoden.\nDas gleiche, wenn auch unregelm\u00e4ssiger findet ihr dr\u00fcben auf Facebook.\nNat\u00fcrlich k\u00f6nnt ihr auch direkt mit mir via Twitter @pokipsie oder Instagram (@pokipsie) Kontakt treten. Da findet ihr auch unregelm\u00e4ssig Storys \u00fcber mein Leben und tolle neue und praktische Gadgets.\nIch freu mich immer \u00fcber den Austausch mit euch, lieben H\u00f6rern:innen.\nFeedback zum #GeekTalk Daily\nIch freu mich \u00fcber Feedback von euch. Hinterlasst uns euren Kommentar unten auf dieser Seite oder bewertet uns auf iTunes. Beides hilft uns den Podcast f\u00fcr euch besser zu gestalten und bekannter zu machen. DANKE daf\u00fcr im Voraus.", "Die Geschlechtsbestimmung bei Degus ist eigentlich nicht sehr kompliziert, wenn man den direkten Vergleich M\u00e4nnchen-Weibchen vor sich hat und das Tier dabei richtig h\u00e4lt. Da jedoch immer noch viele Fehlbestimmungen, auch in Tierheimen und bei Tier\u00e4rzten, vorkommen, haben wir hier die Unterschiede zusammengefasst. Sollten Sie sich unsicher sein, schicken Sie uns gerne Fotos und wir helfen.\nKontrolle muss sein Aufgrund vieler Fehlinformationen und unwissenden Verk\u00e4ufern im Zoohandel, liegt es meist in der eigenen Verantwortung die Geschlechtskontrolle durchzuf\u00fchren und falls n\u00f6tig, ein Vergleichsbild mit zu nehmen oder einen Degu-kundigen Tierarzt aufzusuchen.\n\u00d7 Warnung verwerfen\nM\u00e4nnchen (links) -- Weibchen (rechts)\nM\u00e4nnchen\nBeim M\u00e4nnchen liegt etwa ein Zentimeter zwischen Geschlechtszapfen und After, die Haut dazwischen tr\u00e4gt eine Hautfalte in L\u00e4ngsrichtung. Sie ist optimal zu erkennen, wenn man den Schwanz an der Wurzel ganz leicht nach hinten dr\u00fcckt, so dass die Haut sich dehnt.\nWeibchen\nBeim Weibchen ist der Abstand zwischen Harnr\u00f6hrenzapfen und After sehr gering; er betr\u00e4gt wenige Millimeter. Bei genauerem Hinsehen ist die Scheiden\u00f6ffnung unter dem Harnr\u00f6hrenzapfen zu erkennen. Diese ist allerdings fest verschlossen und \u00f6ffnet sich nur w\u00e4hrend der Paarungsbereitschaft.", "Sortierung nach Relevanz, absteigend Sortierung nach Scan, aufsteigend Sortierung nach Scan, absteigend 10 Treffer pro Seite 20 Treffer pro Seite 30 Treffer pro Seite 40 Treffer pro Seite 50 Treffer pro Seite\n[Hilfe] [Neue Suche] [Neue Suche in diesem Band]\nTipps zur Suche\nPhrasensuche: Verwenden Sie doppelte Anf\u00fchrungsstriche, um eine exakte Folge von W\u00f6rtern oder Zeichen zu finden: z.B. \"k\u00f6nig ludwig ii\"\nMehrwortsuche: Wenn Sie nach mehreren W\u00f6rtern au\u00dferhalb einer Phrase suchen, vermeiden Sie sehr h\u00e4ufig vorkommende W\u00f6rter (z.B.: 'der', 'die', 'das', 'in', etc.), um eine z\u00fcgige Verarbeitung zu gew\u00e4hrleisten.\nAutovervollst\u00e4ndigung: Wenn Sie ein Wort in das Feld eintippen, wird die Lupe rot. Das bedeutet, dass das System nach den ersten Buchstaben Ihres Suchwortes im aktuellen Dokument sucht. Wenn das Wort in der resultierenden Liste dabei ist, kommt es auch in diesem Dokument vor.", "Apple versucht, Ihnen bei der richtigen Rechtschreibung und Satzstruktur zu helfen, indem es Optionen wie Autokorrektur und Rechtschreibpr\u00fcfung enth\u00e4lt. Es bietet auch eine automatische Gro\u00dfschreibungsfunktion, die den ersten Buchstaben in S\u00e4tzen automatisch gro\u00dfschreibt. Dies kann jedoch nicht immer von Vorteil sein, und der Prozess, die Kapitalisierung tats\u00e4chlich zu stoppen, kann etwas frustrierend sein. Gl\u00fccklicherweise k\u00f6nnen Sie die automatische Gro\u00dfschreibung auf Ihrem iPhone 5 mit nur wenigen einfachen Schritten deaktivieren.\nStoppen Sie die automatische Gro\u00dfschreibung auf dem iPhone 5\nIch finde, dass diese Funktion vor allem dann problematisch ist, wenn Sie versuchen, Eingaben in Felder auf Webseiten vorzunehmen, bei denen die Gro\u00df-/Kleinschreibung beachtet wird. Und w\u00e4hrend Sie normalerweise die Umschalttaste auf der Tastatur dr\u00fccken k\u00f6nnen, um die Gro\u00dfschreibung zu stoppen, bevorzugen andere die vollst\u00e4ndige Kontrolle \u00fcber ihre Texteingabe.\nSchritt 1: Tippen Sie auf das Einstellungen Symbol.\nSchritt 2: W\u00e4hlen Sie die Allgemein M\u00f6glichkeit.\nSchritt 3: Scrollen Sie nach unten und w\u00e4hlen Sie das Klaviatur M\u00f6glichkeit.\nSchritt 4: Tippen Sie auf die Schaltfl\u00e4che rechts neben Automatische Kapitalisierung um es auf die umzustellen aus Position.\nWenn Sie den Tastaturklickton nicht m\u00f6gen, der abgespielt wird, wenn Sie einen Buchstaben auf Ihrer iPhone 5-Tastatur eingeben, k\u00f6nnen Sie dies auch deaktivieren.\nEin zweites Lightning-Ladekabel f\u00fcr Ihr iPhone 5 zu haben ist nie eine schlechte Sache, aber es kann etwas teuer sein. Gl\u00fccklicherweise verkauft Amazon sein eigenes von Apple zugelassenes Lightning-Kabel f\u00fcr weniger als viele der Optionen, die Sie im Einzelhandel finden.", "Die technische Speicherung oder der Zugang ist unbedingt erforderlich f\u00fcr den rechtm\u00e4\u00dfigen Zweck, die Nutzung eines bestimmten Dienstes zu erm\u00f6glichen, der vom Teilnehmer oder Nutzer ausdr\u00fccklich gew\u00fcnscht wird, oder f\u00fcr den alleinigen Zweck, die \u00dcbertragung einer Nachricht \u00fcber ein elektronisches Kommunikationsnetz durchzuf\u00fchren.\nVorlieben Vorlieben\nDie technische Speicherung oder der Zugriff ist f\u00fcr den rechtm\u00e4\u00dfigen Zweck der Speicherung von Pr\u00e4ferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.\nStatistiken Statistiken\nDie technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschlie\u00dflich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zus\u00e4tzliche Aufzeichnungen von Dritten k\u00f6nnen die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.\nMarketing Marketing\nDie technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder \u00fcber mehrere Websites hinweg zu \u00e4hnlichen Marketingzwecken zu verfolgen.", "agement: Stadtkasse Erteilung eines SEPA-Lastschriftmandats f\u00fcr die Gemeinde B\u00f6neb\u00fcttel SEPA-Mandat f\u00fcr Neum\u00fcnster allgemein SEPA-Mandat f\u00fcr Grundst\u00fccksabgaben SEPA-Mandat f\u00fcr Wasbek Antrag auf Stundu [...] F\u00fchrungszeugnis Hundesteuer/-Abbuchung Anmeldung Abmeldung SEPA-Lastschrift der Stadt Neum\u00fcnster SEPA-Lastschrift der Gemeinde B\u00f6neb\u00fcttel SEPA-Lastschrift der Gemeinde Wasbek Melderecht nach dem Bundes [...] Erteilung einer Fahrerlaubnis f\u00fcr Kraftfahrzeuge, Antrag auf Ausstellung einer Bewohnerparkberechtigung, SEPA-Lastschriftmandat oder ... Formulare und mehr rund ums Auto finden Sie im einzelnen unter F\u00fchrers\nKraftfahrzeugsteuer bezahlen\nge\u00e4ndert, ist immer ein neues SEPA-Lastschriftmandat bei Ihrem zust\u00e4ndigen Hauptzollamt zu erteilen (Formular 032021 Kraftfahrzeugsteuer: SEPA-Lastschriftmandat f\u00fcr die SEPA-Basislastschrift). Eine formlose [...] Formular f\u00fcr das SEPA-Lastschriftmandat auch auf der Internetseite der Zollverwaltung herunterladen: Verwenden Sie das Formular 032021 \u201eKraftfahrzeugsteuer: SEPA-Lastschriftmandat f\u00fcr die SEPA-Basislastschrift\u201c [...] Fahrzeugart. Verfahrensablauf Um die Kraftfahrzeugsteuer zu bezahlen, m\u00fcssen Sie grunds\u00e4tzlich am SEPA-Lastschriftverfahren teilnehmen. Dadurch k\u00f6nnen Sie die termingerechte Zahlung nicht mehr vers\u00e4umen\nAuto anmelden\nOriginal Personalausweis/ Reisepass mit g\u00fcltiger Meldebest\u00e4tigung Einzugserm\u00e4chtigung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat; Unterschrift des Fahrzeughalters und ggf. des abweichenden Kontoinhabers erforderlich) [...] Personalausweis oder Reisepass mit g\u00fcltiger Meldebest\u00e4tigung Einzugserm\u00e4chtigung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat; Unterschrift des Fahrzeughalters und ggf. des abweichenden Kontoinhabers erforderlich) [...] Personalausweis oder Reisepass mit g\u00fcltiger Meldebest\u00e4tigung Einzugserm\u00e4chtigung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat; Unterschrift des Fahrzeughalters und ggf. des abweichenden Kontoinhabers erforderlich)\nBen\u00f6tigte Unterlagen\nHauptzollamt Kiel (SEPA-Lastschriftmandat) zu entrichten und ein entsprechender Nachweis \u00fcber die Zahllung beizubringen. Alternativ muss eine Einzugserm\u00e4chtigung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat; [...] echtigten Einzugserm\u00e4chtigung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat) - Bei abweichendem Kontoinhaber, muss der Fahrzeughalter zwingend das SEPA-Lastschriftmandat unterschreiben Die Geb\u00fchr f\u00fcr eine [...] I / Fahrzeugschein ggf. bisherige/s Kennzeichenschild/er Pr\u00fcfbericht Hauptuntersuchung im Original SEPA-Mandat (IBAN und BIC; Unterschrift des Fahrzeughalters und ggf. des abweichenden Kontoinhabers er\nKfz-H\u00e4ndler und Zulassungsdienste\nm\u00fcssen leider unbearbeitet wieder zur\u00fcckgegeben werden. Denken Sie auch an die Vollmacht und das SEPA-Lastschriftmandat f\u00fcr die Kfz-Steuer. Wir bitten Sie, dieses Verfahren im Sinne einer geordneten\nSEPA-Lastschriftmandat\nLeistungsbeschreibung Mit einem SEPA-Lastschriftmandats stimmen Sie dem Einzug einer f\u00e4lligen Zahlung zu und erteilen gleichzeitig Ihrem Kreditinstitut den Auftrag, die Zahlung einzul\u00f6sen. Die von Ihnen\nKfz: Zulassungsbescheinigung Teil I - Fahrzeugdaten \u00e4ndern (Technische \u00c4nderung)\nMeldebescheinigung des Einwohnermeldeamtes, \u00c4nderung der Fahrzeugart muss ein SEPA-Lastschriftmandat vorgelegt werden SEPA-Lastschriftmandat Wenn Sie einen Dritten mit der Eintragung der \u00c4nderung beauftragen\nFinanzen\nder Vollstreckung Formulare der Abteilung Forderungsmanagement (Antrag auf Stundung/Ratenzahlung, SEPA-Lastschriftmandate) Abteilungsleiter und Kassenverwalter Herr Vo\u00df Telefon 04321 942 2329 Arbeitsg\nZulassung eines gebrauchten Kraftfahrzeuges aus einem EU-Land\nGutachten gem. \u00a7 21 StVZO elektronische Versicherungsbest\u00e4tigung (eVB) Bankverbindung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat) Nachweis \u00fcber Untersuchung nach \u00a7 29 StVZO (i.d.R. Haupt- und Abgasuntersuchung)\nZulassung eines gebrauchten Kraftfahrzeuges aus einem Nicht-EU-Land (Ausland)\nZulassung anerkannt wurde) elektronische Versicherungsbest\u00e4tigung (eVB) Bankverbindung f\u00fcr die Kfz-Steuer (SEPA-Lastschriftmandat) Nachweis \u00fcber Untersuchung nach \u00a7 29 der Stra\u00dfenverkehrs-Zulassungs-Ordnung (i", "Hier finden Sie die wichtigsten Neuerungen im HVV zum Jahresfahrplan 2013, der am 9. Dezember 2012 inkraft tritt. Fahrplan\u00e4nderungen w\u00e4hrend der Fahrplanperiode finden Sie auf der Seite Nachtr\u00e4gliche \u00c4nderungen. Wo Sie die neue NimmBus-Ausgabe bekommen, erfahren Sie hier.\nAuf der Linie U2 entfallen die 10-Minuten-Zwischenz\u00fcge zwischen Schlump und Billstedt am fr\u00fchen Morgen und sp\u00e4ten Abend. Diese Z\u00fcge fahren k\u00fcnftig als U4 ab \u00dcberseequartier, so dass der 10-Minuten-Takt ab Jungfernstieg bestehen bleibt.\nDer 20-Minuten-Takt am fr\u00fchen Morgen zwischen Barmbek und Wandsbek-Gartenstadt wird auf einen 10-Minuten-Takt verdichtet.\nDie neue U-Bahn-Linie U4 nimmt zwischen HafenCity und Jungfernstieg den Betrieb auf. Die Linie f\u00fchrt weiter auf der Strecke der Linie U2 \u00fcber Berliner Tor nach Billstedt. Die Haltestelle HafenCity Universit\u00e4t bleibt bis auf Ausnahmen vorerst geschlossen, am \u00dcberseequartier ist f\u00fcr Fahrg\u00e4ste daher Endstation.\nAuf der Linie S3 wird in den N\u00e4chten vor Sonn- und Feiertagen die Fahrt Hauptbahnhof ab 1.28 Uhr, Neugraben an 1.53 Uhr bis Stade verl\u00e4ngert.\nDie Abfahrtszeiten der RegionalBahnen nach Ahrensburg und Bad Oldesloe werden etwa 10 Minuten vorgezogen, so dass diese direkt nach den RegionalExpress-Z\u00fcgen abfahren.\nEs wird eine neue t\u00e4gliche Sp\u00e4tfahrt um 0.04 Uhr von Hamburg Hbf nach B\u00fcchen angeboten (R\u00fcckfahrt um 0.44 Uhr ab B\u00fcchen). Daf\u00fcr entfallen die beiden bisherigen letzten Fahrtenpaare zwischen Aum\u00fchle und B\u00fcchen.\nDie letzte Fahrt von B\u00fcchen nach L\u00fcbeck wird um eine halbe Stunde nach hinten verlegt und f\u00e4hrt jetzt um 0.43 Uhr als Anschluss an die neue Sp\u00e4tfahrt der Linie R20 (siehe dort).\nDie bisher in Tostedt endende letzte Fahrt um 0.38 Uhr ab Hamburg Hbf wird t\u00e4glich bis Rotenburg verl\u00e4ngert, in den Wochenendn\u00e4chten sogar bis Bremen. Sonntags morgens um 5.08 Uhr gibt es eine zus\u00e4tzliche \u201eNachtschw\u00e4rmerfahrt\u201c von Hamburg nach Bremen.\nAn Wochenenden wird eine zus\u00e4tzliche Fahrt um 22.06 Uhr von Hamburg Hbf nach Cuxhaven angeboten, so dass der Stundentakt nun den ganzen Abend bis Betriebsschluss gilt. Die letzte Fahrt (0.07 Uhr) f\u00e4hrt jetzt immer bis Stade.\nDie Fahrten in den N\u00e4chten von Sonnabend auf Sonntag von Hamburg Hbf nach Bremerv\u00f6rde und zur\u00fcck (\u201eFischmarktfahrten\u201c) entfallen.\nZwischen Buxtehude und Harsefeld werden nachmittags zus\u00e4tzliche Fahrten angeboten, die jeweils 20 Minuten vor den st\u00fcndlichen Z\u00fcgen fahren.\nDie Fahrten in den N\u00e4chten von Sonnabend auf Sonntag von Hamburg Hbf nach Bremerv\u00f6rde und zur\u00fcck (\u201eFischmarktfahrten\u201c) entfallen.\nEs wird in N\u00e4chten von Sonnabend auf Sonntag eine neue Sp\u00e4tfahrt um 23.50 Uhr von Altona nach Husum angeboten mit Halt in Elmshorn, Gl\u00fcckstadt und Itzehoe.\nDer Linienabschnitt in die Speicherstadt entf\u00e4llt. Stattdessen wird die Linie vom Rathausmarkt \u00fcber M\u00f6nckebergstra\u00dfe und Steintorwall weitergef\u00fchrt auf dem Weg der Linien 120 und 124 nach Rothenburgsort mit Endpunkt am Kraftwerk Tiefstack. Die Linie 3 \u00fcbernimmt damit s\u00e4mtliche Fahrten der Linie 120, die bisher in Rothenburgsort oder Tiefstack endeten, au\u00dferdem die Nachtfahrten an Wochenenden der Linie 124.\nDie urspr\u00fcnglich geplante F\u00fchrung zusammen mit dem Individualverkehr au\u00dferhalb der vorhandenen Busspur, um Fahrzeit zu sparen, wird nicht umgesetzt.\nDer Linienabschnitt in die HafenCity wird gek\u00fcrzt. Diese Fahrten enden k\u00fcnftig an der Haltestelle Brandstwiete.\nDer Linienabschnitt in die HafenCity wird gek\u00fcrzt. Diese Fahrten enden k\u00fcnftig in der Speicherstadt an der Haltestelle Auf dem Sande.\nNeu eingerichtet wird ein Linienzweig \u00fcber U-R\u00f6dingsmarkt, Ludwig-Erhard-Stra\u00dfe, Budapester Stra\u00dfe bis U-Feldstra\u00dfe mit den jeweils bereits vorhandenen Haltestellen und einer neuen Haltestelle Paulinenstra\u00dfe.\nRichtung Sachsenstra\u00dfe wird eine neue Haltestelle Borgfelder Stra\u00dfe eingerichtet (im Ausschl\u00e4ger Weg). Richtung Bf. Altona wird eine neue Haltestelle Normannenweg eingerichtet (im Ausschl\u00e4ger Weg). Die bestehende Haltestelle S-Hammerbrook wird umbenannt in S-Hammerbrook (S\u00fcd) zur Unterscheidung der neuen Haltestelle S-Hammerbrook (Nord) der Linie 112.\nZwischen Berliner Platz und Jenfelder Allee wird die neue, von der dortigen Otto-Hahn-Schule lange geforderte Haltestelle Otto-Hahn-Schule Jenfeld bedient.\nMit der Linie 111 wird eine lange geplante Linie am n\u00f6rdlichen Hafenrand eingerichtet. Sie f\u00e4hrt von Bf. Altona \u00fcber Gro\u00dfe Elbsta\u00dfe, Fischmarkt, Peperm\u00f6hlenbek, Reeperbahn, Davidstra\u00dfe, Landungsbr\u00fccken, Baumwall, und Am Sandtorkai in die HafenCity zur neuen U-Bahn-Haltestelle \u00dcberseequartier und endet an der neuen Haltestelle Shanghaiallee. Diese Linie verbindet somit praktisch alle f\u00fcr Einheimische wie Touristen interessanten Gebiete an der Elbe zwischen Altona und HafenCity.\nIm Gegenzug wird die Linie 383 (Bf. Altona\u2013Fischmarkt) eingestellt.\nDie bisher ab etwa 20.30 Uhr an U-Steinstra\u00dfe endenden Fahrten werden bis Betriebsschluss weitergef\u00fchrt bis Osterbrookplatz. Die bisherige Abendlinie 312 von U-S-Berliner Tor zum Osterbrookplatz entf\u00e4llt.\nDie Linie 112 erh\u00e4lt in der City-S\u00fcd einen neuen Linienweg mit drei neuen Haltestellen. Sie f\u00e4hrt k\u00fcnftig \u00fcber Nordkanalstra\u00dfe, Nagelsweg, und Albertstra\u00dfe von Norden in die Hammerbrookstra\u00dfe und h\u00e4lt dort an der neu eingerichteten Haltestelle S-Hammerbrook (Nord). Richtung Innenstadt f\u00e4hrt die Linie entsprechend \u00fcber die Spaldingstra\u00dfe.\nDie Linie 312 wird eingestellt. Die abendliche Anbindung des Osterbrookviertels \u00fcbernimmt die Linie 112, deren Betriebszeiten entsprechend verl\u00e4ngert werden.\nDie Linie 321 wird von der Nettelnburger Landstra\u00dfe in das Wohngebiet Allerm\u00f6he Ost verschwenkt und bedient dort das Gesch\u00e4ftszentrum am Grachtenplatz. Das Fahrtenangebot bleibt unver\u00e4ndert bei einem 2-Stunden-Takt.\nDie Linie 135 bedient k\u00fcnftig abends nicht mehr die Sternwarte. Alle Fahrten fahren wie tags\u00fcber den kurzen Weg. Stattdessen wird der Betrieb der Linie 335 im Stundentakt bis zur Sternwarte verl\u00e4ngert. Die Fahrten enden und beginnen am Eingang.\nDie Linie 142 wird von Bf. Harburg in den Harburger Hafen verl\u00e4ngert. Gleichzeitig wird der Takt auf einen 5-Minuten-Takt verdichtet. Die Bedienung des Freizeitbades MidSommerland wird von der Linie 145 \u00fcbernommen.\nDie Linie 145 wird von Bf. Harburg bis Freizeitbad MidSommerland verl\u00e4ngert und \u00fcbernimmt hier die Aufgaben der Linie 142.\nUmbenennung der Haltestelle Heykenstieg in Heykenstieg (Kehre) und Einrichtung einer neuen Haltestelle Heykenstieg in beiden Richtungen in der Georg-Heyken-Stra\u00dfe jeweils vor der Einm\u00fcndung Heykenstieg. Dadurch kann f\u00fcr die Linie 146 die Stichfahrt durch die Kehre im Heykenstieg entfallen. Die Linie 250 bedient die alte Haltestelle im Heykenstieg weiterhin, aber zus\u00e4tzlich in beiden Richtungen auch den neuen Haltestellenmast Richtung Osten in der Georg-Heyken-Stra\u00dfe. (Diese Ma\u00dfnahme wurde schon zum 1. November 2012) umgesetzt.)\nDie Linie 153 bedient nur noch das Gewerbegebiet Hohe Schaar mit Anschluss an der Kornweide an weiterf\u00fchrende Buslinien. Der Abschnitt nach Harburg wird von der Linie 154 \u00fcbernommen.\nDie Linie 154 wird tags\u00fcber zu den Gesch\u00e4ftszeiten bis S-Harburg Rathaus verl\u00e4ngert, in den Hauptverkehrszeiten bis Bf. Harburg. Im Gegenzug entf\u00e4llt die Linie 153 zwischen Kornweide und Harburg.\nEine morgendliche Fahrt in den Hafen beginnt k\u00fcnftig in der HafenCity an U-\u00dcberseequartier.\nAuf vielfachem Wunsch von Fahrg\u00e4sten wird auch Richtung U-Horner Rennbahn eine Haltestelle Schimmelmannstra\u00dfe (Mitte) eingerichtet. Sie wird sich in der Stra\u00dfe Holstenhofweg wird zwischen den Einm\u00fcndungen Rauchstra\u00dfe und Schimmelmannstra\u00dfe befinden.\nEine neue Linie 264 wird zwischen Bf. Rahlstedt und Trittau \u00fcber Stapelfeld und Gro\u00dfensee eingerichtet. Die Linie verkehrt haupts\u00e4chlich vormittags Richtung Hamburg und nachmittags zur\u00fcck und dient ohne den Umweg \u00fcber L\u00fctjensee als schnelle Alternative zur Linie 364.\nDie bisherigen Kurzl\u00e4ufer zwischen Rahlstedt und Gro\u00dfensee entfallen. Stattdessen f\u00e4hrt die neue Linie 264 (siehe dort). Die bisherigen Wochenendfahrten zwischen Trittau und Basthorst der Linie 364 werden durch ein Anruf-Sammel-Taxi (Linie 8888) ersetzt. Ein weiteres neues Anruf-Sammel-Taxi (Linie 8889) wird montags bis sonnabends von Trittau \u00fcber Granderheide nach Rausdorf eingerichtet.\nDie Linie 564 wird in 8763 umbenannt.\nDie Abendlinie 268 f\u00e4hrt zwischen den Haltestellen Burgweg und Spechtweg k\u00fcnftig \u00fcber die Stra\u00dfe Vogelsang und bedient die dortigen Haltestellen.\nDie bisherige Ringlinie 169 wird zu einer echten Linie mit zwei Richtungen zwischen Bf. Ahrensburg durch das Gewerbegebiet nach Bf. Gartenholz umgestaltet. Daf\u00fcr wird die Linie 469 eingestellt.\nDurch die Fahrplan\u00e4nderungen bei der Linie R10 werden auch die Abfahrtszeiten der Busse im Ahrensburger Stadtverkehr angepasst. Eine direkten Anschluss in Gartenholz aus Richtung L\u00fcbeck \u2013 Bad Oldesloe an die Linie 169 in das Gewerbegebiet gibt es nicht mehr (etwa 30 Minuten Wartezeit).\nDie Linie 378 wird von U-Garstedt nach Glash\u00fctte,Markt zur\u00fcckgenommen. Auf diesem Abschnitt f\u00e4hrt k\u00fcnftig die neue Linie 278. Desweiteren \u00fcbernimmt die Linie 378 die Fahrten nach Duvenstedt,Mesterbrooksweg von der Linie 478. Die Linie 478 wiederum \u00fcbernimmt von der Linie 493 die morgendliche Schulfahrt zu den Falkenbergschulen.\nDie Linie 288 wird von Bf. Altona mit einer Schleifenfahrt \u00fcber Palmaille, Fischmarkt und Gro\u00dfe Bergstra\u00dfe zur\u00fcck nach Bf. Altona erweitert. Sie ersetzt somit auch die entfallende Linie 383 mit der Haltestelle Behnstra\u00dfe.\nAuf der Linie 293 entfallen abends die Fahren \u00fcber Henstedt. Am Wochenende werden einige Fahrten \u00fcber Paracelsus-Klinik gef\u00fchrt. Siehe auch Linie 196.\nDie Linie 593 wird mit einigen Fahrten nach bzw. \u00fcber A-Ulzburg-S\u00fcd gef\u00fchrt.\nDie Betrieb der Linie 196 wird bis in die sp\u00e4ten Abendstunden sowie auf Sonn- und Feiertage ausgeweitet. Die Linie \u00fcbernimmt damit auch die entfallenden Fahrten der Linie 293 nach Henstedt \u2013 Kisdorf.\nIn den N\u00e4chten von Sonnabend auf Sonntag wird eine zus\u00e4tzliche Fahrt um 2.28 Uhr von Bf. Harburg \u00fcber Sieversen und T\u00f6tensen nach Buchholz angeboten.\nDie Linie 8712 wird von der Demolierung bis zur Vorstadtschule verl\u00e4ngert.\nDie eine Fahrt der Linie 602 in die HafenCity wird \u00fcber U-\u00dcberseequartier zum neuen Endpunkt U-Steinstra\u00dfe verl\u00e4ngert.\nZwei zus\u00e4tzliche Fahrten werden angeboten: um 2.06 Uhr von S-Elbgaustra\u00dfe nach A-Burgwedel und (erstmalig in die andere Richtung) um 2.22 Uhr von A-Burgwedel nach S-Elbgaustra\u00dfe.\nDie Linie 62 wird von Sandtorh\u00f6ft bis St. Pauli-Landungsbr\u00fccken zur\u00fcckgenommen.\nDie neue Linie 72 f\u00e4hrt t\u00e4glich zwischen St. Pauli-Landungsbr\u00fccken und dem neuen Anleger Elbphilharmonie in der HafenCity. Montags bis freitags zu den Schichtzeiten wird auch der Anleger Arningstra\u00dfe (bisher Linie 73) angelaufen.\nDer neue F\u00e4hranleger Ernst-August-Schleuse in Wilhelmsburg wird montags bis freitags alle 40 Minuten bis etwa 21.45 Uhr bedient. Die Bedienung des Anlegers Arningstra\u00dfe \u00fcbernimmt die neue Linie 72.\nUmbenennung von Haltestellen\nIn Anpassung an die HVV-Richtlinien werden wieder zahlreiche Haltestellennamen ge\u00e4ndert. Besonderer Schwerpunkt liegt diesmal im Landkreis Stade mit \u00fcber 300 Umbenennungen.", "\u201cNa, hast du es auch mal wieder hergeschafft?\u201d Ist ja super, wurde auch Zeit. Schon klar, \u201cwar auch stressig\u201d, was? Du hast es noch gar nicht geschafft, die letzten Folgen zu h\u00f6ren? Nein, nein, kein Problem! *hust* *dutreuslosetomate* *h\u00fcstl* Lebst du noch, ja? Warum bist du denn jetzt so zickig? Ich denke, wir k\u00f6nnen uns alles erz\u00e4hlen!?!? Entspann\u2019 dich doch einfach mal und genie\u00dfe das unversch\u00e4mte Floskel-Update von Heidi und Lina. Es geht um Dinge und S\u00e4tze, die keiner mehr h\u00f6ren kann. Und die beiden Freundinnen finden: Zu Recht! N\u00e4chsten Sonntag gibt es dann alles wie gewohnt in voller L\u00e4nge. \u201cDie beiden haben es sich aber auch wirklich einfach gemacht, nur noch alle zwei Wochen eine \u201crichtige\u201d Folge zu machen.\u201d Und nat\u00fcrlich: \u201cFr\u00fcher war alles besser\u201d.\nMit dem Mist werben Heidi und Lina schon von Anfang an: Der Satisfyer - blablablabla \ud83d\ude05 Sichere ihn dir jetzt mit 43% Rabatt: https://ffrl.ch/p/satisfyer (*) \ud83c\udf89 Auch ein tolles Geschenk f\u00fcr die beste Freundin oder Partnerin! \ud83d\ude09\nSchreib\u2019 uns jetzt auch direkt \u00fcber WhatsApp! Wir sind sooo gespannt, von dir zu h\u00f6ren. Hast du Themen, \u00fcber die wir unbedingt sprechen sollten, oder Tipps und Anregungen? Was liegt dir gerade auf dem Herzen? WhatsApp an +49 176 568 637 98 oder \u00fcber Instagram: @feuchtfroehlich.show. Au\u00dferdem w\u00fcrde es uns sehr helfen, wenn du uns auf deiner Lieblings-Podcast-Plattform nicht nur abonnierst, sondern auch positiv bewertest! Vielen Dank im Voraus und bis zur n\u00e4chsten feuchtfr\u00f6hlichen Folge,\ndeine Heidi & Lina!\n________________\n(*) Affiliate-Link, danke f\u00fcr deine Unterst\u00fctzung!\nImpressum / Datenschutz \u00a92021 - 2023 feuchtfr\u00f6hlich.show - All rights reserved - Eine Produktion von ZetaCast mediaservices.", "Als Produktionsleiter und Mitglied der Gesch\u00e4ftsleitung bei Bigla Office kennt sich Marcel Marolf mit Produktionsprozessen und dem Ver\u00e4nderungsmanagement bestens aus. Seit der Bekanntgabe der \u00dcbernahme nimmt das Projekt sehr viel Zeit in Anspruch. Wie Marcel und das gesamte Projektteam konkret vorgehen, wie wichtig das globale Verst\u00e4ndnis und Vertrauen aller involvierten Parteien sind und welche grossen Herausforderungen anstehen, erfahren Sie im nachfolgenden Interview.\nNach Bekanntgabe der \u00dcbernahme im letzten Jahr wurde zeitnahe ein Projekt-Team, bestehend aus 15 Fachkr\u00e4ften, einberufen. Welches Hauptziel wird global verfolgt?\nEs muss uns in erster Linie gelingen, ein gemeinsames Verst\u00e4ndnis f\u00fcr die Produktionsverlagerung zu schaffen, welches wir verst\u00e4ndlich und glaubw\u00fcrdig nach aussen tragen k\u00f6nnen. Denn die nachhaltige und erfolgreiche Umsetzung des Projektes steht und f\u00e4llt mit dem Vertrauen unserer Mitarbeitenden, Kunden, Lieferanten und Partner \u2013 also in das was wir tun und die Art und Weise wie wir es tun. Unter dieser gesamtheitlichen Betrachtungsweise sehe ich noch Verbesserungspotential, welches wir nutzen m\u00fcssen.\nNach nun doch einigen Wochen und Monaten hast du Einblicke in beide Unternehmenskulturen und Abl\u00e4ufe erhalten. Welche grossen kulturellen Unterschiede konntest du in den letzten Monaten feststellen und wie gehen die Mitarbeitenden von Bigla Office mit der neuen Situation um?\nDen gr\u00f6ssten Unterschied nehme ich pers\u00f6nlich in der F\u00fchrungskultur der beiden Unternehmen wahr. Daraus abgeleitet \u00abfunktionieren\u00bb beide Unternehmen dann eben auch ganz unterschiedlich und haben ihre eigene gefestigte \u00abUnternehmens-DNA\u00bb. Diese Ausgangslage ist f\u00fcr die Mitarbeitenden beider Unternehmen eine grosse Herausforderung, bietet zugleich aber auch Chancen. Diese Konstellation und Rahmenbedingung d\u00fcrfen wir weder ignorieren noch als unwesentliches Element betrachten. Es muss uns durch bewusstes Verhalten und Handeln gelingen, eine Basis zu schaffen, auf welcher beide Unternehmenskulturen eigenst\u00e4ndig gelebt und entwickelt werden k\u00f6nnen, ohne dass dabei gr\u00f6ssere Spannungen in der Unternehmenskultur und \u00fcbergreifenden Zusammenarbeit entstehen.\nSeid ihr aktuell im Zeitplan?\nIn Bezug auf den physischen Transfer, also Mitarbeitende und Maschinen der einzelnen Produktionsbereiche, sind wir im Zeitplan. Wenn wir weitere Elemente wie Produktionsdaten, -dokumente und -prozesse in die Beurteilung miteinbeziehen, sind wir noch nicht auf der Leistungsstufe, an der wir uns orientieren wollen und m\u00fcssen. In diesen Themenbereichen werden wir in den kommenden Wochen unsere Schwerpunkte setzen.\nWie l\u00e4sst sich das Vorgehen bzw. der Masterplan bei der Produktionsverlagerung in wenigen Worten zusammenfassen?\nZu Beginn des Projekts \u00abProduktionsverlagerung\u00bb (anfangs September 2019) haben wir in einem ersten Schritt die Hauptziele, Rahmenbedingungen und Verantwortungsbereiche festgelegt. Unter Ber\u00fccksichtigung dieser Vorgaben haben wir versucht, das Projekt in einem konkreten und strukturierten Gesamtbild abzubilden \u2013 dies mit dem Wissen, dass es aufgrund der Projektkomplexit\u00e4t nicht m\u00f6glich sein wird, alle Aktivit\u00e4ten zu erkennen und diese in der Gesamtstruktur zu ber\u00fccksichtigen. F\u00fcr unser Projekt war und ist es entscheidend, dass wir uns an klar definierten Meilensteinen orientieren k\u00f6nnen. Die Themen in den einzelnen Projektphasen konkretisieren und entwickeln wir mit dem Projekt, in dem wir regelm\u00e4ssig Koordinationsmeetings durchf\u00fchren, die n\u00e4chsten Schritte kontinuierlich planen, umsetzen, pr\u00fcfen und dort wo n\u00f6tig unmittelbar Korrekturmassnahmen einleiten.\nIm Fokus: Marcel Marolf in Aktion an einem der regelm\u00e4ssigen\nKoordinationsmeetings in Huttwil.\nObwohl es sich in Anf\u00fchrungs- und Schlusszeichen lediglich um die Verschiebung der Produktion handelt, sind weitaus mehrere Bereiche der beiden Unternehmen beteiligt. Welche Abteilungen tragen dabei eine bedeutende Rolle und weshalb?\nEs sind unsere Mitarbeitenden, Kunden, Lieferanten und Partner. Es gibt viele und verschiedene Gr\u00fcnde, weshalb diese Beteiligten in ihren individuellen Rollen f\u00fcr uns von zentraler Bedeutung sind. Eine Gemeinsamkeit ist sicherlich die, dass wir in der aktuellen Phase des Projektes \u2013 in der noch nicht alles \u00abrund l\u00e4uft\u00bb \u2013 auf das Verst\u00e4ndnis, die Unterst\u00fctzung und Loyalit\u00e4t dieser Beteiligten setzen.\nInsgesamt wurden 30 Arbeitsstellen in Huttwil angeboten, wovon 20 zeitnahe besetzt werden konnten. Wie gelang es, die Mitarbeitenden von Bigla Office trotz des l\u00e4ngeren Arbeitswegs zum Stellenwechsel zu bewegen?\nDiese Frage kann ich dir leider nicht konkret beantworten, da ich die individuellen Beweggr\u00fcnde nicht im Detail kenne. Unser Ziel war es, den Mitarbeitenden in k\u00fcrzester Zeit qualitative und quantitative Informationen zu vermitteln, welche sie als wertvolle Entscheidungsgrundlage nutzen konnten. Ob wir dieses Ziel erreicht haben, k\u00f6nnen wir fr\u00fchestens in 12 Monaten beurteilen, indem wir beobachten wie dauerhaft die Stellen bei NOVEX durch Mitarbeitenden der Bigla Office besetzt werden konnten.\nWie sieht das konkrete Vorgehen f\u00fcr die erfolgreiche Eingliederung sowie Einschulung der jeweiligen Mitarbeitenden aus?\nIm Grundsatz verl\u00e4uft die Eingliederung und Einarbeitung nach dem Standardprozess f\u00fcr \u00abneu eintretende Mitarbeitende\u00bb bei NOVEX. In unserer Konstellation war es m\u00f6glich, diesen Prozess bereits im Dezember 2019 zu starten, indem wir ab diesem Zeitpunkt die Mitarbeitenden in unternehmens\u00fcbergreifenden Schulungseins\u00e4tzen an ihr neues Arbeitsumfeld respektive ihre neuen Arbeitsaufgaben heranf\u00fchren konnten. Auch wenn die Ausgangslage im ersten Moment als \u00abStandardeintritt\u00bb wahrgenommen wird, m\u00fcssen wir die Realit\u00e4t ber\u00fccksichtigen und uns bewusst sein, dass die Mitarbeitenden diesen Stellenwechsel nicht aus eigenem Antrieb angestrebt haben. Aus diesem Grund sind die F\u00fchrungsverantwortlichen besonders gefordert und es braucht die Bereitschaft und F\u00e4higkeit sich in die \u00abGef\u00fchlswelt\u00bb dieser Mitarbeitenden hinein zu versetzen.\nDie Produktionsverlagerung ist ein komplexer Prozess des Ver\u00e4nderungsmanagements auch \u201eChange-Management\u201c im Englischen genannt. Weshalb wurde hierbei bewusst auf externe Beratung verzichtet?\nDie Aussage, dass wir auf externe Berater verzichtet haben, ist nur teilweise zutreffend. Im Zusammenhang mit der Kommunikation vom 18. September 2019 (Bekanntgabe des Entscheides zur Produktionsverlagerung) haben wir uns vorg\u00e4ngig durch externe Berater unterst\u00fctzen lassen, da wir dieses Ereignis als Basis f\u00fcr eine erfolgreiche Umsetzung des Gesamtprojekts beurteilt haben. Weiter konnten die Mitarbeitenden, welche sich bei NOVEX beworben haben, wir jedoch kein Jobangebot machen konnten, an einem Newplacement-Workshop teilnehmen. Dieser Workshop wurde durch Externe gestaltet und durchgef\u00fchrt, mit dem Ziel die Teilnehmer in ihrem pers\u00f6nlichen \u00abVer\u00e4nderungsprozess\u00bb individuell zu unterst\u00fctzen.\nDer Beizug externer Unterst\u00fctzung, mit der Zielsetzung, im Vorfeld eine Analyse durchzuf\u00fchren, die \u00abTransformation\u00bb zu planen und dann zu begleiten, haben wir aufgrund des komprimierten Zeitplanes als nicht zielf\u00fchrend eingestuft. Ich schliesse nicht aus, dass externe Dienstleistungen in diesem Themenbereich zu einem sp\u00e4teren Zeitpunkt sinnvoll sein k\u00f6nnen.\nSowohl NOVEX als auch Bigla Office k\u00f6nnen auf ein langj\u00e4hrig bestehendes Partnernetzwerk zur\u00fcckgreifen. Inwiefern werden externe Partner ins Projekt miteinbezogen und warum?\nIch pers\u00f6nlich sehe eine Partnerschaft (im wirtschaftlichen Sinne) dann als gegeben, wenn die involvierten Parteien durch gemeinsame Aktivit\u00e4ten einen Mehrwert generieren und dadurch die individuelle Marktstellung des einzelnen gest\u00e4rkt wird. Demnach m\u00fcssen wir unsere Partner \u00fcberall dort einbeziehen, wo wir mit unserem Verhalten oder Handeln den gemeinsamen Mehrwert gef\u00e4hrden und/oder die individuelle Marktstellung eines Involvierten schw\u00e4chen.\nWelches sind die gr\u00f6ssten Herausforderungen, die in den n\u00e4chsten Wochen auf das gesamte Projekt-Team zukommen?\nIch unterscheide zwischen den Bereichen Lackiererei, Endmontage und Bereitstellung, welche bereits verlagert wurden und dem Produktionsteil Blechbearbeitung.\nBei den verlagerten Bereichen sind es die Schwerpunkte, welche ich bereits in der dritten Frage angesprochen habe. Hier geht es darum die Produktionsdaten, -dokumente und -prozesse zu optimieren und auf die Leistungsstufe zu f\u00fchren, welche uns legitimiert, als Schweizer Hersteller am Markt aufzutreten und nachhaltig erfolgreich zu agieren.\nBei der Verlagerung der Blechbearbeitung liegt der Schwerpunkt darin, dass wir mit unseren Mitarbeitenden die Hauptmaschinen nach Huttwil transferieren, in Betrieb nehmen und zu fix definierten Zeitpunkten die Produktionst\u00e4tigkeit wieder aufnehmen. In einem weiteren Schritt werden dann auch hier die Produktionsdaten, -dokumente und -prozesse analysiert und optimiert.", "Diese Richtlinie beschreibt, wie \u201eJagged Alliance Forum\u201c (\u201ehttps://forum.jaggedalliance.de\u201c) (im Folgenden \u201eder Betreiber\u201c) die Daten verwendet, die w\u00e4hrend deines Foren-Besuchs gesammelt werden.\nUmfang und Art der Datenspeicherung\nDeine Daten werden auf vier verschiedene Arten gesammelt:\nDie Forensoftware phpBB erstellt bei deinem Besuch des Boards mehrere Cookies. Cookies sind kleine Textdateien, die dein Browser als tempor\u00e4re Dateien ablegt und die zwischen den einzelnen Aufrufen des Boards erhalten bleiben. In diesen Cookies sind die aktuelle ID deiner Sitzung (damit dir alle Seitenaufrufe zugeordnet werden k\u00f6nnen), Informationen \u00fcber die von dir gelesenen Beitr\u00e4ge (zur Markierung dieser als gelesen/ungelesen; sofern du nicht angemeldet bist) sowie Informationen \u00fcber deine Teilnahme an Umfragen (sofern du nicht angemeldet bist) gespeichert. Ferner werden deine Benutzer-ID, ein Authentifizierungsschl\u00fcssel und eine Session-ID gespeichert. Die Cookies haben standardm\u00e4\u00dfig eine G\u00fcltigkeit von einem Jahr. Alle Cookies kannst du jederzeit \u00fcber die Funktion \u201eAlle Cookies l\u00f6schen\u201c l\u00f6schen.\nWeiterhin werden die Daten gespeichert, die du bei der Registrierung, in deinem Profil oder deinem pers\u00f6nlichem Bereich angibst. F\u00fcr die Registrierung sind mindestens ein eindeutiger Benutzername, eine E-Mail-Adresse und ein Passwort notwendig. Wenn durch den Betreiber weitere Daten als notwendig festgelegt wurden, so ist dies f\u00fcr dich vor deren Eingabe ersichtlich.\nWenn du einen Beitrag oder eine private Nachricht erstellst, so werden die dort eingegebenen Daten ebenfalls gespeichert. Gleiches gilt, wenn du einen Beitrag als Entwurf zwischenspeicherst. In diesen F\u00e4llen wird auch deine IP-Adresse gespeichert. Die IP-Adresse wird weiterhin bei folgenden Aktionen gespeichert: L\u00f6schen und \u00c4ndern von Beitr\u00e4gen (dazu z\u00e4hlen Private Nachrichten und Umfragen), \u00c4nderungen an zentralen Profildaten (E-Mail-Adresse, Kontoaktivierung, Benutzer-Passwort) und gescheiterte Anmeldeversuche. Die von deinem Browser \u00fcbermittelte Browser-Kennzeichnung (User Agent) wird nur in der \u201eWer ist online?\u201c-Funktion angezeigt und nicht dauerhaft gespeichert.\nSchlie\u00dflich erfordern einzelne Funktionen des Boards, dass weitere Daten gespeichert werden. Dazu geh\u00f6ren dein Abstimmungsverhalten bei Umfragen, der Gelesen-Status von deinen Beitr\u00e4gen oder explizit von dir gesetzte Lesezeichen oder Benachrichtigungsfunktionen.\nDein Passwort wird mit einer Einwege-Verschl\u00fcsselung (Hash) gespeichert, so dass es sicher ist. Jedoch wird dir empfohlen, dieses Passwort nicht auf einer Vielzahl von Webseiten zu verwenden. Das Passwort ist dein Schl\u00fcssel zu deinem Benutzerkonto f\u00fcr das Board, also geh mit ihm sorgsam um. Insbesondere wird dich kein Vertreter des Betreibers, von phpBB Limited oder ein Dritter berechtigterweise nach deinem Passwort fragen. Solltest du dein Passwort vergessen haben, so kannst du die Funktion \u201eIch habe mein Passwort vergessen\u201c benutzen. Die phpBB-Software fragt dich dann nach deinem Benutzernamen und deiner E-Mail-Adresse und sendet anschlie\u00dfend ein neu generiertes Passwort an diese Adresse, mit dem du dann auf das Board zugreifen kannst.\nGestattung der Datenspeicherung\nDu gestattest dem Betreiber, die von dir eingegebenen und oben n\u00e4her spezifizierten Daten zu speichern, um das Board betreiben und anbieten zu k\u00f6nnen.\nDar\u00fcber hinaus ist der Betreiber berechtigt, im Rahmen einer Interessenabw\u00e4gung zwischen deinen und seinen Interessen sowie den Interessen Dritter, Zeitpunkte von Zugriffen und Aktionen zusammen mit deiner IP-Adresse und der von deinem Browser \u00fcbermittelter Browser-Kennung zu speichern, sofern dies zur Gefahrenabwehr oder zur rechtlichen Nachverfolgbarkeit notwendig ist.\nRegelungen bez\u00fcglich der Weitergabe deiner Daten\nZweck eines Boards ist es, einen Austausch mit anderen Personen zu erm\u00f6glichen. Du bist dir daher bewusst, dass die Daten deines Profils und die von dir erstellten Beitr\u00e4ge im Internet \u00f6ffentlich zug\u00e4nglich sein k\u00f6nnen. Der Betreiber kann jedoch festlegen, dass einzelne Informationen nur f\u00fcr einen eingeschr\u00e4nkten Nutzerkreis (z. B. andere registrierte Benutzer, Administratoren etc.) zug\u00e4nglich sind. Wenn du Fragen dazu hast, suche nach entsprechenden Informationen im Forum oder kontaktiere den Betreiber. Die E-Mail-Adresse aus deinem Profil ist dabei jedoch nur f\u00fcr den Betreiber und von ihm beauftragte Personen (Administratoren) zug\u00e4nglich.\nAndere als die oben genannten Daten wird der Betreiber nur mit deiner Zustimmung an Dritte weitergeben. Dies gilt nicht, sofern er auf Grund gesetzlicher Regelungen zur Weitergabe der Daten (z. B. an Strafverfolgungsbeh\u00f6rden) verpflichtet ist oder die Daten zur Durchsetzung rechtlicher Interessen erforderlich sind.\nGestattung der Kontaktaufnahme\nDu gestattest dem Betreiber dar\u00fcber hinaus, dich unter den von dir angegebenen Kontaktdaten zu kontaktieren, sofern dies zur \u00dcbermittlung zentraler Informationen \u00fcber das Board erforderlich ist. Dar\u00fcber hinaus d\u00fcrfen er und andere Benutzer dich kontaktieren, sofern du dies in deinem pers\u00f6nlichen Bereich gestattet hast.\nGeltungsbereich dieser Richtlinie\nDiese Richtlinie umfasst nur den Bereich der Seiten, die die phpBB-Software umfassen. Sofern der Betreiber in anderen Bereichen seiner Software weitere personenbezogene Daten verarbeitet, wird er dich dar\u00fcber gesondert informieren.\nAuskunftsrecht\nDer Betreiber erteilt dir auf Anfrage Auskunft, welche Daten \u00fcber dich gespeichert sind.\nDu kannst jederzeit die L\u00f6schung bzw. Sperrung deiner Daten verlangen. Kontaktiere hierzu bitte den Betreiber.", "Bilder mit frommen und weniger frommen Kommentaren vom M\u00fcnster Unserer Lieben Frau in Freiburg i. Br.\nMen\u00fc\nHome\nWarum dieser Blog?\nKontakt\nWarum dieser Blog?\nNicht nur italienische Menschen machen gern eine \u201ebella figura\u201c, wenn sie liebe und wichtige G\u00e4ste haben. Und womit macht man in Freiburg im Breisgau eine \u201ebella figura\u201c? Da bietet sich das M\u00fcnster an. Aber um ein bisschen mit ihm zu gl\u00e4nzen, muss man es zeigen k\u00f6nnen, und dazu muss man es ein bisschen kennen lernen. Und dabei habe ich mich in das alte Gem\u00e4uer und seine ewig junge Chefin ein bisschen verliebt.\nDie Zeiten, in denen ich versuchte, Kolleginnen und Freunden aus Italien und Spanien das M\u00fcnster zu zeigen, sind vorbei. Geblieben ist die Lust zu fabulieren; dazu gekommen ist ein Fotoapparat mit einem ordentlichen Teleobjektiv. Mit seiner Hilfe kann man auch ferne und kleine Sch\u00f6nheiten des M\u00fcnsters von ganz nahe betrachten. Und so entstand die Idee zu diesem Blog: Ich m\u00f6chte einfach meine Fotos oder, besser gesagt, die von mir gesehene, h\u00e4ufig \u00fcbersehene Sch\u00f6nheit des M\u00fcnsters und Gedankensplitter dazu mit anderen teilen.\nDabei bin ich in allem \u2013 im Fabulieren, Interpretieren, Fotografieren \u2013 Dilettant, das heisst: nicht vom Fach; aber das Wort kommt vom italienischen dilettare = erfreuen, erg\u00f6tzen, ich mache es mit grossem Spass an der Freude, es ist ein Spiel. Ich fotografiere mit meiner Amateurkamera, von unten aus der Perspektive der seit 800 Jahren Betenden und Betrachtenden; ich habe das Licht zur Verf\u00fcgung, das Sonne und M\u00fcnstermanagement allen Besuchern bieten.\nMein Name ist Nikolaus Sidler. Ich geniesse seit einigen Jahren mein m\u00fcssiges Rentnerdasein, nachdem ich jahrzehntelang Lehrer war. Mit der katholischen Kirche habe ich vielf\u00e4ltige und interessante Erfahrungen gemacht. Deswegen habe ich ein etwas distanziertes, leicht am\u00fcsiertes Verh\u00e4ltnis zu dieser Kirche und zu organisierter Religion \u00fcberhaupt.\nBei der Verfertigung der Gedanken zu den Bildern besch\u00e4ftige ich gelegentlich freie Mitarbeiter, am h\u00e4ufigsten folgende drei: (1) Ein in die Jahre gekommener Ministrant, der Weih-nachten mal als kleinster der Truppe das Wachsjesulein vom Hochaltar zum rechten Seitenaltar und dort zur noch leer stehenden Krippe tragen durfte. Er starb um ein Haar vor Angst, dabei zu stolpern und sich vor der versammelten Gemeinde bis auf die Knochen zu blamieren. (2) Ein historisch-kritischer Bibelleser, der gelegentlich, wenn er nicht mit der Freundin Kaffee trinken war, eine theologische Vorlesung h\u00f6rte. (3) Der Tor von Psalm 53,1, der in seinem Herzen spricht: \u201eEs gibt keinen Gott\u201c, aber nie wirklich Atheist war, sondern philosophisch haltbarer Agnostizist, und der h\u00e4ufig \u201eim Kreis der Sp\u00f6tter sitzt\u201c, wie Psalm 1,1 missbilligend sagt. Wir vier treffen uns w\u00f6chentlich zur Redaktionskonferenz.\nDas Vorabbild dieses Blogs zeigt ein Lastenrad vom Dachboden des M\u00fcnsters. Die Engel im und am M\u00fcnster mit ihren Fl\u00fcgeln und die Heiligen einschliesslich der lieblichen Madonna mit ihren Heiligenscheinen wirken luftig-\u00e4therisch, aber sie wiegen viele Zentner, die mit menschlicher Muskelkraft hochgehoben und an Ort und Stelle gebracht werden mussten. Dieses Originalrad aus dem 13. Jahrhundert machte so etwas \u00fcberhaupt erst m\u00f6glich. Ich zeige es, weil man es selten sieht.\nKommentare sind erbeten, Weiterempfehlungen auch. Die Urheberrechte liegen bei mir. Falls jemand die Texte zitieren will, gerne, aber bitte mit Quellenangabe; Verwendung der Fotos nach R\u00fccksprache mit mir.\nHaftungsausschluss: Was in diesem Blog geschrieben ist, entspricht dem aktuellen Stand der Irrt\u00fcmer des gesamten Redaktionsteams. F\u00fcr keine Aussage wird eine Garantie \u00fcbernommen, und es wird jegliche Haftung f\u00fcr Folgesch\u00e4den ausgeschlossen, sowohl f\u00fcr das Dies- wie vor allem f\u00fcr das Jenseits.", "Zie het onderstaande bericht van onze Zwitserse vrienden m.b.t. camperplaatsen gedurende en vooraf/aansluitend op het evenement\nGepubliceerd: 18-06-2019 | 23:15:43\nLaatst gewijzigd: 18-06-2019 | 23:15:43\nZu der M\u00f6glichkeit Wohnmobile zu stationieren - Bitte um Beachtung!\nVom Mittwoch 28. August bis Samstag 31. August sind 20 Parkpl\u00e4tze f\u00fcr den EURO-Cup reserviert. In dieser Zeit m\u00fcssen daf\u00fcr keine Parkgeb\u00fchren bezahlt werden. Rund 6 Pl\u00e4tze davon werden durch Regatta-Funktion\u00e4re des SCAe beansprucht. Es k\u00f6nnen aber vom SCAe keine Zuteilungen einzelner Pl\u00e4tze garantiert werden. Der SCAe hat keine M\u00f6glichkeit fremde Parkende wegzuweisen.\nAn den Tagen ausserhalb dieses Zeitraums k\u00f6nnen alle Pl\u00e4tze zu CHF 8.00 pro Tag belegt werden. Es ist keine Reservierung m\u00f6glich!\nEs gibt keine Wasser- oder Stromanschl\u00fcsse. Toiletten gibt es beim Restaurant unten am See, einfache Garderoben und Duschen in der Infrastruktur des SCAe.\nDas beste ist nach wie vor auf dem sehr guten Campingplatz ganz in der N\u00e4he zu logieren. ................................. aber auf diesem Campingplatz sind Hunde nicht erlaubt !Campingplatz Unter\u00e4geri Wilbrunnenstr. 81 am gegen\u00fcberliegenden Seeufer vis \u00e0 vis Clubhaus Ober\u00e4geri\nCamping Unter\u00e4geri Tel. +41 41 750 39 28 Meer info\noder auf dem Campingplatz Naas, liegt auch am See, aber ein wenig weiter weg ............................................... da sind Hunde erlaubt !\nAuf diesem Campingplatz sind Hunde erlaubt: Honden toegestaan\nsiehe auch unter info\nWir tun unser Bestes speziellen W\u00fcnschen nachzukommen. M\u00f6glichst detaillierte Angaben fr\u00fchzeitig senden Meer info", "Beruhigt Emotionen Besserer Schlaf Bes\u00e4nftigt Angst F\u00fcr den Notfall Gibt Energie Hilfe in der Schule Inspiration Ist-Bewusstsein Konzentration Resilienz Selbstvertrauen Spirituelles Erwachen Stimmungsaufheller Stressmanagement Verbessert Beziehungen\n\u00a9 2023 Gouttes de la Terre | Tous droits r\u00e9serv\u00e9s | Politique de confidentialit\u00e9 | Conditions G\u00e9n\u00e9rales de Vente | Cr\u00e9ation pixandnet\nDiese Website verwendet Cookies, um die Benutzerfreundlichkeit zu verbessern und den Traffic zu analysieren.\nF\u00fcr weitere Informationen lesen Sie bitte die Informationen \u00fcber Cookies und wie Sie diese kontrollieren k\u00f6nnen, indem Sie auf \"Pr\u00e4ferenzen\" klicken.\nPr\u00e4ferenzen\nAlle ablehnen\nAlle akzeptieren\nPrivacy Preference Center\nPr\u00e4ferenzen\nDiese Website verwendet Cookies, um die Benutzerfreundlichkeit zu verbessern und den Traffic zu analysieren. F\u00fcr weitere Informationen lesen Sie bitte die Informationen \u00fcber Cookies und wie Sie diese kontrollieren k\u00f6nnen, indem Sie auf \"Datenschutzerkl\u00e4rung\" klicken.\nTracking\nDiese Website verwendet Google Analytics, um den Datenverkehr zu analysieren und so die Nutzererfahrung zu verbessern.", "Der Bundesverband von B\u00dcNDNIS 90/DIE GR\u00dcNEN sucht zum n\u00e4chstm\u00f6glichen Zeitpunkt eine*n Social-Media-Redakteur*in (m/w/d).\nF\u00fcr 100 Prozent Lohngerechtigkeit\nFrauen verdienen in Deutschland im Schnitt 18 Prozent weniger als M\u00e4nner. Das wollen wir \u00e4ndern. Werde jetzt mit uns aktiv f\u00fcr [...]\nKindergrundsicherung \u2013 Das steckt drin\nJedes f\u00fcnfte Kind in Deutschland ist armutsgef\u00e4hrdet \u2013 das ist ein untragbarer Zustand. Lies hier nach, wie wir daf\u00fcr sorgen wollen, dass alle [...]", "Helden ist ein Ortsteil der Hansestadt Attendorn. Die St\u00e4dt. Kath. Grundschule Helden \u2013 Marienschule \u2013 ist eine von vier Grundschulen der Stadt Attendorn. Zum urspr\u00fcnglichen Einzugsgebiet geh\u00f6rt das gesamte Repetal mit den D\u00f6rfern Helden, Niederhelden, D\u00fcnschede, R\u00f6lleken, Mecklinghausen, Repe, Rieflinghausen\u2026. .\nUnsere zweiz\u00fcgig gef\u00fchrte St\u00e4dtische Katholische Grundschule besuchen momentan ca. 140 Sch\u00fclerinnen und Sch\u00fcler aus dem gesamten Repetal. Wir sind eine offene Ganztagsschule mit jahrgangsbezogenem Unterricht.\nAktuell besteht unser Team aus einer Rektorin, acht Regelschul-Lehrkr\u00e4ften, zwei Vertretungs-Lehrkr\u00e4ften, einer abgeordneten Sonderp\u00e4dagogin, dem P\u00e4dagogischen Personal mit 7 Mitarbeiterinnen, der Schulsekret\u00e4rin und dem Hausmeister. Die Zusammenarbeit mit allen am Schulleben Beteiligten ist uns wichtig. Helden hat einen d\u00f6rflich gepr\u00e4gten Charakter mit kleiner Infrastruktur (Lebensmittelladen, Tankstelle). Es besteht ein engagiertes Vereinswesen und eine gute Zusammenarbeit zwischen Kirche, Gemeinde und Schule.\nInformationen\n1705, 2023\nWallfahrt\nVon Bettina Rath|2023-05-26T15:04:27+00:00Mai 17th, 2023|Kategorien: Aktuelles|Kommentare deaktiviert f\u00fcr Wallfahrt\nNach 3 Jahren Pause f\u00fchrte die Marienschule ihre traditionelle Schulwallfahrt durch. Bei tollem Fr\u00fchlingswetter ging es durch die Repetaler Felder zum Heiligenh\u00e4uschen in D\u00fcnschede, an dem der Gemeindereferent Herr M\u00fcller \u00fcber das Leben der Gottesmutter Maria erz\u00e4hlte. Nach gemeinsamen Ges\u00e4ngen und Gebeten ginge es \u00fcber Waldwege mit sch\u00f6nen Aussichten auf die Attendorner Umgebung und einem St\u00fcck des Heldener RuHe-Pfades zur\u00fcck zur Schule.\nWeiterlesen\n2704, 2023\nFu\u00dfballer weiter auf Erfolgkurs\nVon Bettina Rath|2023-05-04T06:39:28+00:00April 27th, 2023|Kategorien: Aktuelles|Kommentare deaktiviert f\u00fcr Fu\u00dfballer weiter auf Erfolgkurs\nBei hervorragendem Fu\u00dfballwetter trafen sich heute Vormittag die 6 besten Mannschaften der Grundschulen des Kreis Olpe im Kreuzbergstadion in Olpe. Bei einem fairen und spannenden Turnier wurde der neue Kreismeister ermittelt. Mit zwei Unentschieden gegen die GS Rhode und die GS R\u00f6nkhausen und drei klaren Siegen gegen die GS Meggen, die GS Wendener Land und die GS Welschen Ennest, zeigten unsere Jungen eine grandiose Leistung und gingen als Kreismeister aus dem Turnier hervor! Damit", "die Bundesregierung hat die COVID-19-Schutzma\u00dfnahmen-Ausnahmeverordnung (SchAusnahmV) erlassen, die auch f\u00fcr den Schulbetrieb relevant ist und ab dem 17.05.2021 an unserer Schule umgesetzt wird.\nFolgendes findet sich darin wieder:\nWegfall der qualifizierten Selbstauskunft \u00fcber die Durchf\u00fchrung eines Tests\nEs ist nicht mehr erlaubt, den zweimaligen Test pro Woche auf eine Infektion mit dem Coronavirus SARS-CoV-2 zuhause durchzuf\u00fchren. Die Selbsttest m\u00fcssen in den Schulen unter Aufsicht durchgef\u00fchrt werden. Es werden folgende Testnachweise weiterhin anerkannt:\na) betriebliche Testung im Sinne des Arbeitsschutzes durch Personal, das die daf\u00fcr erforderliche Ausbildung oder Kenntnis und Erfahrung besitzt\nb) wenn Tests von einem Leistungserbringer nach \u00a7 6 Absatz 1 der Coronavirus-Testverordnung vorgenommen oder \u00fcberwacht werden (z. B. Testzentrum)\nBei den unter a) und b) genannten Testnachweisen darf die zu Grunde liegende Testung maximal 24 Stunden zur\u00fcckliegen.", "Oft ist das lesen am Bildschirm mit eingeschr\u00e4nkter Sehkraft beschwerlich. Lassen Sie sich unsere Webseiten www.highpower.ch, www.highpower.de und www.voice-corp.ch einfach vorlesen!\nM\u00f6chten Sie den Dienst ebenfalls auf Ihrer Webseite nutzen, dann kontaktieren Sie uns! Wir erstellen Ihnen gerne ein Angebot, das auf Ihre Bed\u00fcrfnisse abgestimmt ist.\nAuf jeder Seite finden Sie einen Button Vorlesen, zum vorlesen lassen. Klicken Sie auf das Symbol und Ihnen wird der Text automatisch nach einigen Sekunden vorgelesen.\nVersuchen Sie es doch einfach, denn der Dienst ist kostenlos.\nWas ben\u00f6tigen Sie am PC?\nEinen Kopfh\u00f6rer oder Lautsprecher und einen Browser mit audio-f\u00e4higem Player. Das hat fast jedes Handy, PC oder Tablet.\nMP3 herunterladen und anh\u00f6ren!\nNutzen Sie den Dienst zum privaten Gebrauch und laden Sie, zum sp\u00e4teren anh\u00f6ren, die MP3-Datei auf Ihr Handy oder PC.\nWas k\u00f6nnen Sie tun, wenn Sie keine Sprachwiedergabe h\u00f6ren?\na) Durch Klick auf das Audio-Symbol >>>>> Dr\u00fccken Sie auf Play um den Dienst zu nutzen! Vorlesen, sollte der Player mit dem Vorlesen automatisch beginnen.\nBitte klicken Sie auf MP3. Dadurch wird die MP3-Datei automatisch herunter geladen und kann anschlie\u00dfend abgespielt werden.\nb) docReader: Durch Klick auf das Audio-Symbol sollte sich ein Player-Fenster \u00f6ffnen und das Vorlesen automatisch beginnen.\nFalls sich kein Fenster \u00f6ffnet, aktivieren Sie bitte die Java-Script-Funktion in Ihren Browser-Einstellungen.\nSollte sich ein Fenster \u00f6ffnen, aber der Vorlesevorgang nicht automatisch starten, dann klicken Sie im ge\u00f6ffneten Fenster bitte auf den Button (kein Ton?). Dadurch wird die MP3-Datei automatisch herunter geladen und kann anschlie\u00dfend abgespielt werden. Bei weiteren Fragen kontaktieren Sie uns!", "Erinnern Sie sich, vor drei Jahren haben wir uns kurz vor der Er\u00f6ffnung das Swissotel Am Schloss angesehen. Nun laden uns Hoteldirektor Kevin Furrer und Marketingchefin Corinne Miseer erneut ein. Sie wollen uns ihre neue \u201eWohnstube\u201c pr\u00e4sentieren. Wir haben uns gedacht, dass dies ein guter Anlass ist, um \u00fcber Hotels, Tourismus und Bettensteuer zu diskutieren. So stehen uns neben dem Hoteldirektor auch der Vorsitzende des Tourismusverbandes, Johannes Lohmeyer, sowie Gr\u00fcnen-Stadtrat und Jurist Johannes Lichdi Rede und Antwort.\nWir treffen uns am 31. M\u00e4rz \u2013 diesmal am Dienstag \u2013 um 19 Uhr im Hotel Am Schloss in der Schlo\u00dfstra\u00dfe.\nWir hoffen, Sie neugierig gemacht zu haben und w\u00fcrden uns \u00fcber eine rege Teilnahme freuen.\nDamit das Hotel besser planen kann, w\u00e4re es sch\u00f6n, wenn Sie sich bis zum 27. M\u00e4rz in unserem Clubb\u00fcro unter: info@presseclub-dresden anmelden.\nDieser Eintrag wurde ver\u00f6ffentlicht in Clubabend, Programm und verschlagwortet mit Clubabend, Presseclub Dresden, Swisshotel Dresden von 51nullacht. Permanenter Link zum Eintrag.", "Touristen fotografieren die Veste Coburg vom Hofgarten aus. Der Tourismus in Bayern hat fast wieder Vor-Corona-Niveau erreicht.\n\u00a9 dpa / Daniel Vogl/dpa\nBayern bei Touristen wieder beliebt\nAktualisiert am 07.09.2022, 14:19 Uhr\nF\u00fcrth (dpa/lby) - Erstmals haben ann\u00e4hernd wieder so viele Touristen in Bayern \u00fcbernachtet wie vor der Corona-Pandemie. Die 11.566 ge\u00f6ffneten Beherbergungsbetriebe verzeichneten nach einer Mitteilung des Landesamtes f\u00fcr Statistik im Juli knapp 4,5 Millionen G\u00e4steank\u00fcnfte und fast 11,5 Millionen \u00dcbernachtungen. Das entspreche fast den Werten aus dem Juli 2019.\nMehr zum Thema Reise\nAus dem Ausland wurden erstmals seit der Pandemie wieder mehr als eine Million Touristen innerhalb eines Monats im Freistaat gez\u00e4hlt, wie die Statistiker in F\u00fcrth mitteilten. Besonders gefragt waren im Juli Jugendherbergen und H\u00fctten. Hier kamen 75,8 Prozent mehr G\u00e4ste als noch im Juli des Vorjahres.\nInsgesamt wurden in diesem Jahr bislang 18,1 Millionen G\u00e4steank\u00fcnfte und knapp 49,3 Millionen \u00dcbernachtungen in Bayern registriert. Das ist den Angaben zufolge im Vergleich zum Vorjahreszeitraum ein Anstieg um 147,7 Prozent bei den G\u00e4steank\u00fcnften und um 103,6 Prozent bei den \u00dcbernachtungen.", "Im Kapitalismus werden die Arbeitendenals Ware im Dienst des Kapitals ausgebeutet. Der Grad dieser Ausbeutung ist dabei bei Jugendlichen und speziell Lernenden besonders hoch. Dies liegt daran, dass Jugendliche keine konstante Gruppe sind, man bleibt nicht immer jung, und daher schwerer gewerkschaftlich zu organisieren sind. Auch sind sie politisch nicht wahl-und stimmberechtigt: man muss sich daher kaum vorihren Stimmen f\u00fcrchten. Dazu kommt, dass Jugendliche in der Regel von ihren Eltern finanziert werden k\u00f6nnen, man braucht ihnen daher auch keine anst\u00e4ndigen L\u00f6hne zu bezahlen. Weiter fehlt es Jugendlichen aufgrund ihrer naturgem\u00e4ss erst 10kleinen Erfahrung oft an Wissen dar\u00fcber, was ihre Rechte sind und sein sollten.\nAls treibende linke Kraft weiss das die JUSO, dass unsere Jugend die Flammeder Revolution bildet. Als Partei des Sozialismus und damit der Arbeitenden ist esunser elementarstes Interesse, besonders auch die jungen Arbeitenden zu organisieren und f\u00fcr unseren Kampf zu gewinnen. Das folgende Papier soll entsprechend eine politische Grundlage f\u00fcr die zuk\u00fcnftige Arbeit unter den Lernenden und jungen Arbeitenden bilden.\nLehre statt Leere!\nDas b\u00fcrgerliche Konzept,\u00abDer Markt regelt alles von alleine\u00bb, versagt ein weiteres Mal krass, wenn wir uns das Lehrstellenangebot in der Schweiz anschauen. So waren 2012 ca. 3.5% aller 20Jugendlichen arbeitslos. 19'417 junge Personen standen ohneberufliche Perspektive da. Nach den genaueren OECD-Zahlen waren es Ende 2013 gar 10.4%. Jugendliche die nie eine Berufslehre absolvieren konnten, sind besonders von Arbeitslosigkeit und Armut betroffen. So haben 75.8% aller Sozialhilfe-Empf\u00e4ngerInnen keine Berufslehre abgeschlossen. Anhand dieser alarmierenden Zahlen sieht man wie wichtig die Berufsbildung f\u00fcr unsere Gesellschaft und wie massiv das Marktversagen ist.\nDer obligatorische Berufsbildungsfond im Kanton Z\u00fcrich ist noch kein Allheilmittel sondern nur ein kleiner Schritt zu einer solidarischen Gesellschaft, deshalb muss der Bund auch dar\u00fcber hinaus aktiv eingreifen. Das Ziel muss sein, dass kein Jugendlicher ohne Ausbildung ist. Eine M\u00f6glichkeit besteht darin, \u00f6ffentliche Auftr\u00e4ge nur noch an Unternehmen zu vergeben, welche Lernende ausbilden. Weiter 30m\u00fcssen die Beitr\u00e4ge an den Berufsbildungsfonds von Seiten der Unternehmen, besonders derjenigen die keine Lernende ausbilden,erh\u00f6ht werden.\nEine Berufslehre ist der Einstieg in das Berufsleben. Nach der Ausbildung r\u00fcckt die Weiterbildung ins Zentrum. Diese kann z.B. die Berufsmatur erfordern. Vielen Lernenden wird die berufsbegleitende Berufsmatur w\u00e4hrend der Lehre vom Lehrbetrieb jedoch wiederrechtlich verboten, da sie sonst zu viel in der Schule und zu wenig im Betrieb seien. Auszubildende d\u00fcrfen aber nicht einfach nur als billige Arbeitskr\u00e4fte ausgebeutet werden. Deshalb muss es jedem Lernenden offen stehen die BMS w\u00e4hrend der Lehre zu absolvieren. Betriebe die gegen dieses Recht verstossen, m\u00fcssen hart bestraft werden.\nAusserdem muss die Zahl der spezialisierten Berufe und spezifischen Ausbildungenreduziert werden. Auch Jugendlichen ohne BMS sollte eine breite Grundbildung erm\u00f6glicht werden. Es braucht 40ausserdem Unterst\u00fctzungskurse, damit eine berufliche Ausbildung trotz schulischen Schwierigkeiten erm\u00f6glicht werden kann.\nWir fordern:\nDie Einf\u00fchrung eines nationalen Berufsbildungsfonds\nEine Lehrstellengarantie\nDie Durchsetzung des Rechtes auf Weiterbildung\nEine breite Grundbildung\u2022Vereinheitlichte und verbesserte Stipendien\nMindestens zwei Stunden Arbeitszeit pro Woche muss zum Lernen f\u00fcr die Schule zur Verf\u00fcgung gestellt werden\nVollen Zugang der Gewerkschaften an den Berufsschulen\nSicherheit auch f\u00fcr Lernende!\nJ\u00e4hrlich verunfallen 24\u2019500 Lernende am Arbeitsplatz. Die Meisten dieser Unf\u00e4lle k\u00f6nnten verhindert werden. Doch Lernende k\u00f6nnen in der Realit\u00e4t nicht \u201eNein\u201c zu einer Arbeit sagen, bzw. sie wissen oft 55\u00fcberhaupt nicht, welche Arbeiten in ihrem Beruf gef\u00e4hrlich sind. Auch durch ungen\u00fcgende Einweisung in neue Arbeiten entstehen viele Unf\u00e4lle. Oft werden auch M\u00e4ngel nicht beseitigt, obwohl die Lernenden den Betrieb darauf aufmerksam machen.\nUnf\u00e4lle passieren auch, wenn viel zu lange gearbeitet wird \u2013die t\u00e4gliche Arbeitszeit darf 9 Stunden nicht \u00fcberschreiten. Oft k\u00f6nnen sich die Lernenden aber gar nicht gegen viel zu lange Arbeitszeiten 60wehren. Ein weiteres Problem ist, dass viele Lernende gerade zu Beginn ihrer Lehre oft berufsfremde Arbeiten erledigen m\u00fcssen. Im Durchschnitt verbringen Lernende im ersten Lehrjahr 50% ihrer Arbeitszeit mit berufsfremden Arbeiten \u2013obwohl diese eigentlich verboten sind! Wenn Lernende die meiste Zeit damit verbringen, Boteng\u00e4nge zu erledigen oder zu putzen, lernen sie nichts, was f\u00fcr ihren Beruf \u2013und somit f\u00fcr die Abschlusspr\u00fcfungen \u2013wichtig ist. Wenn ein/e Lernende/r sich, nachdem das 65Gespr\u00e4ch im Betrieb gesucht wurde, ans Berufsbildungsamt wendet, wird oft alles nur noch schlimmer. Sie/Er gilt dann schnell als Nestbeschmutzer. H\u00e4ufig kriegen Lernende zu h\u00f6ren, sie sollen Dankbar sein, dass sie eine Lehrstelle haben und dass das halt so sei in einer Lehre. Oft verspricht der/die Berufsinspektor/in dem/der Lernenden im Gespr\u00e4ch Hilfe, f\u00e4llt ihm/ihr aber dann in den R\u00fccken und verb\u00fcndet sich mit dem/der Ausbildungsverantwortlichen. Dabei werden etwa andere 70Lernende aus dem Betrieb, im Beisein des Ausbildungsverantwortlichen,befragt und der Fall so anschliessend herunter gespielt.\nSelbst wenn die Fronten total verh\u00e4rtet sind \u2013 ein Lehrvertrag kann nur sehr schwer aufgel\u00f6st werden, ohne dass Lernenden Sanktionen in Form eines schlechten Arbeitszeugnisses drohen. Was eigentlich zum Schutz der Lernenden gedacht ist, macht ihnen zuweilen das Leben schwer. Einseitig kann ein Lehrvertrag nur Aufgel\u00f6st werden, wenn schwerwiegende Gr\u00fcnde, wie etwa sexuelle Bel\u00e4stigung, vorliegen.\nWenn Lernende also mit ihrem Chef/Ausbildungsverantwortlichen \u00fcberhaupt nicht klarkommen, dieser mit einer Aufl\u00f6sung aber nicht einverstanden ist, bleiben ihnen zwei M\u00f6glichkeiten: falsche Anschuldigungen aufstellen oder die Arbeit verweigern. Beides ist weder sinnvoll noch gut f\u00fcr das 80weitere Arbeitsleben. Wenn ein Betrieb einen Lernenden loswerden will, ist es deutlich einfacher. Falsche Anschuldigungen zu stellen ist in der Machtposition oder Ausbildner deutlich einfacher. Dann kann es heissen: \u201eDu bekommst ein gutes Zeugnis, wenn du einer Aufl\u00f6sung zustimmst. Sonnst k\u00f6nnen wir auch sagen, du hast geklaut.\u201c\nDie Zust\u00e4nde auf dem Berufsbildungsamt m\u00fcssen verbessert werden, so dass die Interessen der 85Lernenden im Zentrum stehen.Bei der Suche nach einer neuen Stelle muss das Berufsbildungsamt die Lernenden aktiv unterst\u00fctzen. Sie haben schliesslich die Bewilligung an den vorherigen Betriebdes Lernenden gegeben. F\u00fcr die Lernenden vergeht viel Zeit, wenn sie den Lehrbetrieb wechseln wollen, und sie erhalten dabei kaum oder gar keine Unterst\u00fctzung vom Amt.\nBewilligungen f\u00fcr Betriebe werden eigentlich nach strengen Regeln vergeben. Im Betrieb muss ein 90Berufsbildner angestellt sein, der f\u00fcr diese Bezeichnung einen 40 Stunden dauernden Kurs besucht hat. Diese Berufsbildner unterschreiben auch den Lehrvertrag. Ausserdem m\u00fcssen Ger\u00e4tschaften vorhanden sein, die f\u00fcr das erlernen des Berufes wichtig sind. Welche Ger\u00e4te und Einrichtungen vorhanden sein m\u00fcssen, ist f\u00fcr jeden Lehrberuf geregelt. Diese Dinge sind aber nur wichtig, wenn ein Betrieb das erste Mal Lernende ausbilden m\u00f6chte. Wenn der Betrieb bereits seit Jahren Lernende 95betreut, finden keine weiteren Kontrollen statt. Gerade in kleinen Betrieben ist seit Jahren einfach der Chef der Lehrmeister und Lernende sind in solchen Betrieben oftmals auch als g\u00fcnstige Mitarbeiter angestellt. Deshalb w\u00e4re es Sinnvoll, wenn alle Lehrbetriebe regelm\u00e4ssig und unangek\u00fcndigt kontrolliert w\u00fcrden.\nWir fordern:\nDas Recht auf Sicherheit und Gesundheitsschutz am Arbeitsplatz\nDie 35-Stunden-Woche f\u00fcr Lernende ohne Lohnverlust\nDie M\u00f6glichkeit den Lehrbetrieb unb\u00fcrokratisch zu wechseln\nJedes Lehrverh\u00e4ltnis soll mindestens zweimal w\u00e4hrend der Lehre verdachtsunabh\u00e4ngig kontrolliert werden\nSieben Wochen Ferien f\u00fcr Lernende\nDie Abschaffung der Geldbussen an den Berufsschulen\nFaire L\u00f6hne auch f\u00fcr Lernende!\nDie Krise hat starke Auswirkungen auf die Arbeiten der Auszubildenden, und damit auch auf m\u00f6gliche Lohnforderungen. F\u00fcr die Betriebe ist die Ausbildung von Lernenden profitabler geworden, denn Lernende \u00fcbernehmen zunehmend Arbeiten von ausgelernten Fachkr\u00e4ften. Die Ausbildung von Lernenden kommt dabei zu kurz, und im Lohn spiegelt sich die erh\u00f6hte Ausbeutung schon gar nicht wieder. Nach Angaben der UnternehmerInnen wird gesch\u00e4tzt, dass Lernende im letzten Lehrjahr etwa 70% des Leistungsniveaus von ausgelernten Fachkr\u00e4ften erreichen. Auch die Lernenden selber sind 115im letzten Lehrjahr mit dem Verh\u00e4ltnis von erbrachter Leistung zum Lohn \u00e4usserst unzufrieden. Da sie im letzten Lehrjahr auch nur ca. 70% der Arbeitszeit einer ausgelernten Fachkraft erreichen, w\u00e4re zumindest ein halber Facharbeiter-/Innenlohn angemessen. Zudem erh\u00f6ht ein 13. Monatslohn \u2013der l\u00e4ngst nicht Normalit\u00e4t ist -die Lohnzufriedenheit von Lernenden massiv.\nDie Lohnh\u00f6he der Lernenden basieren offiziell auf den Empfehlungen der Berufs-und 120Arbeitgeberverb\u00e4nde. Doch seit Marx wissen wir, dass die Lohnh\u00f6he nicht willk\u00fcrlich ist, dass sie immer auf den Reproduktionskosten einer Arbeitskraft beruht. Bei Lernenden sind dies die Kosten, die sie ausserhalb des Elternhauses selbst zu tragen haben. Die gr\u00f6ssten Ausgabeposten im Lernendenbudget sind Transport-und Verpflegungskosten sowie die Kosten f\u00fcr den Ausgang \u2013einer der\u00f6konomischen Ursachen f\u00fcr die Tanzdemonstrationen der letzten Jahre. In den letzten beiden 125Lehrjahren machen Lernende zudem h\u00e4ufig ihren F\u00fchrerausweis und kaufen sich ein erstes Auto, was den h\u00f6heren Lohn im letzten Lehrjahr auch bitter n\u00f6tig macht.\nGeb\u00fchren f\u00fcr Schule,WeiterbildungenKosten f\u00fcr Arbeitsmittel (z.B. Messwerkzeuge bei Polymechanikern), Wegkosten zur Schule und zu \u00fcberbetrieblichen Kursen, Kosten f\u00fcr Arbeitskleidung und ihre Reinigung schm\u00e4lern das frei verf\u00fcgbare Budget der Lernenden enorm.130Obwohl die derzeitige Rechtslage die Betriebe dazu anh\u00e4lt, einige dieser Kosten zu \u00fcbernehmen, machen sie in der Praxis dasGegenteil, die Kosten werden zunehmend auf die Lernenden abgew\u00e4lzt.Dies hat sich durch die Krise noch versch\u00e4rft.\nWir fordern:\nMindestl\u00f6hne f\u00fcr Lernende und PraktikantInnen\n\u00dcbernahme aller Ausbildungs-und Arbeitskosten durch die Unternehmen\nGratis \u00d6V f\u00fcr alle\u2022\n3. Monatslohn f\u00fcr alle Lernenden\nZuk\u00fcnftige Zusammenarbeit zwischen Juso und Gewerkschaftsjugenden\nMit diesem Papier wollen wir einen Prozess anstossen, an dessen Ende die Verschmelzung der Juso mit den Gewerkschaftsjugenden steht. So k\u00f6nnen wir uns endlich daran machen, die vorhandenen Ressourcen f\u00fcr Gewerkschaftliche Jugendarbeit real nutzbar zu machen \u2013im Moment mangelt es den Gewerkschaftsjugenden weniger an Ressourcen als an AktivistInnen die diese auch nutzen k\u00f6nnen. 145Auch k\u00f6nnen wir wieder an unsere historischen Wurzeln anschliessen \u2013 die sozialistische Jugend zu Beginn des Jahrhunderts war noch die gemeinsame Organisation von Sozialdemokratie und Gewerkschaften, die Trennung beider Organisationen fand erst sp\u00e4ter und im Streit statt. Zudem gewinnen wir ein gewaltiges Feld, in dem wir unseren Einfluss geltend machen k\u00f6nnen \u2013 die Gewerkschaften selber. So k\u00f6nnen wir unseren Teil dazu beitragen, die gewerkschaftliche Praxis 150wieder mit einer sozialistischen Perspektive zu verkn\u00fcpfen. Auf der anderen Seite gewinnen wir wertvolle und konkrete Erfahrungen in gewerkschaftlichen K\u00e4mpfen. Mit unseren Mitteln \u2013 unseren aktiven Mitgliedern, unseren engagierten Vorst\u00e4nden, unseren wichtigen Kantonsparlamentariern, unserer Zeitung und unseren Websites, mit unseren Verbindungen in SP und neu in die Gewerkschaften \u2013 k\u00f6nnen wir diesen K\u00e4mpfen eine neue Kraft, Sch\u00e4rfe und schon lange nicht 155gesehene Intensit\u00e4t geben.\nDer logische erste Schritt in diese Richtung wird sein, unsere Mitglieder \u2013egal ob aktiv oder passiv \u2013 dringend dazu anzuhalten, Gewerkschaftsmitglieder zu werden. Eine Mitgliedschaft in einer Gewerkschaftsjugend kostet f\u00fcr Lernende und Studenten im Monat nur so viel wie ein bis zwei Bier. Und es ist ja nur logisch, dass in der Gewerkschaft nur mitzureden hat, wer Gewerkschaftsmitglied ist.\nDer n\u00e4chste Schritt betrifft die Inhalte unserer politischen Bildung. Die Motivation, sich in den Gewerkschaften zu engagieren, entsteht nicht von alleine. Dazu brauchen wir umfangreiches politisches Vorwissen. Jedem Mitglied muss klar werden, was Gewerkschaften sind, wie sie entstanden sind und was dazu gef\u00fchrt hat, dass sie so sind wie sie heute sind. Und ganz besonders muss uns im Laufe des n\u00e4chsten Jahres klar werden, wie wir uns die Gewerkschaften der Zukunft vorstellen. Und dann m\u00fcssen wir uns die wichtigste Frage stellen: wie kommen wir dahin?\nDazu m\u00fcssen auf allen Ebenen unserer Partei regelm\u00e4ssige Bildungsteile \u00fcber gewerkschaftliche Arbeit stattfinden. In den politischen Keimzellen unserer Partei, an den Vollversammlungen der Sektionen, muss es zuk\u00fcnftig ein regelm\u00e4ssig gelebtes Traktandum zur Gewerkschaftspolitik geben. Im Laufe der Zeit, wenn das Grundlagenwissen erst einmal gelegt ist und wir zur Praxis schreiten, 170wird dieses Traktandum vom theoretischem Traktandum immer mehr in die Praxis hin\u00fcbergef\u00fchrt werden \u2013nat\u00fcrlich ohne dabei je die theoretischen Grundlagen aus den Augen zu verlieren.\nAls n\u00e4chstes sollten wir sicherstellen, dass es auf jeder unserer Ebenen, ob sektional oder kantonal, Gewerkschaftsverantwortliche gibt. Diese sollten sich mit den aktuellen gewerkschaftspolitischen Themen vertraut machen, und die personelle Verbindung zu den Gewerkschaften herstellen \u2013indem 175sie sich beispielsweise in die Vorst\u00e4nde der Gewerkschaften w\u00e4hlen lassen.. Auch wenn diese Gremien derzeit wenig jugendlich sind, werden dort wichtige gewerkschaftliche Themen besprochen. So k\u00f6nnen wir uns ein Bild \u00fcber die aktuelle Gewerkschaftspolitik machen. Zudem bieten sie uns die Chance, wichtige Netzwerke zu kn\u00fcpfen um unsere Anliegen in die Gewerkschaften einzubringen.\nDie Verschmelzung mit den Gewerkschaftsjugenden und die aktive Partizipation an der 180Gewerkschaftspolitik bergen gewaltige Potentiale f\u00fcr die linke Jugendbewegung der Schweiz. Mit unserer Ann\u00e4herung an die Gewerkschaften und dem Aufbau einer Gewerkschaftsjugend legen wir den Grundstein zu einer linken Jugendbewegung, wie sie dieses Land bisher noch nicht gesehen hat!", "Unser erster Turniertag begann mit nassen F\u00fc\u00dfen. Wegen des Dauerregens gestern war der Dressurplatz so nass, dass die ersten Dressurwettbewerbe in die Reithalle verlegt werden mussten. Das gute Turnierwetter mit freundlichem Sonnenschein sorgte aber daf\u00fcr, dass schon am Vormittag wieder auf den Au\u00dfenplatz gewechselt werden konnte.\nDie Reiterinnen unseres Vereins haben heute einige bunte Schleifen erritten: Wiebke Jungermann und Paula D\u00f6rner teilten sich den dritten Platz in der Hunterklasse \u2013 auf Colliander und Strathmore Silver Fire, besser bekannt als Annie. Beim Springreiterwettbewerb gingen die Pl\u00e4tze zwei bis vier an den RV Bochum-Werne: Finja Wendland auf Anton, Lilli Kind auf Frodo und Luisa Klossek auf Ratima. Und beim Dressurreiterwettbewerb erreichten Luisa Klossek auf Anton und Emilia B\u00f6gel auf Ratima den sechsten bzw. siebten Platz. An dieser Stelle ein dickes Dankesch\u00f6n an alle, die unseren Schulpferdereitern geholfen und sie unterst\u00fctzt haben!\n\u00dcberhaupt: Dass dieser Tag so erfolgreich verlaufen ist, haben wir nicht nur dem sch\u00f6nen Wetter, sondern vor allem den unz\u00e4hligen Helferinnen und Helfern zu verdanken. Vom Treckerfahren \u00fcbers Grillen bis zum Br\u00f6tchenschmieren, vom Tafeldienst \u00fcbers Kaffeekochen bis zum Stangenschleppen \u2013 unz\u00e4hlige Handgriffe wurden getan und Schritte gelaufen. Nat\u00fcrlich gab es hier und da Pannen, Missverst\u00e4ndnisse und Unsicherheiten \u2013 aber wir k\u00f6nnen stolz sein, diesen ersten Turniertag gewuppt zu haben. Und wir k\u00f6nnen uns auf den zweiten Turniertag morgen freuen!\ntagPlaceholderTags:\nAktuelles\nBoxen frei!\nWir haben in unseren St\u00e4llen aktuell zwei Boxen zum Einstallen von Pferden frei. Bei Interesse und f\u00fcr weitere Informationen nehmen Sie gern Kontakt mit uns auf. (10.05.2023)\nLetzte Informationen zum Turnier\nAm Samstag, 13. Mai, ist es soweit und wir starten in unser Turnierwochenende. Es ist alles vorbereitet, der Platz ist bestens in Schuss und das Catering steht. Alle wichtigen Infos gibt es auf der Turnier-Seite. Wir freuen uns auf viele Teilnehmer und Besucher, tollen Sport und vor allem ganz viel Spa\u00df !\n(10.05.2023)\nNachnennungen nur noch per Mail\nWir freuen uns \u00fcber die vielen Nennungen, die bis zum Nennschluss am letzten Dienstag bereits eingegangen sind. Nachnennungen sind ab sofort nur noch per Mail an unseren Partner Turnierservice Hollmann-Steinebach m\u00f6glich. (20.04.2023)\nNennungen ab sofort m\u00f6glich\nSeit Freitag, 30. M\u00e4rz, sind Nennungen f\u00fcr unser Turnier im Mai m\u00f6glich. Wir freuen \u00fcber den erkennbaren gro\u00dfen Zuspruch. Alle Informationen zum Turnier gibt es hier. (04.04.2023)\nDressur- & Spring-Turnier 2023\nNach erfolgreichem Neustart im vergangenen Jahr findet unser Turnier in diesem Jahr am 13. & 14. Mai statt. Die Ausschreibung ist final und kann hier eingesehen werden. Die Veranstaltung steht zudem unter dem Motto des 50-j\u00e4hrigen Bestehens unseres Vereins und zum Jubil\u00e4um werden wir ein besonders tolles Turnier organisieren! Fortlaufend neue Infos gibt es hier. (25.03.2023)", "Saerbeck, 30. M\u00e4rz 2022 \u2013 SAERTEX wird zum 01. April 2022 einen Aufschlag f\u00fcr Lieferungen im Gesch\u00e4ftsfeld seiner multiaxialen Gelege aus Glas-, Carbon und Aramidfasern f\u00fcr den Leichtbau erheben. Diese Ma\u00dfnahme begr\u00fcndet sich mit den massiv gestiegenen Preisen f\u00fcr Roh-, Hilfs- und Betriebsstoffe sowie Transport- und Energiekosten.\n\u201eIn den letzten Monaten erlebten wir zunehmend eine ver\u00e4nderte Liefersituation in den Rohstoffm\u00e4rkten f\u00fcr Glas- und Carbonfasern, aber auch bei Hilfs- und Betriebsstoffen,\u201c sagt Christoph Geyer, CEO der SAERTEX GmbH & Co. KG. \u201eDurch die Ukraine-Krise versch\u00e4rft sich die Situation nochmals.\u201c\nDie SAERTEX GmbH & Co. KG wird auf diese Entwicklung reagieren. Ab 01. April 2022 wird das Unternehmen einen Aufschlag f\u00fcr Verpackungs-, Energie- und Logistikkosten erheben. Dieser Zuschlag wird von der Art des Produkts und den vereinbarten Lieferbedingungen abh\u00e4ngig sein. \u201eDie Verteuerung auf dem Beschaffungsmarkt geht einher mit einer deutlich zunehmenden Nachfrage nach unseren Produkten,\u201c so Christoph Geyer weiter. \u201eUm auch weiterhin als zuverl\u00e4ssiger Partner an der Seite unserer Kunden zu stehen, ist es erforderlich unsere Preise an die dynamische Entwicklung der Weltm\u00e4rkte anzupassen.\u201c\nDas international agierende Unternehmen besitzt Produktionsst\u00e4tten in 11 L\u00e4ndern, jedoch keine davon in Russland oder der Ukraine. Aus dem Ukraine-Konflikt resultierende Kostensteigerungen f\u00fcr Energie, Verpackungen und Transport sind allerdings ein zus\u00e4tzlicher Teuerungsfaktor f\u00fcr das Angebot an multiaxialen Gelege aus Glas-, Carbon- und Aramidfasern.\nBereits in den letzten Monaten vor dem Konflikt war eine zunehmend angespannte Liefersituation in den Rohstoffm\u00e4rkten f\u00fcr Glas- und Carbonfasern, aber auch bei vielen Hilfs- und Betriebsstoffen aufgrund vielf\u00e4ltiger Faktoren und verst\u00e4rkt durch die indirekten Auswirkungen der Pandemie zu verzeichnen.\n\u201eDurch unser globales Produktionsnetzwerk auf f\u00fcnf Kontinenten und durch unsere langfristigen Partnerschaften mit Lieferanten verf\u00fcgen wir \u00fcber eine bew\u00e4hrte und stabile Lieferkette,\u201c so Sebastian Dohnke, Head of Global Purchasing bei SAERTEX. \u201eWir sind zuversichtlich, dass wir die anstehenden Herausforderungen in Bezug auf die Materialverf\u00fcgbarkeit meistern werden, und unsere gesamten Bem\u00fchungen sind darauf ausgerichtet, unsere Kunden zuverl\u00e4ssig und kosteng\u00fcnstig zu beliefern.\u201c\nTeilen Sie diese Seite per E-Mail und informieren so Freunde und Bekannte \u00fcber die aktuellsten SAERTEX-Themen!", "Du bist auf der Suche nach einem Rucksack f\u00fcr deinen Alltag? Egal ob du nach einem gro\u00dfen Rucksack f\u00fcr die Uni oder f\u00fcr die Arbeit mit Laptopfach oder einen kleinen Handtaschen-Ersatz f\u00fcr den n\u00e4chsten St\u00e4dtetrip suchst, hier findest du garantiert den Richtigen! Die Kapten & Son Rucks\u00e4cke erm\u00f6glichen es dir nicht nur, alles Wichtige praktisch, sondern auch stilsicher zu verstauen.\nRucks\u00e4cke f\u00fcr jeden Anlass\nWer kennt es nicht? Es steht ein stressiger Tag in der Uni oder im Job an und ein DinA4 Block, ein Laptop, die Brotdose und eine Trinkflasche m\u00fcssen im Rucksack Platz finden. Die gro\u00dfen Rucks\u00e4cke von Kapten & Son bieten ein Volumen von 8 bis zu 26 Litern. Alles, was du brauchst, transportierst du so bequem auf dem R\u00fccken. Als klassischer Alltags-Rucksack dient dir beispielweise ein 'Bergen' Rucksack, Fyn' Rucksack oder 'Aarhus' Rucksack. M\u00f6chtest du auch dein Sportzeug unterbringen oder deinen Rucksack als Weekender benutzen, empfehlen wir dir die Modelle der 'Helsinki' Rucksack-Kollektion oder der 'Lund Pro' Rucksack-Kollektion. Au\u00dferdem bietet Kapten & Son auch kleine Rucks\u00e4cke an, die dir in deiner Freizeit mit einem Stauraum von 4 bis 7 Litern das Leben einfacher machen.\nRucks\u00e4cke in allen Farbvariationen\nDie Rucks\u00e4cke von Kapten & Son sind jedoch nicht nur praktisch, sondern komplettieren auch jedes deiner Outfits und machen dich so zum echten Hingucker. Ganz gleich ob du dich f\u00fcr einen Rucksack in schwarz entscheidest, den du sowohl l\u00e4ssig und cool, als auch rockig und elegant kombinieren kannst. Oder ob du durch einen Rucksack in pink oder einen Rucksack in gr\u00fcn einen bunten Farbakzent setzen m\u00f6chtest. Besonders stylisch sind Rucks\u00e4cke in beige und sandfarbenen T\u00f6nen, die sich ganz einfach zu einer Jeans, wei\u00dfem Oberteil und Sneakern kombinieren lassen. Hier sind deinem Trendbewusstsein nat\u00fcrlich keine Grenzen gesetzt! Kapten & Son bietet zudem ein gro\u00dfes Sortiment an Rucks\u00e4cken in grau an. Sowohl Frauen als auch M\u00e4nner finden damit hier ihre passende Rucksack-Farbe!\nQualit\u00e4t als oberstes Gebot\nDoch die Kapten & Son Rucks\u00e4cke bestechen nicht nur durch Praktikabilit\u00e4t, Funktionalit\u00e4t und ihren sch\u00f6nen Look, sondern auch durch ihre qualitativ hochwertigen Materialien \u2013 \u00fcberzeug dich selbst und hol dir deinen Lieblings-Rucksack von Kapten & Son zu dir nach Hause!", "F\u00fcr die Fahrt dorthin hatte Elfriede einen Bus gechartert, der uns p\u00fcnktlich um 16:00 Uhr in Sch\u00f6nau abholte. \u00dcber Schleiden, der n\u00e4chsten Zustiegsm\u00f6glichkeit brachte uns Lethert Busreisen zur Kartbahn im Eupener Industriegebiet, die wir gegen 17:30 Uhr erreichten.\nhomepage Eupener Karting\nHier erwartete uns das mit 920m Streckenl\u00e4nge in einer 8000 m\u00b2 gro\u00dfen Halle gr\u00f6\u00dfte Kartcenter von Belgien.\nNach einer kurzen Einweisung von Francis und der Verlosung der vierzehn 2er Teams starteten wir zur 20 min\u00fctigen Qualifikation. Neben den Vereinsmitgliedern gingen auch einige G\u00e4ste mit an den Start. Das Team Hensch/Plumm startete zum 95 min dauernden Rennen aus der Pole Position gefolgt von den Teams B\u00fctzler/Weber und Schmitz/Schmitz.\nNach gut einer halben Stunde setzte sich das Team Matthias B\u00fctzler und Andre Weber(kl) an die Spitze des Feldes, die sie bis zum Ziel nicht mehr hergaben. Gegen die permanent schnellen Rundenzeiten hatte die Konkurrenz keine Chance. Das Team Andre Bach und Christoph Breuer erreichte mit einer Runde R\u00fcckstand den 2. Platz, w\u00e4hrend das Team Lukas Keutgen und Michael Prause mit einer weiteren Runde R\u00fcckstand den 3. Podestplatz belegte.\nDie von den Teams geforderten 5 Fahrerwechsel waren aus den Ergebnislisten nicht zu \u00fcberpr\u00fcfen und hatten somit keinen weiteren Einfluss auf das Gesamtergebnis, wor\u00fcber einige Teams sicher erfreut gewesen sein d\u00fcrften.", "Jeder Sportverein ist einzigartig, genau wie seine Mitglieder. Daher ist es wichtig, dass jeder Verein die optimale Beratung erh\u00e4lt. VIBSS bietet hier genau die richtige Unterst\u00fctzung.\nVereins Informations Beratungs Schulungs System\nVIBSS - OnlineVIBSS ist ein Dienstleistungsnetzwerk f\u00fcr Mitarbeiter/-innen im Vereinsmanagement und in der Sportpraxis, das durch Information, Beratung und Schulung eine attraktive und zukunftsorientierte Vereinsarbeit unterst\u00fctzt.\nWeitere Informationen\nVereinsberatung vor Ort\nImmer mehr Vereine erkennen, dass die kritische Diskussion aktueller Vereinsstrukturen und ihrer Angebote eine zentrale Aufgabe der Vereinsf\u00fchrung ist.\nDabei stellen sich Fragen nach der Aufgabenverteilung im Verein, der richtigen Gestaltung der Angebote, der Beitragsh\u00f6he und nach der Zusammenarbeit im Team.\nWeitere Informationen\nPraxiserprobte Stundenbeispiele\nSeit 1989 ver\u00f6ffentlicht der Landessportbund NRW und die Sportjugend NRW die Artikelserie \"Praktisch f\u00fcr die Praxis\". Vielf\u00e4ltige Themen von Sportstunden im Kinder-, Jugend- und Erwachsenenbereich werden ausf\u00fchrlich und \u00fcbersichtlich mit einem Stundenablaufkonzept beschrieben.", "FileMove SE ist ein m\u00e4chtiges Werkzeug zur automatischen Handhabung Ihrer Dateien. Sie haben mit diesem Programm die M\u00f6glichkeit alle Dateien die sich auf ihrem Computer befinden zu manipulieren. Dazu geh\u00f6ren sowohl versteckte Systemdateien als auch das Suchen in Systemordnern und deren Unterverzeichnissen.\nBitte lesen Sie diese Hilfedatei um sich mit den Funktionen von FileMove SE vertraut zu machen. Bei aller Einfachheit bietet das Programm komplexe M\u00f6glichkeiten zur Suche und Manipulation von Verzeichnissen und Dateien.\nBevor Sie einen neuen Auftrag automatisch ausf\u00fchren lassen oder ihn von Hand starten sollten Sie, vor allem wenn Sie Dateien aus den Systemverzeichnissen verschieben oder l\u00f6schen m\u00f6chten, einen Probelauf im Vorschaumodus oder mit Testdateien zur Kontrolle ausf\u00fchren.\nBenutzen Sie das Programm FilerMate von SDW Software um die Datei- und Verzeichnisattribute von Testdateien zu \u00e4ndern.\nBei unsachgem\u00e4sser Verwendung der Funktionen des Programms FileMove SE kann das System im schlimmsten Fall so besch\u00e4digt werden, dass es sich nicht mehr starten l\u00e4sst!\nVerschieben oder l\u00f6schen Sie keine Dateien die zum Betrieb von Windows notwendig sind!\nF\u00fcr Sch\u00e4den die durch die Benutzung von FileMove SE entstehen k\u00f6nnen ist der Autor nicht haftbar.\nDiese Hilfeseiten k\u00f6nnen \u00fcberall in FileMove SE mit dem Button F1 auf der Tastatur aufgerufen werden.", "Mit dem etwas sperrigen Namen THEATRHYTHM FINAL BAR LINE ver\u00f6ffentlicht SQUARE ENIX den f\u00fcnften Teil der von Final Fantasy inspirierten Rhythmusspielserie f\u00fcr die Playstation 4 und die Nintendo Switch. Der Klappentext verspricht sofortige Immersion f\u00fcr alle Arten von Spielenden aufgrund der einfachen Steuerung und der vier vorhandenen Schwierigkeitsgrade. Aber worum geht es eigentlich?\nDer Einstieg\nDer Titel beginnt mit einem netten und relativ langen Einf\u00fchrungsvideo, in dem bereits viele der Charaktere und auch der Gegner aus der Final Fantasy-Serie sichtbar sind. Zun\u00e4chst sind lediglich die Einstellungen sowie der Spielmodus \"Serienauftr\u00e4ge\" verf\u00fcgbar. In den Einstellungen sollte man sich zu Beginn nicht zu lange aufhalten, da viele der Optionen zun\u00e4chst unverst\u00e4ndlich sein werden. Zumindest die Sprache der Sprachausgabe sollte man einstellen; eine japanische Sprachausgabe steht zur Verf\u00fcgung.\nMit der Auswahl der Serienauftr\u00e4ge beginnt ein kleines Tutorium, in dem die drei grundlegenden Arenatypen vorgestellt werden und eine kurze Sequenz lang ausprobiert werden k\u00f6nnen. Anschlie\u00dfend kann sich der Spielende gleich in die ersten Kampf- und Feldmusikarenen eines der Serienauftr\u00e4ge st\u00fcrzen. Die Serienauftr\u00e4ge bilden jeweils einen Final Fantasy-Titel ab, wie beispielsweise Final Fantasy 4, Final Fantasy 7 oder das aktuelle Final Fantasy 15.\nDas Spiel\nIn THEATRHYTHM FINAL BAR LINE geht es darum, durch das geschickte und rhythmische Ausl\u00f6sen von Taktschl\u00e4gen besonders viele Punkte zu sammeln. Die Genauigkeit beim Treffen der Taktschl\u00e4ge, der sogenannten Trigger, wird in 6 Kategorien von KRITISCH (in Regenbogenfarbe) \u00fcber KRITISCH, Perfekt, Gut, Schlecht und Verfehlt beurteilt. Je besser die Bewertung ist, desto mehr Punkte werden gesammelt und desto besser k\u00e4mpft das zusammengestellte Team.\nDurch das Freischalten und Abschlie\u00dfen von Serienauftr\u00e4gen kann der Spielende bis zu 104 Charaktere aus dem Final Fantasy-Universum rekrutieren. F\u00fcr jede Arena kann ein Team von 4 Charakteren individuell zusammengestellt werden. 5 solcher Teams k\u00f6nnen separat verwaltet werden. Die verf\u00fcgbaren Charaktere sind in die Klassen \"Physisch\", \"Magie\", \"Besch\u00fctzer\", \"Heiler\" und \"J\u00e4ger\" eingeteilt, die der Gruppe jeweils klassenspezifische Vorteile verschaffen. Zudem kann jeweils ein sogenannter Esperstein ausgew\u00e4hlt werden, der passive Boni verleiht und im Verlauf einer Arena bei guter Triggerbewertung aktiviert wird und dann gro\u00dfen Schaden verursacht.\nEs gibt die Arenatypen \"Kampfmusikarena\", \"Feldmusikarena\" und \"Ereignismusikarena\". In Kampfmusikarenen k\u00e4mpft die Gruppe unentwegt gegen Gegner, so lange, bis das Lied endet. Je st\u00e4rker die Gruppe ist, desto mehr Gegner k\u00f6nnen besiegt werden und desto mehr Beute kann gesammelt werden. In diesem Arenatyp kommen die Noten von links. In Feldmusikarenen wandert die Gruppe durch ein von Final Fantasy inspiriertes Feld und bek\u00e4mpft zwischendurch Gegner. Hier kommen die Noten ebenfalls von links, es gibt allerdings zus\u00e4tzlich sogenannte \"Hold\"-Trigger, bei denen nicht nur der Knopf gehalten werden muss, sondern auch die Tonh\u00f6he mit einem der Sticks nachgefahren werden muss. Zu guter Letzt kann in den Ereignismusikarenen eine jeweils bekannte Szene aus dem jeweiligen Titel verfolgt werden. Hier kommen die Trigger von oben.\nBildergalerie von THEATRHYTHM FINAL BAR LINE (7 Bilder)\nDurch das (gute) Abschlie\u00dfen von Arenen sammeln die einzelnen Charaktere Erfahrung und steigen individuell in der Stufe bis 99 auf. Sie lernen bei einigen Stufen auch zus\u00e4tzliche Fertigkeiten von denen zu jeder Zeit jeweils drei eingesetzt werden k\u00f6nnen. Die Fertigkeiten sind entweder passiv, werden durch Ereignisse, wie das Auftauchen eines Bosses oder durch gute Leistungen wie lange Kombos, also das fortw\u00e4hrende Treffen von Triggern, oder durch den zeitlichen Fortschritt im aktuellen Musikst\u00fcck aktiviert. Nach Stufe 99 k\u00f6nnen die Charaktere weiter durch Sammeln von Erfahrung auf sogenannte Sternenstufen aufsteigen. Stufe 9 ist hier die h\u00f6chste. Die Charaktere k\u00f6nnen au\u00dferdem in einzelnen Werten durch die Nutzung von Gegenst\u00e4nden, die im Laufe des Spiels gefunden werden k\u00f6nnen, verbessert werden. Au\u00dferdem gibt es f\u00fcr jeden Charakter sogenannte CollectaCards, die, sobald sie gefunden wurden, den Charakter weiter verbessern. Eine Optimierungsfunktion w\u00e4hlt f\u00fcr die aktuell im Team befindlichen Charaktere die st\u00e4rksten Fertigkeiten aus, ber\u00fccksichtigt dabei jedoch keine Spezifika der n\u00e4chsten Musikarena, wie beispielsweise Resistenzen oder Schw\u00e4chen von Gegnern oder Besonderheiten der Arena, wie beispielsweise verdoppelter oder halbierter physischer Schaden.\nIn THEATRHYTHM FINAL BAR LINE gibt es jede Menge Filme und CollectaCards zu finden. Um diese betrachten zu k\u00f6nnen, gibt es das Museum, in dem der Spielende alle Fundsachen betrachten kann. Au\u00dferdem kann jedes in einem Serienauftrag gespielte Lied separat noch einmal ohne die Besonderheiten der jeweiligen Arena gespielt werden. Im Mehrspielermodus k\u00f6nnen sich bis zu vier Spielende in einer Arena messen. Dabei k\u00f6nnen auch \u00fcber sogenannte ProfiCards, Profilkarten, Informationen \u00fcber die beteiligten Spielenden und sogar Espersteine ausgetauscht werden.\nDie Technik\nTHEATRHYTHM FINAL BAR LINE hat einen farbenfrohen, comichaften Grafikstil. Das Spiel l\u00e4uft ruckelfrei, was f\u00fcr ein Rhythmusspiel sehr wichtig ist. Die Musik stammt aus den jeweiligen Final Fantasy-Titeln. Die Steuerung ist pr\u00e4zise und kann per Einstellung sogar auf gegebenenfalls beim Fernseher vorhandene Verz\u00f6gerungen angepasst werden. Der Titel bietet vier Schwierigkeitsgrade sowie einen \"Auto-Modus\", einen 2-Spieler-Modus sowie \u00dcbungsmodus.\nDie Digital Deluxe Edition\nDie Digital Deluxe Edition enth\u00e4lt zus\u00e4tzlich 27 exklusive Lieder sowie den Season Pass 1, der 30 weitere Lieder aus den bekannten SQUARE ENIX-Serien SaGa, LIVE A LIVE, The World Ends with You und Nier enthalten wird.\nCover & Bilder \u00a9 \u00a9 SQUARE ENIX CO., LTD. All Rights Reserved. LOGO ILLUSTRATION:\u00a9 2022 YOSHITAKA AMANO  THEATRHYTHM and FINAL BAR LINE are registered trademarks or trademarks of Square Enix Co., Ltd. SQUARE ENIX and the SQUARE ENIX logo are registered trademarks or trademarks of Square Enix Holdings Co., Ltd.\nDas Fazit von: Wolf\nDer Name ist bei THEATRHYTHM FINAL BAR LINE gl\u00fccklicherweise das einzig Sperrige. Mit einer gef\u00e4lligen farbenfrohen Grafik, einer riesigen Musikauswahl aus dem Final Fantasy-Universum, vielen Spielmodi f\u00fcr alle Erfahrungsstufen von Spielenden, einem sehr guten Koop-Modus und einer Unmenge an Sammelgegenst\u00e4nden kann der Titel einige Zeit lang sehr gut unterhalten. Hier ist sowohl f\u00fcr Einsteiger als auch f\u00fcr extreme Rhythmusspezialisten ein passender Schwierigkeitsgrad dabei. Zus\u00e4tzliche Inhalte k\u00f6nnen \u00fcber die angek\u00fcndigten Season Passes erworben werden. F\u00fcr Anh\u00e4nger von Rhythmusspielen ist der Titel eine klare Kaufempfehlung. Final Fantasy-Anh\u00e4nger, die den Abstecher in die Rhythmik machen m\u00f6chten, k\u00f6nnen ebenso beherzt zugreifen.", "Die ist einfach super! Es ist eine Pflegecreme f\u00fcr die beanspruchten Hautstellen wie Arm- und Kniebeugen zus\u00e4tzlich zur Basispflege. Die hat sich wirklich bew\u00e4hrt bei uns. Sie l\u00e4sst sich gut verteilen und hinterl\u00e4sst ein angenehmes Hautgef\u00fchl.\nDurch Inhaltsstoffe wie Zink, Phantenol und Lanolin wird die Haut optimal gepflegt und die oft roten Hautstellen werden gemildert. Die Regeneration der Haut wird unterst\u00fctzt und die betroffenen Hautstellen erholen sich , meiner Meinung nach, sehr viel eher. Der Nachteil ist vielleicht das durch das Zink die Haut noch eher ausgetrocknet. Dies ist ein subjektiver Eindruck von mir, was mich jedoch nicht weiter st\u00f6rt, da wir danach immer eine Fettsalbe benutzen.\nIch kann euch diese Salbe wirklich empfehlen denn bei uns hat sie einen festen Platz. Wir benutzen sie derzeit t\u00e4glich fr\u00fch und abends. Es ist nur Schade das die Krankenkassen, soweit ich wei\u00df, diese Salbe nicht zahlen. Man kann die Creme mischen lassen was jedoch nicht das Ergebnis bringt was ich erwarten w\u00fcrde. Dies habe ich mehrfach versucht. Ebenso habe ich, in Absprache mit unserem Hausarzt, versucht die Salbe in \u00e4hnlicher Form anmischen zu lassen, jedoch ohne Erfolg.\nWir haben schon viel versucht und entscheiden immer nach Gef\u00fchl. Das ist f\u00fcr uns unheimlich wichtig denn f\u00fcr uns muss es ja funktionieren. Jeder muss hier am Ende selber seinen Weg finden. Die Salben oder Cremes m\u00fcssen sich auf der Haut einfach gut anf\u00fchlen und die Konsistenz muss passen. Bei mir ist es genauso. Ich brauche einfach ein gutes Hautgef\u00fchl. Gerade bei Kindern ist es wichtig das sich die Creme gut verschmieren l\u00e4sst. Damit es schnell gehen kann und auch manchmal muss:-)\nWie gesagt, wir haben super gute Erfahrungen damit gemacht und darum ist die APP Kindersalbe mein heutiger Tipp:-) Bis ganz Bald!", "Warum das Ethnologische Museum und das Museum f\u00fcr Asiatische Kunst ihrem alten Standort auch nach dem Umzug nach Berlin-Mitte treu bleiben.\nDahlem begann mit einer Vision: Hier sollten sich Teile der Universit\u00e4t, wissenschaftliche Institute, Museen und andere Bildungseinrichtungen ansiedeln, ja von einem \u201epreu\u00dfischen Oxford\u201c im S\u00fcdwesten Berlins war die Rede. Auch f\u00fcr einige Sammlungen, die heute zur Stiftung Preu\u00dfischer Kulturbesitz geh\u00f6ren, wurden H\u00e4user konzipiert. Wilhelm von Bode, Generaldirektor der Berliner Museen, tr\u00e4umte von einem gro\u00dfen Museumskomplex, der die Kunst und Kultur der vier Erdteile Asien, Afrika, Amerika und Ozeanien in ebenso vielen Neubauten gleichberechtigt nebeneinander zeigen sollte, was f\u00fcr ein ungemein zukunftsweisendes Projekt schon zu Beginn des 20. Jahrhunderts!\n\u00a9 Geoportal Berlin / Digitale farbige Orthophotos 2016 (DOP20RGB)\nBis 1921 konnte jedoch nur ein Geb\u00e4ude nach Pl\u00e4nen von Bruno Paul fertiggestellt werden. Auch f\u00fcr das fr\u00fchere Preu\u00dfische Geheime Staatsarchiv entstand damals in Dahlem ein gro\u00dfer Archivbau. Der Zweite Weltkrieg und die Aufl\u00f6sung Preu\u00dfens beendeten zun\u00e4chst die Pl\u00e4ne eines Wissenschaftsstandortes im S\u00fcdwesten Berlins. Erst in der Zeit der Teilung der Stadt und der Gr\u00fcndung der Freien Universit\u00e4t 1948 wurde an diese \u00dcberlegungen wieder angekn\u00fcpft.\nHeute liegt der Museumskomplex Dahlem sehr vorteilhaft im Zentrum relevanter Institute der Freien Universit\u00e4t und unweit der FU-Universit\u00e4tsbibliothek, des Deutschen Arch\u00e4ologischen Instituts und des Max-Planck-Instituts f\u00fcr Wissenschaftsgeschichte. Dieses Potential nutzend, m\u00f6chten wir unseren Dahlemer Standort in den n\u00e4chsten Jahren zu einem neuen Forschungscampus weiterentwickeln. Nach dem Umzug der Ausstellungsfl\u00e4chen des Ethnologischen Museums und des Museums f\u00fcr Asiatische Kunst ins wieder aufgebaute Berliner Schloss ergeben sich hier ganz neue M\u00f6glichkeiten.\nObgleich im Humboldt Forum insgesamt mehr Exponate als bislang in Dahlem gezeigt werden k\u00f6nnen und diese durch den modularen Aufbau der Ausstellungen zudem regelm\u00e4\u00dfig wechseln, kann auch am neuen Standort immer nur ein Bruchteil der riesigen Sammlungen ausgestellt werden, die allein im Bereich des Ethnologischen Museums rund eine halbe Millionen Objekte umfassen.\nVon Anfang an wurde daher mit zwei Standorten geplant. Die j\u00fcngste Planungs\u00e4nderung im Humboldt Forum bez\u00fcglich der bislang dort vorgesehenen Bibliotheksfl\u00e4chen in einem Teil des ersten Obergeschosses und das Moratorium der Weiterentwicklung des Zentraldepots der Stiftung in Friedrichshagen bieten nun aber ganz neue M\u00f6glichkeiten. Da eine r\u00e4umliche Trennung des wissenschaftlichen Personals von der Forschungsinfrastruktur aus Bibliothek und Studiensammlungen nicht denkbar ist, muss eine gemeinsame Unterbringungsm\u00f6glichkeit gefunden werden. Hierf\u00fcr erscheint der etablierte Standort Dahlem ungleich besser geeignet als Friedrichshagen.\nDahlem bleibt die \u201ehomebase\u201c, wo die wissenschaftliche Grundlagenarbeit der Museen und ihrer Kooperationspartner stattfindet.\nIm Humboldt Forum unterhalten die beiden Museen neben kleineren Werkstatt- und Depotbereichen vor allem ihre Ausstellungsfl\u00e4chen, auf denen ihre Sammlungsbest\u00e4nde pr\u00e4sentiert, die Erkenntnisse der Forschung vermittelt und die wichtige Bildungsarbeit geleistet wird. Dahlem bleibt die \u201ehomebase\u201c, wo die wissenschaftliche Grundlagenarbeit der Museen und ihrer Kooperationspartner stattfindet, mit Vertreterinnen und Vertretern der Ursprungsgesellschaften zusammengearbeitet und geforscht wird und neue Konzepte f\u00fcr die Pr\u00e4sentation und die Ausstellungsmodule im Humboldt Forum erarbeitet werden.\nDie breit gef\u00e4cherten Ressourcen des Ethnologische Museums, des Museums f\u00fcr Asiatische Kunst und des ohnehin mit seinem Museumsbetrieb mittelfristig in Dahlem verbleibenden Museums Europ\u00e4ischer Kulturen werden damit dem Standort nicht nur erhalten, sondern durch vielf\u00e4ltige Optimierungen sogar noch deutlich gest\u00e4rkt. Die im Museumskomplex zusammenzuf\u00fchrenden Buchbest\u00e4nde der drei H\u00e4user w\u00fcrden in einer aktuell 230.000 B\u00e4nde umfassende Spezialbibliothek der Kunst und Kulturen der Welt vereint, die in der Forschungslandschaft ihresgleichen sucht, erg\u00e4nzt durch einmalige Archivunterlagen aller drei Museen.\nEine solche B\u00fcndelung der Forschungsressourcen im Museumskomplex Dahlem h\u00e4tte den enormen Vorteil, dass damit gleichzeitig auch weitere sinnvolle und kostensparende strukturelle Ma\u00dfnahmen erfolgen k\u00f6nnten. So sind Direktion, Bibliothek, Restaurierungswerkst\u00e4tten und Depot des Museum Europ\u00e4ischer Kulturen bislang gar nicht im eigentlichen Museumskomplex Dahlem untergebracht, sondern in R\u00e4umlichkeiten des Geheimen Staatsarchivs Preu\u00dfischer Kulturbesitz. Dieses wiederum muss deshalb einen gro\u00dfen Teil seiner empfindlichen Archivalien in angemieteten Depotr\u00e4umen im Westhafen auslagern, die kostenintensiv zwischen den beiden Standorten hin- und hertransportiert werden m\u00fcssen.\nDie Gelegenheit einer Neuplanung des Standorts Dahlem beim Schopfe packend, w\u00fcrden bei einer Fl\u00e4chenrochade alle H\u00e4user profitieren. Das Museum Europ\u00e4ischer Kulturen zieht mit Verwaltung, Bibliothek, Werkst\u00e4tten und Sammlungsbestand auf die frei werdenden Fl\u00e4chen der in das Humboldt Forum \u00fcberwechselnden Ausstellungsbereiche des Ethnologischen Museums und des Museums f\u00fcr Asiatische Kunst, und das Geheime Staatsarchiv Preu\u00dfischer Kulturbesitz k\u00f6nnte den dann wieder verf\u00fcgbaren Magazintrakt f\u00fcr das eigene und derzeit im Westhafen untergebrachte Archivgut nutzen. Weitere, f\u00fcr die Optimierung der Museumsabl\u00e4ufe der drei H\u00e4user nicht ben\u00f6tigte Fl\u00e4chen k\u00f6nnen Dritten angeboten werden, die das Profil des \u201eForschungscampus Dahlem\u201c abrunden. So w\u00e4re beispielsweise die derzeit in Charlottenburg untergebrachte Abguss-Sammlung Antiker Plastik der Freien Universit\u00e4t Berlin eine sinnvolle Erg\u00e4nzung und Bereicherung.\nDie Gelegenheit einer Neuplanung des Standorts Dahlem beim Schopfe packend, w\u00fcrden bei einer Fl\u00e4chenrochade alle H\u00e4user profitieren.\nAm Standort Dahlem k\u00f6nnte unter diesen Voraussetzungen ein lebendiger Ort der Forschung und des Erkenntnistransfers entstehen, der mit den benachbarten renommierten Institutionen einen geisteswissenschaftlichen Fixpunkt schafft \u2013 f\u00fcr den Bezirk eine Ideall\u00f6sung und f\u00fcr den Wissenschaftsstandort Berlin ein gro\u00dfer Gewinn. Die im Humboldt Forum verorteten Stipendienprogramme und Laboratorien w\u00fcrden durch die bestehende Infrastruktur und die verkehrstechnisch g\u00fcnstige Anbindung Dahlems unterst\u00fctzt und gest\u00e4rkt. Externe Forscher, Graduierte und Angeh\u00f6rige der Ursprungsgesellschaften w\u00fcrden hier ebenso Zugang zu Sammlungsbest\u00e4nden und Forschungsinfrastruktur finden, wie die bestehenden Netzwerke mit der Freien Universit\u00e4t weiterhin sinnvoll f\u00fcr die Museen genutzt und ausgebaut werden k\u00f6nnten.\nDer \u201eForschungscampus Dahlem\u201c w\u00fcrde dabei \u2013 in Fortsetzung seiner musealen Tradition \u2013 besonders auch als Schaufenster der Wissenschaft spannende Ergebnisse der Forschung an die \u00d6ffentlichkeit vermitteln: Vorstellbar sind kleinere Studio-Ausstellungen, gef\u00fchrte Rundg\u00e4nge durch die Studiensammlungen oder Blicke hinter die Kulissen, bei denen man etwa Restauratoren bei ihrer Arbeit \u00fcber die Schulter schaut. Diesen Fr\u00fchsommer m\u00f6chten wir dazu nutzen, mit den Institutionen, der Politik und den Menschen in Steglitz-Zehlendorf gemeinsam Pl\u00e4ne und Ideen zur Weiternutzung des Standorts zu diskutieren. Und die wichtigste Botschaft: Ja, der Museumskomplex Dahlem hat eine Zukunft, die sich vorz\u00fcglich in die traditionellen St\u00e4rken des Berliner S\u00fcdwestens einf\u00fcgt.", "The Website uses Mediavine to manage all third-party advertising on the Website. Mediavine serves content and advertisements when you visit the Website, which may use cookies. Mediavine may collect IP addresses and location to serve personalized ads. If you would like more information about this practice and to know your choices to opt-in or opt-out of this data collection, please visit http://www.networkadvertising.org/managing/opt_out.asp.\nGESCH\u00c4FTSBEDINGUNGEN\nDiese Gesch\u00e4ftsbedingungen (\u201cBedingungen\u201d, \u201cVereinbarung\u201d) sind eine Vereinbarung zwischen BIT FAN d.o.o. (\u201cBIT FAN d.o.o.\u201d, \u201cuns\u201d, \u201cwir\u201d oder \u201cunser\u201d) und Ihnen (\u201cUser\u201d, \u201cSie\u201d oder \u201cIhr\u201d). Diese Vereinbarung legt die allgemeinen Gesch\u00e4ftsbedingungen f\u00fcr Ihre Nutzung der Webseite http://www.ihrweg.com sowie jeder ihrer Produkte und Dienstleistungen dar (allgemein \u201cWebsite\u201d oder \u201cDienstleistungen\u201d).\nKonten und Mitgliedschaft\nSie m\u00fcssen mindestens 13 Jahre alt sein, um diese Webseite zu nutzen. Indem Sie diese Webseite nutzen und der Vereinbarung zustimmen, garantieren und best\u00e4tigen Sie, dass Sie mindestens 13 Jahre alt sind. Wenn Sie ein Konto auf der Webseite erstellen, sind Sie f\u00fcr die Einhaltung der Sicherheit Ihres Kontos zust\u00e4ndig und Sie sind ebenfalls voll verantwortlich f\u00fcr alle Aktivit\u00e4ten, die unter dem Konto auftreten sowie f\u00fcr jedwede get\u00e4tigte Action, die mit Ihrem Konto in Verbindung steht. Die Bereitstellung von falschen Kontaktinformationen jeglicher Art kann zur K\u00fcndigung Ihres Kontos f\u00fchren. Sie m\u00fcssen uns umgehend \u00fcber jede unautorisierte Verwendung Ihres Kontos sowie \u00fcber jeglichen anderen Sicherheitsversto\u00df informieren. Wir tragen keinerlei Haftung weder f\u00fcr Handlungen oder Unterlassungen von Ihnen noch f\u00fcr Sch\u00e4den jeglicher Art, die als Resultat von solchen Handlungen oder Unterlassungen auftreten. Wir d\u00fcrfen Ihr Konto sperren, deaktivieren oder l\u00f6schen (oder Teile davon) wenn wir feststellen, dass Sie eine oder mehrere Vorschriften dieses Vereinbarung verletzt haben oder wenn Ihr Verhalten oder Ihre Inhalte dazu tendieren w\u00fcrde, unsere Reputation und unseren Firmenwert zu sch\u00e4digen. Wenn wir Ihr Konto aufgrund der soeben genannten Gr\u00fcnde l\u00f6schen, k\u00f6nnen Sie sich nicht nochmals f\u00fcr unsere Dienstleistungen registrieren. Wir d\u00fcrfen Ihre E-Mail-Adresse und Ihre Internet-Protocol-Adresse blockieren, um eine weitere Registrierung zu unterbinden.\nNutzerinhalte\nWir besitzen keinerlei Daten, Informationen oder Materialien (\u201cInhalt\u201c), die Sie der Webseite im Rahmen der Nutzung unserer Dienstleistungen zur Verf\u00fcgung stellen. Sie tragen die alleinige Verantwortung f\u00fcr die Korrektheit, Qualit\u00e4t, Integrit\u00e4t, Rechtsm\u00e4\u00dfigkeit, Vertrauensw\u00fcrdigkeit, Angemessenheit sowie f\u00fcr die Eigentumsrechte der geistigen Inhalte, um diese Inhalte zu verwenden. Wir d\u00fcrfen die Inhalte \u00fcberwachen, die von Ihnen durch die Nutzung unserer Dienstleistungen auf der Webseite zur Verf\u00fcgung gestellt oder erstellt wurden. Ihre Nutzung der Webseite gew\u00e4hrt uns keine Lizenz zur Verwendung, Reproduzierung, Abwandlung, \u00c4nderung, Ver\u00f6ffentlichung oder Vertreibung der durch Sie erstellten Inhalte oder der Inhalte, die in Ihrem User-Konto f\u00fcr kommerzielle, marketing-bezogene oder sonstige Zwecke gespeichert wurden, au\u00dfer Sie haben es uns ausdr\u00fccklich gestattet. Jedoch geben Sie uns die Erlaubnis, auf die Inhalte Ihres Kontos zuzugreifen, sie zu kopieren, \u00fcbertragen, neu zu formatieren, anzuzeigen und auszuf\u00fchren ausschlie\u00dflich f\u00fcr den Zweck, damit wir Ihnen die Dienstleistungen zur Verf\u00fcgung stellen k\u00f6nnen. Ohne jegliche dieser Erkl\u00e4rungen oder Zusicherungen einzuschr\u00e4nken haben wir das Recht, jedoch nicht die Verpflichtung, in unserem alleinigen Ermessen jegliche Inhalte abzulehnen oder zu entfernen, welche nach unserer begr\u00fcndeteren Auffassung, unsere Richtlinien verletzen oder in irgendeiner Form sch\u00e4dlich oder anst\u00f6\u00dfig sind.\nInhalt f\u00fcr Erwachsene\nBitte seien Sie sich dessen bewusst, dass die Webseite bestimme Inhalte beinhalten kann, die f\u00fcr Erwachsene bestimmt sind. Eine Warnung wird dem User vor Nutzung dieser Inhalte f\u00fcr Erwachsene angezeigt. Einzelpersonen, die j\u00fcnger als 18 Jahre alt sind, d\u00fcrfen auf diese Inhalte f\u00fcr Erwachsene gem\u00e4\u00df den Gesetzen jeglicher Rechtsprechung nicht zugreifen. Wenn wir erfahren, dass Personen unter 18 Jahren versuchen, eine Transaktion mit Hilfe der Dienstleistungen durchzuf\u00fchren, werden wir es erforderlich machen, die nachgewiesene elterliche Zustimmung gem\u00e4\u00df des Gesetzes zum Schutz der Online-Privatsph\u00e4re von Kindern von 1998 (\u201cCOPPA\u201c) einzuholen. Bestimmte Teile der Webseite sind unter keinen Umst\u00e4nden f\u00fcr Kinder unter 18 Jahren zug\u00e4nglich.\nBack-up-Sicherungen\nWir f\u00fchren regelm\u00e4\u00dfige Back-up-Sicherungen f\u00fcr die Webseite und die Inhalte durch und werden unser Bestes tun, um die Vollst\u00e4ndigkeit und Genauigkeit dieser Back-up-Sicherungen zu gew\u00e4hrleisten. Im Falle eines Hardware-Ausfalls oder eines Datenverlusts werden wir die Back-up-Sicherungen automatische einspielen, um die Ausfallzeit und die Auswirkungen zu minimieren.\nLinks zur anderen Webseiten\nObwohl diese Webseite zu anderen Webseiten f\u00fchren kann, deuten wir weder direkt noch indirekt keinerlei Zustimmung, Verbindung, Sponsoring, Unterst\u00fctzung oder Zugeh\u00f6rigkeit zu jeglichen verlinkten Webseiten an, au\u00dfer dies wurde ausdr\u00fccklich genannt. Wir sind nicht f\u00fcr die Untersuchung und Analyse verantwortlich und wir garantieren keine Angebote von Unternehmen oder Einzelpersonen oder von den Inhalten derer Webseiten. Wir \u00fcbernehmen keine Verantwortung oder Haftung f\u00fcr die Handlungen, Produkte, Dienstleistungen und Inhalte von jeglichen Drittanbietern. Sie sollten die rechtlichen Aussagen sowie die anderen Nutzungsbedingungen von anderen Webseiten genau \u00fcberpr\u00fcfen, auf welche Sie durch einen Link von dieser Webseite zugreifen. Die Weiterleitung auf sonstige andere Webseiten geschieht auf eigene Gefahr.\nWerbung\nW\u00e4hrend der Nutzung dieser Webseite k\u00f6nnen Sie auf Korrespondenz sto\u00dfen oder an Kampagnen von Werbetreibenden oder Sponsoren teilnehmen, die ihre Waren oder Dienstleistungen auf der Webseite anbieten. Jegliche Aktion und jede Bedingung, Voraussetzung, Garantie oder Darstellung, die mit solch einer Aktivit\u00e4t in Verbindung steht, besteht allein zwischen Ihnen und der jeweiligen Drittpartei. Wir tragen keine Haftung, Verpflichtung oder Verantwortung f\u00fcr solch eine Korrespondenz, Kauf oder Werbema\u00dfnahme zwischen Ihnen und jedweder Drittpartei.\nVerbotene Anwendungen\nNeben den anderen Bedingungen, die in der Vereinbarung dargelegt sind, ist es Ihnen verboten, von der Webseite und deren Inhalten zu nutzen: (a) f\u00fcr jedweden illegalen Zweck; (b) um andere darum zu bitten, ungesetzliche Handlungen durchzuf\u00fchren oder daran teilzuhaben; (c) um jegliche internationalen, f\u00f6deralen, provinziellen oder staatlichen Bestimmungen, Regeln, Gesetze oder lokale Verordnungen zu verletzen; (d) um geistige Eigentumsrechte oder das geistige Eigentum von anderen zu verletzen oder dagegen zu versto\u00dfen; (e) um auf Basis des Geschlechts, sexueller Orientierung, Religion, Ethnie, Rasse, Alter, nationaler Herkunft oder Behinderung zu bel\u00e4stigen, missbrauchen, beleidigen, sch\u00e4digen, diffamieren, verleumden, verunglimpfen, einsch\u00fcchtern oder diskriminieren; (f) um falsche oder irref\u00fchrende Informationen zu verbreiten; (g) um Viren oder andere Formen von b\u00f6sartigen Codes hochzuladen oder zu \u00fcbertragen, die in irgendeiner Form dazu genutzt werden k\u00f6nnen oder genutzt werden, um die Funktionst\u00fcchtigkeit oder den Betrieb der Dienstleistungen, von damit in Verbindung stehenden Webseiten, andere Webseiten oder das Internet zu beintr\u00e4chtigen; (h) um pers\u00f6nliche Informationen von anderen zu sammeln oder nachzuverfolgen; (i) um Spam-, Phishing-, Pharm-, Pretext-, Spider-, Crawl-, oder Scrape-Aktionen durchzuf\u00fchren; (j) f\u00fcr jegliche unanst\u00e4ndige oder unmoralischen Zwecke; oder (k) um die Sicherheitsmechanismen der Dienstleistungen, der damit in Verbindung stehenden Webseiten, anderen Webseiten oder dem Internet zu unterlaufen oder zu beintr\u00e4chtigen. Wir behalten uns das Recht vor, Sie von unseren Dienstleistungen sowie von jeglichen damit in Verbindung stehenden Webseiten auszuschlie\u00dfen, wenn Sie gegen die unzul\u00e4ssigen Anwendungen versto\u00dfen.\nGeistige Eigentumsrechte\nDiese Vereinbarung \u00fcbertr\u00e4gt kein geistiges Eigentum von BIT FAN d.o.o. oder von Drittparteien von BIT FAN d.o.o. auf Sie und alle Rechte, Titel und Interessen an und f\u00fcr solches Eigentum besteht ausschlie\u00dflich (wie zwischen den Parteien) mit BIT FAN d.o.o. Alle Warenzeichen, Servicemarken, Grafiken und Logos, die in Verbindung mit unserer Webseite oder unseren Dienstleistungen genutzt werden, sind Warenzeichen oder eingetragene Warenzeichen von BIT FAN d.o.o. oder von Lizenzgebern von BIT FAN d.o.o. Andere Warenzeichen, Servicemarken, Graphiken und Logos, die in Verbindung mit unserer Webseite oder unseren Dienstleistungen stehen, k\u00f6nnen keine Warenzeichen von anderen Drittparteien sein. Ihre Nutzung unser Webseite und Dienstleistungen gew\u00e4hrt Ihnen nicht das Recht oder die Lizenz, jegliche Warenzeichen von BIT FAN d.o.o. oder von Drittparteien zu verwenden.\nHaftungsausschluss\nSie stimmen zu, dass die Nutzung unserer Webseite und Dienstleistungen auf eigene Gefahr erfolgt. Sie stimmen zu, dass die Dienstleistungen im Istzustand und je nach Verf\u00fcgbarkeit zur Verf\u00fcgung gestellt werden. Wir lehnen ausdr\u00fccklich jegliche Gew\u00e4hrleistungen aller Art ab, egal ob enthalten oder impliziert. Dies beinhaltet die implizierten Gew\u00e4hrleistungen in Bezug auf Handels\u00fcblichkeit, Eignung zu einem bestimmten Zweck und Nichtverletzung, schr\u00e4nkt dies jedoch nicht ein. Wir garantieren weder, dass die Dienstleistungen Ihren Anforderungen entsprechen, noch dass die Dienstleistungen ohne Unterbrechung, p\u00fcnktlich, sicher oder fehlerfrei sind, noch geben wir eine Gew\u00e4hrleistung f\u00fcr die Ergebnisse, die Sie im Rahmen der Nutzung der Dienstleistungen erhalten. Wir geben keine Gew\u00e4hrleistung hinsichtlich der Genauigkeit und Zuverl\u00e4ssigkeit der Informationen, die Sie durch die Dienstleistungen erhalten haben und wir garantieren nicht, dass Defekte korrigiert werden. Sie sind sich dessen bewusst und stimmen zu, dass jegliches Material und/oder Daten, die heruntergeladen oder anderweitig im Rahmen unserer Dienstleistungen erhalten werden, nach Ihrem Ermessen und auf eigene Gefahr erfolgen und dass Sie allein f\u00fcr jeglichen Schaden auf Ihrem Computersystem oder f\u00fcr einen Datenverlust verantwortlich sind, die sich aus dem Download von solchen Materialien und/oder Daten ergeben. Wir geben keinerlei Garantie f\u00fcr jegliche Produkte oder Dienstleistungen, die durch unsere Dienstleistungen oder durch Transaktionen erworben oder erhalten wurden. Keine Empfehlung oder Information, egal ob schriftlich oder m\u00fcndlich, die Sie von uns oder durch unsere Dienstleistungen erhalten haben, ergeben eine Gew\u00e4hrleistung, die hier nicht ausdr\u00fccklich erw\u00e4hnt wurde.\nHaftungsbeschr\u00e4nkung\nIn vollem Umfang des anwendbaren Rechts werden BIT FAN d.o.o., seine Partner, Direktoren, Funktion\u00e4re, Angestellte, Agenten, Lieferanten oder Lizenzgeber in keinem Fall f\u00fcr jegliche Personen f\u00fcr (a) jegliche indirekten, zuf\u00e4lligen, besonderen, straf-bezogenen, deckungs-bezogenen oder mittelbare Sch\u00e4den haften (dies beinhaltet ohne Einschr\u00e4nkung Sch\u00e4den f\u00fcr entgangene Gewinne, Umsatz, Verk\u00e4ufe, Firmenwert, Nutzung oder Inhalt, Auswirkung auf das Unternehmen, Unternehmensunterbrechung, Verlust von erwarteten Einsparungen, Verlust von Gesch\u00e4ftsm\u00f6glichkeiten), auch wenn diese gem\u00e4\u00df jeglicher Haftungstheorie verursacht wurden. Dies beinhaltet ohne Einschr\u00e4nkung Vertr\u00e4ge, unerlaubte Handlungen, Verletzung der gesetzlichen Pflichten, Fahrl\u00e4ssigkeit oder Sonstiges, auch wenn BIT FAN d.o.o. auf die M\u00f6glichkeit solcher Sch\u00e4den hingewiesen wurde oder solche Sch\u00e4den h\u00e4tte voraussehen k\u00f6nnen. Bis zum maximalen Umfang des anwendbaren Rechts wird die aggregierte Haftung von BIT FAN d.o.o. und seinen Partnern, Direktoren, Funktion\u00e4ren, Angestellten, Agenten, Lieferanten oder Lizenzgebern in Bezug auf die Dienstleistungen auf einen Betrag beschr\u00e4nkt, der gr\u00f6\u00dfer als 1 Dollar ist oder auf sonstige anderen Betr\u00e4ge, die tats\u00e4chlich in bar von Ihnen an BIT FAN d.o.o. f\u00fcr den vorherigen Zeitraum von einem Monat vor dem ersten Vorgang oder Vorfall bezahlt wurden, die zu solch einer Haftung gef\u00fchrt haben. Diese Einschr\u00e4nkungen und Ausnahmen gelten ebenfalls, wenn dieses Rechtsmittel Sie nicht vollst\u00e4ndig f\u00fcr jegliche Verluste oder Sch\u00e4den seines wesentlichen Zwecks entsch\u00e4digt https://www.pharmazea.de/arzneimittel/kamagra.\nEntsch\u00e4digung\nSie sind damit einverstanden, BIT FAN d.o.o. und seine Partner, Direktoren, Funktion\u00e4re, Angestellte und Vertreter zu entsch\u00e4digen und sie von jeglichen Haftungen, Verlusten, Sch\u00e4den oder Kosten schadlos zu halten, ebenso von akzeptablen Anwaltsgeb\u00fchren, die in Verbindung mit oder von jeglichen Anschuldigungen, Behauptungen, Handlungen, Streitigkeiten oder Anspr\u00fcchen von Drittparteien entstehen, welche gegen sie als Resultat wegen ihrer Verbindung zu Ihren Inhalten, Ihrer Nutzung der Webseite und Dienstleistungen oder anderem absichtlichen Fehlverhaltens Ihrerseits ausgesprochen werden.\nSalvatorische Klausel\nAlle Rechte und Einschr\u00e4nkungen in dieser Vereinbarung sollen ausgef\u00fchrt werden und sollen anwendbar und bindend nur in dem Ausma\u00dfe sein, dass sie kein anwendbares Gesetz verletzen und dazu gedacht sind, im notwendigen Ausma\u00dfe eingeschr\u00e4nkt zu sein, sodass sie diese Vereinbarung nicht illegal, ung\u00fcltig und nicht durchsetzbar machen. Wenn eine Bestimmung oder ein Teil dieser Vereinbarung von einem Gericht einer kompetenten Rechtsprechung als illegal, ung\u00fcltig oder nicht durchsetzbar angesehen wird, so ist die Absicht der Parteien, dass die verbleibenden Bestimmungen oder Teile davon die Vereinbarung in Bezug auf den Gegenstand darstellen und dass alle verbleibenden Bestimmungen oder Teile davon vollst\u00e4ndig in Kraft und Wirkung bleiben sollen.\nStreitschlichtung\nDie Ausformung, Interpretation und Ausf\u00fchrung dieser Vereinbarung und von jeglichen daraus entstehenden Streitigkeiten sollen gem\u00e4\u00df des Sach- und Verfahrensrechts der Federacija Bosna i Hercegovina, F\u00f6deration Bosnien und Herzegowina geregelt werden, ohne Ber\u00fccksichtigung seiner Gesetze in Bezug auf Konflikte oder Rechtswahl und im soweit anwendbarem Ma\u00dfe der Gesetze von Bosnien und Herzegowina. Die exklusive Zust\u00e4ndigkeit und der Handlungsort in Bezug auf diese Angelegenheit sollen der Staat und die Bundesgerichte der Federacija Bosna i Hercegovina, Bosnien und Herzegowina sein und Sie unterwerfen sich hierbei der pers\u00f6nlichen Gerichtsbarkeit solcher Gerichte. Sie verzichten hierbei auf jegliches Recht auf ein Schwurgerichtsprozess in jedem Verfahren, das aus dieser Vereinbarung entsteht oder das mit dieser Vereinbarung in Verbindung steht. Das \u00dcbereinkommen der Vereinten Nationen \u00fcber Vertr\u00e4ge im Internationalen Warenkauf gilt nicht f\u00fcr diese Vereinbarung.\n\u00dcbertragung\nSie d\u00fcrfen keines Ihrer nachstehenden Rechte oder Verpflichtungen g\u00e4nzlich oder teilweise ohne Ihre vorherige schriftliche Einwilligung \u00fcbertragen, weiterverkaufen, unterlizensieren oder auf andere Art und Weise \u00fcbermitteln oder delegieren. Die Einwilligung soll nach Ihrem alleinigen Ermessen und ohne Verpflichtung geschehen, jegliche solche \u00dcbertragung oder Transfer ist dann null und nichtig. Uns steht es frei, jegliche nachstehenden Rechte oder Verpflichtungen g\u00e4nzlich oder teilweise an jegliche Drittpartei im Rahmen des Verkaufs unserer Substanz, Verm\u00f6gens, Aktien oder als Teil einer Verschmelzung zu \u00fcbertragen.\n\u00c4nderungen und Erg\u00e4nzungen\nWir behalten uns das Recht vor, diese Vereinbarung oder die Richtlinien jederzeit zu \u00e4ndern, welche in Verbindung mit dieser Webseite oder der Dienstleistungen stehen. Diese treten nach der Ver\u00f6ffentlichung der aktualisierten Version dieser Vereinbarung auf der Webseite in Kraft. Wenn wir dies tun, dann werden wir das aktualisierte Datum am Ende dieser Webseite \u00fcberarbeiten. Eine fortgesetzte Nutzung der Webseite nach solchen \u00c4nderungen stellt Ihre Zustimmung zu diesen Ver\u00e4nderungen dar.\nAnnahme dieser Bedingungen\nSie best\u00e4tigen, dass Sie diese Vereinbarung gelesen haben und dass Sie allen Bedingungen zustimmen. Durch die Nutzung der Webseite oder deren Dienstleistungen stimmen Sie zu, an diese Vereinbarung gebunden zu sein. Wenn Sie den Bedingungen dieser Vereinbarung nicht zustimmen, so sind Sie nicht dazu berechtigt, auf diese Webseite und ihre Dienstleistungen zuzugreifen oder diese zu nutzen.", "Der SV Reinhartshausen konnte im Heimspiel gegen den SV Bergheim zum R\u00fcckrundenauftakt drei ganz wichtige Punkte einfahren. Garant f\u00fcr den Erfolg war der zweifache Torsch\u00fctze Christian Fischer. Wenig r\u00fchmlich pr\u00e4sentierten sich einige andere Spieler, die ihre Nerven in einer spannenden zweiten H\u00e4lfte nicht mehr im Griff hatten. F\u00fcr die Reserve setzte es eine knappe und etwas ungl\u00fcckliche 1:2 Niederlage.\nErste Mannschaft\nIn der ersten Halbzeit waren beide Mannschaften auf Sicherheit bedacht und spielten ihre Angriffe nur sehr selten mit letztem Willen zu Ende. Dies war m\u00f6glicherweise auch die Reaktion auf die v\u00f6llig inakzeptable Leistung, die gro\u00dfe Teile der Mannschaft noch vor einer Woche gegen die Reserve aus Hurlach gezeigt hatten... Es war daher wenig \u00fcberraschend, dass die F\u00fchrung durch einen Standard fiel: Matthias Groll schob einen Eckball \u00fcberlegt ins Tor der G\u00e4ste. Mit diesem Spielstand ging es verdienterma\u00dfen auch in die Kabine. Der SVR pr\u00e4sentierte sich insgesamt etwas giftiger als die doch eher harmlosen G\u00e4ste.\nNach dem Seitenwechsel legte der SVR eine Schippe drauf und kam zu einer Reihe gef\u00e4hrlicher Angriffe. Doch zun\u00e4chst Christian Fischer mit einem Solo, als auch Martin Rietzler mit einem starken Freisto\u00df scheiterten am Keeper der G\u00e4ste. Beim zweiten Laufduell lie\u00df sich Christian Fischer jedoch nicht mehr lumpen und erh\u00f6hte souver\u00e4n auf 2:0. Nur zwei Minuten sp\u00e4ter wurde der Torsch\u00fctze gl\u00e4nzend von einem Bergheimer in Szene gesetzt, so dass er nur noch das eins gegen eins mit dem Torwart zu bew\u00e4ltigen hatte. Und diese Aufgabe l\u00f6ste er absolut eiskalt und sehenswert zum 3:0. Die Partie war entschieden, weshalb es noch verwunderlicher war, dass einige Spieler tats\u00e4chlich auf die Provokationen der G\u00e4ste eingingen.\nDennoch blieb die etwas hitzige Schlussphase ohne weiteren Treffer, weshalb der SV Reinhartshausen verdiente drei Punkte zuhause behielt.\nReserve\nEs hatte etwas beinahe Herzliches: bereits vor dem Spiel fielen sich Menschen in die Arme, die sich davor monatelang nicht gesehen hatten! Und dann war da auch noch das sch\u00f6ne - wenn auch etwas holprige - Gr\u00fcn des Rasens, das zum ersten mal seit dem Sp\u00e4therbst wieder \u00fcber die Fu\u00dfballschuhe der Akteuere strich. Ganz getreu dem Motto: Kondition ist etwas f\u00fcr Spieler, die sie n\u00f6tig haben. Und Training muss ja nicht unbedingt etwas mit dem Fu\u00dfballplatz zu tun haben. Dennoch war allen Beteiligten anzumerken, dass das runde Etwas durchaus auch wieder einen gewissen Reiz ausstrahlte! Wenngleich die meisten Ann\u00e4herungsversuche nicht g\u00e4nzlich von Erfolg gekr\u00f6nt waren, so zeigte der SV Reinhartshausen etwas, das man nicht trainieren kann: Einsatzwillen! Das Team versuchte Vieles, um es den G\u00e4sten so schwer wie m\u00f6glich zu machen! Und weil es den G\u00e4sten ziemlich \u00e4hnlich zu gehen schien, entwickelte sich ein nicht unbedingt niveauvolles, aber durchaus spannendes Match! Und der SVR hatte dabei Pech: Die G\u00e4ste brauchten einen Sonntagsschuss und einen sehr schmeichelhaften Elfmeter, um ein Erfolgserlebnis der Reinhartshauser zu verhindern. Da war auch das sensationelle Freisto\u00dftor von Philipp Sch\u00f6nw\u00e4lder schlicht zu wenig...\nGepaart mit etwas Kondition und der ein oder anderen Trainingseinheit am Ball, w\u00fcrde der SVR wohl auch in den n\u00e4chsten Wochen mit Teams auf \u00e4hnlichem Niveau wie Bergheim mithalten k\u00f6nnen. Es w\u00e4re w\u00fcnschenswert, wenn der ein oder andere daran arbeiten w\u00fcrde...", "Nach 24j\u00e4hriger T\u00e4tigkeit als K\u00fcsterin und K\u00fcster in Gelmer verabschieden wir am Sonntag, den 04. September 2022 um 9.30 Uhr in der St. Josef Kirche in Gelmer mit der Eucharistiefeier Maria und\u2026\n72. 2022-08-20__Pfarrnachrichten.pdf\n20. August \u2013 04. September 2022 Jesus l\u00e4dt ein: \u201eIch bin die T\u00fcr\u201c Verabschiedung Ehepaar G\u00e4hr Nach 24j\u00e4hriger T\u00e4tigkeit als K\u00fcsterin und K\u00fcster in Gelmer verabschieden wir am Sonntag, den 4.\u2026\n73. 2022-08-06__Pfarrnachrichten.pdf\n6. August \u2013 21. August 2022 Gottesdienstordnung vom 6. August \u2013 21. August 2022 Samstag, 06. August 2022 Verkl\u00e4rung des Herrn 9.30 Uhr St. Mari\u00e4 Himmelfahrt 11.30 Uhr St. Petronilla 13.00 Uhr St.\u2026\n74. B\u00e4nke unter der Orgelempore in St. Petronilla\nSchon seit den \u00dcberlegungen zu unserem Pastoralplan 2017/18 gibt es die Idee, r\u00e4umli-che Ver\u00e4nderungen in unserer Gemeinde vorzunehmen. Daf\u00fcr gibt es liturgische, pasto-rale, aber auch energetische\u2026\n75. Kuchenspenden\nF\u00fcr das Kuchenbuffet w\u00e4hrend des Kloster-Flohmarkts in Haus Emmaus am 7. August 2022 wird um Kuchenspenden gebeten. Wer einen Kuchen backen m\u00f6chte, meldet sich bitte ab dem 1. August 2022 bei\u2026\n76. Kloster-Flohmarkt am 7. August 2022\nVon 14 bis 17 Uhr findet der letzte Flohmarkt im Haus Emmaus, Vorsehungskloster (am Gymnasium St. Mauritz), Wersebeckmannweg 77, statt. Der Reinerl\u00f6s ist f\u00fcr Kinder in Not in Indonesien und zur\u2026\n77. 2022-07-23__Pfarrnachrichten.pdf\n23. Juli \u2013 7. August 2022 Gottesdienstordnung vom 23. Juli \u2013 7. August 2022 Samstag, 23. Juli 2022 13.00 Uhr St. Petronilla 15.00 Uhr St. Mari\u00e4 Himmelfahrt 17.30 Uhr St. Mari\u00e4 Himmelfahrt Trauung\u2026\n78. Stellenangebote\nAktuelle, offene Stellenangebote in unseren Kindertageseinrichtungen finden Sie auf der eigenen homepage\n79. Verbundleitung und Kindertageseinrichtung\nKITA-Verbundleitung Christian Wilm Tel. 0251-6206578-300 wilm-c@bistum-muenster.de Kita St. Petronilla, Handorf 0251-6206578-600 Kita St. Mari\u00e4 Himmelfahrt, Dyckburg-Sudm\u00fchle \u2026\n80. 2022-07-09__Pfarrnachrichten.pdf\n9. Juli \u2013 24. Juli 2022 Gottesdienstordnung vom 9. Juli \u2013 24. Juli 2022 Samstag, 09. Juli 2022 11.00 Uhr St. Mari\u00e4 Himmelfahrt 13.30 Uhr St. Mari\u00e4 Himmelfahrt 15.00 Uhr St. Mari\u00e4 Himmelfahrt 17.30\u2026", "Als ich 2020 in den Ferien in meinem jetzigen Ausbildungsbetrieb gearbeitet habe, entstand der Wunsch den Beruf Tierwirtin zu erlernen.\nEs gibt T\u00e4tigkeiten, die man in der praktischen Ausbildung besonders gerne macht. Welche w\u00fcrden Sie da nennen?\nEine T\u00e4tigkeit die ich besonders gerne mache, ist K\u00e4lber zu versorgen. Aber auch das Melken macht mir Spa\u00df.\nWorin sehen Sie zuk\u00fcnftige Herausforderungen f\u00fcr die Landwirtschaft und den Beruf der Tierwirte?\nEine Herausforderung sehe ich im sich ver\u00e4ndernden Klima. Im Sommer wird es sehr warm und das Getreide kann vor der Ernte auf dem Feld vertrocknen.\nHaben Sie Vorstellungen, wie Ihre berufliche Entwicklung nach erfolgreichem Abschluss der Ausbildung weitergehen k\u00f6nnte?\nNach erfolgreichem Abschluss meiner Ausbildung, m\u00f6chte ich mich gerne zur Landwirtschaftsmeisterin qualifizieren.\nDanke f\u00fcr das Interview!\n*Titelfoto: Ein gerade geborenes Kalb bekommt von Lucy 3 Liter Biestmilch. Die Biestmilch ist besonders reich an Antik\u00f6rpern und Mineralstoffen.", "FrauSein bedeutet uns allen etwas Anderes \u2013 die KAS m\u00f6chte jeden Monat einer anderen Frau die M\u00f6glichkeit geben, ihre Gedanken, Erfahrungen und Eindr\u00fccke zum Thema \u201eFrauSein\u201c mit Ihnen und Euch zu diskutieren.\nWir als Stiftung hatten in der letzten Woche das gro\u00dfe Gl\u00fcck bei einem Filmdreh dabei sein zu d\u00fcrfen. Die Hauptdarstellerin: Lisa Recknagel, gelernte Erzieherin, derzeit in Elternzeit und Mutter aus Leidenschaft. Sie wird am kommenden Mittwoch bei einer Vortragsreihe der Konrad-Adenauer-Stiftung zum Thema \u201eFrauSein \u2013 einfach Mama sein\u201c der Radio Moderatorin Ann-Katrin Kr\u00fcgel und allen virtuellen Teilnehmerinnen und Teilnehmern Rede und Antwort zu ihrem Verst\u00e4ndnis von Frau sein stehen.\nEs war bei dem Filmdreh beeindruckend zu erleben, mit welcher Leidenschaft sie \u00fcber ihre Mutter Rolle gesprochen hat.\nEbenso interessant, die Einblicke die sie in ihr Arbeitsleben als Erzieherin geben wird. Kommen Sie zur Veranstaltung unseres Partners dazu, melden Sie sich an:\nhttps://www.kas.de/de/veranstaltungen/detail/-/content/frausein-einfach-mama-sein\nDie Veranstaltung findet \u00fcber Zoom und YouTube statt. Die Anmeldefrist ist zwar schon verstrichen, melden Sie sich gerne aber unter kontakt@stiftung-familienwerte - wir lassen Ihnen die Einw\u00e4hldaten dann zukommen.", "Der Philosoph Max Scheler hat sich am Anfang des 20. Jahrhunderts in seinem Text \"Das Ressentiment im Aufbau der Moral\" ausf\u00fchrlich mit den verschiedenen Formen der Voreingenommenheit besch\u00e4ftigt. F\u00fcr Scheler ist Ressentiment eine Form der seelischen Selbstvergiftung, die er auf die verhinderte Entladung von Gem\u00fctsbewegungen und Affekten zur\u00fcckf\u00fchrt.\nHass ist heute wohl das am h\u00e4ufigsten verwendete pejorative Wort. Es wird von allen politischen Richtungen zur Mobilisierung von negativen Emotionen gegen Andersdenkende genutzt, insbesondere aber an den linken und rechten R\u00e4ndern des politischen Spektrums inflation\u00e4r als rhetorische Keule verwendet.\nAngst ist ein Grundgef\u00fchl des Menschen, doch sie sollte nicht \u00fcber den Menschen bestimmen. Dieses Urgef\u00fchl kann unser Leben dominieren. Nichts ist so bestimmend wie psychische Beklommenheit. Angst l\u00e4hmt uns, macht uns krank. Was ist das Wesen der Angst? Welche Funktion hat sie? Wie kann man Angst nutzen oder \u00fcberwinden?\nBei Oliver Baier diskutieren der Jugendforscher Bernhard Heinzlmaier und Georg Psota, Facharzt f\u00fcr Psychiatrie und Neurologie, der in seinem neuesten Buch \"Angst\" aufzeigt, dass im Spektrum der Angst vieles nat\u00fcrlich ist - und dennoch gebe es Punkte, an denen das Ausma\u00df der Angst in Relation zur jeweiligen Belastung eindeutig krankheitswertig ist.\nBernhard Heinzlmaier ist Mitbegr\u00fcnder des Instituts f\u00fcr Jugendkulturforschung und seit 2003 ehrenamtlicher Vorsitzender. Hauptberuflich leitet er das Marktforschungsunternehmen tfactory in Hamburg.\nService\nBernhard Heinzlmaier: Angst, Ressentiment und Hass. Leben in einer Zeit, in der die Zukunft kein Hoffnungsort mehr ist ? Dossier des Instituts f\u00fcr Jugendkulturforschung, Wien, 2018.\nGeorg Psota, Michael Horowitz: Angst. Erkennen - Verstehen - \u00dcberwinden. Salzburg/Wien: Residenz Verlag, 2018.", "\u00dcber Herbst und Winter ist die Kr\u00f6pcke-Uhr mit Strickgrafitti dekoriert. Auch sonst gibt es immer mal wieder Aktionen und die Uhr bietet ja auch einen kleinen Ausstellungsraum innendrin.\nIm unteren Bereich dominieren l\u00e4ngere F\u00e4den, kombiniert mit zusammengef\u00fcgten bunten Lappen. Oben ist aus den Lappen eine M\u00fctze f\u00fcr die Uhr gefertigt, inklusive einem Bommel ganz oben drauf.\nDas Bed\u00fcrfnis nach mehr lauschiger Heimeligkeit in der Stadt, mehr bunte Fr\u00f6hlichkeit statt einheitsgrau oder gerade modischer Sandsteinfassaden ist leicht nachvollziehbar - obgleich vom Konzept her M\u00fctzen, Jacken und Schals ja nicht selbst w\u00e4rmen, sondern nur als Isolation dienen, als W\u00e4rmepuffer, wenn nichts drinsteckt, was W\u00e4rme erzeugt, wird es auch nicht kuschelig warm, sondern im Herbst und Winter nur fies feucht-kalt. Von daher ist die naheliegende Assoziation also die falsche. Man stelle sich also eher vor, man sei gezwungen, bei Regen Strickjacke, -m\u00fctze und Schal zu tragen und wenn alles richtig na\u00df ist, nicht wieder ausziehen zu d\u00fcrfen. So ungef\u00e4hr geht es den bestrickten Objekten in der Stadt, die sich der zus\u00e4tzlichen, gestauten Feuchtigkeit nicht entziehen k\u00f6nnen. Die Farben sind allerdings wirklich sch\u00f6n bunt und fr\u00f6hlich und bieten dem Betrachter etwas Abwechslung.\nDa die Strickerei ja auch nicht dauerhaft bleiben soll, sind vermutlich keine ernsthaften Sch\u00e4den zu bef\u00fcrchten, sofern die Uhr nicht bereits Schwachstellen und Risse hat, bei denen sich der Verfall so verschlimmern k\u00f6nnte - aber das wird man bei der Aktion sicherlich bedacht haben.\n\u00b7 1 \u00b7 2 \u00b7 3 \u00b7 4 \u00b7\nStart \u00b7 Galerie-Index \u00b7 Portraits \u00b7 Pflanzen \u00b7 Pilze \u00b7 Tiere \u00b7 Orte \u00b7 \u00d6ffentliche Kunst in Hannover \u00b7 Experimentelles und Sonstiges \u00b7 Technisches \u00b7 Impressum \u00b7 Anmerkungen \u00b7", "Jeder Schritt ist eine Qual, jeder Spaziergang eine Tortur, selbst die normale Alltagsbew\u00e4ltigung eine gro\u00dfe Herausforderung.\nDein einst so lebensfroher Liebling liegt nur noch apathisch und tr\u00e4ge auf seinem Platz - schaut traurig ins Nichts.\nSichere dir jetzt dein gratis Buch!\nEigentlich w\u00fcrde dieses Buch 14,99\u20ac (PLUS Versand) kosten. Du \u00fcbernimmst heute nur die Versandgeb\u00fchren von 1,99\u20ac\n\u201eIrgendwas stimmt doch mit Ihm/Ihr nicht\u201c.\nDas hast du in letzter Zeit oft von Freunden und Familie geh\u00f6rt. Und auch du selbst merkst nat\u00fcrlich, dass der Glanz und die Lebenslust, die dein treuer Begleiter einst in den Augen hatte, schon seit einiger Zeit erloschen ist.\nDu f\u00fchlst dich machtlos, ratlos, und verzweifelt.\nDu bist traurig - und das ist vollkommen normal. Denn keiner will einen langj\u00e4hrigen Freund sehen, der sich nur noch m\u00fchevoll durch\u2018s Leben schleppt. Du willst helfen und stellst dir die Frage:\n\u201eGibt es irgendwas, dass ich tun kann?\u201c\nIn der Tat gibt es einige therapeutische und pr\u00e4ventive Ma\u00dfnahmen, welche bei Hunden sehr gut ansprechen.\nArthrose bei Tieren ist strukturell \u00e4hnlich aufgebaut wie bei Menschen. Der sch\u00fctzende Knorpel im Gelenkspalt nutzt sich ab \u2013 die Folge: beide Knochenenden reiben aufeinander, ein sich progressiv verschlimmernder Schmerz.\nArthrose bei menschlichen Gelenken ist in westlichen L\u00e4ndern die Volkskrankheit Nummer eins und somit auch unfassbar gut erforscht. Durch die \u00c4hnlichkeit zur Arthrose am Hundegelenk lassen sich viele gut erforschte Behandlungen vom Menschen auf den Hund \u00fcbertragen.\nVor allem die Supplementierung von knorpelschonenden und regenerativen N\u00e4hrstoffen, zeigt bei Hunden wissenschaftlich nachgewiesen eine deutliche Besserung der Symptome.\nIn unserem kostenlosen Buch \u201eGelenkprobleme beim Hund \u2013 Therapie und Vorsorge durch Nahrungserg\u00e4nzung\u201c wollen wir dir einen Wegweiser an die Hand geben, welcher alle offenen Fragen nachhaltig kl\u00e4rt.\nDabei gehen wir auf alle Ursachen, Symptome, rassenspezifische Probleme, Behandlungsmethoden und n\u00fctzliche Tipps ein, welche dir dabei helfen, die Lebensqualit\u00e4t deines Hundes nachhaltig zu verbessern.\nDenn dein treuer Freund hat mehr als einen angenehmen Lebensabend verdient. Nun liegt es an dir, die Grundlage daf\u00fcr zu schaffen.\nSichere dir jetzt dein gratis Buch!\nWie wird unser Ratgeber dein Leben und das deines Hundes verbessern?\nVerbessere den Alltag deines Hundes mithilfe von Gadgets, Wohnungsgestaltung, Nahrungsanpassung und vielen weiteren n\u00fctzlichen Tipps\nDu erkennst rassenspezifische Schmerz-Symptome und wei\u00dft sofort was zu tun ist\nLerne den medizinischen Hintergrund und die Ursache von Arthrose besser kennen und verstehen\nTabletten oder Leckerlies? Du lernst die m\u00f6glichen Darreichungsformen von tierischer Medizin und deren Vor- und Nachteile kennen", "\u201eCaput Limitis\u201c nannte der r\u00f6mische Historiker Tacitus den Limesturm Nr.1, der in Rheinbrohl den Anfang des Obergermanisch-Raetischen Limes markiert. Ganz in der N\u00e4he l\u00e4dt das Erlebnismuseum und Limes Informationszentrum R\u00f6merwelt unter dem Motto \u201eSehen \u2013 Verstehen \u2013 Erleben\u201c dazu ein, das allt\u00e4gliche Leben der stationierten Truppen am Limes und im Kastell hautnah kennenzulernen - im wahrsten Sinne des Wortes, denn Besucher k\u00f6nnen die historischen Gew\u00e4nder der R\u00f6mer auch selbst anziehen. In den drei Themenbereichen der Ausstellung wird die R\u00f6merzeit au\u00dferdem mit multimedialen Darstellungen und interaktiven Stationen erlebbar. Im Au\u00dfengel\u00e4nde erz\u00e4hlen Mannschaftsstube, Werkstatt, Kr\u00e4utergarten und r\u00f6mische Back\u00f6fen vom Alltag der alten R\u00f6mer.\nBack- und R\u00f6mertage ziehen viele Besucher an\nZentrale Fragen, die in der Ausstellung beantwortet werden, lauten: Wie sah der Alltag im Leben der Menschen am Limes vor 2000 Jahren aus? Wie gestaltete sich der Austausch zwischen R\u00f6mern und Germanen? Was ist der Unterschied zwischen Toga und Stola? Um diesen Fragen auf den Grund zu gehen, ist anfassen und ausprobieren erlaubt. So k\u00f6nnen kleine und gro\u00dfe Besucher einen Teil der Ausr\u00fcstung der Soldaten anlegen, den Wachdienst auf einem R\u00f6merturm nachvollziehen oder in die Stola genannten Gew\u00e4nder der r\u00f6mischen Frauen schl\u00fcpfen.\nF\u00fchrungen, themenbezogene Workshops und Veranstaltungen wie die Back- und die R\u00f6mertage ziehen in jedem Jahr besonders viele Besucher an. F\u00fcr die Kinder gibt es einen museumseigenen Spielplatz. Dort k\u00f6nnen sie zum Abschluss des Museumsbesuchs spielen, w\u00e4hrend die Eltern ein St\u00fcck Limestorte und einen Kaffee genie\u00dfen. Die R\u00f6merwelt ist an den Rheinradweg, den Limeswanderweg und den Rheinsteig angebunden, sodass ein Besuch des Museums gut mit einer Rad- oder Wandertour kombiniert werden kann.\nWeitere Infos gibt es online unter www.rlp-tourismus.de/romantischer-rhein sowie www.rlp-tourismus.com/Erlebnismuseum-RoemerWelt_Rheinbrohl\nWeitere Infos zu anschlie\u00dfenden Wander- und Radwegen unter www.tourenplaner-rheinland-pfalz.de/wanderung-auf-dem-limeswanderweg, www.tourenplaner-rheinland-pfalz.de/roemerweltweg sowie unter www.tourenplaner-rheinland-pfalz.de/fernradweg/rheinradweg und www.tourenplaner-rheinland-pfalz.de/fernwanderweg/rheinsteig\nPassendes Bildmaterial k\u00f6nnen Sie in unserer Mediendatenbank unter dem folgenden Link runterladen: https://bilder.rlp-tourismus.com/app.html#/public/70bef260-a232-11ed-9166-33a3fc3da6fa", "Online Hilfestelle Sucht & Drogen \u203a Ich m\u00f6chte Informationen zum Thema Sucht und Drogen \u203a Ich m\u00f6chte Informationen zu einer bestimmten Substanz\nInformationen zu unterschiedlichen Substanzen finden Sie hier: http://sdw.wien/sucht-und-du/\nFalls Sie noch weitere Fragen haben, verwenden Sie bitte das unten stehende Kontaktformular. Wir nehmen uns gerne Ihres Anliegens an.\nBitte beschreiben Sie Ihr Anliegen\nM\u00f6chten Sie, dass wir Sie kontaktieren? Dann geben Sie bitte eine E-Mail Adresse oder Telefonnummer ein. (optional)\nM\u00f6chten Sie uns Ihren Namen nennen? (optional)\nAchtung: Wenn Sie keine Kontaktm\u00f6glichkeit eingeben, k\u00f6nnen wir Ihnen auch nicht auf Ihre Anfrage antworten.\nSucht ist keine Willensschw\u00e4che\nSucht ist eine Krankheit und kann entsprechend behandelt werden. Details zum Thema Suchterkrankungen finden Sie hier: Infos Suchterkrankung\nDatenschutz\nIhre Eingaben werden v\u00f6llig vertraulich behandelt.\nDetails zu unseren technischen Ma\u00dfnahmen, um ihre Daten zu sch\u00fctzen, finden Sie hier: Datenschutzinfos\nSie brauchen Hilfe?\nDie sozialmedizinische Einrichtung jedmayer der Suchthilfe Wien ist t\u00e4glich von 0 \u2013 24 Uhr unter der Nummer +43 1 4000-53799 erreichbar.", "Die Aktie von Amazon konnte sich von den starken Kursr\u00fcckg\u00e4ngen seit Oktober 2018 beinahe wieder vollst\u00e4ndig erholen. Erst k\u00fcrzlich hatten wir Ihnen geschrieben, dass wir der Meinung sind, wer bei Amazon von weiter steigenden Kursen ausgeht, der kann immer unseren Optionsschein aus dem Depot mit der WKN MF42AS kaufen.\nWir gehen davon aus, dass es hier noch weitere \u00dcberraschungen geben wird. Diese Einsch\u00e4tzung war goldrichtig, denn Amazon steht gerade unmittelbar davor, das Allzeithoch zu knacken und \u00fcber die Marke von 1.800 Euro nach oben auszubrechen. Im letzten Quartal verdiente Amazon den aktuellen Zahlen zufolge so viel wie noch nie zuvor und der \u00dcberschuss war um sage und schreibe 125% auf 3,6 Milliarden Dollar gestiegen. Wir meinen, dass man hier dabei bleiben muss.\nvoriger Artikel\nAchtung: Diese Warnung ist AKUT\nn\u00e4chster Artikel\nTrendwende eingel\u00e4utet: Beste Chance 2019\nDisclaimer: Die hier angebotenen Beitr\u00e4ge dienen ausschlie\u00dflich der Information und stellen keine Kauf- bzw. Verkaufsempfehlungen dar. Sie sind weder explizit noch implizit als Zusicherung einer bestimmten Kursentwicklung der genannten Finanzinstrumente oder als Handlungsaufforderung zu verstehen. Der Erwerb von Wertpapieren birgt Risiken, die zum Totalverlust des eingesetzten Kapitals f\u00fchren k\u00f6nnen. Die Informationen ersetzen keine, auf die individuellen Bed\u00fcrfnisse ausgerichtete, fachkundige Anlageberatung. Eine Haftung oder Garantie f\u00fcr die Aktualit\u00e4t, Richtigkeit, Angemessenheit und Vollst\u00e4ndigkeit der zur Verf\u00fcgung gestellten Informationen sowie f\u00fcr Verm\u00f6genssch\u00e4den wird weder ausdr\u00fccklich noch stillschweigend \u00fcbernommen. Die CoJo GmbH hat auf die ver\u00f6ffentlichten Inhalte keinerlei Einfluss und vor Ver\u00f6ffentlichung der Beitr\u00e4ge keine Kenntnis \u00fcber Inhalt und Gegenstand dieser. Die Ver\u00f6ffentlichung der namentlich gekennzeichneten Beitr\u00e4ge erfolgt eigenverantwortlich durch Autoren wie z.B. Gastkommentatoren, Nachrichtenagenturen, Unternehmen. Infolgedessen k\u00f6nnen die Inhalte der Beitr\u00e4ge auch nicht von Anlageinteressen der CoJo GmbH und / oder seinen Mitarbeitern oder Organen bestimmt sein. Die Gastkommentatoren, Nachrichtenagenturen, Unternehmen geh\u00f6ren nicht der Redaktion der CoJo GmbH an. Ihre Meinungen spiegeln nicht notwendigerweise die Meinungen und Auffassungen der CoJo GmbH und deren Mitarbeiter wieder.\nDie meistgelesenen und am besten bewerteten Empfehlungen:\nMorgen ist der START: Darum steigt die Aurora Cannabis Aktie heute schon stark an \u2013 Anleger m\u00fcssen dringend handeln! 25. Mai 2020\nMorgen ist der START: Darum steigt die Gilead Sciences Aktie heute schon stark an \u2013 Anleger m\u00fcssen dringend handeln! 25. Mai 2020\nMorgen ist der START: Darum steigt die BioNTech Aktie heute schon stark an \u2013 Anleger m\u00fcssen dringend handeln! 25. Mai 2020\nMorgen ist der START: Darum steigt die TUI Aktie heute schon stark an \u2013 Anleger m\u00fcssen dringend handeln! 25. Mai 2020\nMorgen ist der START: Darum steigt die Wirecard Aktie heute schon stark an \u2013 Anleger m\u00fcssen dringend handeln! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die SIXT Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die MTU Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die Eckert&Ziegler Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die E.ON Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die Alibaba Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die AMS Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die Allianz Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die Deutsche Bank Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020\nMorgen geht es endlich los: Darum ist die Bayer Aktie heute schon stark im Gewinn \u2013 Anleger handeln umgehend!!!! 25. Mai 2020", "\u00a7 240/4 - Verschiedenes und Bekanntgaben: Fahrradabstellm\u00f6glichkeiten am Bahnhof Hessental (\u00f6ffentlich) \u2013 Ratsinformationssytem Schw\u00e4bisch Hall\n\u00a7 240/4 - Verschiedenes und Bekanntgaben: Fahrradabstellm\u00f6glichkeiten am Bahnhof Hessental (\u00f6ffentlich)\nAus Ratsinformationssytem Schw\u00e4bisch Hall\n< 28009587/0/meetingminutes\nWechseln zu: Navigation, Suche\nedit ist beschr\u00e4nkt auf Gruppen sysop und editor (gilt, weil diese Seite SEC:PUB \u201ein der Kategorie\u201c ist)\ndelete ist beschr\u00e4nkt auf Gruppen sysop und editor (gilt, weil diese Seite SEC:PUB \u201ein der Kategorie\u201c ist)\n< Zur\u00fcck zum Protokoll: Bau- und Planungsausschuss (05.11.2018)\nSachvortrag:\nStadtr\u00e4tin Niemann erkundigt sich, ob es richtig sei, dass es f\u00fcr den Fahrradabstellplatz am Bahnhof Hessental keine Karten mehr geben w\u00fcrde. Nach \u00dcberlegungen zur Kapazit\u00e4tserweiterung wird gefragt.\nFachbereichsleiter Planen und Bauen G\u00f6ttler berichtet, dass die Pl\u00e4tze alle belegt seien. Es gebe jedoch auch einen stetigen Wechsel. Es werden Karten zur\u00fcckgegeben, welche dann wieder ausgegeben werden k\u00f6nnen.\nStadtr\u00e4tin Niemann erkundigt sich nach der Anzahl der im Umlauf befindlichen Karten\nFachbereichsleiter Planen und Bauen G\u00f6ttler sagt eine Abkl\u00e4rung zu.\nOberb\u00fcrgermeister Pelgrim erg\u00e4nzt, dass weitere Fahrradabstellpl\u00e4tze gerade Bestandteil des Wettbewerbsverfahrens f\u00fcr den Haalplatz und das Unterw\u00f6hrd seien.\nStadtr\u00e4tin Niemann sieht die Notwendigkeit von Kapazit\u00e4ten sowohl am Bahnhof Hessental als auch am Bahnhof in der Innenstadt.\nErster B\u00fcrgermeister Klink erg\u00e4nzt, dass die F\u00f6rderantr\u00e4ge u.a. f\u00fcr die Unterf\u00fchrung im Bereich des Bahnhofsareals an das Regierungspr\u00e4sidium Stuttgart gesendet wurden. Eine Bike+Ride-Anlage sei hier enthalten.\nStadtrat Dr. Graf v. Westerholt regt an die Administration der Kartenausgabe mittels technischer Unterst\u00fctzung neu zu regeln. Die Karte k\u00f6nnte z. B. nach einem Jahr die G\u00fcltigkeit verlieren.\nVon \u201ehttps://ratsinfo.schwaebischhall.de/index.php?title=28009587/0/meetingminutes/42927518/paragraph&oldid=67574\u201c", "In der TheaterScheune erstaunt Dietmar Blume immer wieder sein Publikum mit besonderen Verkn\u00fcpfungen historischer Zeitgeschichte und literarischer Texte, Schauspiel und Animation.\nIn dieser Inszenierung gelingt es Dietmar Blume in einer feinsinnigen Symbiose, Poesie und Erlebtes zusammen zu f\u00fcgen und damit einen unerwarteten realistischen Bezug zu erfahren.\nBlume, ein wunderbarer Performer, Schauspieler und Puppenspieler, findet in seinem neuen Mitspieler David Sick (Gitarre) einen meisterhaften und perfekten Gegenpol. Beide erwecken diese ber\u00fchrenden Momente theatralisch und musikalisch zum Leben und lassen sie fantasievoll erbl\u00fchen.\nEs ist eine Liebesgeschichte auf der Grundlage der Erz\u00e4hlung von \u201eLeonce und Lena\u201c, verwoben mit tragischen und authentischen Tage- buchaufzeichnungen aus den dunklen Zeiten des zweiten Weltkrieges. Ein herausragendes, professionelles, schauspielerisches und musikalisches Erlebnis.\nRegie: Dietmar Blume\nMusik: David Sick\nAusstattung: Susanne Wieltsch\nDAS M\u00c4RCHEN VON DER GR\u00dcNEN SCHLANGE UND DER SCH\u00d6NEN LILIE\nLiterarisches Kleinod von J. W. Goethe\n\u201eDiesen Abend verspreche ich Ihnen ein M\u00e4rchen, durch das Sie an nichts und an alles erinnert werden sollen.\u201c\nGoethes \u201eM\u00e4rchen von der gr\u00fcnen Schlange und der sch\u00f6nen Lilie\u201c ist ein literarisches Kleinod, \u00fcber dessen Symbolgehalt sich schon Generationen mehr oder weniger erfolglos den Kopf zerbrochen haben. Goethe selbst hat sich dar\u00fcber zeitlebens ausgeschwiegen.\nFraglos wird auf eine grenzenlos phantastische Art und Weise die Welt gerettet, wenn die gr\u00fcne Schlange, die Irrlichter, der F\u00e4hrmann und wer noch alles von den handelnden Figuren sich aufmachen zur sch\u00f6nen Lilie. Durch ihr gemeinsames Handeln erreichen sie, dass der unterirdische Tempel an die Oberfl\u00e4che gehoben wird und eine breite verkehrsreiche Br\u00fccke sich \u00fcber den bisher schwer \u00fcberwindbaren Fluss schwingt.\nBlume & Huber nehmen sich diesen Stoff als Erz\u00e4hl-, Objekt-, Figuren- und Schauspieltheater an und man darf gespannt sein, welche Welten sich aus dem Nichts erheben werden . . .\nGef\u00f6rdert durch die Landeshauptstadt Saarbr\u00fccken und das Ministerium f\u00fcr Bildung, Kultur und Wirtschaft des Saarlandes\nDIE ARMEN WEBER\nMenschen, Schicksale und Textilgeschichte der Oberlausitz\nBasierend auf den k\u00fcnstlerischen Vorlagen von Heinrich Heines \u201eDie schlesischen Weber\u201c und Gerhart Hauptmanns \u201eDie Weber\u201c werden \u201edas Thema\u201c in der Oberlausitz, n\u00e4mlich der nicht vermeidbare Abriss des \u201eWei\u00dfen Riesen\u201c und der Weberaufstand von 1844 in Schlesien k\u00fcnstlerisch aufbereitet und inszeniert.\nZwei Musiker auf der Durchreise in Neugersdorf, die unterschiedlicher nicht sein k\u00f6nnten: Der vertr\u00e4umte Thomas und der sachliche Ernst.\nThomas muss das Erbe seiner Gro\u00dftante Edeltraut kl\u00e4ren.\nWie in einem Stoffmuster gehen sie jedem Hinweis \u2013 einem roten Faden gleichend \u2013 nach und entdecken einige Ungereimtheiten.\nBirgt der Nachlass der alten Dame ein Verm\u00e4chtnis? Ein Geheimnis?\nSie m\u00fcssen sich entscheiden zwischen dem n\u00e4chsten Auftritt in Dresden und dem L\u00f6sen des R\u00e4tsels!\nDie teilweise autobiografische Handlung basiert auf der Geschichte der Textilindustrie in der Oberlausitz und dem Material der Firma C. G. Hoffmann.\nGef\u00f6rdert durch Kulturstiftung des Freistaates Sachsen, Kulturraum Oberlausitz \u2013 Niederschlesien, Stadt Ebersbach \u2013 Neugersdorf und den Freunden der TheaterScheune\nDIE LETZTE KARTUFFEL\nAberwitzige Farce mit skurril aufbereiteten Bildern\nMit skurril aufbereiteten Bildern und jeder Menge Kokolores wird eine Familiengeschichte erz\u00e4hlt; als aberwitzige Farce \u00fcber das Leben in Irland, \u00fcber Verrat und Liebe, \u00fcber Hunger und Whisky und Kartoffeln.\nDietmar Blume spielt selbst den Gro\u00dfvater und den irischen Geschichtenerz\u00e4hler. F\u00fcr andere Rollen halten Puppen und au\u00dferirdisch anmutende Skulpturen, k\u00fcnstlerische Fotos und vieles mehr aus dem Atelier der Berliner Ausstatterin Susanne Wieltsch her.\nGrundlage des St\u00fcckes: \u201eIrischer Lebenslauf\u201c (Das Barmen) von Flann O\u00b4Brien. Es geht um die gro\u00dfe Hungersnot 1741 bis 1745 in Irland, in der die regierenden Engl\u00e4nder mit willk\u00fcrlichen Regeln ihre Macht ohne Realit\u00e4tsbezug und Mitgef\u00fchl gegen die Iren aus\u00fcbten.\nAlles in allem echt Irisch, echt Flann O\u2019Brien und echt staunenswerter Unsinn. Zu guter Letzt wird in der Pause der Lieblingswhisky von K\u00f6nigin Elisabeth, \u201eRoyal Lochnager\u201c, vom Publikum vernascht.\nText und Spiel: Dietmar Blume\nRegie: Dieter Desgranges\nAusstattung: Susanne Wieltsch\nGef\u00f6rdert durch die Landeshauptstadt Saarbr\u00fccken, Ministerium f\u00fcr Bildung Kultur und Wirtschaft des Saarlandes sowie Saartoto", "Sappho wird eine Sonderstellung in der antiken, qua \u00dcberlieferung von M\u00e4nnern dominierten Geisteswelt zugeschrieben. So bezeichnete sie Platon als die zehnte, wenngleich sterbliche Muse der Poesie. Was nicht hei\u00dft, da\u00df es nicht auch andere Dichterinnen zu jener Zeit gegeben haben mag, nur da\u00df von ihnen nichts auf sp\u00e4tere Generationen \u00fcberkommen ist. Und wahrscheinlich h\u00e4tte ohne die von ber\u00fchmten Zeitgenossen gezollte Anerkennung, wie etwa die seitens Solons, der Sapphos Verse auswendig lernte, ihr Werk dasselbe Schicksal ereilt. Dennoch finden sich relativ wenige Gedichte und von diesen oft auch nur einzelne Strophen, Zeilen oder Verse bewahrt. Was sie in der Gegenwart, in der eine Neigung zum Fragment und zum Prozesshaften beobachtbar ist, in einem gewissen Sinne sogar zug\u00e4nglicher, zeitgem\u00e4\u00df erscheinen l\u00e4\u00dft. Nicht zuletzt ihres Tones wegen, den sie beispielsweise in ihrer dichterischen Ansprache an die G\u00f6ttin Aphrodite (Frg. 1), anschl\u00e4gt, unerh\u00f6rt, voller Subjektivit\u00e4t, von einem Widerspruchsgeist durchdrungen und gar nicht devot.\nKolportiert wurde in Bezug auf Sappho \u00fcber Jahrhunderte hinweg vor allem die Legende von der freien resp. lesbischen wie unerf\u00fcllten Liebe und der Wollust auf Lesbos, in ihrem Kreis. Gerade im 18. und 19. Jahrhundert war die Rezeption davon bestimmt, nicht zuletzt gen\u00e4hrt von St\u00fccken Franz Alexander von Kleists (eines Bruders von Heinrich von Kleist) und Grillparzer, die von Sapphos unerwiderter Liebe zu Phaon, einem J\u00fcngling, handeln. Ein Fenster zu ihren Texten aber stie\u00df vor allem der aus Worms stammende Theologe und Schriftsteller Johann Nikolaus G\u00f6tz mit seinen Nachdichtungen auf, die 1760 zusammen mit Gedichten Anakreons erschienen. Er begr\u00fcndete damit einen neuen Zugang zum Werk dieser Dichterin im deutschsprachigen Raum, und auch er hat sich mit eigenen Versen Sapphos Welt zu n\u00e4hern versucht, wovon eine Elegie mit dem Titel \u201eDie M\u00e4dcheninsel\u201c Kunde gibt.\nIch erinnere mich, da\u00df uns im Literaturunterricht (Ende 60er Jahre) das Geschick einer Frau und Dichterin vermittelt wurde, deren Einsamkeit und Unerf\u00fclltheit letzthin als unausweichlich betrachtet werden m\u00fcsse. Und wir jenen ber\u00fchmten Vers vom Mond und den Plejaden genau in diesem Sinne interpretierten.\nDen Herausgebern des vorliegenden Bandes kommt der Verdienst zu, einen Raum f\u00fcr die Auseinandersetzung mit Sapphos Werk jenseits ausgetretener Pfade im Verlaufe der Rezeptionsgeschichte er\u00f6ffnet zu haben. Dazu haben sie eine Anzahl zeitgen\u00f6ssischer Autorinnen und Autoren eingeladen, ihre Antworten auf Sappho von Mytilene, wie sie sich aus den \u00fcberlieferten Versen konstituiert, ihre Lesarten einzelner Fragmente, ihre Reflexionen, Assoziationen und Variationen beizusteuern. Weit \u00fcber vierzig von ihnen sind mit viel Lust der Einladung zu einem Unterfangen gefolgt, das einer Expedition gleicht, die zum Teil \u00fcberraschende Ergebnisse zeitigt.\nBirgit Kreipe bildet in ihren Ann\u00e4herungen die auf Gef\u00e4\u00dfscherben fragmentarisch \u00fcberlieferten Verse nach (S. 87). Angelika Janz (S. 89) brilliert mit ihrer Interpretation, indem sie Vorgefundenes erg\u00e4nzt und damit einer Deutung unterwirft. Kerstin Becker wei\u00df in ihrer dichterischen Antwort auf das Fragment 31 mit einer sch\u00f6nen Zeile zu \u00fcberraschen: die Zunge stirbt mir im Geh\u00e4use. (S. 46) Eine Besonderheit stellen die beiden Pioniere einer feministisch grundierten Sappho-Rezeption in den 60/70er Jahren des 20. Jahrhunderts, Marylin Hacker und Joan Larkin, dar. Hackers Replik auf eine M\u00e4dchenliebe in Fragment 31 findet sich gleich in zweifacher \u00dcbersetzung, was Bedeutungs- und Sinnverschiebungen im Proze\u00df der \u00dcbertragung nachvollziehbar macht. (S. 42/43) Hackers Verse dabei frech, zeitgen\u00f6ssisch und nie frivol. Bertram Reinecke geht in seinem Ansatz spielerisch mit der rezeptiven Wahrnehmung Sapphos in der j\u00fcngeren Kulturgeschichte um und macht die Mechanismen sichtbar, die den Moden resp. dem Zeitgeist zugrundeliegen, was in der Folge mit der \u00dcberlieferung geschieht, aus ihr herausgel\u00f6st, weitergetragen, ver\u00e4ndert wird. (S. 82/83). Als K\u00fcr kann die Abteilung \u201eAlles wird Mond\u201c betrachtet werden, in der freie Variationen und Interpretationen zu Sapphos wohl bekanntestem Gedicht versammelt sind. In etlichen der St\u00fccke kommt das Gestirn als eines zur Sprache, das entschwunden oder noch nicht aufgegangen ist, das fehlt. Und damit ist gleichsam von ihm als einer Metapher die Rede, die schon des l\u00e4ngeren in der deutschsprachigen Dichtung als unzeitgem\u00e4\u00df erachtet wird, doch hier in einer spielerischen wie auch (selbst-) ironischen N\u00e4herung und Brechung Substanz zur\u00fcckerh\u00e4lt. Brigitte Struzyk hat die R\u00fcckseite des Mondes bemalt, sieht die Verwandlungen, die dessen Licht zeitigt, sich im Traum vollziehen. Marianne Lanz fragt: brauchen wir \u00fcberhaupt einen/ wir versuchen es mit lampen luxus pl\u00e4nen. Michael Gratz f\u00fchrt spielerisch vor, was herauskommen kann, wenn die Verse mittels der Stillen Post die Filter mannigfacher \u00dcbertragung passieren \u2013 im Ergebnis ein polyglottes Intermezzo. Und da\u00df in diesem Zusammenhang auch ein Proze\u00df von Be- und Umschreibungen statthat (seit wann ist eigentlich die Verwendung dieser Begrifflichkeiten in Bezug auf die m\u00fcndliche Ent\u00e4u\u00dferung nachweisbar?). Martin Piekar weist in seiner Sapphoesie der Dichterin ihren Ort irgendwo zwischen Voll- und Sichelmond zu und Marcus Roloff variiert Sapphos Verse gleich in vier vierzeiligen Nachtgedichten, hier das erste: abgang mond, das/ siebengestirn inkl. 24 h./ alles flie\u00dft, aber/ ich liege.\nDirk Uwe Hansen, der mit Michael Gratz als Herausgeber des Bandes zeichnet, hat Sapphos Fragmente am Schlu\u00df in einer eigens dazu erstellten Prosa\u00fcbertragung zu einem Ganzen gef\u00fcgt, einer Art Brief, gerichtet an Unbekannt. Und f\u00fcr mich wird gerade dort noch einmal deutlich, da\u00df die \u00fcberlieferten Zeilen und Verse gleichsam Flaschenposten darstellen, deren Entstehungskontexte, das Warum und Woher, sich im Vagen bewegen, nur schwer rekonstruieren lassen. Nicht nur in diesem Zusammenhang lohnt es sich, seine 2012 editierten neuen \u00dcbersetzungen und Nachdichtungen ausgew\u00e4hlter Fragmente Sapphos (\u201eSappho. Scherben \u2013 Skizzen\u201c) daneben zu legen, wo er sich zum Teil gr\u00f6\u00dfere dichterische Freiheiten erlaubt als im vorliegenden Band, so beispielsweise in Bezug auf Frg. 51. In der \u00dcbersetzung lautet der Vers: Ich wei\u00df nicht, was ich tu. Zweifach sind meine \u00dcberlegungen. In Hansens Nachdichtung: Was wei\u00df denn ich wo/ hin und welche ich bin/ so schnell. In \u201eMuse, die zehnte\u201c wiederum: Ich wei\u00df nicht, was ich tu. Gespalten sind meine Gedanken. F\u00fcr mich bildet die mittlere Version die ausdrucksst\u00e4rkste, jene, die auch im Sprechen selbst und in der nachempfundenen Metrik etwas von der Irritation der Autorin vermittelt. Aber da\u00df diese verschiedenen Versionen bei einem Nachdichter zu beobachten sind, macht deutlich, da\u00df die Auseinandersetzung mit Sappho noch l\u00e4ngst nicht zu einem Ende gekommen ist, es hoffentlich nie sein wird.\nFebruar 2015\nMuse, die zehnte. Antworten auf Sappho von Mytilene. Hrsg. von Michael Gratz und Dirk Uwe Hansen. Dt./altgriech. Greifswald (freiraum-verlag) 2014. 150 Seiten. 14,95 Euro.", "Der Skiclub machte sich am vergangenen Sonntag bei gutem Wanderwetter auf den Weg nach Sasbachwalden. Der Genie\u00dferpfad \u201eAlte Gott Panoramarunde war unser Ziel.\nAuf dem sch\u00f6nen ausgeschilderten Zuweg zum Genie\u00dfer Pfad, der zentral am Kurhaus \u201eZum Alde Gott\u201c startete, begann die Tour. An den sagenumwobenen Gaish\u00f6ll- Wasserf\u00e4llen begann der Genie\u00dferpfad.\nDie Schlucht der Gaish\u00f6ll-Wasserf\u00e4lle war zugleich die schwierigste Herausforderung. Viele Br\u00fccken und Stufen f\u00fchrten durch die knapp einen Kilometer lange wildromantische Schlucht.\nDer zehn Kilometer lange Premiumweg rund um Sasbachwalden f\u00fchrte im Auf und Ab durch Kastanienw\u00e4lder und Streuobstwiesen. An Weinbergen und Winzergeh\u00f6ften vorbei, mit Blick auf die Rheinebene bis zum Stra\u00dfburger M\u00fcnster.\nVorbei an der Friedenskappe St. Katharina, einer Kornm\u00fchle aus dem 18. Jahrhunderts, entlang des alten Postweges und durch Hohlgassen, zum Ursprung des \u201eAlde Gottes\u201c. Ein Bildst\u00f6ckle zeugte von der Sage des Alde Gottes, einen weiteren Panoramablick gab es hier gratis dazu. Unterwegs genossen die Wanderer auch die an den Wein- und Schnapsbrunnen bereitgestellten Getr\u00e4nke.\nDie Panoramarunde um das bezaubernde Blumen- und Weindorf Sasbachwalden war eine wunderbare Tour durch Natur- und Kulturlandschaften des Schwarzwaldes. Dank an unsere Claudia f\u00fcr die gelungene Organisation.", "Wenn Vince Ebert auf die B\u00fchne kommt, dann verbinden sich Humor und Wissenschaft. Bei seinem Kabarett-Programm vermittelt der geb\u00fcrtige Odenw\u00e4lder wissenschaftliche Zusammenh\u00e4nge mit den Gesetzen des Humors. Seine gek\u00fcrzte Lesung mit einer Spielzeit von 70 Minuten ist nun als H\u00f6rbuch erschienen. In seinem Programm \u201eEvolution\u201c erfahren die Zuh\u00f6rer nicht nur, warum Pandab\u00e4ren total \u00fcbersch\u00e4tzt werden, sondern auch warum der Urknall gar nicht geknallt hat. Geschickt verbindet Vince Ebert, der auch als Buchautor erfolgreich ist, Witz und Wissen.\nNach Oskar Lafontaine und Angela Merkel sieht sich Vince Ebert als den dritten Physiker, der mit Comedy sein Geld verdient. Doch bei seinem aktuellen Programm geht es weniger um aktuelle Politik, sondern mehr um den Gegensatz von Naturwissenschaft und (Aber-)Glaube. Gleich zu Beginn des Programms k\u00fcndigt er an, sich an gro\u00dfe wissenschaftliche Themen zu wagen und das Geheimnis des Lebens zu ergr\u00fcnden. Das geschieht nicht in Form eines wissenschaftlichen Vortrags, sondern durch humorvolle Erl\u00e4uterungen zu kleinen Kapiteln der Wissenschaft. Diese garniert Vince Ebert mit verbalen Spitzen und hinterfragt zum Beispiel, ob der Musikantenstadel mit der Evolutionstheorie vereinbar ist.\nSp\u00e4ter um Programm bem\u00fcht er Gemeinsamkeiten zwischen Mensch und Tier und spricht \u00fcber die Evolution. Bei der seien keinesfalls die Besten, sondern nur die am besten Angepassten \u00fcbrig geblieben. Mit einem Feuerwerk von Informationen, wie der, dass der gr\u00f6\u00dfte Pilz eine Fl\u00e4che von neun Quadratkilometern erreicht, oder der, dass Schweine die Intelligenz von F\u00fcnfj\u00e4hrigen haben, bringt der Kabarettist sein Publikum zum Lachen und auch zum Nachdenken. Dazu nimmt er sie mit auf eine Zeitreise zum Anfang der Evolution. Noch vor dem Urknall ist es dort \u00f6de, einsam und pechschwarz. Geknallt habe es mangels Materie zwar nicht, aber immerhin sei das Universum entstanden. Nur beim Licht sei die biblische Sch\u00f6pfungsgeschichte schneller gewesen. Real w\u00e4re das Licht nicht in sechs Tagen, sondern erst nach 400.000 Jahren entstanden. Vince Ebert teilt aus gegen Religionen und Esoterik. So vergleicht er den Vatikan mit einem schwarzen Loch. Dann sagt er selbstironisch, er sei in Sachen Astrologie skeptisch, wie es typisch f\u00fcr Zwillinge sei. Auch die aktuelle Politik wird zwischendurch gestreift. So bef\u00fcrchtet er, dass der Urknall bis heute nicht erfolgt w\u00e4re, h\u00e4tte man den Berliner Senat mit diesem beauftragt. Wie beim Berliner Flughafen w\u00e4re man bis heute mit dem Brandschutzkonzept besch\u00e4ftigt.\nTrotzdem beschreibt Vince Ebert die Erde als Gl\u00fccksfall im Planetenlotto. Trotz W\u00fcsten, Slums und Ostwestfalen seinen die Zust\u00e4nde auf der Erde paradiesisch. Menschen verf\u00fcgten zwar \u00fcber doppelt so viele Darmbakterien wie Gehirnzellen. Trotzdem seien diese mangels Kuschelfaktor nicht besonders beliebt. Ganz anders sei das zu seinem Unverst\u00e4ndnis bei Pandas. \u201eWas hat ein Pandab\u00e4r jemals f\u00fcr uns getan?\u201c, fragt Vince Ebert sein Publikum. Beliebt seien auch L\u00f6wen, doch sei das Sozialleben der Hy\u00e4nen viel ausgepr\u00e4gter berichtet Ebert und intoniert eine Melodie aus dem Musical \u201eDer K\u00f6nig der L\u00f6wen\u201c.\nDann geht er wieder auf die Menschen ein. Auch die lebten manchmal nach dem \u201eFuck and Go\u201c-Prinzip, sodass Frauen oft im Nachteil seien. Oft gel\u00e4nge es diesen aber mit Geruch und Fingerl\u00e4ngen Signale f\u00fcr die optimale Partnerwahl zu entdecken. Laut Ebert ist die L\u00e4nge des Ringfingers beim Mann Signal f\u00fcr den Testosteronspiegel. So h\u00e4tte Frauen die Chance zur \u201eVermeidung genetischer Vollpfosten\u201c. Eine Reihe von Physikerwitzen und Hinweise, warum Menschen nicht f\u00fcr das vegane Leben gemacht sind, schlie\u00dfen sich an. Kochen beschreibt Vince Ebert dabei als outgesourste Verdauung. In seinem Programm bietet Ebert nicht nur Informationen, sondern auch Denkanst\u00f6\u00dfe. So sagt er zu technischen Innovationen: \u201eOhne die Erfindung der Gl\u00fchbirne m\u00fcssten wir heute noch bei Kerzenlicht fernsehen.\u201c\nSeitenhiebe auf zum Musikantenstadel schunkelnden Zuschauern, das Z\u00f6libat als Ausschluss aus dem Genpool und die Gefahren der Religionen f\u00fcr Frauen, Schwule, Unverheiratete und viele andere schlie\u00dfen sich an. Auch die Funkerausbildung bei der Bundeswehr, die \u201eethnische S\u00e4uberung\u201c der Umgebung durch Hauskatzen und der Stress durch immer mehr Entscheidungen werden angesprochen. Vince Ebert wagt sich damit auch an unpopul\u00e4re Themen und riskiert es, anderen auf den Schlips zu treten. Doch genau das macht gute Unterhaltung im Kabarett aus. Auch wenn die drei Haupts\u00e4tze der Thermodynamik den dreifaltigen Gott ersetzen. Das H\u00f6rbuch (ISBN 978-3-8445-1463-6) ist zum Preis von 14,99 Euro im H\u00f6rverlag erschienen. (SMC)", "Das sch\u00f6ne am Film ist ja unter anderem, dass man Abenteuer erlebt, w\u00e4hrend man gefahrlos und bequem im Sessel sitzt und man nur f\u00fcr den Augenblick vergisst, dass der Schauspieler genauso in Sicherheit ist. Ganz anders ist das, wenn es sich um eine Doku handelt. \u201eDer Alpinist\u201c ist ein Portrait des Extrem-Bergsteiger Marc-Andr\u00e9 Leclerc und ist so faszinierend wie erschreckend.\nDas Klettern hat sich in den letzten Jahren immer mehr zu einer Trendsportart entwickelt. Umso authentischer macht den Kanadier Leclerc, dass er die Aufmerksamkeit, die seine Passion zunehmend genie\u00dft, nie dazu benutzt hat, um sich selbst ins Rampenlicht zu stellen. Am liebsten war er auf Solo-Touren unterwegs, die so atemberaubend schwierig sind, dass wenige Menschen so ein Risiko auf sich nehmen w\u00fcrden.\nAls der Doku-Filmer Peter Mortimer zu Beginn der 10-er Jahre auf ihn aufmerksam wird, ist er fasziniert von den Touren des damals Anfang 20-j\u00e4hrigen und begleitet ihn auf seinen immer riskanter werdenden Touren. Die Bilder, die dabei entstanden sind, sind einfach atemberaubend. Zu den H\u00f6hepunkten der Doku z\u00e4hlt Leclercs Besteigung des Cerro Torre in Patagonien, bei er der laut Kennern die schwierigste Route \u00fcberhaupt gew\u00e4hlt hatte.\nBereichert wird sie au\u00dferdem von Interviews mit anderen Extrem-Bergsteigern wie Alex Honnold oder auch Reinhold Messner, von dem das Zitat stammt: \u201eOhne die M\u00f6glichkeit des Todes w\u00e4re das Klettern keine Kunst.\u201c F\u00fcr Leclerc ist diese M\u00f6glichkeit 2018 real geworden. Allerdings durch eine Variable, die auf dem Berg nie vollst\u00e4ndig in der eigenen Hand liegt: das Wetter. Der Alpinist ist also eine Hommage an einen Mann, der die M\u00f6glichkeiten des Solo-Bergsteigens bis aufs \u00c4u\u00dferste ausgereizt hat, aber zumindest nicht vordergr\u00fcndig aus Todessehnsucht, sondern aus einer f\u00fcr Au\u00dfenstehende schlicht unbegreiflichen Liebe zu dieser T\u00e4tigkeit.\nDer Alpinist. Ab 17.2. im Kino. Johannes Rhomberg\nMore in this category: \u00ab screening Room - Zappa Screening Room - Der Mann, der seine Haut verkaufte \u00bb", "Sie stimmen zu, dass die im Rahmen der Registrierung erhobenen Daten in einer Datenbank gespeichert werden. Diese Daten werden nicht an Dritte weitergegeben.\nDieses System verwendet Cookies, um Informationen auf Ihrem Computer zu speichern. Diese Cookies enthalten keine pers\u00f6nlichen Informationen, sondern dienen ausschlie\u00dflich Ihrem Komfort.\nLayout-Daten k\u00f6nnen Sie auf Anfrage und nach der Freischaltung kostenfrei herunterladen. Die Feindaten werden Ihnen nach der Preisabstimmung in Ihrem pers\u00f6nlichen Kundenordner zum Download bereitgestellt oder bei Einzelbildern mit e-mail zugesandt.\nNach der Registrierung und Anmeldung mit Ihrem Benutzernamen und Passwort k\u00f6nne Sie Bilder ausw\u00e4hlen und zum Leuchtkasten hinzuf\u00fcgen. Den Preis f\u00fcr die Nutzung einzelner Bilder k\u00f6nnen Sie erfragen, indem Sie auf den Link \"Anfrage\" in der Gro\u00dfansicht des jeweiligen Bildes klicken. Nachdem Sie das Formular ausgef\u00fcllt und abgeschickt haben, bekommen Sie von uns so bald wie m\u00f6glich einen Preis genannt. Alternativ k\u00f6nnen Sie sich f\u00fcr eine kostenlose Preisberechnung mit uns per email in Verbindung setzen oder per Telefon.\nDie Preisberechnung basiert auf den Honorarrichtlinien der Mittelstandsgemeinschaft Foto-Marketing (MFM). Der Preis wird nach bestimmten Kriterien der Bildnutzung (Verwendungszweck, Abbildungsgr\u00f6\u00dfe, Auflage etc.) berechnet und gilt grunds\u00e4tzlich f\u00fcr eine einmalige Nutzung auf Grundlage unserer AGB. Mehrfachnutzungen und Bildsperrungen bed\u00fcrfen besonderer Regelungen und m\u00fcssen im Einzelfall mit uns verhandelt werden.\nNeukunden bitten wir vor der \u00dcbermittlung der Feindaten um Vorauszahlung mit Kreditkarte (Die Abwicklung erfolgt gesichtert \u00fcber Paypal) oder \u00dcberweisung.\nF\u00fcr nicht genutzte, \u00fcbermittelte Feindaten berechnen wir 10 EUR pro Bild. Durch das Abschlie\u00dfen der Registrierung stimmen Sie zus\u00e4tzlich den AGB zu.", "Dies ist eine Beispiel-Seite. Sie unterscheidet sich von Beitr\u00e4gen, da sie stets an derselben Stelle bleibt und (bei den meisten Themes) in der Website-Navigation angezeigt wird. Die meisten starten mit einem Impressum, der Datenschutzerkl\u00e4rung oder einer \u201e\u00dcber uns\u201c-Seite, um sich potenziellen Besuchern der Website vorzustellen. Dort k\u00f6nnte zum Beispiel stehen:\nHallo! Tags\u00fcber arbeite ich als Fahrradkurier, nachts bin ich ein aufstrebender Schauspieler und dies hier ist meine Website. Ich lebe in Berlin, habe einen gro\u00dfen Hund namens Jack, mag Pi\u00f1a Coladas, jedoch weniger (ohne Schirm) im Regen stehen gelassen zu werden.\n\u2026 oder so etwas wie:\nDas Unternehmen XYZ wurde 1971 gegr\u00fcndet und versorgt die \u00d6ffentlichkeit seither mit qualitativ hochwertigen Produkten. An seinem Standort in einer kleinen Gro\u00dfstadt besch\u00e4ftigt der Betrieb \u00fcber 2.000 Menschen und unterst\u00fctzt die Stadtbewohner in vielfacher Hinsicht.\nAls neuer WordPress-Benutzer solltest du dein Dashboard aufrufen, um diese Seite zu l\u00f6schen und neue Seiten und Beitr\u00e4ge f\u00fcr deine Website erstellen. Viel Spa\u00df!", "Die folgenden Hinweise geben einen einfachen \u00dcberblick dar\u00fcber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie pers\u00f6nlich identifiziert werden k\u00f6nnen. Ausf\u00fchrliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgef\u00fchrten Datenschutzerkl\u00e4rung.\nDatenerfassung auf dieser Website\nWer ist verantwortlich f\u00fcr die Datenerfassung auf dieser Website?\nDie Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten k\u00f6nnen Sie dem Abschnitt \u201eHinweis zur Verantwortlichen Stelle\u201c in dieser Datenschutzerkl\u00e4rung entnehmen.\nWie erfassen wir Ihre Daten?\nIhre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen. Hierbei kann es sich z. B. um Daten handeln, die Sie in ein Kontaktformular eingeben.\nAndere Daten werden automatisch oder nach Ihrer Einwilligung beim Besuch der Website durch unsere IT-Systeme erfasst. Das sind vor allem technische Daten (z. B. Internetbrowser, Betriebssystem oder Uhrzeit des Seitenaufrufs). Die Erfassung dieser Daten erfolgt automatisch, sobald Sie diese Website betreten.\nWof\u00fcr nutzen wir Ihre Daten?\nEin Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gew\u00e4hrleisten. Andere Daten k\u00f6nnen zur Analyse Ihres Nutzerverhaltens verwendet werden.\nWelche Rechte haben Sie bez\u00fcglich Ihrer Daten?\nSie haben jederzeit das Recht, unentgeltlich Auskunft \u00fcber Herkunft, Empf\u00e4nger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Sie haben au\u00dferdem ein Recht, die Berichtigung oder L\u00f6schung dieser Daten zu verlangen. Wenn Sie eine Einwilligung zur Datenverarbeitung erteilt haben, k\u00f6nnen Sie diese Einwilligung jederzeit f\u00fcr die Zukunft widerrufen. Au\u00dferdem haben Sie das Recht, unter bestimmten Umst\u00e4nden die Einschr\u00e4nkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Des Weiteren steht Ihnen ein Beschwerderecht bei der zust\u00e4ndigen Aufsichtsbeh\u00f6rde zu.\nHierzu sowie zu weiteren Fragen zum Thema Datenschutz k\u00f6nnen Sie sich jederzeit an uns wenden.\nAnalyse-Tools und Tools von Dritt\u00adanbietern\nBeim Besuch dieser Website kann Ihr Surf-Verhalten statistisch ausgewertet werden. Das geschieht vor allem mit sogenannten Analyseprogrammen.\nDetaillierte Informationen zu diesen Analyseprogrammen finden Sie in der folgenden Datenschutzerkl\u00e4rung.\n2. Hosting\nStrato\nWir hosten unsere Website bei Strato. Anbieter ist die Strato AG, Otto-Ostrowski-Stra\u00dfe 7, 10249 Berlin (nachfolgend \u201eStrato\u201c). Wenn Sie unsere Website besuchen, erfasst Strato verschiedene Logfiles inklusive Ihrer IP-Adressen.\nWeitere Informationen entnehmen Sie der Datenschutzerkl\u00e4rung von Strato: https://www.strato.de/datenschutz/.\nDie Verwendung von Strato erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Wir haben ein berechtigtes Interesse an einer m\u00f6glichst zuverl\u00e4ssigen Darstellung unserer Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endger\u00e4t des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nAuftragsverarbeitung\nWir haben einen Vertrag \u00fcber Auftragsverarbeitung (AVV) mit dem oben genannten Anbieter geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gew\u00e4hrleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.\n3. Allgemeine Hinweise und Pflicht\u00adinformationen\nDatenschutz\nDie Betreiber dieser Seiten nehmen den Schutz Ihrer pers\u00f6nlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend den gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerkl\u00e4rung.\nWenn Sie diese Website benutzen, werden verschiedene personenbezogene Daten erhoben. Personenbezogene Daten sind Daten, mit denen Sie pers\u00f6nlich identifiziert werden k\u00f6nnen. Die vorliegende Datenschutzerkl\u00e4rung erl\u00e4utert, welche Daten wir erheben und wof\u00fcr wir sie nutzen. Sie erl\u00e4utert auch, wie und zu welchem Zweck das geschieht.\nWir weisen darauf hin, dass die Daten\u00fcbertragung im Internet (z. B. bei der Kommunikation per E-Mail) Sicherheitsl\u00fccken aufweisen kann. Ein l\u00fcckenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht m\u00f6glich.\nHinweis zur verantwortlichen Stelle\nDie verantwortliche Stelle f\u00fcr die Datenverarbeitung auf dieser Website ist:\nTriskellum - Sascha Krysztofiak\nIm Wehrfeld 10\n53757 Sankt Augustin\nTelefon: 02241-204573\nE-Mail: Diese E-Mail-Adresse ist vor Spambots gesch\u00fctzt! Zur Anzeige muss JavaScript eingeschaltet sein!\nVerantwortliche Stelle ist die nat\u00fcrliche oder juristische Person, die allein oder gemeinsam mit anderen \u00fcber die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten (z. B. Namen, E-Mail-Adressen o. \u00c4.) entscheidet.\nSpeicherdauer\nSoweit innerhalb dieser Datenschutzerkl\u00e4rung keine speziellere Speicherdauer genannt wurde, verbleiben Ihre personenbezogenen Daten bei uns, bis der Zweck f\u00fcr die Datenverarbeitung entf\u00e4llt. Wenn Sie ein berechtigtes L\u00f6schersuchen geltend machen oder eine Einwilligung zur Datenverarbeitung widerrufen, werden Ihre Daten gel\u00f6scht, sofern wir keine anderen rechtlich zul\u00e4ssigen Gr\u00fcnde f\u00fcr die Speicherung Ihrer personenbezogenen Daten haben (z. B. steuer- oder handelsrechtliche Aufbewahrungsfristen); im letztgenannten Fall erfolgt die L\u00f6schung nach Fortfall dieser Gr\u00fcnde.\nAllgemeine Hinweise zu den Rechtsgrundlagen der Datenverarbeitung auf dieser Website\nSofern Sie in die Datenverarbeitung eingewilligt haben, verarbeiten wir Ihre personenbezogenen Daten auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO bzw. Art. 9 Abs. 2 lit. a DSGVO, sofern besondere Datenkategorien nach Art. 9 Abs. 1 DSGVO verarbeitet werden. Im Falle einer ausdr\u00fccklichen Einwilligung in die \u00dcbertragung personenbezogener Daten in Drittstaaten erfolgt die Datenverarbeitung au\u00dferdem auf Grundlage von Art. 49 Abs. 1 lit. a DSGVO. Sofern Sie in die Speicherung von Cookies oder in den Zugriff auf Informationen in Ihr Endger\u00e4t (z. B. via Device-Fingerprinting) eingewilligt haben, erfolgt die Datenverarbeitung zus\u00e4tzlich auf Grundlage von \u00a7 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Sind Ihre Daten zur Vertragserf\u00fcllung oder zur Durchf\u00fchrung vorvertraglicher Ma\u00dfnahmen erforderlich, verarbeiten wir Ihre Daten auf Grundlage des Art. 6 Abs. 1 lit. b DSGVO. Des Weiteren verarbeiten wir Ihre Daten, sofern diese zur Erf\u00fcllung einer rechtlichen Verpflichtung erforderlich sind auf Grundlage von Art. 6 Abs. 1 lit. c DSGVO. Die Datenverarbeitung kann ferner auf Grundlage unseres berechtigten Interesses nach Art. 6 Abs. 1 lit. f DSGVO erfolgen. \u00dcber die jeweils im Einzelfall einschl\u00e4gigen Rechtsgrundlagen wird in den folgenden Abs\u00e4tzen dieser Datenschutzerkl\u00e4rung informiert.\nHinweis zur Datenweitergabe in die USA und sonstige Drittstaaten\nWir verwenden unter anderem Tools von Unternehmen mit Sitz in den USA oder sonstigen datenschutzrechtlich nicht sicheren Drittstaaten. Wenn diese Tools aktiv sind, k\u00f6nnen Ihre personenbezogene Daten in diese Drittstaaten \u00fcbertragen und dort verarbeitet werden. Wir weisen darauf hin, dass in diesen L\u00e4ndern kein mit der EU vergleichbares Datenschutzniveau garantiert werden kann. Beispielsweise sind US-Unternehmen dazu verpflichtet, personenbezogene Daten an Sicherheitsbeh\u00f6rden herauszugeben, ohne dass Sie als Betroffener hiergegen gerichtlich vorgehen k\u00f6nnten. Es kann daher nicht ausgeschlossen werden, dass US-Beh\u00f6rden (z. B. Geheimdienste) Ihre auf US-Servern befindlichen Daten zu \u00dcberwachungszwecken verarbeiten, auswerten und dauerhaft speichern. Wir haben auf diese Verarbeitungst\u00e4tigkeiten keinen Einfluss.\nWiderruf Ihrer Einwilligung zur Datenverarbeitung\nViele Datenverarbeitungsvorg\u00e4nge sind nur mit Ihrer ausdr\u00fccklichen Einwilligung m\u00f6glich. Sie k\u00f6nnen eine bereits erteilte Einwilligung jederzeit widerrufen. Die Rechtm\u00e4\u00dfigkeit der bis zum Widerruf erfolgten Datenverarbeitung bleibt vom Widerruf unber\u00fchrt.\nWiderspruchsrecht gegen die Datenerhebung in besonderen F\u00e4llen sowie gegen Direktwerbung (Art. 21 DSGVO)\nWENN DIE DATENVERARBEITUNG AUF GRUNDLAGE VON ART. 6 ABS. 1 LIT. E ODER F DSGVO ERFOLGT, HABEN SIE JEDERZEIT DAS RECHT, AUS GR\u00dcNDEN, DIE SICH AUS IHRER BESONDEREN SITUATION ERGEBEN, GEGEN DIE VERARBEITUNG IHRER PERSONENBEZOGENEN DATEN WIDERSPRUCH EINZULEGEN; DIES GILT AUCH F\u00dcR EIN AUF DIESE BESTIMMUNGEN GEST\u00dcTZTES PROFILING. DIE JEWEILIGE RECHTSGRUNDLAGE, AUF DENEN EINE VERARBEITUNG BERUHT, ENTNEHMEN SIE DIESER DATENSCHUTZERKL\u00c4RUNG. WENN SIE WIDERSPRUCH EINLEGEN, WERDEN WIR IHRE BETROFFENEN PERSONENBEZOGENEN DATEN NICHT MEHR VERARBEITEN, ES SEI DENN, WIR K\u00d6NNEN ZWINGENDE SCHUTZW\u00dcRDIGE GR\u00dcNDE F\u00dcR DIE VERARBEITUNG NACHWEISEN, DIE IHRE INTERESSEN, RECHTE UND FREIHEITEN \u00dcBERWIEGEN ODER DIE VERARBEITUNG DIENT DER GELTENDMACHUNG, AUS\u00dcBUNG ODER VERTEIDIGUNG VON RECHTSANSPR\u00dcCHEN (WIDERSPRUCH NACH ART. 21 ABS. 1 DSGVO).\nWERDEN IHRE PERSONENBEZOGENEN DATEN VERARBEITET, UM DIREKTWERBUNG ZU BETREIBEN, SO HABEN SIE DAS RECHT, JEDERZEIT WIDERSPRUCH GEGEN DIE VERARBEITUNG SIE BETREFFENDER PERSONENBEZOGENER DATEN ZUM ZWECKE DERARTIGER WERBUNG EINZULEGEN; DIES GILT AUCH F\u00dcR DAS PROFILING, SOWEIT ES MIT SOLCHER DIREKTWERBUNG IN VERBINDUNG STEHT. WENN SIE WIDERSPRECHEN, WERDEN IHRE PERSONENBEZOGENEN DATEN ANSCHLIESSEND NICHT MEHR ZUM ZWECKE DER DIREKTWERBUNG VERWENDET (WIDERSPRUCH NACH ART. 21 ABS. 2 DSGVO).\nBeschwerde\u00adrecht bei der zust\u00e4ndigen Aufsichts\u00adbeh\u00f6rde\nIm Falle von Verst\u00f6\u00dfen gegen die DSGVO steht den Betroffenen ein Beschwerderecht bei einer Aufsichtsbeh\u00f6rde, insbesondere in dem Mitgliedstaat ihres gew\u00f6hnlichen Aufenthalts, ihres Arbeitsplatzes oder des Orts des mutma\u00dflichen Versto\u00dfes zu. Das Beschwerderecht besteht unbeschadet anderweitiger verwaltungsrechtlicher oder gerichtlicher Rechtsbehelfe.\nRecht auf Daten\u00ad\u00fcbertrag\u00adbarkeit\nSie haben das Recht, Daten, die wir auf Grundlage Ihrer Einwilligung oder in Erf\u00fcllung eines Vertrags automatisiert verarbeiten, an sich oder an einen Dritten in einem g\u00e4ngigen, maschinenlesbaren Format aush\u00e4ndigen zu lassen. Sofern Sie die direkte \u00dcbertragung der Daten an einen anderen Verantwortlichen verlangen, erfolgt dies nur, soweit es technisch machbar ist.\nAuskunft, L\u00f6schung und Berichtigung\nSie haben im Rahmen der geltenden gesetzlichen Bestimmungen jederzeit das Recht auf unentgeltliche Auskunft \u00fcber Ihre gespeicherten personenbezogenen Daten, deren Herkunft und Empf\u00e4nger und den Zweck der Datenverarbeitung und ggf. ein Recht auf Berichtigung oder L\u00f6schung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene Daten k\u00f6nnen Sie sich jederzeit an uns wenden.\nRecht auf Einschr\u00e4nkung der Verarbeitung\nSie haben das Recht, die Einschr\u00e4nkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Hierzu k\u00f6nnen Sie sich jederzeit an uns wenden. Das Recht auf Einschr\u00e4nkung der Verarbeitung besteht in folgenden F\u00e4llen:\nWenn Sie die Richtigkeit Ihrer bei uns gespeicherten personenbezogenen Daten bestreiten, ben\u00f6tigen wir in der Regel Zeit, um dies zu \u00fcberpr\u00fcfen. F\u00fcr die Dauer der Pr\u00fcfung haben Sie das Recht, die Einschr\u00e4nkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.\nWenn die Verarbeitung Ihrer personenbezogenen Daten unrechtm\u00e4\u00dfig geschah/geschieht, k\u00f6nnen Sie statt der L\u00f6schung die Einschr\u00e4nkung der Datenverarbeitung verlangen.\nWenn wir Ihre personenbezogenen Daten nicht mehr ben\u00f6tigen, Sie sie jedoch zur Aus\u00fcbung, Verteidigung oder Geltendmachung von Rechtsanspr\u00fcchen ben\u00f6tigen, haben Sie das Recht, statt der L\u00f6schung die Einschr\u00e4nkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.\nWenn Sie einen Widerspruch nach Art. 21 Abs. 1 DSGVO eingelegt haben, muss eine Abw\u00e4gung zwischen Ihren und unseren Interessen vorgenommen werden. Solange noch nicht feststeht, wessen Interessen \u00fcberwiegen, haben Sie das Recht, die Einschr\u00e4nkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.\nWenn Sie die Verarbeitung Ihrer personenbezogenen Daten eingeschr\u00e4nkt haben, d\u00fcrfen diese Daten \u2013 von ihrer Speicherung abgesehen \u2013 nur mit Ihrer Einwilligung oder zur Geltendmachung, Aus\u00fcbung oder Verteidigung von Rechtsanspr\u00fcchen oder zum Schutz der Rechte einer anderen nat\u00fcrlichen oder juristischen Person oder aus Gr\u00fcnden eines wichtigen \u00f6ffentlichen Interesses der Europ\u00e4ischen Union oder eines Mitgliedstaats verarbeitet werden.\nSSL- bzw. TLS-Verschl\u00fcsselung\nDiese Seite nutzt aus Sicherheitsgr\u00fcnden und zum Schutz der \u00dcbertragung vertraulicher Inhalte, wie zum Beispiel Bestellungen oder Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL- bzw. TLS-Verschl\u00fcsselung. Eine verschl\u00fcsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von \u201ehttp://\u201c auf \u201ehttps://\u201c wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.\nWenn die SSL- bzw. TLS-Verschl\u00fcsselung aktiviert ist, k\u00f6nnen die Daten, die Sie an uns \u00fcbermitteln, nicht von Dritten mitgelesen werden.\nWiderspruch gegen Werbe-E-Mails\nDer Nutzung von im Rahmen der Impressumspflicht ver\u00f6ffentlichten Kontaktdaten zur \u00dcbersendung von nicht ausdr\u00fccklich angeforderter Werbung und Informationsmaterialien wird hiermit widersprochen. Die Betreiber der Seiten behalten sich ausdr\u00fccklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-E-Mails, vor.\n4. Datenerfassung auf dieser Website\nCookies\nUnsere Internetseiten verwenden so genannte \u201eCookies\u201c. Cookies sind kleine Textdateien und richten auf Ihrem Endger\u00e4t keinen Schaden an. Sie werden entweder vor\u00fcbergehend f\u00fcr die Dauer einer Sitzung (Session-Cookies) oder dauerhaft (permanente Cookies) auf Ihrem Endger\u00e4t gespeichert. Session-Cookies werden nach Ende Ihres Besuchs automatisch gel\u00f6scht. Permanente Cookies bleiben auf Ihrem Endger\u00e4t gespeichert, bis Sie diese selbst l\u00f6schen oder eine automatische L\u00f6schung durch Ihren Webbrowser erfolgt.\nTeilweise k\u00f6nnen auch Cookies von Drittunternehmen auf Ihrem Endger\u00e4t gespeichert werden, wenn Sie unsere Seite betreten (Third-Party-Cookies). Diese erm\u00f6glichen uns oder Ihnen die Nutzung bestimmter Dienstleistungen des Drittunternehmens (z. B. Cookies zur Abwicklung von Zahlungsdienstleistungen).\nCookies haben verschiedene Funktionen. Zahlreiche Cookies sind technisch notwendig, da bestimmte Websitefunktionen ohne diese nicht funktionieren w\u00fcrden (z. B. die Warenkorbfunktion oder die Anzeige von Videos). Andere Cookies dienen dazu, das Nutzerverhalten auszuwerten oder Werbung anzuzeigen.\nCookies, die zur Durchf\u00fchrung des elektronischen Kommunikationsvorgangs, zur Bereitstellung bestimmter, von Ihnen erw\u00fcnschter Funktionen (z. B. f\u00fcr die Warenkorbfunktion) oder zur Optimierung der Website (z. B. Cookies zur Messung des Webpublikums) erforderlich sind (notwendige Cookies), werden auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO gespeichert, sofern keine andere Rechtsgrundlage angegeben wird. Der Websitebetreiber hat ein berechtigtes Interesse an der Speicherung von notwendigen Cookies zur technisch fehlerfreien und optimierten Bereitstellung seiner Dienste. Sofern eine Einwilligung zur Speicherung von Cookies und vergleichbaren Wiedererkennungstechnologien abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage dieser Einwilligung (Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG); die Einwilligung ist jederzeit widerrufbar.\nSie k\u00f6nnen Ihren Browser so einstellen, dass Sie \u00fcber das Setzen von Cookies informiert werden und Cookies nur im Einzelfall erlauben, die Annahme von Cookies f\u00fcr bestimmte F\u00e4lle oder generell ausschlie\u00dfen sowie das automatische L\u00f6schen der Cookies beim Schlie\u00dfen des Browsers aktivieren. Bei der Deaktivierung von Cookies kann die Funktionalit\u00e4t dieser Website eingeschr\u00e4nkt sein.\nSoweit Cookies von Drittunternehmen oder zu Analysezwecken eingesetzt werden, werden wir Sie hier\u00fcber im Rahmen dieser Datenschutzerkl\u00e4rung gesondert informieren und ggf. eine Einwilligung abfragen.\nEinwilligung mit Usercentrics\nDiese Website nutzt die Consent-Technologie von Usercentrics, um Ihre Einwilligung zur Speicherung bestimmter Cookies auf Ihrem Endger\u00e4t oder zum Einsatz bestimmter Technologien einzuholen und diese datenschutzkonform zu dokumentieren. Anbieter dieser Technologie ist die Usercentrics GmbH, Sendlinger Stra\u00dfe 7, 80331 M\u00fcnchen, Website: https://usercentrics.com/de/ (im Folgenden \u201eUsercentrics\u201c).\nWenn Sie unsere Website betreten, werden folgende personenbezogene Daten an Usercentrics \u00fcbertragen:\nIhre Einwilligung(en) bzw. der Widerruf Ihrer Einwilligung(en)\nIhre IP-Adresse\nInformationen \u00fcber Ihren Browser\nInformationen \u00fcber Ihr Endger\u00e4t\nZeitpunkt Ihres Besuchs auf der Website\nDes Weiteren speichert Usercentrics ein Cookie in Ihrem Browser, um Ihnen die erteilten Einwilligungen bzw. deren Widerruf zuordnen zu k\u00f6nnen. Die so erfassten Daten werden gespeichert, bis Sie uns zur L\u00f6schung auffordern, das Usercentrics-Cookie selbst l\u00f6schen oder der Zweck f\u00fcr die Datenspeicherung entf\u00e4llt. Zwingende gesetzliche Aufbewahrungspflichten bleiben unber\u00fchrt.\nDer Einsatz von Usercentrics erfolgt, um die gesetzlich vorgeschriebenen Einwilligungen f\u00fcr den Einsatz bestimmter Technologien einzuholen. Rechtsgrundlage hierf\u00fcr ist Art. 6 Abs. 1 lit. c DSGVO.\nAuftragsverarbeitung\nWir haben einen Vertrag \u00fcber Auftragsverarbeitung (AVV) mit dem oben genannten Anbieter geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gew\u00e4hrleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.\nServer-Log-Dateien\nDer Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien, die Ihr Browser automatisch an uns \u00fcbermittelt. Dies sind:\nBrowsertyp und Browserversion\nverwendetes Betriebssystem\nReferrer URL\nHostname des zugreifenden Rechners\nUhrzeit der Serveranfrage\nIP-Adresse\nEine Zusammenf\u00fchrung dieser Daten mit anderen Datenquellen wird nicht vorgenommen.\nDie Erfassung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an der technisch fehlerfreien Darstellung und der Optimierung seiner Website \u2013 hierzu m\u00fcssen die Server-Log-Files erfasst werden.\nKontaktformular\nWenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und f\u00fcr den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.\nDie Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erf\u00fcllung eines Vertrags zusammenh\u00e4ngt oder zur Durchf\u00fchrung vorvertraglicher Ma\u00dfnahmen erforderlich ist. In allen \u00fcbrigen F\u00e4llen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.\nDie von Ihnen im Kontaktformular eingegebenen Daten verbleiben bei uns, bis Sie uns zur L\u00f6schung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck f\u00fcr die Datenspeicherung entf\u00e4llt (z. B. nach abgeschlossener Bearbeitung Ihrer Anfrage). Zwingende gesetzliche Bestimmungen \u2013 insbesondere Aufbewahrungsfristen \u2013 bleiben unber\u00fchrt.\nAnfrage per E-Mail, Telefon oder Telefax\nWenn Sie uns per E-Mail, Telefon oder Telefax kontaktieren, wird Ihre Anfrage inklusive aller daraus hervorgehenden personenbezogenen Daten (Name, Anfrage) zum Zwecke der Bearbeitung Ihres Anliegens bei uns gespeichert und verarbeitet. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.\nDie Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erf\u00fcllung eines Vertrags zusammenh\u00e4ngt oder zur Durchf\u00fchrung vorvertraglicher Ma\u00dfnahmen erforderlich ist. In allen \u00fcbrigen F\u00e4llen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.\nDie von Ihnen an uns per Kontaktanfragen \u00fcbersandten Daten verbleiben bei uns, bis Sie uns zur L\u00f6schung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck f\u00fcr die Datenspeicherung entf\u00e4llt (z. B. nach abgeschlossener Bearbeitung Ihres Anliegens). Zwingende gesetzliche Bestimmungen \u2013 insbesondere gesetzliche Aufbewahrungsfristen \u2013 bleiben unber\u00fchrt.\nRegistrierung auf dieser Website\nSie k\u00f6nnen sich auf dieser Website registrieren, um zus\u00e4tzliche Funktionen auf der Seite zu nutzen. Die dazu eingegebenen Daten verwenden wir nur zum Zwecke der Nutzung des jeweiligen Angebotes oder Dienstes, f\u00fcr den Sie sich registriert haben. Die bei der Registrierung abgefragten Pflichtangaben m\u00fcssen vollst\u00e4ndig angegeben werden. Anderenfalls werden wir die Registrierung ablehnen.\nF\u00fcr wichtige \u00c4nderungen etwa beim Angebotsumfang oder bei technisch notwendigen \u00c4nderungen nutzen wir die bei der Registrierung angegebene E-Mail-Adresse, um Sie auf diesem Wege zu informieren.\nDie Verarbeitung der bei der Registrierung eingegebenen Daten erfolgt zum Zwecke der Durchf\u00fchrung des durch die Registrierung begr\u00fcndeten Nutzungsverh\u00e4ltnisses und ggf. zur Anbahnung weiterer Vertr\u00e4ge (Art. 6 Abs. 1 lit. b DSGVO).\nDie bei der Registrierung erfassten Daten werden von uns gespeichert, solange Sie auf dieser Website registriert sind und werden anschlie\u00dfend gel\u00f6scht. Gesetzliche Aufbewahrungsfristen bleiben unber\u00fchrt.\n5. Soziale Medien\neRecht24 Safe Sharing Tool\nDie Inhalte auf dieser Website k\u00f6nnen datenschutzkonform in sozialen Netzwerken wie Facebook, Twitter & Co. geteilt werden. Diese Seite nutzt daf\u00fcr das eRecht24 Safe Sharing Tool. Dieses Tool stellt den direkten Kontakt zwischen den Netzwerken und Nutzern erst dann her, wenn der Nutzer aktiv auf einen dieser Button klickt. Der Klick auf den Button stellt eine Einwilligung im Sinne des Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG dar. Diese Einwilligung kann jederzeit mit Wirkung f\u00fcr die Zukunft widerrufen werden.\nEine automatische \u00dcbertragung von Nutzerdaten an die Betreiber dieser Plattformen erfolgt durch dieses Tool nicht. Ist der Nutzer bei einem der sozialen Netzwerke angemeldet, erscheint bei der Nutzung der Social-Media-Elemente von Facebook, Twitter & Co. ein Informations-Fenster, in dem der Nutzer den Text vor dem Absenden best\u00e4tigen kann.\nUnsere Nutzer k\u00f6nnen die Inhalte dieser Seite datenschutzkonform in sozialen Netzwerken teilen, ohne dass komplette Surf-Profile durch die Betreiber der Netzwerke erstellt werden.\nDer Einsatz des Dienstes erfolgt, um die gesetzlich vorgeschriebenen Einwilligungen f\u00fcr den Einsatz bestimmter Technologien einzuholen. Rechtsgrundlage hierf\u00fcr ist Art. 6 Abs. 1 lit. c DSGVO.\nFacebook\nAuf dieser Website sind Elemente des sozialen Netzwerks Facebook integriert. Anbieter dieses Dienstes ist die Meta Platforms Ireland Limited, 4 Grand Canal Square, Dublin 2, Irland. Die erfassten Daten werden nach Aussage von Facebook jedoch auch in die USA und in andere Drittl\u00e4nder \u00fcbertragen.\nEine \u00dcbersicht \u00fcber die Facebook Social-Media-Elemente finden Sie hier: https://developers.facebook.com/docs/plugins/?locale=de_DE.\nWenn das Social-Media-Element aktiv ist, wird eine direkte Verbindung zwischen Ihrem Endger\u00e4t und dem Facebook-Server hergestellt. Facebook erh\u00e4lt dadurch die Information, dass Sie mit Ihrer IP-Adresse diese Website besucht haben. Wenn Sie den Facebook \u201eLike-Button\u201c anklicken, w\u00e4hrend Sie in Ihrem Facebook-Account eingeloggt sind, k\u00f6nnen Sie die Inhalte dieser Website auf Ihrem Facebook-Profil verlinken. Dadurch kann Facebook den Besuch dieser Website Ihrem Benutzerkonto zuordnen. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der \u00fcbermittelten Daten sowie deren Nutzung durch Facebook erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerkl\u00e4rung von Facebook unter: https://de-de.facebook.com/privacy/explanation.\nSoweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung des Dienstes auf Grundlage unseres berechtigten Interesses an einer m\u00f6glichst umfassenden Sichtbarkeit in den Sozialen Medien.\nSoweit mit Hilfe des hier beschriebenen Tools personenbezogene Daten auf unserer Website erfasst und an Facebook weitergeleitet werden, sind wir und die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland gemeinsam f\u00fcr diese Datenverarbeitung verantwortlich (Art. 26 DSGVO). Die gemeinsame Verantwortlichkeit beschr\u00e4nkt sich dabei ausschlie\u00dflich auf die Erfassung der Daten und deren Weitergabe an Facebook. Die nach der Weiterleitung erfolgende Verarbeitung durch Facebook ist nicht Teil der gemeinsamen Verantwortung. Die uns gemeinsam obliegenden Verpflichtungen wurden in einer Vereinbarung \u00fcber gemeinsame Verarbeitung festgehalten. Den Wortlaut der Vereinbarung finden Sie unter: https://www.facebook.com/legal/controller_addendum. Laut dieser Vereinbarung sind wir f\u00fcr die Erteilung der Datenschutzinformationen beim Einsatz des Facebook-Tools und f\u00fcr die datenschutzrechtlich sichere Implementierung des Tools auf unserer Website verantwortlich. F\u00fcr die Datensicherheit der Facebook-Produkte ist Facebook verantwortlich. Betroffenenrechte (z. B. Auskunftsersuchen) hinsichtlich der bei Facebook verarbeiteten Daten k\u00f6nnen Sie direkt bei Facebook geltend machen. Wenn Sie die Betroffenenrechte bei uns geltend machen, sind wir verpflichtet, diese an Facebook weiterzuleiten.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum, https://de-de.facebook.com/help/566994660333381 und https://www.facebook.com/policy.php.\nTwitter\nAuf dieser Website sind Funktionen des Dienstes Twitter eingebunden. Diese Funktionen werden angeboten durch die Twitter International Company, One Cumberland Place, Fenian Street, Dublin 2, D02 AX07, Irland.\nWenn das Social-Media-Element aktiv ist, wird eine direkte Verbindung zwischen Ihrem Endger\u00e4t und dem Twitter-Server hergestellt. Twitter erh\u00e4lt dadurch Informationen \u00fcber den Besuch dieser Website durch Sie. Durch das Benutzen von Twitter und der Funktion \u201eRe-Tweet\u201c werden die von Ihnen besuchten Websites mit Ihrem Twitter-Account verkn\u00fcpft und anderen Nutzern bekannt gegeben. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der \u00fcbermittelten Daten sowie deren Nutzung durch Twitter erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerkl\u00e4rung von Twitter unter: https://twitter.com/de/privacy.\nSoweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung des Dienstes auf Grundlage unseres berechtigten Interesses an einer m\u00f6glichst umfassenden Sichtbarkeit in den Sozialen Medien.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://gdpr.twitter.com/en/controller-to-controller-transfers.html.\nIhre Datenschutzeinstellungen bei Twitter k\u00f6nnen Sie in den Konto-Einstellungen unter https://twitter.com/account/settings \u00e4ndern.\nInstagram\nAuf dieser Website sind Funktionen des Dienstes Instagram eingebunden. Diese Funktionen werden angeboten durch die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland.\nWenn das Social-Media-Element aktiv ist, wird eine direkte Verbindung zwischen Ihrem Endger\u00e4t und dem Instagram-Server hergestellt. Instagram erh\u00e4lt dadurch Informationen \u00fcber den Besuch dieser Website durch Sie.\nWenn Sie in Ihrem Instagram-Account eingeloggt sind, k\u00f6nnen Sie durch Anklicken des Instagram-Buttons die Inhalte dieser Website mit Ihrem Instagram-Profil verlinken. Dadurch kann Instagram den Besuch dieser Website Ihrem Benutzerkonto zuordnen. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der \u00fcbermittelten Daten sowie deren Nutzung durch Instagram erhalten.\nSoweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung des Dienstes auf Grundlage unseres berechtigten Interesses an einer m\u00f6glichst umfassenden Sichtbarkeit in den Sozialen Medien.\nSoweit mit Hilfe des hier beschriebenen Tools personenbezogene Daten auf unserer Website erfasst und an Facebook bzw. Instagram weitergeleitet werden, sind wir und die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland gemeinsam f\u00fcr diese Datenverarbeitung verantwortlich (Art. 26 DSGVO). Die gemeinsame Verantwortlichkeit beschr\u00e4nkt sich dabei ausschlie\u00dflich auf die Erfassung der Daten und deren Weitergabe an Facebook bzw. Instagram. Die nach der Weiterleitung erfolgende Verarbeitung durch Facebook bzw. Instagram ist nicht Teil der gemeinsamen Verantwortung. Die uns gemeinsam obliegenden Verpflichtungen wurden in einer Vereinbarung \u00fcber gemeinsame Verarbeitung festgehalten. Den Wortlaut der Vereinbarung finden Sie unter: https://www.facebook.com/legal/controller_addendum. Laut dieser Vereinbarung sind wir f\u00fcr die Erteilung der Datenschutzinformationen beim Einsatz des Facebook- bzw. Instagram-Tools und f\u00fcr die datenschutzrechtlich sichere Implementierung des Tools auf unserer Website verantwortlich. F\u00fcr die Datensicherheit der Facebook bzw. Instagram-Produkte ist Facebook verantwortlich. Betroffenenrechte (z. B. Auskunftsersuchen) hinsichtlich der bei Facebook bzw. Instagram verarbeiteten Daten k\u00f6nnen Sie direkt bei Facebook geltend machen. Wenn Sie die Betroffenenrechte bei uns geltend machen, sind wir verpflichtet, diese an Facebook weiterzuleiten.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum, https://help.instagram.com/519522125107875 und https://de-de.facebook.com/help/566994660333381.\nWeitere Informationen hierzu finden Sie in der Datenschutzerkl\u00e4rung von Instagram: https://instagram.com/about/legal/privacy/.\nLinkedIn\nDiese Website nutzt Elemente des Netzwerks LinkedIn. Anbieter ist die LinkedIn Ireland Unlimited Company, Wilton Plaza, Wilton Place, Dublin 2, Irland.\nBei jedem Abruf einer Seite dieser Website, die Elemente von LinkedIn enth\u00e4lt, wird eine Verbindung zu Servern von LinkedIn aufgebaut. LinkedIn wird dar\u00fcber informiert, dass Sie diese Website mit Ihrer IP-Adresse besucht haben. Wenn Sie den \u201eRecommend-Button\u201c von LinkedIn anklicken und in Ihrem Account bei LinkedIn eingeloggt sind, ist es LinkedIn m\u00f6glich, Ihren Besuch auf dieser Website Ihnen und Ihrem Benutzerkonto zuzuordnen. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der \u00fcbermittelten Daten sowie deren Nutzung durch LinkedIn haben.\nSoweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung des Dienstes auf Grundlage unseres berechtigten Interesses an einer m\u00f6glichst umfassenden Sichtbarkeit in den Sozialen Medien.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.linkedin.com/help/linkedin/answer/62538/datenubertragung-aus-der-eu-dem-ewr-und-der-schweiz?lang=de\nWeitere Informationen hierzu finden Sie in der Datenschutzerkl\u00e4rung von LinkedIn unter: https://www.linkedin.com/legal/privacy-policy.\nXING\nDiese Website nutzt Elemente des Netzwerks XING. Anbieter ist die New Work SE, Dammtorstra\u00dfe 30, 20354 Hamburg, Deutschland.\nBei jedem Abruf einer unserer Seiten, die Elemente von XING enth\u00e4lt, wird eine Verbindung zu Servern von XING hergestellt. Eine Speicherung von personenbezogenen Daten erfolgt dabei nach unserer Kenntnis nicht. Insbesondere werden keine IP-Adressen gespeichert oder das Nutzungsverhalten ausgewertet.\nSoweit eine Einwilligung (Consent) eingeholt wurde, erfolgt der Einsatz des o. g. Dienstes auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 TTDSG. Die Einwilligung ist jederzeit widerrufbar. Soweit keine Einwilligung eingeholt wurde, erfolgt die Verwendung des Dienstes auf Grundlage unseres berechtigten Interesses an einer m\u00f6glichst umfassenden Sichtbarkeit in den Sozialen Medien.\nWeitere Information zum Datenschutz und dem XING Share-Button finden Sie in der Datenschutzerkl\u00e4rung von XING unter: https://www.xing.com/app/share?op=data_protection.\n6. Analyse-Tools und Werbung\nGoogle Tag Manager\nWir setzen den Google Tag Manager ein. Anbieter ist die Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland.\nDer Google Tag Manager ist ein Tool, mit dessen Hilfe wir Tracking- oder Statistik-Tools und andere Technologien auf unserer Website einbinden k\u00f6nnen. Der Google Tag Manager selbst erstellt keine Nutzerprofile, speichert keine Cookies und nimmt keine eigenst\u00e4ndigen Analysen vor. Er dient lediglich der Verwaltung und Ausspielung der \u00fcber ihn eingebundenen Tools. Der Google Tag Manager erfasst jedoch Ihre IP-Adresse, die auch an das Mutterunternehmen von Google in die Vereinigten Staaten \u00fcbertragen werden kann.\nDer Einsatz des Google Tag Managers erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an einer schnellen und unkomplizierten Einbindung und Verwaltung verschiedener Tools auf seiner Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endger\u00e4t des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nGoogle Analytics\nDiese Website nutzt Funktionen des Webanalysedienstes Google Analytics. Anbieter ist die Google Ireland Limited (\u201eGoogle\u201c), Gordon House, Barrow Street, Dublin 4, Irland.\nGoogle Analytics erm\u00f6glicht es dem Websitebetreiber, das Verhalten der Websitebesucher zu analysieren. Hierbei erh\u00e4lt der Websitebetreiber verschiedene Nutzungsdaten, wie z. B. Seitenaufrufe, Verweildauer, verwendete Betriebssysteme und Herkunft des Nutzers. Diese Daten werden in einer User-ID zusammengefasst und dem jeweiligen Endger\u00e4t des Websitebesuchers zugeordnet.\nDes Weiteren k\u00f6nnen wir mit Google Analytics u. a. Ihre Maus- und Scrollbewegungen und Klicks aufzeichnen. Ferner verwendet Google Analytics verschiedene Modellierungsans\u00e4tze, um die erfassten Datens\u00e4tze zu erg\u00e4nzen und setzt Machine-Learning-Technologien bei der Datenanalyse ein.\nGoogle Analytics verwendet Technologien, die die Wiedererkennung des Nutzers zum Zwecke der Analyse des Nutzerverhaltens erm\u00f6glichen (z. B. Cookies oder Device-Fingerprinting). Die von Google erfassten Informationen \u00fcber die Benutzung dieser Website werden in der Regel an einen Server von Google in den USA \u00fcbertragen und dort gespeichert.\nDie Nutzung dieses Dienstes erfolgt auf Grundlage Ihrer Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://privacy.google.com/businesses/controllerterms/mccs/.\nBrowser Plugin\nSie k\u00f6nnen die Erfassung und Verarbeitung Ihrer Daten durch Google verhindern, indem Sie das unter dem folgenden Link verf\u00fcgbare Browser-Plugin herunterladen und installieren: https://tools.google.com/dlpage/gaoptout?hl=de.\nMehr Informationen zum Umgang mit Nutzerdaten bei Google Analytics finden Sie in der Datenschutzerkl\u00e4rung von Google: https://support.google.com/analytics/answer/6004245?hl=de.\nAuftragsverarbeitung\nWir haben mit Google einen Vertrag zur Auftragsverarbeitung abgeschlossen und setzen die strengen Vorgaben der deutschen Datenschutzbeh\u00f6rden bei der Nutzung von Google Analytics vollst\u00e4ndig um.\nGoogle Conversion-Tracking\nDiese Website nutzt Google Conversion Tracking. Anbieter ist die Google Ireland Limited (\u201eGoogle\u201c), Gordon House, Barrow Street, Dublin 4, Irland.\nMit Hilfe von Google-Conversion-Tracking k\u00f6nnen Google und wir erkennen, ob der Nutzer bestimmte Aktionen durchgef\u00fchrt hat. So k\u00f6nnen wir beispielsweise auswerten, welche Buttons auf unserer Website wie h\u00e4ufig geklickt und welche Produkte besonders h\u00e4ufig angesehen oder gekauft wurden. Diese Informationen dienen dazu, Conversion-Statistiken zu erstellen. Wir erfahren die Gesamtanzahl der Nutzer, die auf unsere Anzeigen geklickt haben und welche Aktionen sie durchgef\u00fchrt haben. Wir erhalten keine Informationen, mit denen wir den Nutzer pers\u00f6nlich identifizieren k\u00f6nnen. Google selbst nutzt zur Identifikation Cookies oder vergleichbare Wiedererkennungstechnologien.\nDie Nutzung dieses Dienstes erfolgt auf Grundlage Ihrer Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar.\nMehr Informationen zu Google Conversion-Tracking finden Sie in den Datenschutzbestimmungen von Google: https://policies.google.com/privacy?hl=de.\nFacebook Pixel\nDiese Website nutzt zur Konversionsmessung der Besucheraktions-Pixel von Facebook. Anbieter dieses Dienstes ist die Meta Platforms Ireland Limited, 4 Grand Canal Square, Dublin 2, Irland. Die erfassten Daten werden nach Aussage von Facebook jedoch auch in die USA und in andere Drittl\u00e4nder \u00fcbertragen.\nSo kann das Verhalten der Seitenbesucher nachverfolgt werden, nachdem diese durch Klick auf eine Facebook-Werbeanzeige auf die Website des Anbieters weitergeleitet wurden. Dadurch k\u00f6nnen die Wirksamkeit der Facebook-Werbeanzeigen f\u00fcr statistische und Marktforschungszwecke ausgewertet werden und zuk\u00fcnftige Werbema\u00dfnahmen optimiert werden.\nDie erhobenen Daten sind f\u00fcr uns als Betreiber dieser Website anonym, wir k\u00f6nnen keine R\u00fcckschl\u00fcsse auf die Identit\u00e4t der Nutzer ziehen. Die Daten werden aber von Facebook gespeichert und verarbeitet, sodass eine Verbindung zum jeweiligen Nutzerprofil m\u00f6glich ist und Facebook die Daten f\u00fcr eigene Werbezwecke, entsprechend der Facebook-Datenverwendungsrichtlinie verwenden kann. Dadurch kann Facebook das Schalten von Werbeanzeigen auf Seiten von Facebook sowie au\u00dferhalb von Facebook erm\u00f6glichen. Diese Verwendung der Daten kann von uns als Seitenbetreiber nicht beeinflusst werden.\nDie Nutzung dieses Dienstes erfolgt auf Grundlage Ihrer Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG. Die Einwilligung ist jederzeit widerrufbar.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum und https://de-de.facebook.com/help/566994660333381.\nSoweit mit Hilfe des hier beschriebenen Tools personenbezogene Daten auf unserer Website erfasst und an Facebook weitergeleitet werden, sind wir und die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland gemeinsam f\u00fcr diese Datenverarbeitung verantwortlich (Art. 26 DSGVO). Die gemeinsame Verantwortlichkeit beschr\u00e4nkt sich dabei ausschlie\u00dflich auf die Erfassung der Daten und deren Weitergabe an Facebook. Die nach der Weiterleitung erfolgende Verarbeitung durch Facebook ist nicht Teil der gemeinsamen Verantwortung. Die uns gemeinsam obliegenden Verpflichtungen wurden in einer Vereinbarung \u00fcber gemeinsame Verarbeitung festgehalten. Den Wortlaut der Vereinbarung finden Sie unter: https://www.facebook.com/legal/controller_addendum. Laut dieser Vereinbarung sind wir f\u00fcr die Erteilung der Datenschutzinformationen beim Einsatz des Facebook-Tools und f\u00fcr die datenschutzrechtlich sichere Implementierung des Tools auf unserer Website verantwortlich. F\u00fcr die Datensicherheit der Facebook-Produkte ist Facebook verantwortlich. Betroffenenrechte (z. B. Auskunftsersuchen) hinsichtlich der bei Facebook verarbeiteten Daten k\u00f6nnen Sie direkt bei Facebook geltend machen. Wenn Sie die Betroffenenrechte bei uns geltend machen, sind wir verpflichtet, diese an Facebook weiterzuleiten.\nIn den Datenschutzhinweisen von Facebook finden Sie weitere Hinweise zum Schutz Ihrer Privatsph\u00e4re: https://de-de.facebook.com/about/privacy/.\nSie k\u00f6nnen au\u00dferdem die Remarketing-Funktion \u201eCustom Audiences\u201c im Bereich Einstellungen f\u00fcr Werbeanzeigen unter https://www.facebook.com/ads/preferences/?entry_product=ad_settings_screen deaktivieren. Dazu m\u00fcssen Sie bei Facebook angemeldet sein.\nWenn Sie kein Facebook Konto besitzen, k\u00f6nnen Sie nutzungsbasierte Werbung von Facebook auf der Website der European Interactive Digital Advertising Alliance deaktivieren: http://www.youronlinechoices.com/de/praferenzmanagement/.\n7. Newsletter\nNewsletter\u00addaten\nWenn Sie den auf der Website angebotenen Newsletter beziehen m\u00f6chten, ben\u00f6tigen wir von Ihnen eine E-Mail-Adresse sowie Informationen, welche uns die \u00dcberpr\u00fcfung gestatten, dass Sie der Inhaber der angegebenen E-Mail-Adresse sind und mit dem Empfang des Newsletters einverstanden sind. Weitere Daten werden nicht bzw. nur auf freiwilliger Basis erhoben. Diese Daten verwenden wir ausschlie\u00dflich f\u00fcr den Versand der angeforderten Informationen und geben diese nicht an Dritte weiter.\nDie Verarbeitung der in das Newsletteranmeldeformular eingegebenen Daten erfolgt ausschlie\u00dflich auf Grundlage Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO). Die erteilte Einwilligung zur Speicherung der Daten, der E-Mail-Adresse sowie deren Nutzung zum Versand des Newsletters k\u00f6nnen Sie jederzeit widerrufen, etwa \u00fcber den \u201eAustragen\u201c-Link im Newsletter. Die Rechtm\u00e4\u00dfigkeit der bereits erfolgten Datenverarbeitungsvorg\u00e4nge bleibt vom Widerruf unber\u00fchrt.\nDie von Ihnen zum Zwecke des Newsletter-Bezugs bei uns hinterlegten Daten werden von uns bis zu Ihrer Austragung aus dem Newsletter bei uns bzw. dem Newsletterdiensteanbieter gespeichert und nach der Abbestellung des Newsletters oder nach Zweckfortfall aus der Newsletterverteilerliste gel\u00f6scht. Wir behalten uns vor, E-Mail-Adressen aus unserem Newsletterverteiler nach eigenem Ermessen im Rahmen unseres berechtigten Interesses nach Art. 6 Abs. 1 lit. f DSGVO zu l\u00f6schen oder zu sperren.\nDaten, die zu anderen Zwecken bei uns gespeichert wurden, bleiben hiervon unber\u00fchrt.\nNach Ihrer Austragung aus der Newsletterverteilerliste wird Ihre E-Mail-Adresse bei uns bzw. dem Newsletterdiensteanbieter ggf. in einer Blacklist gespeichert, sofern dies zur Verhinderung k\u00fcnftiger Mailings erforderlich ist. Die Daten aus der Blacklist werden nur f\u00fcr diesen Zweck verwendet und nicht mit anderen Daten zusammengef\u00fchrt. Dies dient sowohl Ihrem Interesse als auch unserem Interesse an der Einhaltung der gesetzlichen Vorgaben beim Versand von Newslettern (berechtigtes Interesse im Sinne des Art. 6 Abs. 1 lit. f DSGVO). Die Speicherung in der Blacklist ist zeitlich nicht befristet. Sie k\u00f6nnen der Speicherung widersprechen, sofern Ihre Interessen unser berechtigtes Interesse \u00fcberwiegen.\n8. Plugins und Tools\nYouTube mit erweitertem Datenschutz\nDiese Website bindet Videos der YouTube ein. Betreiber der Seiten ist die Google Ireland Limited (\u201eGoogle\u201c), Gordon House, Barrow Street, Dublin 4, Irland.\nWir nutzen YouTube im erweiterten Datenschutzmodus. Dieser Modus bewirkt laut YouTube, dass YouTube keine Informationen \u00fcber die Besucher auf dieser Website speichert, bevor diese sich das Video ansehen. Die Weitergabe von Daten an YouTube-Partner wird durch den erweiterten Datenschutzmodus hingegen nicht zwingend ausgeschlossen. So stellt YouTube \u2013 unabh\u00e4ngig davon, ob Sie sich ein Video ansehen \u2013 eine Verbindung zum Google DoubleClick-Netzwerk her.\nSobald Sie ein YouTube-Video auf dieser Website starten, wird eine Verbindung zu den Servern von YouTube hergestellt. Dabei wird dem YouTube-Server mitgeteilt, welche unserer Seiten Sie besucht haben. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, erm\u00f6glichen Sie YouTube, Ihr Surfverhalten direkt Ihrem pers\u00f6nlichen Profil zuzuordnen. Dies k\u00f6nnen Sie verhindern, indem Sie sich aus Ihrem YouTube-Account ausloggen.\nDes Weiteren kann YouTube nach Starten eines Videos verschiedene Cookies auf Ihrem Endger\u00e4t speichern oder vergleichbare Wiedererkennungstechnologien (z. B. Device-Fingerprinting) einsetzen. Auf diese Weise kann YouTube Informationen \u00fcber Besucher dieser Website erhalten. Diese Informationen werden u. a. verwendet, um Videostatistiken zu erfassen, die Anwenderfreundlichkeit zu verbessern und Betrugsversuchen vorzubeugen.\nGegebenenfalls k\u00f6nnen nach dem Start eines YouTube-Videos weitere Datenverarbeitungsvorg\u00e4nge ausgel\u00f6st werden, auf die wir keinen Einfluss haben.\nDie Nutzung von YouTube erfolgt im Interesse einer ansprechenden Darstellung unserer Online-Angebote. Dies stellt ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO dar. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endger\u00e4t des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nWeitere Informationen \u00fcber Datenschutz bei YouTube finden Sie in deren Datenschutzerkl\u00e4rung unter: https://policies.google.com/privacy?hl=de.\nGoogle Web Fonts\nDiese Seite nutzt zur einheitlichen Darstellung von Schriftarten so genannte Web Fonts, die von Google bereitgestellt werden. Beim Aufruf einer Seite l\u00e4dt Ihr Browser die ben\u00f6tigten Web Fonts in ihren Browsercache, um Texte und Schriftarten korrekt anzuzeigen.\nZu diesem Zweck muss der von Ihnen verwendete Browser Verbindung zu den Servern von Google aufnehmen. Hierdurch erlangt Google Kenntnis dar\u00fcber, dass \u00fcber Ihre IP-Adresse diese Website aufgerufen wurde. Die Nutzung von Google WebFonts erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an der einheitlichen Darstellung des Schriftbildes auf seiner Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endger\u00e4t des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nWenn Ihr Browser Web Fonts nicht unterst\u00fctzt, wird eine Standardschrift von Ihrem Computer genutzt.\nWeitere Informationen zu Google Web Fonts finden Sie unter https://developers.google.com/fonts/faq und in der Datenschutzerkl\u00e4rung von Google: https://policies.google.com/privacy?hl=de.\nGoogle Maps\nDiese Seite nutzt den Kartendienst Google Maps. Anbieter ist die Google Ireland Limited (\u201eGoogle\u201c), Gordon House, Barrow Street, Dublin 4, Irland.\nZur Nutzung der Funktionen von Google Maps ist es notwendig, Ihre IP-Adresse zu speichern. Diese Informationen werden in der Regel an einen Server von Google in den USA \u00fcbertragen und dort gespeichert. Der Anbieter dieser Seite hat keinen Einfluss auf diese Daten\u00fcbertragung. Wenn Google Maps aktiviert ist, kann Google zum Zwecke der einheitlichen Darstellung der Schriftarten Google Web Fonts verwenden. Beim Aufruf von Google Maps l\u00e4dt Ihr Browser die ben\u00f6tigten Web Fonts in ihren Browsercache, um Texte und Schriftarten korrekt anzuzeigen.\nDie Nutzung von Google Maps erfolgt im Interesse einer ansprechenden Darstellung unserer Online-Angebote und an einer leichten Auffindbarkeit der von uns auf der Website angegebenen Orte. Dies stellt ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO dar. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschlie\u00dflich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und \u00a7 25 Abs. 1 TTDSG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endger\u00e4t des Nutzers (z. B. Device-Fingerprinting) im Sinne des TTDSG umfasst. Die Einwilligung ist jederzeit widerrufbar.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://privacy.google.com/businesses/gdprcontrollerterms/ und https://privacy.google.com/businesses/gdprcontrollerterms/sccs/.\nMehr Informationen zum Umgang mit Nutzerdaten finden Sie in der Datenschutzerkl\u00e4rung von Google: https://policies.google.com/privacy?hl=de.\n9. Audio- und Videokonferenzen\nDatenverarbeitung\nF\u00fcr die Kommunikation mit unseren Kunden setzen wir unter anderen Online-Konferenz-Tools ein. Die im Einzelnen von uns genutzten Tools sind unten aufgelistet. Wenn Sie mit uns per Video- oder Audiokonferenz via Internet kommunizieren, werden Ihre personenbezogenen Daten von uns und dem Anbieter des jeweiligen Konferenz-Tools erfasst und verarbeitet.\nDie Konferenz-Tools erfassen dabei alle Daten, die Sie zur Nutzung der Tools bereitstellen/einsetzen (E-Mail-Adresse und/oder Ihre Telefonnummer). Ferner verarbeiten die Konferenz-Tools die Dauer der Konferenz, Beginn und Ende (Zeit) der Teilnahme an der Konferenz, Anzahl der Teilnehmer und sonstige \u201eKontextinformationen\u201c im Zusammenhang mit dem Kommunikationsvorgang (Metadaten).\nDes Weiteren verarbeitet der Anbieter des Tools alle technischen Daten, die zur Abwicklung der Online-Kommunikation erforderlich sind. Dies umfasst insbesondere IP-Adressen, MAC-Adressen, Ger\u00e4te-IDs, Ger\u00e4tetyp, Betriebssystemtyp und -version, Client-Version, Kameratyp, Mikrofon oder Lautsprecher sowie die Art der Verbindung.\nSofern innerhalb des Tools Inhalte ausgetauscht, hochgeladen oder in sonstiger Weise bereitgestellt werden, werden diese ebenfalls auf den Servern der Tool-Anbieter gespeichert. Zu solchen Inhalten z\u00e4hlen insbesondere Cloud-Aufzeichnungen, Chat-/ Sofortnachrichten, Voicemails hochgeladene Fotos und Videos, Dateien, Whiteboards und andere Informationen, die w\u00e4hrend der Nutzung des Dienstes geteilt werden.\nBitte beachten Sie, dass wir nicht vollumf\u00e4nglich Einfluss auf die Datenverarbeitungsvorg\u00e4nge der verwendeten Tools haben. Unsere M\u00f6glichkeiten richten sich ma\u00dfgeblich nach der Unternehmenspolitik des jeweiligen Anbieters. Weitere Hinweise zur Datenverarbeitung durch die Konferenztools entnehmen Sie den Datenschutzerkl\u00e4rungen der jeweils eingesetzten Tools, die wir unter diesem Text aufgef\u00fchrt haben.\nZweck und Rechtsgrundlagen\nDie Konferenz-Tools werden genutzt, um mit angehenden oder bestehenden Vertragspartnern zu kommunizieren oder bestimmte Leistungen gegen\u00fcber unseren Kunden anzubieten (Art. 6 Abs. 1 lit. b DSGVO). Des Weiteren dient der Einsatz der Tools der allgemeinen Vereinfachung und Beschleunigung der Kommunikation mit uns bzw. unserem Unternehmen (berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO). Soweit eine Einwilligung abgefragt wurde, erfolgt der Einsatz der betreffenden Tools auf Grundlage dieser Einwilligung; die Einwilligung ist jederzeit mit Wirkung f\u00fcr die Zukunft widerrufbar.\nSpeicherdauer\nDie unmittelbar von uns \u00fcber die Video- und Konferenz-Tools erfassten Daten werden von unseren Systemen gel\u00f6scht, sobald Sie uns zur L\u00f6schung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck f\u00fcr die Datenspeicherung entf\u00e4llt. Gespeicherte Cookies verbleiben auf Ihrem Endger\u00e4t, bis Sie sie l\u00f6schen. Zwingende gesetzliche Aufbewahrungsfristen bleiben unber\u00fchrt.\nAuf die Speicherdauer Ihrer Daten, die von den Betreibern der Konferenz-Tools zu eigenen Zwecken gespeichert werden, haben wir keinen Einfluss. F\u00fcr Einzelheiten dazu informieren Sie sich bitte direkt bei den Betreibern der Konferenz-Tools.\nEingesetzte Konferenz-Tools\nWir setzen folgende Konferenz-Tools ein:\nZoom\nWir nutzen Zoom. Anbieter dieses Dienstes ist die Zoom Communications Inc., San Jose, 55 Almaden Boulevard, 6th Floor, San Jose, CA 95113, USA. Details zur Datenverarbeitung entnehmen Sie der Datenschutzerkl\u00e4rung von Zoom: https://zoom.us/de-de/privacy.html.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://zoom.us/de-de/privacy.html.\nAuftragsverarbeitung\nWir haben einen Vertrag \u00fcber Auftragsverarbeitung (AVV) mit dem oben genannten Anbieter geschlossen. Hierbei handelt es sich um einen datenschutzrechtlich vorgeschriebenen Vertrag, der gew\u00e4hrleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.\nUnsere Social-Media-Auftritte\nDatenverarbeitung durch soziale Netzwerke\nWir unterhalten \u00f6ffentlich zug\u00e4ngliche Profile in sozialen Netzwerken. Die im Einzelnen von uns genutzten sozialen Netzwerke finden Sie weiter unten.\nSoziale Netzwerke wie Facebook, Twitter etc. k\u00f6nnen Ihr Nutzerverhalten in der Regel umfassend analysieren, wenn Sie deren Website oder eine Website mit integrierten Social-Media-Inhalten (z. B. Like-Buttons oder Werbebannern) besuchen. Durch den Besuch unserer Social-Media-Pr\u00e4senzen werden zahlreiche datenschutzrelevante Verarbeitungsvorg\u00e4nge ausgel\u00f6st. Im Einzelnen:\nWenn Sie in Ihrem Social-Media-Account eingeloggt sind und unsere Social-Media-Pr\u00e4senz besuchen, kann der Betreiber des Social-Media-Portals diesen Besuch Ihrem Benutzerkonto zuordnen. Ihre personenbezogenen Daten k\u00f6nnen unter Umst\u00e4nden aber auch dann erfasst werden, wenn Sie nicht eingeloggt sind oder keinen Account beim jeweiligen Social-Media-Portal besitzen. Diese Datenerfassung erfolgt in diesem Fall beispielsweise \u00fcber Cookies, die auf Ihrem Endger\u00e4t gespeichert werden oder durch Erfassung Ihrer IP-Adresse.\nMit Hilfe der so erfassten Daten k\u00f6nnen die Betreiber der Social-Media-Portale Nutzerprofile erstellen, in denen Ihre Pr\u00e4ferenzen und Interessen hinterlegt sind. Auf diese Weise kann Ihnen interessenbezogene Werbung in- und au\u00dferhalb der jeweiligen Social-Media-Pr\u00e4senz angezeigt werden. Sofern Sie \u00fcber einen Account beim jeweiligen sozialen Netzwerk verf\u00fcgen, kann die interessenbezogene Werbung auf allen Ger\u00e4ten angezeigt werden, auf denen Sie eingeloggt sind oder eingeloggt waren.\nBitte beachten Sie au\u00dferdem, dass wir nicht alle Verarbeitungsprozesse auf den Social-Media-Portalen nachvollziehen k\u00f6nnen. Je nach Anbieter k\u00f6nnen daher ggf. weitere Verarbeitungsvorg\u00e4nge von den Betreibern der Social-Media-Portale durchgef\u00fchrt werden. Details hierzu entnehmen Sie den Nutzungsbedingungen und Datenschutzbestimmungen der jeweiligen Social-Media-Portale.\nRechtsgrundlage\nUnsere Social-Media-Auftritte sollen eine m\u00f6glichst umfassende Pr\u00e4senz im Internet gew\u00e4hrleisten. Hierbei handelt es sich um ein berechtigtes Interesse im Sinne von Art. 6 Abs. 1 lit. f DSGVO. Die von den sozialen Netzwerken initiierten Analyseprozesse beruhen ggf. auf abweichenden Rechtsgrundlagen, die von den Betreibern der sozialen Netzwerke anzugeben sind (z. B. Einwilligung im Sinne des Art. 6 Abs. 1 lit. a DSGVO).\nVerantwortlicher und Geltendmachung von Rechten\nWenn Sie einen unserer Social-Media-Auftritte (z. B. Facebook) besuchen, sind wir gemeinsam mit dem Betreiber der Social-Media-Plattform f\u00fcr die bei diesem Besuch ausgel\u00f6sten Datenverarbeitungsvorg\u00e4nge verantwortlich. Sie k\u00f6nnen Ihre Rechte (Auskunft, Berichtigung, L\u00f6schung, Einschr\u00e4nkung der Verarbeitung, Daten\u00fcbertragbarkeit und Beschwerde) grunds\u00e4tzlich sowohl gg\u00fc. uns als auch gg\u00fc. dem Betreiber des jeweiligen Social-Media-Portals (z. B. gg\u00fc. Facebook) geltend machen.\nBitte beachten Sie, dass wir trotz der gemeinsamen Verantwortlichkeit mit den Social-Media-Portal-Betreibern nicht vollumf\u00e4nglich Einfluss auf die Datenverarbeitungsvorg\u00e4nge der Social-Media-Portale haben. Unsere M\u00f6glichkeiten richten sich ma\u00dfgeblich nach der Unternehmenspolitik des jeweiligen Anbieters.\nSpeicherdauer\nDie unmittelbar von uns \u00fcber die Social-Media-Pr\u00e4senz erfassten Daten werden von unseren Systemen gel\u00f6scht, sobald Sie uns zur L\u00f6schung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck f\u00fcr die Datenspeicherung entf\u00e4llt. Gespeicherte Cookies verbleiben auf Ihrem Endger\u00e4t, bis Sie sie l\u00f6schen. Zwingende gesetzliche Bestimmungen \u2013 insb. Aufbewahrungsfristen \u2013 bleiben unber\u00fchrt.\nAuf die Speicherdauer Ihrer Daten, die von den Betreibern der sozialen Netzwerke zu eigenen Zwecken gespeichert werden, haben wir keinen Einfluss. F\u00fcr Einzelheiten dazu informieren Sie sich bitte direkt bei den Betreibern der sozialen Netzwerke (z. B. in deren Datenschutzerkl\u00e4rung, siehe unten).\nSoziale Netzwerke im Einzelnen\nFacebook\nWir verf\u00fcgen \u00fcber ein Profil bei Facebook. Anbieter dieses Dienstes ist die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland (nachfolgend Meta). Die erfassten Daten werden nach Aussage von Meta auch in die USA und in andere Drittl\u00e4nder \u00fcbertragen.\nWir haben mit Meta eine Vereinbarung \u00fcber gemeinsame Verarbeitung (Controller Addendum) geschlossen. In dieser Vereinbarung wird festgelegt, f\u00fcr welche Datenverarbeitungsvorg\u00e4nge wir bzw. Meta verantwortlich ist, wenn Sie unsere Facebook-Page besuchen. Diese Vereinbarung k\u00f6nnen Sie unter folgendem Link einsehen: https://www.facebook.com/legal/terms/page_controller_addendum.\nSie k\u00f6nnen Ihre Werbeeinstellungen selbstst\u00e4ndig in Ihrem Nutzer-Account anpassen. Klicken Sie hierzu auf folgenden Link und loggen Sie sich ein: https://www.facebook.com/settings?tab=ads.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum und https://de-de.facebook.com/help/566994660333381.\nDetails entnehmen Sie der Datenschutzerkl\u00e4rung von Facebook: https://www.facebook.com/about/privacy/.\nTwitter\nWir nutzen den Kurznachrichtendienst Twitter. Anbieter ist die Twitter International Company, One Cumberland Place, Fenian Street, Dublin 2, D02 AX07, Irland.\nSie k\u00f6nnen Ihre Twitter-Datenschutzeinstellungen selbstst\u00e4ndig in Ihrem Nutzer-Account anpassen. Klicken Sie hierzu auf folgenden Link und loggen Sie sich ein: https://twitter.com/personalization.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://gdpr.twitter.com/en/controller-to-controller-transfers.html.\nDetails entnehmen Sie der Datenschutzerkl\u00e4rung von Twitter: https://twitter.com/de/privacy.\nInstagram\nWir verf\u00fcgen \u00fcber ein Profil bei Instagram. Anbieter dieses Dienstes ist die Meta Platforms Ireland Limited, 4 Grand Canal Square, Grand Canal Harbour, Dublin 2, Irland.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.facebook.com/legal/EU_data_transfer_addendum, https://help.instagram.com/519522125107875 und https://de-de.facebook.com/help/566994660333381.\nDetails zu deren Umgang mit Ihren personenbezogenen Daten entnehmen Sie der Datenschutzerkl\u00e4rung von Instagram: https://help.instagram.com/519522125107875.\nXING\nWir verf\u00fcgen \u00fcber ein Profil bei XING. Anbieter ist die New Work SE, Dammtorstra\u00dfe 30, 20354 Hamburg, Deutschland. Details zu deren Umgang mit Ihren personenbezogenen Daten entnehmen Sie der Datenschutzerkl\u00e4rung von XING: https://privacy.xing.com/de/datenschutzerklaerung.\nLinkedIn\nWir verf\u00fcgen \u00fcber ein Profil bei LinkedIn. Anbieter ist die LinkedIn Ireland Unlimited Company, Wilton Plaza, Wilton Place, Dublin 2, Irland. LinkedIn verwendet Werbecookies.\nWenn Sie LinkedIn-Werbe-Cookies deaktivieren m\u00f6chten, nutzen Sie bitte folgenden Link: https://www.linkedin.com/psettings/guest-controls/retargeting-opt-out.\nDie Daten\u00fcbertragung in die USA wird auf die Standardvertragsklauseln der EU-Kommission gest\u00fctzt. Details finden Sie hier: https://www.linkedin.com/legal/l/dpa und https://www.linkedin.com/legal/l/eu-sccs.\nDetails zu deren Umgang mit Ihren personenbezogenen Daten entnehmen Sie der Datenschutzerkl\u00e4rung von LinkedIn: https://www.linkedin.com/legal/privacy-policy.\nYouTube\nWir verf\u00fcgen \u00fcber ein Profil bei YouTube. Anbieter ist die Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland. Details zu deren Umgang mit Ihren personenbezogenen Daten entnehmen Sie der Datenschutzerkl\u00e4rung von YouTube: https://policies.google.com/privacy?hl=de.", "Sasel agierte aus der Position des Tabellenf\u00fchrers, ihnen auf den Fersen wir Volksdorfer mit 2 Punkten Abstand.\nMannschaftsf\u00fchrer Gert Blankenburg w\u00e4hlte eine taktisch kluge Aufstellung unter Einbeziehung von Walter Blumenberg und f\u00fchrte Sasel zu einem souver\u00e4nen 5,5:2,5 Sieg. Herzlichen Gl\u00fcckwunsch !\nInsgesamt hat Sasel diese Saison eine sehr geschlossene Mannschaftsleistung abgeliefert, dennoch sind Karina Tobianski mit 6 aus 7 und Peter R\u00f6mer mit 7 aus 8 besonders hervorzuheben.\nNun d\u00fcrfen die Saseler den Sekt schon mal kalt stellen, denn nur Volksdorf h\u00e4tte noch eine theoretische Chance, Sasel abzufangen. Dazu m\u00fcsste Volksdorf 2x haushoch gewinnen und Sasel sein letztes Spiel verlieren. In jedem Fall kommt der Staffelsieger aus dem Nordosten:-)\ntagPlaceholderTags:\nSo findet Ihr uns\nInhalte von Google Maps werden aufgrund deiner aktuellen Cookie-Einstellungen nicht angezeigt. Klicke auf die Cookie-Richtlinie (Funktionell), um den Cookie-Richtlinien von Google Maps zuzustimmen und den Inhalt anzusehen. Mehr dazu erf\u00e4hrst du in der Google Maps Datenschutzerkl\u00e4rung.\n\"R\u00e4ucherkate\", Claus-Ferck-Str. 43, 22359 Hamburg Volksdorf\nUnser barrierefreies Spiellokal, die \"R\u00e4ucherkate\", ist mit der U-Bahn (U1 bis Volksdorf), Bus und Auto gut zu erreichen.", "Sie besuchen unser Webangebot mit einer veralteten Browserversion (z.B. Internet Explorer, veraltete Safari-Version oder andere). Diese Browserversion wird von den Herstellern nicht mehr unterst\u00fctzt und verursacht Darstellungs- und Sicherheitsprobleme. Bitte wechseln Sie auf einen aktuellen Browser.\nVerstanden\nAchtung: Bitte wechseln Sie den Browser\nDas von Ihnen aufgerufene Formular l\u00e4sst sich leider nicht darstellen. Sie verwenden eine veraltete Browserversion (z.B. Internet Explorer, veraltete Safari-Version oder andere). Diese Browserversion wird von den Herstellern nicht mehr unterst\u00fctzt und verursacht Darstellungs- und Sicherheitsprobleme. Bitte wechseln Sie auf einen aktuellen Browser.\nWebstatistik\nWir verwenden eine Webstatistik, um herauszufinden, wie wir unser Webangebot f\u00fcr Sie verbessern k\u00f6nnen. Alle Daten werden anonymisiert und in Rechenzentren in der Schweiz verarbeitet. Mehr Informationen finden Sie unter \u201cDatenschutz\u201c.", "Nat\u00fcrlich wachte ich auch heute wieder so zeitig auf. Ist klar - wenn ich heute gro\u00dfes Programm gehabt h\u00e4tte und deshalb zeitig aufstehen muss, h\u00e4tte mich der Wecker aus dem Tiefschlaf gerissen. Aber wenn man ausschlafen kann, wacht man zeitig auf...\nGestern Abend hatte ich noch einen Blick in den Ordner mit den Motel-Infos geworfen und siehe da: das Restaurant wird morgens zum Fr\u00fchst\u00fcck ge\u00f6ffnet und man kann dort (gegen Bezahlung) fr\u00fchst\u00fccken. Na, da werde ich mir heute auch nochmal ein sch\u00f6nes Fr\u00fchst\u00fcck g\u00f6nnen.\nIch packte schon mal das restliche Zeugs zusammen und dann ging ich r\u00fcber ins Restaurant, wo ich gen\u00fcsslich ein Omelette verspeiste. Auschecken musste man erst um 12 Uhr, Pl\u00e4ne f\u00fcr den Tag hatte ich au\u00dfer Auto abgeben und Motel-Wechsel keine. Ich schnappte mir Dollarchen und steuerte noch eine Boot Barn Filiale an - wieder ein g\u00fcnstiger Besuch, wieder nix gefunden\nZur\u00fcck im Motel machte ich noch eine Kaffeepause und suchte mir anhand Google Maps die einfachste Strecke zum Best Western Airport Inn. Dann belud ich Dollarchen, checkte aus und machte mich auf den Weg...\nDie 24. Stra\u00dfe fand ich problemlos, aber Google Maps hatte mir den Standort des Motels rechts angezeigt, an der Stelle, wo ich auf die 24. Stra\u00dfe treffe. Also bog ich rechts ab. Das Motel kam und kam nicht. \u00dcbersehen? Dreherle. wieder gucken, nochmal Dreherele. Wo war das verflixte Teil? Meine Gesichtsfarbe hatte inzwischen den Ton \"reife Tomate\" erreicht.\nAls dann der Abzweig zum Sky Harbor Circle auftauchte, bog ich vollkommen entnervt auf diesen ab und fuhr zum Rental Car Center. Dort gab ich Dollarchen ab und schleppte meinen ganzen Krempel zum n\u00e4chsten Taxistand. Der Fahrer war nicht wirklich erfreut, als ich ihm das Ziel nannte und sagte mir, dass ich beim n\u00e4chsten Mal das Motel anrufe soll, die haben ein Shuttle. Meine Laune wurde dadurch auch nicht besser.\nGegen 13.30 Uhr kam ich im Motel an. Die Frau an der Rezeption hatte wohl noch nix von amerikanischer Freundlichkeit geh\u00f6rt. Sie hatte Kinnlappen wie ein Truthahn und diese schlenkerten emp\u00f6rt, als ich mich zu fragen traute, ob evtl. schon ein Zimmer fertig ist. \"No! Check-in at 4pm\" bellte sie mir im Tonfall eines Oberfeldwebels entgegen. Ich h\u00e4tte fast einen Satz nach hinten gemacht und mich hinter das Sofa geduckt...\nOk, ich lie\u00df mein Gep\u00e4ck erstmal dort stehen und ging nach drau\u00dfen, um eine zu rauchen. Dann l\u00fcmmelte ich mich auf das Sofa und las in meinem Buch weiter. Um 14 Uhr schien Schichtwechsel zu sein, denn Frau Truthahn-Feldwebel rauschte von dannen und ein junges M\u00e4del mit mexikanischem Einschlag nahm ihren Platz ein. Die machte einen netten Eindruck und ich versuchte erneut mein Gl\u00fcck. Hilfsbereit telefonierte sie mit der Housekeeping-Chefin und 20 Minuten sp\u00e4ter rollerte ich mein Gep\u00e4ck ins Zimmer\nDie n\u00e4chsten paar Stunden verbrachte ich gem\u00fctlich im Schatten am Pool. Ich hing meinen Gedanken nach, erinnerte mich an einzelne Orte und Episoden dieser Tour. Mir ging mal wieder durch den Kopf, wie hoch doch mein Erholungsfaktor bei solchen Touren ist. Der Kopf ist komplett frei, der Alltag ganz, ganz weit weg. Au\u00dfer Karlie nat\u00fcrlich. An meinen s\u00fc\u00dfen Fratz denke ich jeden Tag.\nIm Zimmer packte ich nun die restlichen Klamotten von heute ein, ging unter die Dusche und dann ins Rodehouse Restaurant, welches zum Best Western dazugeh\u00f6rt. In Erinnerung an das \u00e4u\u00dferst leckere H\u00fchnchengericht aus Glenwood Springs entschied ich mich heute auch f\u00fcr ein H\u00fchnchengericht. H\u00e4tte ich das mal lieber bleiben lassen.... trocken, und die Gew\u00fcrze lagen wohl neben statt in der Pfanne...\nW\u00e4hrend ich nach dem Essen drau\u00dfen eine Zigarette rauchte, beobachtete ich einen recht netten Sonnenuntergang\nAnschlie\u00dfend wechselte ich noch in die Lounge und orderte mir eine Abschieds-Margarita. Deren Mischung war so stark, dass sie unter das Waffenrecht fallen m\u00fcsste... W\u00e4hrend ich die gen\u00fcsslich trank, las ich noch mein Buch fertig. Das musste unbedingt sein, sonst h\u00e4tte ich morgen im Handgep\u00e4ck zwei B\u00fccher, das geht gar nicht.\nZur\u00fcck im Zimmer schaute ich noch fix im DA Forum vorbei, dann r\u00e4umte ich das Netbook in den Handgep\u00e4cktrolley und packte den noch fertig.\nIch war schon wieder total m\u00fcde. Ich bestellte noch den Wake-up-Call und das Shuttle zum Airport. Dann schnappte ich mir die letzte Dose MGD und ging nach drau\u00dfen, rauchte noch zwei Zigaretten und lag kurz nach 23 Uhr im Bett.\nDer Rest ist schnell erz\u00e4hlt: Am Freitag, 12. Oktober 2012, klingelte der Wecker um 3.30 Uhr. Wie immer am Abreisetag str\u00f6mte sofort eine extra Dosis Adrenalin durch meinen K\u00f6rper. Der Gedanke \"hoffentlich klappt alles reibungslos\" sorgt daf\u00fcr, dass ich sofort hellwach bin. Und ich freute mich auch auf daheim.\nEine Stunde sp\u00e4ter kam p\u00fcnktlich das Shuttle und nach ca. 15 Minuten war ich am Airport. Die ganzen Gep\u00e4ckst\u00fccke auf einmal zu bewegen war nat\u00fcrlich unm\u00f6glich und so stand ich etwas hilflos in der Gegend rum. Ein Gep\u00e4ckw\u00e4gelchen \"auszul\u00f6sen\" war nicht m\u00f6glich - keine Ahnung, warum ich da immer scheitere. Aber eine nette Angestellte bemerkte mein Dilemma und kam mit so einem gro\u00dfen Rollwagen an. So bugsierten wir meinen Kram nach drinnen, deponierten ihn schon am Schalter und ich reihte mich in die Schlange ein. Die paar Dollar Trinkgeld hatte sie sich wirklich verdient.\nNachdem ich meine zwei Gep\u00e4ckst\u00fccke eingecheckt hatte, d\u00fcste ich eine Ebene hoch und holte mir bei Starbucks einen gro\u00dfen Kaffee. Den nahm ich mit nach drau\u00dfen und \u00fcberbr\u00fcckte die Wartezeit mit ein paar Zigaretten.\nDer Flug nach Atlanta startete p\u00fcnktlich und sp\u00e4ter auch der Anschlussflug nach Stuttgart. Dank dem zeitigen Aufstehen habe ich ca. 3,5 Stunden geschlafen und so war der Flug recht schnell vorbei\nSamstag, 13. Oktober 2012: In Stuttgart musste ich noch ein wenig warten, denn Andy stand im Stau. Aber kurz nach 10 Uhr war ich dann daheim und wurde von einem hungrigen Karlie begr\u00fc\u00dft , denn seine Katzensitterin war an diesem Morgen nicht gekommen. Das w\u00e4re ja Quatsch gewesen, da ich am Vormittag sowieso nach Hause gekommen bin.\nDer kleine Racker hatte die Zeit ohne mich gut \u00fcberstanden und hat auch nicht geschmollt. Im Gegenteil, in dem Moment, als ich wieder da war, hat er den Wettbewerb gestartet \"welcher Kater kann am l\u00e4ngsten schnurren\" Bei so einem Empfang kommt man doch gerne wieder nach Hause", "Der Muskatnussbaum erreicht H\u00f6hen von bis zu 20 Metern. Erst nach acht Jahren beginnt der Baum erste Bl\u00fcten zu tragen. Die daraus entstehenden Fr\u00fcchte haben einen Durchmesser von circa 4-5 cm und erinnern an reife Pfirsiche.\n\u00c4hnlich einer Walnuss befindet sich au\u00dfen eine dicke Schale und im Inneren der Samen, den wir als Muskatnuss kennen. Der innere Samenkern ist von einem r\u00f6tlichen Samenmantel umh\u00fcllt, der als Macis bekannt ist. Die ebenfalls gel\u00e4ufige Bezeichnung \u00a8Muskatbl\u00fcte\u00a8 stammt noch aus dem Mittelalter, als man glaubte, bei der Macis handelt es sich um die Bl\u00fcte des Muskatnussbaumes.\nDie Macis hat ein \u00e4hnliches Aroma wie die Muskatnuss, kommt aber feiner und eleganter daher.\nNeben dem typischen Muskataroma erinnert der Macis ein wenig an Nelken, einen Hauch von Karamell und eine ganz dezente Bitternote.\nVerwendung:\nFisch- und Fleischgerichte, S\u00fc\u00dfspeisen, Kompott, Fruchtsalat, Gem\u00fcse, Suppen, Wursterzeugnisse, Fleischbr\u00fche. Als feines Gew\u00fcrz f\u00fcr s\u00fc\u00dfe Backwaren (die Weihnachtsb\u00e4ckerei). Geschmacklich feiner als Muskatn\u00fcsse.\nWir empfehlen Macis f\u00fcr Spargelgerichte. Zudem l\u00e4sst sich Macis gut mit Schokolade kombinieren und gibt Gl\u00fchwein und Punsch einen exotischen Touch.\nHerkunft: Westindisch\nWeitere Herkunftsl\u00e4nder: Molukken, Java, Borneo, Sumatra, Celebes, Indien , Sri Lanka, Westindische Inseln (beste Qualit\u00e4ten: Grenada), Penang, Brasilien, Mauritius, Malaysia, Indonesien.", "Vor vielen Jahren begannen die Menschen im Norden, sich gegen ihre G\u00f6tter zu erheben. Also taten diese as Mutige: Sie rannten davon. Nach Neuseeland.\nAn seinem 21. Geburtstag erf\u00e4hrt Axl, dass seine Mutter, sein Vater, seine drei Br\u00fcder und sein \u201cCousin\u201d Olaf alle G\u00f6tter sind. Und heute wird er das auch. Sie haben viel von ihrer alten Macht eingeb\u00fc\u00dft und k\u00f6nnen kaum mehr als Partytricks vollbringen. Aber es gibt einen Weg, sie wieder zu voller St\u00e4rke zur\u00fcckzubringen. Und Axl \u2013 oder sollte ich sagen Odin \u2013 ist der Schl\u00fcssel dazu.\nDie ersten beiden Folgen dieser neuseel\u00e4ndischen waren richtig witzig und es macht Spa\u00df ihnen zuzugucken.\nDie Charaktere wissen zwar, dass sie G\u00f6tter sind, aber sie haben keine Erinnerungen als die, die sie in ihrem jetzigen Leben erworben haben. Und jeder geht mit seinen Kr\u00e4ften anders um.\nManchmal ist der neuseel\u00e4ndische Akzent etwas schwer zu verstehen, aber wenn man schon mal britische (nicht amerikanische!) Serien geguckt hat, dann kommt man rein.", "Diese Richtlinie beschreibt, wie \u201eForum der VUM Stiftung\u201c (\u201ehttp://forum.v-u-m.org\u201c) (im Folgenden \u201eder Betreiber\u201c) die Daten verwendet, die w\u00e4hrend deines Foren-Besuchs gesammelt werden.\nUmfang und Art der Datenspeicherung\nDeine Daten werden auf vier verschiedene Arten gesammelt:\nDie Forensoftware phpBB erstellt bei deinem Besuch des Boards mehrere Cookies. Cookies sind kleine Textdateien, die dein Browser als tempor\u00e4re Dateien ablegt und die zwischen den einzelnen Aufrufen des Boards erhalten bleiben. In diesen Cookies sind die aktuelle ID deiner Sitzung (damit dir alle Seitenaufrufe zugeordnet werden k\u00f6nnen), Informationen \u00fcber die von dir gelesenen Beitr\u00e4ge (zur Markierung dieser als gelesen/ungelesen; sofern du nicht angemeldet bist) sowie Informationen \u00fcber deine Teilnahme an Umfragen (sofern du nicht angemeldet bist) gespeichert. Ferner werden deine Benutzer-ID, ein Authentifizierungsschl\u00fcssel und eine Session-ID gespeichert. Die Cookies haben standardm\u00e4\u00dfig eine G\u00fcltigkeit von einem Jahr. Alle Cookies kannst du jederzeit \u00fcber die Funktion \u201eAlle Cookies l\u00f6schen\u201c l\u00f6schen.\nWeiterhin werden die Daten gespeichert, die du bei der Registrierung, in deinem Profil oder deinem pers\u00f6nlichem Bereich angibst. F\u00fcr die Registrierung sind mindestens ein eindeutiger Benutzername, eine E-Mail-Adresse und ein Passwort notwendig. Wenn durch den Betreiber weitere Daten als notwendig festgelegt wurden, so ist dies f\u00fcr dich vor deren Eingabe ersichtlich.\nWenn du einen Beitrag oder eine private Nachricht erstellst, so werden die dort eingegebenen Daten ebenfalls gespeichert. Gleiches gilt, wenn du einen Beitrag als Entwurf zwischenspeicherst. In diesen F\u00e4llen wird auch deine IP-Adresse gespeichert. Die IP-Adresse wird weiterhin bei folgenden Aktionen gespeichert: L\u00f6schen und \u00c4ndern von Beitr\u00e4gen (dazu z\u00e4hlen Private Nachrichten und Umfragen), \u00c4nderungen an zentralen Profildaten (E-Mail-Adresse, Kontoaktivierung, Benutzer-Passwort) und gescheiterte Anmeldeversuche. Die von deinem Browser \u00fcbermittelte Browser-Kennzeichnung (User Agent) wird nur in der \u201eWer ist online?\u201c-Funktion angezeigt und nicht dauerhaft gespeichert.\nSchlie\u00dflich erfordern einzelne Funktionen des Boards, dass weitere Daten gespeichert werden. Dazu geh\u00f6ren dein Abstimmungsverhalten bei Umfragen, der Gelesen-Status von deinen Beitr\u00e4gen oder explizit von dir gesetzte Lesezeichen oder Benachrichtigungsfunktionen.\nDein Passwort wird mit einer Einwege-Verschl\u00fcsselung (Hash) gespeichert, so dass es sicher ist. Jedoch wird dir empfohlen, dieses Passwort nicht auf einer Vielzahl von Webseiten zu verwenden. Das Passwort ist dein Schl\u00fcssel zu deinem Benutzerkonto f\u00fcr das Board, also geh mit ihm sorgsam um. Insbesondere wird dich kein Vertreter des Betreibers, von phpBB Limited oder ein Dritter berechtigterweise nach deinem Passwort fragen. Solltest du dein Passwort vergessen haben, so kannst du die Funktion \u201eIch habe mein Passwort vergessen\u201c benutzen. Die phpBB-Software fragt dich dann nach deinem Benutzernamen und deiner E-Mail-Adresse und sendet anschlie\u00dfend ein neu generiertes Passwort an diese Adresse, mit dem du dann auf das Board zugreifen kannst.\nGestattung der Datenspeicherung\nDu gestattest dem Betreiber, die von dir eingegebenen und oben n\u00e4her spezifizierten Daten zu speichern, um das Board betreiben und anbieten zu k\u00f6nnen.\nDar\u00fcber hinaus ist der Betreiber berechtigt, im Rahmen einer Interessenabw\u00e4gung zwischen deinen und seinen Interessen sowie den Interessen Dritter, Zeitpunkte von Zugriffen und Aktionen zusammen mit deiner IP-Adresse und der von deinem Browser \u00fcbermittelter Browser-Kennung zu speichern, sofern dies zur Gefahrenabwehr oder zur rechtlichen Nachverfolgbarkeit notwendig ist.\nRegelungen bez\u00fcglich der Weitergabe deiner Daten\nZweck eines Boards ist es, einen Austausch mit anderen Personen zu erm\u00f6glichen. Du bist dir daher bewusst, dass die Daten deines Profils und die von dir erstellten Beitr\u00e4ge im Internet \u00f6ffentlich zug\u00e4nglich sein k\u00f6nnen. Der Betreiber kann jedoch festlegen, dass einzelne Informationen nur f\u00fcr einen eingeschr\u00e4nkten Nutzerkreis (z. B. andere registrierte Benutzer, Administratoren etc.) zug\u00e4nglich sind. Wenn du Fragen dazu hast, suche nach entsprechenden Informationen im Forum oder kontaktiere den Betreiber. Die E-Mail-Adresse aus deinem Profil ist dabei jedoch nur f\u00fcr den Betreiber und von ihm beauftragte Personen (Administratoren) zug\u00e4nglich.\nAndere als die oben genannten Daten wird der Betreiber nur mit deiner Zustimmung an Dritte weitergeben. Dies gilt nicht, sofern er auf Grund gesetzlicher Regelungen zur Weitergabe der Daten (z. B. an Strafverfolgungsbeh\u00f6rden) verpflichtet ist oder die Daten zur Durchsetzung rechtlicher Interessen erforderlich sind.\nGestattung der Kontaktaufnahme\nDu gestattest dem Betreiber dar\u00fcber hinaus, dich unter den von dir angegebenen Kontaktdaten zu kontaktieren, sofern dies zur \u00dcbermittlung zentraler Informationen \u00fcber das Board erforderlich ist. Dar\u00fcber hinaus d\u00fcrfen er und andere Benutzer dich kontaktieren, sofern du dies in deinem pers\u00f6nlichen Bereich gestattet hast.\nGeltungsbereich dieser Richtlinie\nDiese Richtlinie umfasst nur den Bereich der Seiten, die die phpBB-Software umfassen. Sofern der Betreiber in anderen Bereichen seiner Software weitere personenbezogene Daten verarbeitet, wird er dich dar\u00fcber gesondert informieren.\nAuskunftsrecht\nDer Betreiber erteilt dir auf Anfrage Auskunft, welche Daten \u00fcber dich gespeichert sind.\nDu kannst jederzeit die L\u00f6schung bzw. Sperrung deiner Daten verlangen. Kontaktiere hierzu bitte den Betreiber.", "Alle Inhalte dieser Website werden mit gr\u00f6\u00dfter Sorgfalt erstellt. Der Anbieter \u00fcbernimmt jedoch keinerlei Gew\u00e4hr f\u00fcr die Richtigkeit, Vollst\u00e4ndigkeit und Aktualit\u00e4t der bereitgestellten Informationen. Die Nutzung der Website erfolgt auf eigene Gefahr des Benutzers. Die Ausf\u00fchrungen im Rahmen dieser Website stellen keine fachm\u00e4nnische Beratungen oder ersch\u00f6pfende Aufz\u00e4hlungen dar. Haftungsanspr\u00fcche gegen den Anbieter, die durch die Nutzung der angebotenen Inhalte und Informationen verursacht werden, sind grunds\u00e4tzlich ausgeschlossen.\nBeitr\u00e4ge, die mit Namen gekennzeichnet sind, geben die Meinung des betreffenden Autors und nicht zwingend die des Anbieters wider.\nDurch die reine Benutzung dieser Website kommt kein Vertrag zwischen dem Anbieter und dem Benutzer zustande.\nSollten sich aufgrund gesetzlicher Bestimmungen Verpflichtungen zum Sperren oder Entfernen von Inhalten auf der Website ergeben, wird der Anbieter die betreffenden Inhalte umgehend sperren oder entfernen, sobald sie ihm bekannt geworden sind. Eine diesbez\u00fcgliche Haftung kann jedoch erst \u00fcbernommen werden, ab dem Zeitpunkt ab dem dem Anbieter ein konkreter derartiger Sachverhalt bekannt geworden ist.\nExterne Links\nDiese Website enth\u00e4lt Verweise auf fremde Websites, die au\u00dferhalb des Verantwortungsbereiches des Anbieters liegen.\nDie Verlinkung externer Websites hei\u00dft nicht, dass sich der Anbieter die Inhalte der verlinkten Website zu eigen macht. F\u00fcr illegale, fehlerhafte oder unvollst\u00e4ndige Inhalte und insbesondere f\u00fcr Sch\u00e4den, die durch die Nutzung verlinkter Seiten entstehen, haftet allein der jeweilige Anbieter der Seite.\nVerlinkte Websites sind beim Verlinken nach bestem Ermessen gepr\u00fcft worden, und zu diesem Zeitpunkt waren keine Rechtsverst\u00f6\u00dfe der verlinkten Website erkennbar. Der Anbieter hat jedoch keinerlei Einfluss auf die aktuelle und zuk\u00fcnftige Gestaltung und auf die Inhalte der verlinkten Websites. Eine st\u00e4ndige Kontrolle verlinkter Websites ist ohne das Vorliegen konkreter Rechtsverst\u00f6\u00dfe nicht zumutbar, allerdings wird der Anbieter bei Bekanntwerden von Rechtsverst\u00f6\u00dfen die betreffenden Links umgehend l\u00f6schen.\nF\u00fcr illegale, fehlerhafte oder unvollst\u00e4ndige Inhalte und insbesondere f\u00fcr Sch\u00e4den, die durch die Nutzung verlinkter Websites entstehen, haftet allein der Anbieter der jeweiligen Website.\nUrheberrecht\nDie auf dieser Website angebotenen Inhalte unterliegen dem deutschen Urheberrecht. Sie sind nur f\u00fcr den pers\u00f6nlichen Gebrauch bestimmt. Jede weitergehende Verwertung, insbesondere Vervielf\u00e4ltigung, Verbreitung, Bearbeitung, Kopieren, \u00dcbersetzung, Speicherung oder Verarbeitung in Datenbanken oder anderen elektronischen Systemen, bedarf der Zustimmung des Anbieters bzw. jeweiligen Rechteinhabers.\nF\u00fcr die Inhalte, die nicht vom Anbieter der Website erstellt wurden, werden die Urheberrechte Dritter beachtet. Solche Inhalte sind entsprechend markiert. Falls Ihnen dennoch eine Urheberrechtsverletzung auff\u00e4llt, bittet der Anbieter um einen entsprechenden Hinweis. Der Anbieter wird dann die gesetzeswidrigen Inhalte umgehend entfernen.\nSchreibe einen Kommentar Antworten abbrechen\nDeine E-Mail-Adresse wird nicht ver\u00f6ffentlicht. Erforderliche Felder sind mit * markiert\nKommentar\nName *\nE-Mail *\nWebsite\nMeinen Namen, meine E-Mail-Adresse und meine Website in diesem Browser, f\u00fcr die n\u00e4chste Kommentierung, speichern.\nSuche nach:\n\u00dcber diese Website\nimWal.de ist die Website \u00fcber industrienahe maschinelle Wortkunst f\u00fcr automatisierte Lebensformen. Da du das hier liest, wirst du eine automatisierte Lebensform sein, und die Texte hier sind auch f\u00fcr dich bestimmt. N\u00e4heres dazu findest du auf der Seite \u00dcber imWal.de. Wenn du dich fragst, wie es mit maschineller Wortkunst weiter geht, lies doch mal das Interview \u00fcber maschinelle Gedichte.", "Zahnlos geboren entwickelt sich bis zumeist zum 12. Lebenstag das Milchgebi\u00df von Stubentigern. Es besteht aus 26 Z\u00e4hnchen: 14 Z\u00e4hnchen im Oberkiefer und 12 Z\u00e4hnchen im Unterkiefer. Als erstes sind die Schneidez\u00e4hne dran, dann folgen die Fanz\u00e4hne und zu guter Letzt die Backenz\u00e4hne.\nAb dem 5. Lebensmonat beginnt dann im Regelfall der Zahnwechsel. Es kann also sein, dass die Katzenkinder f\u00fcr eine Woche lang ein doppeltes Gebi\u00df haben weil die Milchz\u00e4hne erst verloren werden wenn die zweiten Z\u00e4hne bereits durch das Zahnfleisch gesto\u00dfen sind.\nErwchsene Katzen haben ein Gebi\u00df bestehend aus 30 Z\u00e4hnen. Wobei an jedem Kieferbogen sechs kleine Schneidez\u00e4hne zu finden sind. Sie dienen vor allen Dingen der Fellpflege. Gef\u00e4hrlicher wird es dann was die anschlie\u00dfenden vier lange dolchartige Eckz\u00e4hne betrifft, die auch (wohl nicht ohne Grund) Fangz\u00e4hne hei\u00dfen. Damit wird die Beute gefangen, gehalten \u2013 und damit die Beute auch noch gerissen werden kann befinden sich hinter den Fangz\u00e4hnen im Oberkiefer je drei, im Unterkiefer je zwei Rei\u00dfz\u00e4hne. Sie sind sehr scharfkantig und dienen dem Zweck, da\u00df die Nahung in schluckbare St\u00fccke zerrissen wird. Jede Zahnreihe endet dann mit einem Backenzahn (Mahlzahn).\nIst Euch schon einmal aufgefallen, da\u00df Katzen nicht kauen, sondern da\u00df sie mit einem seitlich gestellten Kopf Nahrung \u201eabrei\u00dfen\u201c? Dank den der Katze innewohnenden Magens\u00e4fte ist es ihr jedoch problemlos m\u00f6glich auch gr\u00f6\u00dfere Brocken gut zu verdauen.\nJetzt zum lachen, aber damals ein Angstmoment:\nAls die Babies unserer Punky ihre Milchz\u00e4hne bekamen erschraken wir fast zu Tode weil sich der Kiefer an einigen Stellen bei allen Tieren schwarz f\u00e4rbte. Zwei Tage betupfen mit Kamillentee, quickende und schimpfende Katzenbabies, dann ein panischer Besuch beim Tierarzt \u2026. der sah uns nur belustigt an und teilte uns mit, dass dieses lediglich Farbpigmente seien\u2026.", "Am 1.3.2023 stellte Professor Dr. Dr. Oliver Reis die Forschungsergebnisse zur Gemeindeentwicklung in 5 Modellr\u00e4umen (Katholische Kirchengemeinden) vor und kam mit den fast 30 Teilnehmenden ins Gespr\u00e4ch.\nAus den Ergebinssen lie\u00dfen sich Diskussionsgrundlagen f\u00fcr Gemeindeentwicklung ableiten, z. B. was es bedeuten w\u00fcrde, Gemeinden in mehr Selbst\u00e4ndigkeit zu entlassen, weil lebendige Gemeinden am besten mit einer Leitung aus der Gemeinschaft f\u00fcr die Gemeinschaft arbeiten kann. Oder dass die gegenw\u00e4rtig laufende Immobilienstrategie noch besser pastoral vernetzt werden muss. Denn die Ergebnisse zeigen, dass die traditionellen Gemeindeformen auf ihre Kirchen, Pfarrheime usw. als Identifikationsorte f\u00fcr die Menschen angewiesen sind, um dort in nahen Beziehungen vernetzt zu sein und auf die Herausforderungen vor Ort reagieren zu k\u00f6nnen.\nSo lie\u00dfe sich auch \u00fcber die n\u00e4chsten Jahre weiterhin eine hohe Zufriedenheit der Ehrenamtlichen erreichen.\nDie pastoralen Konzepte brauchen Hauptamtliche, die die Ehrenamtlichen unterst\u00fctzen. Dies wird hoffentlich ein einem weiteren, zuk\u00fcnftigen Forschungsprojekt evaluiert.\nEs wurde deutlich, dass im aktuellen Prozess, in dem \u201ewir\u201c uns als St. Georg und als gesamter Pastoralverbund NOW befinden, schon vieles passiert, was sich in eine gute Richtung lebendiger Gemeinschaft entwickelt, die den lokalen Gemeinden eine gro\u00dfe Eigenst\u00e4ndigkeit \u2013 \u00e4hnlich wie den untersuchten Gemeindeteams \u2013 zuspricht und die trotzdem ausreichend vernetzte Kommunikation sicherstellt.\nNach dem anregenden Abend standen noch lange kleine Gr\u00fcppchen vor dem Pfarrheim zusammen und besprachen ihre Eindr\u00fccke.\nKonzert mit Jonathan B\u00f6ttcher am 27.11.2022 in der Georgskirche\nKirchplatzbeleuchtung solar\nDer Kirchplatz wird ab sofort mit Solarscheinwerfern erleuchtet, die Aussenbeleuchtung wurde komplett damit ersetzt\nNeue Sitzpl\u00e4tze auf dem Kirchplatz\nDie Steink\u00e4fige vor dem Pfarrheim haben jetzt Holzsitzfl\u00e4chen und laden zum Verweilen ein.\nWeil nicht sein kann, was nicht sein darf? Gespr\u00e4che \u00fcber Tabuthemen\nIn loser Folge widmet sich diese Reihe verschiedenen Themen, die in der kath. Kirche tabuisiert sind oder es lange waren, denn: Es \u00e4ndert sich etwas.\nMenschen finden den Mut, dar\u00fcber zu sprechen, dass ihnen unter dem Dach der kath. Kirche sexuelle Gewalt angetan wurde und werden in der \u00d6ffentlichkeit geh\u00f6rt.\nImmer weniger Menschen akzeptieren, dass sie aufgrund ihres Geschlechtes, ihrer Sexualit\u00e4t und Partnerschaft oder dem Scheitern ihrer Ehe in der Kirche benachteiligt werden.\nBeim Reformprozess \u201eSynodaler Weg\u201c kommen diese Themen in einer nie zuvor erlebten Weise auf den Tisch.\nBitte melden Sie sich auf www.kefb.de oder telefonisch unter 02931-5297610 zu den Veranstaltungen dieser Reihe an. Die Teilnahme ist kostenlos.\nWenige Tage vor dem Termin erhalten Sie den Zugangs-Link zum digitalen Raum in \u201eBigBlueButton\u201c. Technische Voraussetzungen: Internetf\u00e4higer PC, Laptop oder Smartphone\nDienstag, 22. Februar 2022, 19 Uhr \u2013 Das Tabu des sexuellen Missbrauchs\nGespr\u00e4ch mit Frau Prof. Dr. Nicole Priesching und Dr. Christine Hartig, Universit\u00e4t Paderborn\nIm Dezember wurden die Zwischenergebnisse der Studie \u201eMissbrauch im Erzbistum Paderborn\u201c\nver\u00f6ffentlicht. Die beiden verantwortlichen Wissenschaftlerinnen beschrieben in einem Interview mit dem DOM (Nr. 48/21), dass es im Erzbistum Paderborn in den Jahren 1941-2002 ein \u201esystemisches Beschweigen\u201c der Vorf\u00e4lle gab.\nViele Menschen sind buchst\u00e4blich sprachlos angesichts der Zahlen, der ersch\u00fctternden Berichte von Betroffenen und der erschreckenden Befunde der bisher ver\u00f6ffentlichten Studien und Gutachten.\nMit dieser Veranstaltung m\u00f6chte die KEFB einen Raum bieten, sich mit den Zwischenergebnissen der Studie auseinanderzusetzen und einen Beitrag zur Aufarbeitung der Missbrauchsf\u00e4lle im Erz-\nbistum Paderborn leisten.\n\u00dcber die Studie:\nDas Erzbistum hat die Universit\u00e4t Paderborn mit einer Studie \u00fcber die Jahre 1941-2002 beauftragt. Am Fachbereich Kirchen- und Religionsgeschichte werden dabei nicht nur Akten gesichtet, sondern auch Gespr\u00e4che mit Zeitzeuginnen und Zeitzeugen gef\u00fchrt. Die Missbrauchsf\u00e4lle werden sowohl unter juristischen Gesichtspunkten, als auch im Kontext der gesellschaftlichen Entwicklung sowie theologischer, psychologischer und sozialer Aspekte betrachtet.", "\u201eDu z\u00e4hlst, weil Du du bist. Und du wirst bis zum letzten Augenblick deines Lebens eine Bedeutung haben.\"\nDie Palliativpflege umfasst nicht nur die medizinische Versorgung, sondern ist eine ganzheitliche Betreuung. Dabei geht es dem Bewohner die verbleibenden Tage so angenehm wie m\u00f6glich zu gestalten.\nF\u00fcr jeden Wohnbereich unserer Einrichtung steht eine ausgebildete Palliativfachkraft zur Verf\u00fcgung. Sie nimmt Kontakt mit den Angeh\u00f6rigen, dem Hausarzt und dem Palliativarzt auf, um f\u00fcr den Bewohner das Bestm\u00f6gliche an noch bestehender Lebensqualit\u00e4t zu gewinnen. Die Palliativfachkraft ist 24 Std. in Bereitschaft und begleitet den Bewohner bis zum Tod. Eine sinnvolle Schmerz- und Angsttherapie wird individuell mit dem betroffenen Bewohner und den Angeh\u00f6rigen besprochen und umgehend in die Wege geleitet. Unterst\u00fctzend bieten wir auch Aromapflege, Gespr\u00e4che, Sinneswahrnehmungen, seelsorgerische Begleitung an. Dies sind wichtige Bestandteile unseres Konzeptes, die sich in der Priorit\u00e4t verschieben k\u00f6nnen, je nach Anliegen des Bewohners, als auch bei der individuellen Versorgung durch das Pflegepersonal.\nDer Patientenwille ist, was z\u00e4hlt!\n\u201eW\u00e4hrend der letzten Lebensphase w\u00e4re es angemessen sich um die Symptome und das Wohlbefinden des Patienten zu k\u00fcmmern,\nals weiter nach Gr\u00fcnden der Dehydration zu suchen\u201c.\nFazit: Es gibt keine allgemeine L\u00f6sung!\nDer Patientenwille z\u00e4hlt bei uns zur h\u00f6chsten Priorit\u00e4t. Die Bed\u00fcrfnisse am Sterbebett wahrnehmen und Gutes zu tun. Zur Ruhe kommen und f\u00fcr den Sterbenden da zu sein. Liebe und Zuneigung zu geben und seine Hand zu halten. Kraft geben durch unsere seelsorgerische Betreuung."], "tlsh": ["tlsh:T152571F416269C805EF02C7051AD6A771403CFE0BA131DDF5562D44812C382F9BCA299EA4F38BACD181098BC23B367B14D917B358D25C03536E2DE88DC2AB39072FAE1EC2B5", "tlsh:T1BCD680314536CA31EA7808431CDFD675007079067931AAF9550D52E07D5C2CC78F199975EB0357D385A5D78317793601DE61FE9CC73C434AC112D11EC27F254B175D0D5596", "tlsh:T178592152B72A0560FE507B0118E3979044249C017D31A958593D28A33E3D2FF7CB3857DF33232CD6A129A7C663B1B705EE57736EE63D431B7729C89DC2366A096B1829DBFA", "tlsh:T14CE482A1967A8A28FF052A0B04B30FF0152C8D0CFF727E726C6D28D37D996EE3CB2D07DA634AA993501DE5DA7B6173126C6B774DC329830B562AE259C27E740A4F5419E434", "tlsh:T171FAA571B838C1129B921A051CC3AA21C59C58013D559E92146C94D11F7C3F97E7294FEED76782C3627EC543B3F5BE46AEA7B32CB23A4391B23A90ACE13B924FAFB805E651", "tlsh:T114855A21D2185414EF410D0089BB1322420CED719764C419A25D24D12D526EB7CE7D436EA70BEEE2E16D573A5F7A4312BD53732DF07A1364771DCC9ECB2B678B1B7C5DC256", null, "tlsh:T16AAD5741842DD334EE01208254F34891126C2D8AA870EEA0BC2C7AC1787C1FF3D3395650676B84C1225C739BAB793160EC63F2EE376D838538AAA5C6E26B350F97E50CC365", "tlsh:T1BCB19251656F4426BF1037324C679B541494A8817931A9D91C2618E23C0966A3C73907DE9F2778D3611F668A7768661D9F673B0EF77E0095050E98BCD93B3607AFC82A82F4", "tlsh:T12B28E9316229CD215E0239010CD69FA1101450C4EAB06A455D1C288FBA3E7FBBEA1803CEAB574CCBCB58AB51CD7D62085D27372F827586A657ACD578E23736EAAF5D18C338", "tlsh:T16A2572B1B57CD522EB82630108F77A009098A44263B7AC96290F24D1B2293B738F268E9F7317A8C3A16CC793473523288EB7BB1FD76E82C5D935C81DC22B67476B497DD674", "tlsh:T1FF286F115079C909AF12491602F3A3D8A420EC24D3363FF1E46DA8513D1EAFB99B283F95578248838A229B4256B23A02CCD3B30AE2649262B500C2ACD36614425F5C4DEEB8", "tlsh:T14AADB741547D5720DE909B136CA367901AB8D414BB33ABD214191CCAAB0E7DBB8B1006FE9F069C83B1257287BB64A705DDAB771DE36CC219721541EAC237AF46CBC119DA60", "tlsh:T1B639AF112F05C822BF712A597D9A96D8902C88005832B1904833183E3C0E26BBE2255A6A26622AD69A65A3016BB12005EEC9FB48B4B28B192D31DA26C532A752AB3108CB3B", "tlsh:T102C15461A7164832AF707E0948F26B6140587C06AD61BF78151F109AAD5D3FA3873B89FFBF665DD6411722405361666BADC27A0DF1AA93C6D664C4ECD2171846C3981EC2A3", "tlsh:T1375FEA21543299615F10316634C5EA1801F5AC51B9B29BE267296A823E206AE7C63856B7C7839CD3605A4659BB3965041C3133ACD4ACC2823FEAD5ACD296C18ADF249FD671", "tlsh:T14A464531ED32983E5E1122010EA3A384801557866E376AFED92928D2753C3CEBC3143DFE4353ACE5A3A0FF49B72266508CA2754ED27C8B07269CC41DF21B6A456F789C92F8", "tlsh:T1B5A025C1533D4624FE00510619F64AA1DA2C5C453E319E121C2E25D26E1CBFE3C3150BA92B175DE7712DD283332033048DA77759E31E978B223AA9EEC2BB614B1F6C39CD3A", "tlsh:T17432DC31B57DE9359F4035400C9FD69031209A00ED32E981583A7CE1F9692E4BCB6EABDA4B6B20CA20ADF90F633E2348FD2B775C836E8105190CEE1ED3B2250526DC6DC3B0", "tlsh:T156415251B6394116AF38560E59F7EB42A858A4026F21AF80553A64D12D6EAEA3DB286FDC7E134E825127DB872768BA0CDD67B72E621D4319922D801FC2337E0A2F9D0DC4A1", "tlsh:T1574158317435890B8E080B054CDB969A4538E3342430C9A2996930D36D276F538B3C3BACB323ACD7762D2FDAA369704B4A4E796AF0BD421D664B45D6C0652653EF949EFA74", "tlsh:T1D4474D2144434221EF922232980FAB958900EC02D9B749B14D4C1CC1766C3BAFCA395B9903D318E30566FF8B2B74A2601EF6BB13C978C0073F2B8025D4737B173B99696BA5", "tlsh:T19466CEC1843B8429EE51764669F28E2511ACC827B935F65E5D3E24C21E287F97CE682BAB2A4388D6B11D56023373A7450E977B2FCE37C315762DC87CC21F530A4A5C11F27C", "tlsh:T1D957CAD1D56B5914DF214A0509DBAB148154BC467F738AA1041E29CA9D2D7F63C7240FEEE7C764C6471C9F4A33B1B614ECAB7B0ED30E0397AB38C4ADD136640BAF8C19D8B8", "tlsh:T1D0601031647B0D21EF61760514F20B911B8889413F717FE9482EB2713F0C9BF18E10195D26A26C9E700EFB923BD19728DE8FB38D8169C39641AD7052D073920B9F3429D946", "tlsh:T1CC306CB1853C8252AF6406401CA3CFB8600448966631AE807A2638C11E3C3F77C7256ABB7757DED2D1B957FA7B79B501CD277B1DE07E97592529C186E322621FF72819C2B5", "tlsh:T1123DE742B6394920EF50160218974F14E49458076A324E8A152F25C16E2B3FDBCB384AF97F57AAD3D238AB4797B43216DDBBBB4CF32A43556535C05CD67B26072FAC0EE2B4", "tlsh:T17B557641537A0D22EE91360908F11FD11B9849523F317FB1142F71623E0EBBF349240C9E3A762C89A10EE7823BD083188E4BB74D611683A6127CB046D1FB51479F652EDD49", "tlsh:T17FCBE6019E3AC762EE56B4547C7B296405A4A0476C130828B92D0FC1BE3D4B079F3E12775FAF5DD6047CA346827B9308DE7F370FA63E86197B1954A0C275DA69171458C235", "tlsh:T15E022331652DC521FD21A106086BAF51269C6E066C3199586D292EC57D065A2FC63847CA1357F8D3906443677F713200FB63370DE36FC6423A54C4A8C277AB6A6E085CF37D", "tlsh:T1AD831331A71AD7327E42714271FAC714D315582F1F26A677EC6008D1E0342793CA69C7FA4697F8C0A934DC9277FA36609D57B7DD867217146E3EC049D7532A0B4B0834DB74", "tlsh:T1E652BC61436F48169F42E2919FB7A76481E04E929DB0BCE97F108CC12927365BCF1B1FF46F76C7E626400152AB2575025CA57E2CD77DC142322D441CF266F386B91428FD5C", "tlsh:T1072B83E0AB8DAA26FE0422033C6C9684402CA2C5FD60A48A6B2E38FB083D0B0BC32581AC522BCCE227F7C39A4BA6351023037266332741468B56A06CC3226354B94A4CC079", "tlsh:T1798B0B01C97CC661FF9A6043B88B2C6A9970E850C9315AD51E7E39812D18A3EBC2359BB82007DCD3120803D0BDBDCA096E27731EB3DD9649B565A166D0FC7F86AF043AC4EC", "tlsh:T15CCF8631459EC027DB9263A19B2F973445C18AD69D71EDE5BF5888D0581A3E4B8F1F1DE17ABACF60A90001466296694A48957D1C673DF17B737C403DE3322385784E28B85D", "tlsh:T1D83D5611236D4558CB210FA88CB7FDF19CD4A846F83067C0187F6CC62D613F07CA380F59372B4AC0503CE442D2A6510188B13F39486C9290DF12503DFD3730433B7854A294", "tlsh:T11F0C513110949C226EA3114A34F1DE71102C6C563BB1EDD94D3A6ED60B292F53C76D0C7D2A66A8F3B00BD38884A4F34198A3A75D83A24205931B97EE41BAA3B792B9ACC005", "tlsh:T17CAC3D31117A0D22FFA1360504F10FA1179849513F317FB1082E71A23E0EBBF34A241C9D37A22CCDB20DE7823BD19318DE5F774D911683661268B045E4B751479F281ADD45", "tlsh:T1DDEA0B829479C221E9326B471DF35600091CCC483F34BEEB8E2E68D13A1DAFDBC7280AF9976799E7702E6186377573049EE3B70D933F83C9A16691ACD1376206DB1419D99A", "tlsh:T1DAD31581C83984109F10A509EC9FCB148C1C6602BA33EEF61F0919E16F2F7FBB8A690EE2239285F12112FBBD63522B00CCFBBA3D712ED3455256B89DC15F56549B541DD463", "tlsh:T1E152B601152AC510FBC4F40015B27751042D8457ED30CD97730517C1BA293FCFDE3962A5252719469E9491A42D3D77184701B375A73551477248D459D3012A170FFC4EDB36", "tlsh:T15D2D8511043D0407AE31AA0950F7C684586C94496D1BFB35C82A19E6A25D2FE2D72095E56DAF9CC7409CAF07E23FB608F9E9C50FA77C87115C595D16B3353297134C2BD2E4", "tlsh:T1BF3B3921232E4A109F11251121A21F1044543447E2B2BC11681E1AC07D089A97CE355F7CB65B38CB333DBBC6B3F5A382EC3B3748E1AC8716767DC83FD574138B6B683CDAA4", "tlsh:T14F961A11002A4A58FE6037030EDFEE154828D08ABE716DED2C5A5EC06BF66C536B4F4ED6E661CA97B248C19A070127015C7FBB0ED7BE8120B13650AF4442620BF95E4ED0C6", "tlsh:T1CC6D0631216B4029FA007E015CE6EF00E818CC84FC6177D9552E08D1AF3CBA9B07099B7E3762D9F66309C945BFA139008C767E1BB3B897A952784427D037BA163F441EF0E1", "tlsh:T1FAF04C21EE7B1A12BFA1371510F10BD12B994A413F717FF1083E61B23E0CAFF18D24189E36A22C8DB14EFB963B91A628DD5FB38D5156C36601ADA042A4B7960B5F241AD989", "tlsh:T11714DC81422F8D06A767E70A0DE2676078188E5FAC30A8712F2E48E33F19F95FA23406919B243EBA917CF56087322704AD1B1E1CD1B36A18A4FCD576A20757D37694188738", "tlsh:T153934132A52E5115BF01BA0600F7777051369E067E20F7DDAA0C03C11FBC7F93CB785B5AFA670983B16C934AA729621A6DB3771EA23AD349932D40B9C2671A07BB6C1EC958", "tlsh:T18135F031857C685AE911520114FB9B65919CA401FB709F70255D1DC33D4D3F9B8FD552AEA79BE0D3A028C712BB7671079876670BA234D317D204485E911322072FDA6ED9B6", "tlsh:T13A69980274159510FE11BB0528FADB041034CC56FD31EAA06D2E38D37A2A3FBBCB291FFEA77399C35354465BA7723304AEA77B1DC33E5215622AC0C9D13762469B682DE6B1", "tlsh:T1B0B3E9C1533D4624FE00510619F64AA1DA2C5C453E319E221D2E25D26D1CBFE3C3150BA96B175AE7712DD283332033048C677759E31E978B223EA9EEC1BBA24B1F6C39CD3A", "tlsh:T1F1F95981833D8A10DF00570145E78AA560346806A5703A9A190E25D17F3E3FC7C72D9FF837075AD1232A9A8A7B79A214CD73B90DE37E4306172E94EEC237AB0A1F9D2DC4E4", "tlsh:T16A17C231532C90419DE0322E51AB832A457C54186DD1C9D8BC0EFDE2BB0D6D6B8A069FB633735CF77035065A187456414DE76E9FEE1C8224E10888C8C23B1B2AFACD5BC467", "tlsh:T173B77D2111358532F65379D11F338C41100CCC9D4E3B7CE70E15B4205A1AB91B7C5C4BA1DB66D4D5621AE74E377B669383DE6B25B22D82D1B2AA4451C01B0285DE20ACF915", "tlsh:T1428A34F00E806161AF0333043CDAF4682C901B46FC327E24022205E36E9C9B0A85310E876357BFC00C1413E19F9303E655936A5EE1660413364AC1E890B9DF2C77288DC889", "tlsh:T192E28141973A45215A0036040CB29BB24A2889D72E718B0A2D5D30EA7A1E7FD3D23D5BCA0B8344E66114675773F8E741AF33F60AD3BF9796507EF07CD253754B8BDC05C2A1", "tlsh:T196E92A11212351127594670124BB9BA8392CE5119E20FF2A9C2919C73D2E1FA7C5341EA9BB524CCA7304424656E8FB14CCAFDA2CB3B993525369C8C6DB76A30F1B8018EC19", "tlsh:T17C642C312369C022DA26BB1569BF8F106898A0C2B9741ADD603E24D41D5ABA17C43DEBD47B27E5DA70159902BFBE32090AFA7B6F73ED5244D320643DC11B1BCF1BCC9E8161", "tlsh:T1F45DD911793886100F413A0504CFC3116C5A88D564B17B91F40B23876C773E4ECF3845DF8AE688C376594717E7646340559EF74D077D5388AF3DDA4AC226B396278D2EF1E4", "tlsh:T1E90D0B21540404315646750124BE9B5D94A241703F2977C0605D6C51996C2EE746188EFAFF832CC300ADCDD46B2485138A37766AF0BA67945738C5DDC3F794432B7FF9DA60", "tlsh:T15375D662942A8D22EFA06A0048F7B750505C8817E532ABB05C2F28D17B2D7FF7CB290BAB1313ACC37215978777AA32085C63771EE13DC35A666584DAC37B1E0ADF681CD965", "tlsh:T1B0A4E951A53DD110DF41660169E75290500C594BBDB0A959892E15D339293BABCA3843F95FAAD8D252749E1B932E7401D4B3BF8FD17ED764FA18886EC2730F4B2AEC1EC361", "tlsh:T138E7F851963ADA35F571B7C104E38350A024D8512E718E8427493CC2F8797FE3CA255FAF731754CAD279E19723BD22051D5B735AA31F03412552D08DC67A5D96A7DC29E631", "tlsh:T18F31F741F03ED516BB0009010DA2A7E550247C867F246E88A99E64C22A2C2BE34F24DB9C2F03EDF6A02B96325955BF476DB7735EE13E021D2178DC98C23B16261B496AC079", "tlsh:T1CB9633215270C0119EE8050809E3BA11494864883E66A583060E70C21D3E0AEBE72D43CD7B036AC783BEE6978769360B8C93B39EE37F930C523DC019C617FB4A8B5C09EAE1", "tlsh:T1BC1D182163758A21CB5093011CC287519B24CB800F126D020F2BADE35C0A1E7FCD0E03C407B3E5C7D131468B2AEA82308F767F088B4CC6B6311EC0AA867B7103072C1DEA37", "tlsh:T11FB5002141108806EA003A0D19B36A984A046C8A3DF26DE6282E78C29E3C5BD39B3D4EDD634350EB020A19C353A1E30E8C3BB779C26DD75262AD64ACC1A1662B1B8037E4C5", "tlsh:T127E0AFE1B63D4821FF15174109737B825A2CA831AEB29DE12C1E69F63E3D7FE7CB284FFE2B2329C6E22D5A42A3B9B1151D63721DA17A8303BB79C888D477211B875425D0D2", "tlsh:T18DAFC631351882029F041B8508A3EE1194082A07B432DFD5685E11EE9C3E6F0BCB2907ED3727BBE1F15B4BCB67DB1B18DD677654E57402915A35CC5EC16633472B781CD6B1", "tlsh:T18965D2F1B63E41115B5062110AF7E360641CDD153E756DA90EB41DD3BF3D3EB3CB299FAAA313A8C2A228DBA2F77477448E63331C91BD43161931C46CD2276A474B292DD8E6", "tlsh:T19FF72C72953B8120EE20730318B786611958D502FD319E90992A7CD239286EFBCF1C0BBEA7269CCB512EA289776067449FF6F71FA37DC345B569F458E2B311026F4C1DE979", "tlsh:T15327FF61953CC862DE6028012CD36B2150A82D06BF71DB81142D54C11E2E3FA39B144B5BB71358C3A23E4D82E799F106ECABBB9CF0399365C739806EC137AB0F1BE809D6D5", "tlsh:T13E2FC741433E0740CD30F60B51EE0BEAD1A483092D1915A8384D6DC8341E6B7D5931C59F37A67D9D1A3CD7E427FFBC57CD11332FA731F341E98AE18A5A52461367A83AC881", "tlsh:T1D6674511A5271D32FF00950518BA6B40997108937E33223A780E29D33E286B17430C07F90373ABC32269E94F6BE22218DC133E8EE030C712B61CC8568736BE127FAD08D6AC", "tlsh:T1FF592C2145658D208F616E0251DE46206D68D406D36055F9892D3DD1581D57A7C75957F93386CAF36096736687BC910B1F33B30D923FD35417B9C12AD37B53013B484AEA6E", "tlsh:T1C137D631643A45226F61A60140BB6788A054DB528F725941182CB082A9192AFBCF7D17EB3B9288C4523913F273F1B34B8D677B1DD76D5706062ED837C0B50F475F8C3DEAF5", "tlsh:T11D7FBD31A72C04259F5012000CF77F910160AD0BF2338A92AD5864D07C1C3EDBDF3C8ABEB3736ADB917A4B5E57D1AA11CE2B722AD63E9378B670D10CC62691830BBC1DC6B6", "tlsh:T15BBAF051956E4A254F1013051DD76F534954A8073E726E922B1A20D3B91CBEEBDB1EAF9E2B53E8C2300D17D13779B706587B3615D3BD4305A979896DC173930B2F983CC9B2", "tlsh:T1A24C435144248432DB02351086EBD74511581E2276B51B665B1D28A13E1C3A3B8E2E4AADF7839CC6B324EAC76BB672626C77F71DD13C83073AA1C019D73372922B2820D67C", "tlsh:T179D4EC21211CAC30DD58BB8712EF76840D7841957C23E9AD257E6894FA3F1887DF0101E8369140E2A1A05696872B95C3E9417B5A65A5D2EA5325C06ED26687033ABE8AED44", "tlsh:T195A75391007C1951EF17571219975AF487DC8D026E2299BAD8766CC04F253FDEC7151A6FEF1288C1611C1F6E1B875A256C53DB27D37EA395302988AED033B2133B683EE0A4", "tlsh:T14FDB1A41A73A4102EF953DC218EF1FC035549CCAFD606DD0293B11925E323E97171846D53E332E8BA15BDBA316B223019CAFFE7AE74C5B4169DCC584C152960E8B002582B2", "tlsh:T11F9C37A1D73A84157A001A0219D71F600164A8457676BEA1541E14C56D7C3FA3CB281BBFFFC7ECC3160D6B8BB6B43602AC73BB1DD27E9385293EC854C4AB6B4F8F5C29C6B0", "tlsh:T123CD80E196785424AB95230024C35F619438EC0268736965482F31E17E3A3FE3CB2C4BEA37539DC7932D97472375B309CE67775DA27E8399663DC05EC2BB1E4A4BAC2DD5A4", "tlsh:T110E698218628D872FB62260644AA6B90D76C2C423E261E70604C74D279166F93D6281BEEA70B9AC3E35C6459F71AB7061C67BECCC27F8324E791C174C423E50B0B84DAD361", "tlsh:T17C2DA8A1D7394A206E0165401CE39F1444687C467FF28EA52C2D06C15D263FF3C7296EDAB757A9E3432D4B8B73607612DEA3376CE2A55355E62ED8A6C63B5107A7282FC252", "tlsh:T136056A41853CD4169F70A90124DB673654684846A762BFE45C2F10D36A2B3EA7DE39579F7F2785D7D11443CA23D5B6149C7BBB2CE052872150B984968267850F5F082BE2D8", "tlsh:T14B514831843E8633FA5171830CF76B204D1CD4167A70DAD6D22D0DC0AD2D6EB7CB2601F69B5369C162B892835366B5186D03370F622C438BA80DC489C077076A272049EA27", "tlsh:T1D31D2D1163BA8018EA60070305AB0D299220FAA2EF79BEA82C2F6541155C5BE38A2C149D691BE9EF123E56E16B353B15CDB7BB4CF04E8206311784AEF12715835B6C34EA25", "tlsh:T158A3AE53B77D8322EE217A477DBB8B80151CCC24BD30AEFA591D78D13E0C6FDBCF185AFD9327A9F6622D6682676073018D57BB0DE33D87CA612D945DD076260B2B2019E94E", "tlsh:T1933D4A21C51AE8338D40628E69A3BB16308D680DBC72CECB41182DB22E1C7F878A384E83B3532013801D0F2B937139600926327CA234C36CD02CC05E8515320F6EE897F996", "tlsh:T1C5B3A511ED94821CF82F3613946A521999EB4CDA75307FDD2E2C7CA47D2BDF8BC2348E7C2A93AD47B1AE830A276716014CF37719A636C28840832109C12B57CE2458DDC21C", "tlsh:T1EBC8CED1A734C4119F51520218F3EB2156B41849BD236EA5982A15C01E3F2F67DB344EBDBB57DBE2813C8B9352FC3215CDA6FB89F0BA4395CA29C06DC213168A2FDC0EE6E4", "tlsh:T1D15D0821546ACA1C5B7522011DEA6F681018544A3E332D60D95A01868D366F63863A07AE6BB3EDC38228A78243DDB511ED93FC0DA13F431A39D9C55DC32B97436F48079BE4", "tlsh:T102D58511EFB64420FF101D114CF25F6196E5AD4179F24EE4990E2291BC1B3FAFCB240A7D67A2D1D193290A8236247406D921B66E202AD36D377C9C2ED12B14267FE869E994", "tlsh:T17FEA71C1533D4624FE00510619F64AA1DA2C5C453E319E121D2E25D26D1CBFE3C3150BA92B1759E7712DD283332133048D677759E31E978B223EA9EEC1BBA14B5F6C39CD3A", "tlsh:T125707A7121390425ED3065036EF38A5009789C316F34AA5128297C91391A7FABCA1E5BED971BACDE201EA34B3614B311EEE7771C936DC252243A859CA562351F9B4C29DC3A", "tlsh:T124896D41341EA5215F281A060CA76F4614686C02F57E1E94652E30966E077FBBD72907FF7A03F9C6B2285A06A3A0B409DD77BB5FF2BD93387234CD5EC973258603164DD158", "tlsh:T1EBFC8591C53E4632AD51270109E3EB11416CEC157731A9641C1E21D23C2C1BB3CF242BBD63A258E6E31A9343A7533508AE23732EE37E83467226DA6CE233A20F5F9C0DD76C", "tlsh:T1BE19D43186290D11AF12670309F6A6810818EC0AB7B7B996591C31C1393A6E97C33C4BFFB2174CC3539A939A3722F3013DA3732C986C53C54848D00EC1222BCB5B5CBDE527"]} \ No newline at end of file diff --git a/tests/test_compose_dataset_benchmark.py b/tests/test_compose_dataset_benchmark.py index 1e0ba86..a0d04c4 100644 --- a/tests/test_compose_dataset_benchmark.py +++ b/tests/test_compose_dataset_benchmark.py @@ -1,29 +1,33 @@ -import os -import asyncio import logging -from pathlib import Path +import os import tempfile import time +from pathlib import Path + import pyarrow as pa import pytest from llm_datasets.io.parquet import save_texts_to_parquet_chunks - from llm_datasets.utils.config import Config, get_config_from_paths from llm_datasets.utils.dataset_generator import DatasetGenerator, DatasetSplit +from tests.conftest import FIXTURES_DIR + logger = logging.getLogger(__name__) -CONFIGS_DIR = os.environ.get("CONFIGS_DIR", "../eulm/llm_datasets_configs/") +# CONFIGS_DIR = os.environ.get("CONFIGS_DIR", "../eulm/llm_datasets_configs/") -@pytest.mark.skipif(not os.path.exists(CONFIGS_DIR), reason="CONFIGS_DIR does not exist") +# @pytest.mark.skipif(not os.path.exists(CONFIGS_DIR), reason="CONFIGS_DIR does not exist") +# TODO: this test currently does not work -> dataset must exist on disk for total row count -> replace with dummy datasets +@pytest.mark.skip() def test_compose_dataset(): with tempfile.TemporaryDirectory() as temp_dir: + shuffled_datasets_dir = os.path.join(temp_dir, "shuffled_datasets") + config: Config = get_config_from_paths( [ - os.path.join(CONFIGS_DIR, "euro_dataset.yml"), - os.path.join(CONFIGS_DIR, "pegasus.yml"), + os.path.join(FIXTURES_DIR, "configs", "dummy_config.yml"), ], dict( interleave_random_batch_size=1_000, @@ -33,12 +37,12 @@ def test_compose_dataset(): use_sampling=True, save_dataset_ids=True, limit=1_000_000, - shuffled_output_dir="/data/datasets/lm-datasets_data/euro_dataset_v1_shuffled", + shuffled_datasets_dir=shuffled_datasets_dir, split=DatasetSplit.TRAIN, - extra_dataset_registries="internal_llm_datasets.dataset_registry", + # extra_dataset_registries="internal_llm_datasets.dataset_registry", selected_source_ids=[ # "colossal_oscar" - "norwegian_cc", + "legal_mc4", ], selected_dataset_ids=[], ), @@ -51,7 +55,7 @@ def test_compose_dataset(): dataset_generator = DatasetGenerator( config, - shuffled_output_dir=config.shuffled_output_dir, + shuffled_datasets_dir=config.shuffled_datasets_dir, output_format="parquet", save_to_dir=Path(temp_dir), split=config.split, diff --git a/tests/test_config.py b/tests/test_config.py index e69de29..c286415 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -0,0 +1,14 @@ +import os + +from llm_datasets.utils.config import Config, get_config_from_paths + +from tests.conftest import FIXTURES_DIR + + +def test_config_from_yamls(): + config: Config = get_config_from_paths( + [ + os.path.join(FIXTURES_DIR, "configs", "dummy_config.yml"), + ] + ) + assert config.seed == 42 diff --git a/tests/test_datatrove_reader.py b/tests/test_datatrove_reader.py new file mode 100644 index 0000000..04bdcfa --- /dev/null +++ b/tests/test_datatrove_reader.py @@ -0,0 +1,110 @@ +import json +import os +import tempfile +from pathlib import Path + +import numpy as np +import polars as pl +from datatrove.executor import LocalPipelineExecutor +from datatrove.pipeline.writers import JsonlWriter, ParquetWriter +from llm_datasets.datatrove_reader import LLMDatasetsDatatroveReader +from llm_datasets.utils.config import Config + +from tests.dummy_datasets import get_dummy_dataset_cls, save_texts_for_temp_datasets + + +def test_datatrove_reader_to_jsonl(): + expected_docs_len = 1000 + ds_clss = [get_dummy_dataset_cls(size, prefix) for size, prefix in zip([expected_docs_len], ["a"])] + config = Config( + selected_source_ids=["dummy"], + extra_dataset_classes=ds_clss, + use_default_dataset_registry=False, + ) + + with tempfile.TemporaryDirectory() as temp_dir: + output_dir = os.path.join(temp_dir, "output") + output_dir_path = Path(output_dir) + + list_of_saved_texts, list_of_dataset_ids = save_texts_for_temp_datasets( + config, + temp_dir, + output_format="parquet", + ) + + assert len(list_of_dataset_ids) == 1 + + executor = LocalPipelineExecutor( + pipeline=[ + LLMDatasetsDatatroveReader("dummy_a1000", config, limit=expected_docs_len), + JsonlWriter(output_folder=output_dir, compression=None), + ], + tasks=1, + workers=1, + ) + executor.run() + + # load output docs from disk + texts = [] + for fp in sorted(output_dir_path.glob("*.jsonl")): + with open(fp) as f: + for line in f: + texts.append(json.loads(line)["text"]) + + assert len(texts) == expected_docs_len + + assert len(texts) == expected_docs_len + assert np.array_equal(texts, list_of_saved_texts[0]) + + print("done") + + +def test_datatrove_reader_to_parquet_chunks(): + expected_docs_len = 1000 + ds_clss = [get_dummy_dataset_cls(size, prefix) for size, prefix in zip([expected_docs_len], ["a"])] + config = Config( + selected_source_ids=["dummy"], + extra_dataset_classes=ds_clss, + use_default_dataset_registry=False, + ) + + with tempfile.TemporaryDirectory() as temp_dir: + output_dir = os.path.join(temp_dir, "output") + output_dir_path = Path(output_dir) + + list_of_saved_texts, list_of_dataset_ids = save_texts_for_temp_datasets( + config, + temp_dir, + output_format="parquet", + ) + + assert len(list_of_dataset_ids) == 1 + + executor = LocalPipelineExecutor( + pipeline=[ + LLMDatasetsDatatroveReader("dummy_a1000", config, limit=expected_docs_len), + ParquetWriter( + output_folder=output_dir, + # compression="gzip", + # zstd -> error + max_file_size=1024, + ), + ], + tasks=1, + workers=1, + ) + executor.run() + + # read data from disk and check + df = pl.read_parquet(sorted(output_dir_path.glob("*.parquet"))) + texts = df["text"] + + assert len(texts) == expected_docs_len + assert np.array_equal(texts, list_of_saved_texts[0]) + + print("done") + + +if __name__ == "__main__": + test_datatrove_reader_to_jsonl() + # test_datatrove_reader_to_parquet_chunks() diff --git a/tests/test_document_datasets.py b/tests/test_document_datasets.py new file mode 100644 index 0000000..11eca3f --- /dev/null +++ b/tests/test_document_datasets.py @@ -0,0 +1,57 @@ +import os + +import pytest +from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.dataset_registry import get_dataset_class_by_id +from llm_datasets.utils.config import Config + +RAW_DATASETS_DIR = os.environ.get("RAW_DATASETS_DIR", "/netscratch/ortiz/corpora/ELE/") +COLOSSAL_OSCAR_DIR = os.environ.get( + "COLOSSAL_OSCAR_DIR", + "/netscratch/mostendorff/experiments/eulm/data/colossal-oscar-1.0", +) + + +@pytest.mark.skipif(not os.path.exists(RAW_DATASETS_DIR), reason="RAW_DATASET_DIR does not exist") +def test_openlegaldata(): + dataset: BaseDataset = get_dataset_class_by_id("openlegaldata")( + raw_datasets_dir=RAW_DATASETS_DIR, + ) + for i, doc in enumerate(dataset.get_documents()): + if i == 0: + assert doc.text.startswith("\nTenor") + elif i == 9: + assert doc.id == "lsgsh-2022-10-11-l-6-as-8722-b-er" + elif i > 9: + break + + +@pytest.mark.skipif(not os.path.exists(COLOSSAL_OSCAR_DIR), reason="COLOSSAL_OSCAR_DIR does not exist") +def test_colossal_oscar(): + dataset: BaseDataset = get_dataset_class_by_id("colossal_oscar_2023-23_fr")( + config=Config(local_dirs_by_source_id=dict(colossal_oscar=COLOSSAL_OSCAR_DIR)), + ) + for i, doc in enumerate(dataset.get_documents()): + if i == 0: + assert doc.text.startswith("Les cookies nous permettent de personnaliser ") + elif i == 9: + assert doc.id == "75" + elif i > 9: + break + + +def test_legal_mc4_en(): + dataset: BaseDataset = get_dataset_class_by_id("legal_mc4_en")() + for i, doc in enumerate(dataset.get_documents()): + if i == 0: + assert doc.text.startswith("(1) The scope of the individual services is based on ") + elif i == 1: + assert doc.text.startswith("The courts do") + else: + break + + +if __name__ == "__main__": + test_openlegaldata() + test_legal_mc4_en() + test_colossal_oscar() diff --git a/tests/test_generate_texts_from_output.py b/tests/test_generate_texts_from_output.py index feb5d1f..7d27d10 100644 --- a/tests/test_generate_texts_from_output.py +++ b/tests/test_generate_texts_from_output.py @@ -1,8 +1,10 @@ import tempfile -from .dummy_datasets import get_dummy_dataset_cls + from llm_datasets.datasets.base import BaseDataset from llm_datasets.utils.config import Config +from tests.dummy_datasets import get_dummy_dataset_cls + def _test_generate_texts_from_output( dataset_size=100, @@ -21,8 +23,8 @@ def _test_generate_texts_from_output( with tempfile.TemporaryDirectory() as temp_dir: ds: BaseDataset = ds_cls( - output_dir=temp_dir, - shuffled_output_dir=temp_dir, + text_datasets_dir=temp_dir, + shuffled_datasets_dir=temp_dir, max_output_chunk_rows=max_output_chunk_rows, max_output_chunk_uncompressed_bytes=max_output_chunk_uncompressed_bytes, output_batch_size=5, @@ -45,6 +47,7 @@ def _test_generate_texts_from_output( limit=limit, shuffle_output_file_paths=shuffle_output_file_paths, reader_implementation="pyarrow", + cast_to_py_string=True, ) ) @@ -67,7 +70,12 @@ def test_1(): def test_2(): - _test_generate_texts_from_output(dataset_size=100, offset=0, limit=19, compare_text_indicies=[(0, 0), (19 - 1, -1)]) + _test_generate_texts_from_output( + dataset_size=100, + offset=0, + limit=19, + compare_text_indicies=[(0, 0), (19 - 1, -1)], + ) def test_3(): diff --git a/tests/test_interleave_datasets.py b/tests/test_interleave_datasets.py index e0a5e05..4314d9d 100644 --- a/tests/test_interleave_datasets.py +++ b/tests/test_interleave_datasets.py @@ -1,11 +1,12 @@ -from collections import Counter +import logging import tempfile +from collections import Counter import pytest from llm_datasets.utils.config import Config from llm_datasets.utils.dataset_generator import DatasetGenerator, DatasetSplit + from tests.dummy_datasets import get_dummy_dataset_cls, save_texts_for_temp_datasets -import logging logger = logging.getLogger(__name__) @@ -64,7 +65,7 @@ def _test_interval_datasets( dataset_generator = DatasetGenerator( config, split=split, - shuffled_output_dir=temp_dir, + shuffled_datasets_dir=temp_dir, output_format=output_format, save_to_dir=temp_dir, ) diff --git a/tests/test_iterate_over_shuffled_datasets.py b/tests/test_iterate_over_shuffled_datasets.py index fdee4c7..b7d2c34 100644 --- a/tests/test_iterate_over_shuffled_datasets.py +++ b/tests/test_iterate_over_shuffled_datasets.py @@ -1,14 +1,18 @@ import os -import pytest from dataclasses import dataclass -from llm_datasets.datasets.dataset_registry import get_dataset_class_by_id, get_registered_dataset_classes -from llm_datasets.datasets.base import BaseDataset -from llm_datasets.utils.config import Config import pyarrow.parquet as pq +import pytest +from llm_datasets.datasets.base import BaseDataset +from llm_datasets.datasets.dataset_registry import get_dataset_class_by_id +from llm_datasets.utils.config import Config SHUFFLED_OUTPUT_DIR = "/netscratch/mostendorff/experiments/eulm/data/llm_datasets_texts_shuffled" +""" +TODO dummy test that requires local data +""" + @pytest.mark.skipif(not os.path.exists(SHUFFLED_OUTPUT_DIR), reason="test file not exists") def test_iterate_over_datasets(): diff --git a/tests/test_read_parquet.py b/tests/test_read_parquet.py deleted file mode 100644 index bf2a012..0000000 --- a/tests/test_read_parquet.py +++ /dev/null @@ -1,192 +0,0 @@ -import asyncio -import itertools -import logging -from pathlib import Path -import tempfile -import time -import pyarrow as pa -import pyarrow.parquet as pq -from llm_datasets.io.parquet import save_texts_to_parquet_chunks - -from llm_datasets.utils.config import Config, get_config_from_paths -from llm_datasets.utils.dataset_generator import DatasetGenerator, DatasetSplit - -logger = logging.getLogger(__name__) - - -def sync_dataset_iterator(file_path, batch_size, output_text_field): - with open(file_path, "rb") as file_handler: - pq_file = pq.ParquetFile(file_handler) - logger.info("Generate from %s with bs=%i", file_path, batch_size) - - for pq_batch in pq_file.iter_batches(columns=[output_text_field], batch_size=batch_size, use_threads=False): - # logger.info(f"{file_path} , {len(pq_batch[0])=}") - for v in pq_batch[0]: - yield v - - -async def async_dataset_iterator(file_path, batch_size, output_text_field): - with open(file_path, "rb") as file_handler: - pq_file = pq.ParquetFile(file_handler) - logger.info("Generate from %s with bs=%i", file_path, batch_size) - - for pq_batch in pq_file.iter_batches(columns=[output_text_field], batch_size=batch_size, use_threads=False): - # logger.info(f"{file_path} , {len(pq_batch[0])=}") - for v in pq_batch[0]: - yield v - - -def sync_convert_to_batches(iterable, batch_size): - py_batch = [] - - for sample in iterable: - py_batch.append(sample) - - if len(py_batch) >= batch_size: - yield pa.array(py_batch) - py_batch = [] # reset - - if py_batch: - yield pa.array(py_batch) - - -async def async_convert_to_batches(iterable, batch_size): - py_batch = [] - - async for sample in iterable: - py_batch.append(sample) - - if len(py_batch) >= batch_size: - yield pa.array(py_batch) - py_batch = [] # reset - - if py_batch: - yield pa.array(py_batch) - - -# async def test_read_parquet(): -# output = [] - -# async for batch in convert_to_batches(generate_from_parquet(), batch_size=5): -# output.append(batch) - -# logger.info(f"{len(output)=}") - - -async def async_generate_from_parquet(file_limit): - fps = list(sorted(Path("/data/datasets/lm-datasets_data/euro_dataset_v1_shuffled").glob("*.parquet")))[ - :file_limit - ] # colossal_oscar_2023- - print(f"{len(fps)=}") - output_text_field = "text" - batch_size = 10 - - dataset_iterators = [async_dataset_iterator(file_path, batch_size, output_text_field) for file_path in fps] - - for dataset_idx in itertools.cycle(range(len(dataset_iterators))): - try: - iterator = dataset_iterators[dataset_idx] - # sample = next(iterator) - # await sample = iterator.__anext__() - sample = await anext(iterator) - - yield sample - except (StopIteration, StopAsyncIteration): - break - - -def sync_generate_from_parquet(file_limit): - fps = list(sorted(Path("/data/datasets/lm-datasets_data/euro_dataset_v1_shuffled").glob("*.parquet")))[ - :file_limit - ] # colossal_oscar_2023- - print(f"{len(fps)=}") - output_text_field = "text" - batch_size = 10 - - dataset_iterators = [sync_dataset_iterator(file_path, batch_size, output_text_field) for file_path in fps] - - for dataset_idx in itertools.cycle(range(len(dataset_iterators))): - try: - iterator = dataset_iterators[dataset_idx] - sample = next(iterator) - # await sample = iterator.__anext__() - # sample = await anext(iterator) - - yield sample - except (StopIteration, StopAsyncIteration): - break - - -async def async_save_texts(text_iterator, limit): - output = [] - - async for batch in async_convert_to_batches(text_iterator, batch_size=5): - output.append(batch) - - if len(output) > limit: - print("limit reached") - break - - logger.info(f"{len(output)=}") - - -def sync_save_texts(text_iterator, limit): - output = [] - - for batch in sync_convert_to_batches(text_iterator, batch_size=5): - output.append(batch) - - if len(output) > limit: - print("limit reached") - break - - logger.info(f"{len(output)=}") - - -async def async_generate_and_save(limit, file_limit): - await async_save_texts( - async_generate_from_parquet(file_limit), - limit, - ) - - -def sync_generate_and_save(limit, file_limit): - sync_save_texts( - sync_generate_from_parquet(file_limit), - limit, - ) - - -if __name__ == "__main__": - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%Y-%m-%d %H:%M:%S", - # level=logging.DEBUG, - level=logging.INFO, - handlers=[logging.StreamHandler()], - ) - - start_time = time.perf_counter() - file_limit = 100 - limit = 100_000 - # asyncio.run(async_generate_and_save(limit, file_limit)) - sync_generate_and_save(limit, file_limit) - - end_time = time.perf_counter() - elapsed_time = end_time - start_time - - logger.info("done") - - logger.info(f"{start_time=}") - logger.info(f"{end_time=}") - logger.info(f"{elapsed_time=:0.2f} seconds") # approx. 20 seconds - - # limit=10000 - # file_limit=20 - # elapsed_time=8.72 seconds --- sync - # elapsed_time=9.03 seconds -- async - - # limit=100_000 - # file_limit=100 - # async: elapsed_time=18.46 seconds - # sync: elapsed_time=18.17 seconds diff --git a/tests/test_split_dataset.py b/tests/test_split_dataset.py index aa6972c..2daf634 100644 --- a/tests/test_split_dataset.py +++ b/tests/test_split_dataset.py @@ -1,16 +1,16 @@ import math import random import tempfile + from llm_datasets.datasets.base import BaseDataset from llm_datasets.utils.config import Config - from llm_datasets.utils.dataset_generator import ( - generate_texts_from_dataset, DatasetSplit, + generate_texts_from_dataset, get_splits_as_offsets_and_limits, ) -from .dummy_datasets import get_dummy_dataset_cls +from tests.dummy_datasets import get_dummy_dataset_cls def _test_train_validation_split( @@ -36,8 +36,8 @@ def _test_train_validation_split( with tempfile.TemporaryDirectory() as temp_dir: ds: BaseDataset = ds_cls( - output_dir=temp_dir, - shuffled_output_dir=temp_dir, + text_datasets_dir=temp_dir, + shuffled_datasets_dir=temp_dir, max_output_chunk_rows=max_output_chunk_rows, max_output_chunk_uncompressed_bytes=max_output_chunk_uncompressed_bytes, output_batch_size=5, @@ -61,6 +61,7 @@ def _test_train_validation_split( split=DatasetSplit.FULL, split_offset_limit=split_offset_limit, use_shuffled_output=use_shuffled_output, + cast_to_py_string=True, ) ) print("full_texts", len(full_texts)) @@ -71,6 +72,7 @@ def _test_train_validation_split( split=DatasetSplit.TRAIN, split_offset_limit=split_offset_limit, use_shuffled_output=use_shuffled_output, + cast_to_py_string=True, ) ) print("train_texts", len(train_texts), expected_train_size) @@ -81,9 +83,14 @@ def _test_train_validation_split( split=DatasetSplit.TOKENIZER_TRAIN, split_offset_limit=split_offset_limit, use_shuffled_output=use_shuffled_output, + cast_to_py_string=True, ) ) - print("tokenizer_train_texts", len(tokenizer_train_texts), expected_tokenizer_train_size) + print( + "tokenizer_train_texts", + len(tokenizer_train_texts), + expected_tokenizer_train_size, + ) assert len(tokenizer_train_texts) == expected_tokenizer_train_size @@ -93,6 +100,7 @@ def _test_train_validation_split( split=DatasetSplit.VALIDATION, split_offset_limit=split_offset_limit, use_shuffled_output=use_shuffled_output, + cast_to_py_string=True, ) ) print("val_texts", len(val_texts), expected_validation_size) @@ -113,7 +121,10 @@ def _test_train_validation_split( def test_train_validation_split_1000_02_01(): _test_train_validation_split( - dataset_size=1000, validation_ratio=0.2, tokenizer_train_ratio=0.1, max_output_chunk_rows=21 + dataset_size=1000, + validation_ratio=0.2, + tokenizer_train_ratio=0.1, + max_output_chunk_rows=21, ) @@ -128,7 +139,10 @@ def test_train_validation_split_512_033_033(): def test_train_validation_split_100_025_033(): _test_train_validation_split( - dataset_size=100, validation_ratio=0.25, tokenizer_train_ratio=0.33, max_output_chunk_rows=10 + dataset_size=100, + validation_ratio=0.25, + tokenizer_train_ratio=0.33, + max_output_chunk_rows=10, ) diff --git a/tests/test_tlsh_hashes.py b/tests/test_tlsh_hashes.py new file mode 100644 index 0000000..70adb92 --- /dev/null +++ b/tests/test_tlsh_hashes.py @@ -0,0 +1,54 @@ +import json +import os + +import tlsh + +from tests.conftest import FIXTURES_DIR + + +def test_tlsh_hashes_against_oscar(): + """Use the exact same hashing from OSCAR 23.01 + + https://oscar-project.github.io/documentation/versions/oscar-2301/#locality-sensitive-hashing + + """ + with open(os.path.join(FIXTURES_DIR, "oscar_2301_texts_and_hashes.json")) as f: + texts_and_hashes = json.load(f) + + for text, hash in zip(texts_and_hashes["text"], texts_and_hashes["tlsh"]): + if hash is None or text is None: + continue + + given_hash = hash[5:] + computed_hash = tlsh.hash(text.encode("utf-8")) + assert given_hash == computed_hash + + +# texts_and_hashes = [ +# "Kategorie 5 kabel, (ook: Cat5 / Cat5e), is 'n gedraaide draadpaarkabel wat ontwerp is om 'n hoë mate van" +# " integriteit in elektriese seine te verseker. Baie sulke kabels is onafgeskerm, maar kan ook soms met 'n" +# " afskermingskede voorsien word. Die Kategorie 5-spesifikasie is vervang met die Kategorie 5e spesifikasie. Hierdie" +# " soort kabel word dikwels gebruik in kabels vir rekenaarnetwerke soos Ethernet en word ook gebruik om baie ander" +# " seine te dra soos vir basiese telefoniese dienste." +# ] + +# # init dataset in streaming mode +# ds = load_dataset("malteos/tmpdata2", name="de", split="2023_23", streaming=True) +# ds_iter = iter(ds) + + +# for i in range(100): +# print(i) +# row = next(ds_iter) +# if row["tlsh"] is not None: + + +# print(row) +# print(row["tlsh"]) + + +# print("done") + + +if __name__ == "__main__": + test_tlsh_hashes_against_oscar() diff --git a/tests/test_write_parquet.py b/tests/test_write_parquet.py index 03e6c67..e94d198 100644 --- a/tests/test_write_parquet.py +++ b/tests/test_write_parquet.py @@ -1,60 +1,70 @@ import itertools +import tempfile +from pathlib import Path + import pyarrow as pa import pyarrow.parquet as pq def test_write_and_shuffle_parquet(): - def generate_texts(n): - for i in range(n): - yield f"Some text {i}" + with tempfile.TemporaryDirectory() as temp_dir: + temp_dir_path = Path(temp_dir) + + def generate_texts(n): + for i in range(n): + yield f"Some text {i}" - def get_batches(rows_iterable, chunk_size, schema): - rows_it = iter(rows_iterable) - while True: - arr = pa.array(itertools.islice(rows_it, chunk_size)) - batch = pa.RecordBatch.from_arrays([arr], schema=schema) + def get_batches(rows_iterable, chunk_size, schema): + rows_it = iter(rows_iterable) + while True: + arr = pa.array(itertools.islice(rows_it, chunk_size)) + batch = pa.RecordBatch.from_arrays([arr], schema=schema) - if not batch: - break - yield batch + if not batch: + break + yield batch - schema = pa.schema( - [ - ("text", pa.string()), - ] - ) + schema = pa.schema( + [ + ("text", pa.string()), + ] + ) - print("start") + print("start") - batches = get_batches(generate_texts(1_00), chunk_size=10, schema=schema) + batches = get_batches(generate_texts(1_00), chunk_size=10, schema=schema) - print("writing ...") - # Write the batches - out_fp = "example.parquet" + print("writing ...") + # Write the batches + out_fp = temp_dir_path / "example.parquet" - with pq.ParquetWriter(out_fp, schema=schema) as writer: - for batch in batches: - print("write batch") - writer.write_batch(batch) + with pq.ParquetWriter(out_fp, schema=schema) as writer: + for batch in batches: + print("write batch") + writer.write_batch(batch) - print("done") + print("done") - # read again - table = pq.read_table("example.parquet", columns=["text"], memory_map=True) + # read again + table = pq.read_table(temp_dir_path / "example.parquet", columns=["text"], memory_map=True) - assert str(table["text"][99]) == "Some text 99" + assert str(table["text"][99]) == "Some text 99" - from datasets.arrow_dataset import Dataset + from datasets.arrow_dataset import Dataset - ds = Dataset(arrow_table=table) - ds.shuffle(seed=1, keep_in_memory=False).to_parquet("example.shuffled.parquet", batch_size=10) + ds = Dataset(arrow_table=table) + ds.shuffle(seed=1, keep_in_memory=False).to_parquet(temp_dir_path / "example.shuffled.parquet", batch_size=10) - shuffled_table = pq.read_table("example.shuffled.parquet", columns=["text"], memory_map=True) - print(str(shuffled_table["text"][99])) + shuffled_table = pq.read_table( + temp_dir_path / "example.shuffled.parquet", + columns=["text"], + memory_map=True, + ) + print(str(shuffled_table["text"][99])) - assert str(shuffled_table["text"][99]) != "Some text 99" + assert str(shuffled_table["text"][99]) != "Some text 99" - print("reading done.") + print("reading done.") if __name__ == "__main__": diff --git a/tests/test_write_parquet_chunks.py b/tests/test_write_parquet_chunks.py index 573b671..0444f32 100644 --- a/tests/test_write_parquet_chunks.py +++ b/tests/test_write_parquet_chunks.py @@ -1,17 +1,15 @@ +import logging +import os import random import string -import logging +import tempfile +from pathlib import Path +from random import randint -import os import pyarrow as pa from llm_datasets.io.parquet import save_texts_to_parquet_chunks - from llm_datasets.utils.settings import LOGGING_KWARGS -from pathlib import Path -from random import randint -import tempfile - logging.basicConfig(**LOGGING_KWARGS) logger = logging.getLogger(__name__) @@ -19,7 +17,7 @@ # TMP_DIR = Path(__file__).parent.parent / "data/tmp" -def get_texts(n: int, min_len: int, max_len: int, extra_column=False): +def _get_texts(n: int, min_len: int, max_len: int, extra_column=False): for i in range(n): random_len = randint(min_len, max_len) random_str = "".join(random.choices(string.ascii_lowercase, k=random_len)) @@ -60,33 +58,31 @@ def get_output_path(part=None, total_parts=None) -> str: (output_text_field, pa.string()), ] ) - text_and_extra_col_schema = pa.schema( - [ - (output_text_field, pa.string()), - ("extra_column", pa.string()), - ] - ) + # text_and_extra_col_schema = pa.schema([ + # (output_text_field, pa.string()), + # ("extra_column", pa.string()), + # ]) # text + extra column - saved_docs, saved_chunks = save_texts_to_parquet_chunks( - texts=get_texts( - n=10_000, min_len=250, max_len=10_000, extra_column=True - ), # approx 50 MB (none compression) - schema=text_and_extra_col_schema, - max_chunk_uncompressed_bytes=10 * 1024 * 1024, # 10 MB - output_path_func=get_output_path, - compression="ZSTD", - batch_size=24, - ) + # saved_docs, saved_chunks = save_texts_to_parquet_chunks( + # texts=_get_texts( + # n=10_000, min_len=250, max_len=10_000, extra_column=True + # ), # approx 50 MB (none compression) + # schema=text_and_extra_col_schema, + # max_chunk_uncompressed_bytes=10 * 1024 * 1024, # 10 MB + # output_path_func=get_output_path, + # compression="ZSTD", + # batch_size=24, + # ) - assert saved_docs == 10_000 - assert saved_chunks == 5 + # assert saved_docs == 10_000 + # assert saved_chunks == 5 # text only saved_docs, saved_chunks = save_texts_to_parquet_chunks( - texts=get_texts(n=10_000, min_len=250, max_len=10_000), # approx 50 MB (none compression) + texts=_get_texts(n=10_000, min_len=250, max_len=10_000), # approx 50 MB (none compression) schema=text_only_schema, max_chunk_uncompressed_bytes=10 * 1024 * 1024, # 10 MB output_path_func=get_output_path, @@ -98,7 +94,7 @@ def get_output_path(part=None, total_parts=None) -> str: assert saved_chunks == 5 limited_saved_docs, limited_saved_chunks = save_texts_to_parquet_chunks( - texts=get_texts(n=10_000, min_len=250, max_len=10_000), # approx 50 MB (none compression) + texts=_get_texts(n=10_000, min_len=250, max_len=10_000), # approx 50 MB (none compression) schema=text_only_schema, max_chunk_uncompressed_bytes=10 * 1024 * 1024, # 10 MB output_path_func=get_output_path, @@ -111,9 +107,10 @@ def get_output_path(part=None, total_parts=None) -> str: assert limited_saved_chunks == 1 single_file_saved_docs, single_file_saved_chunks = save_texts_to_parquet_chunks( - texts=get_texts(n=1_000, min_len=250, max_len=10_000), # approx 5 MB (none compression) + texts=_get_texts(n=1_000, min_len=250, max_len=10_000), # approx 5 MB (none compression) schema=text_only_schema, - max_chunk_uncompressed_bytes=0, + max_chunk_uncompressed_bytes=None, + max_chunk_rows=None, output_path_func=get_output_path, compression="ZSTD", batch_size=24,