├── .gitignore ├── 0_CLOUD-PATTERNS ├── 0_Starting-Points │ ├── 3-STEPS-TO-START.md │ ├── README.md │ └── VENDORS.md ├── 1_Viz-Systems │ ├── README.md │ ├── VIZ-examples.md │ ├── VIZ-four-evolve.md │ └── Viz-Cloud-Genomics │ │ └── README.md ├── 2_DevOps │ ├── README.md │ └── Terraform │ │ ├── README.md │ │ ├── main-aws.tf │ │ ├── main-azure.tf │ │ └── main-gcp.tf ├── 3_Machine-Learning │ ├── 2_Matrices_for_data_scientists.ipynb │ └── README.md ├── 4_Prompt-Katas │ ├── Learn-More.md │ ├── Prompt-tips.md │ ├── Prompts.md │ ├── README.md │ └── gemini-for-google-workspace-prompting-guide-101.pdf ├── README.md └── images │ ├── RYG-progress.png │ ├── aws-genomics-arch.png │ ├── data-lake.png │ ├── deployment-types-color.png │ ├── deployment-types.png │ ├── deploys.png │ ├── genomic-pipeline.png │ ├── lake-sketch.png │ ├── modern-cloud-arch.png │ ├── new-main.png │ ├── research-pipelines.png │ └── scale-jobs-arch.png ├── AWS ├── AWS-CLOUDLAKES.md ├── README.md ├── aws-courses.png └── aws.png ├── AlibabaCloud ├── README.md └── alibaba-cloud.png ├── Azure ├── Azure-CLOUDLAKES.md ├── README.md └── azure.png ├── GCP ├── GCP-CLOUDLAKES.md ├── README.md └── gcp.png ├── IBM └── README.md ├── LICENSE ├── NVIDIA └── README.md ├── README.md ├── images ├── 0-main.png ├── 1-main-gpt.png ├── 2a-ex-BQ.png ├── 2b-ex-Azure.png ├── 2c-ex-serverless-aws.png ├── LAMP-1.png ├── LAMP-2.png ├── LAMP-3.png ├── LAMP-4.png ├── alibaba-locations.png ├── aws-ci-cd.png ├── aws-locations.png ├── azure-locations.png ├── data-lakes │ ├── CLOUDLAKES.md │ ├── aws-cromwell.png │ ├── aws-idseq.png │ ├── aws-k8.png │ ├── aws-nextflow.png │ ├── aws-variantspark.png │ ├── azure-cromwell.png │ ├── cloud-k8.png │ ├── excalidraw-files │ │ ├── GCP-PAPI-k8.excalidraw │ │ ├── aws-k8.excalidraw │ │ └── cromwell.excalidraw │ ├── gcp-cromwell.png │ ├── gcp-deepvariant.png │ ├── gcp-k8.png │ ├── gcp-nextflow.png │ └── raw-k8.png ├── databricks-icon.png ├── gcp-locations.png ├── gcp-networks.png ├── ibm-cloud.png ├── learning-cloud.png ├── logos.png ├── prompt-kata-group.png ├── terraform-arch.png ├── trends.png └── viz-tools.png └── z_utilities ├── .devcontainer ├── DOCKERFILE └── devcontainer.json ├── .metals └── metals.h2.db ├── .tours ├── aws-tour.tour ├── cloud-tour.tour └── gcp-tour.tour └── .vscode └── settings.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | *.db 131 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/0_Starting-Points/3-STEPS-TO-START.md: -------------------------------------------------------------------------------- 1 | # 3 Steps To Get Started in Cloud---> 2 | 3 | 4 | 1. 🤔 **READ this Repo** and FAQ 5 | - this repo is a companion to my **'Cloud Careers and Certifications`** - [link](https://www.linkedin.com/learning/cloud-computing-careers-and-certifications-first-steps-14851328) course on LinkedIn Learning or Lynda.com course. It is designed to be a first course for those who are new working with public cloud services 6 | - ❓ FAQ - here are the top 10 questions students ask about `learning-cloud` - [link](https://github.com/lynnlangit/learning-cloud/tree/master/CLOUD-PATTERNS/0_Starting-Points) 7 | 2. 🤔 **SELECT a cloud vendor** (AWS, GCP...), set up a free trial (test) account for learning 8 | - See the main file in each vendor folders for links 9 | - for **AWS** go to `\AWS` folder -> `README.md` 10 | - for **GCP** go to `\GCP` folder -> `README.md`, etc... 11 | - Set up **MFA (multi-factor authentication)** on the root user account for your trial cloud account to protect against account misuse by others 12 | - setup up MFA on AWS root user account - [link](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html) 13 | - setup MFA on GCP user accounts - [link](https://www.trendmicro.com/cloudoneconformity/knowledge-base/gcp/CloudIAM/enable-mfa-for-user-accounts.html) 14 | - Learn more about **cloud vendor differences** - [link](https://github.com/lynnlangit/learning-cloud/blob/master/CLOUD-PATTERNS/0_Starting-Points/VENDORS.md) 15 | 3. 💸 **SECURE and SETUP a budget alert** on your test account - I suggest alerting on spend of over $ 50 USD per day 16 | - follow **best practices** for security a demo account (AWS example) - [link](https://dev.to/aws-heroes/stop-aws-account-hacks-1bim) 17 | - pick a **scenario** or service to start learning 18 | - build your project on the cloud and Learn...repeat! 19 | 20 | # --->THEN GO BUILD! 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/0_Starting-Points/README.md: -------------------------------------------------------------------------------- 1 | # Learning Cloud FAQ - Top 10 2 | 3 | - Q: **Which cloud?** 4 | - A: Most overall jobs - AWS 5 | - A: Cheapest, most performant to learn/experiment - GCP 6 | - A: Fastest enterprise growth - Azure 7 | - A: Quantum - IBM 8 | 9 | --- 10 | 11 | - Q: **Which languages?** 12 | - A: Python (application development) 13 | - A: Terraform (infrastructure) 14 | --- 15 | 16 | - Q: **Where to start?** 17 | - A: Pick a vendor, setup a free trial account 18 | - A: Set up multi-factor authentication for your login (email) 19 | - A: Set up a billing alert, send to your email 20 | --- 21 | 22 | - Q: **Which service(s)?** 23 | - A: Core services are VMs, file storage (buckets) and security (AWS: EC2, S3, IAM....) 24 | --- 25 | 26 | - Q: **How to get a job?** 27 | - A: Build something, get certified, talk (post) about it - in this order 28 | --- 29 | 30 | - Q: **How do I avoid a surprise, big cloud bill when learning?** 31 | - A: Set a budget alert and notification 32 | - A: Turn off VMs when not using 33 | - A: Use smallest sized VMs/GPUs as is practical for testing 34 | --- 35 | 36 | - Q: **What are some 'overlooked' areas?** 37 | - A: Security, cost control - more jobs than qualified people 38 | --- 39 | 40 | - Q: **Can I do Gen AI / ML on the cloud?** 41 | - A: Most complete offering - GCP VertexAI 42 | --- 43 | 44 | - Q: **Which certifications get me the highest paying jobs?** 45 | - A: GCP 46 | --- 47 | 48 | - Q: **Whare are the most interesting/useful cloud data services by vendor?** 49 | - A: Azure - CoPilot(s), CosmosDB 50 | - A: AWS - S3, EC2, AWS Braket (Quantum) 51 | - A: GCP - BigQuery, VertexAI, DataProc (managed Apache Spark), Dataplex 52 | - A: IBM - Qiskit (Quantum) 53 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/0_Starting-Points/VENDORS.md: -------------------------------------------------------------------------------- 1 | # How to Select a Cloud Vendor 2 | 3 | Selecting one or more cloud vendors is a key choice when adopting public cloud services. I have done most of my production work with AWS or GCP. However, for some scenarios, Azure or Alibaba Cloud are 'best fit' choices as well. 4 | 5 | The global market trends (shown below) can be seen as a starting point for you. 6 | 7 |  8 | 9 | It is important to further refine your selection based on the following: 10 | 11 | - **services needed** 12 | - does a potential vendor offer your desired services in their cloud? 13 | - comparing service x vendor, which fits best? 14 | - example: does `AWS IoT` or `Azure IoT` better meet your needs? 15 | - **services location(s)** 16 | - does a potential vendor have your desired services in your preferred location(s)? 17 | - where are their data center(s)? 18 | - **community cloud skills** 19 | - what is the size of the total technical community for a potential vendor? 20 | - what is the size of the local technical community in your geography for a potential vendor? 21 | 22 | --- 23 | 24 | ## Vendor Characteristics 25 | 26 | ### GCP - DEVELOPER & DATA SCIENCE CLOUD 27 | - Positive - easy to set up for dev/experiements, cheap/fast & scalable, innovative ML services 28 | - Negative - Enterprise setup/support complex, idiosyncratic (i.e. 'Googly') service implementation 29 | 30 | ### AWS - DEVOPS CLOUD 31 | - Positive - market share/ partner ecosystm, huge variety of services 32 | - Negative - dated, security/cost management is arduous 33 | 34 | ### Azure - ENTERPRISE CLOUD 35 | - Positive - Active Directory integration simplifies security, core services are solid performers 36 | - Negative - expensive, must test scalability by service 37 | 38 | ### Alibaba Cloud - APAC CLOUD 39 | - Positive - good variety of services, well-priced 40 | - Negative - derivative of AWS, based in China (privacy concerns), requires US passport (or other ID) to setup account 41 | 42 | ### IBM Cloud - QUANTUM CLOUD 43 | - Positive - innovation in quantum computing - great tools, useful Quantum libraries and tools 44 | - Negative - expensive for general cloud service 45 | 46 | 47 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/1_Viz-Systems/README.md: -------------------------------------------------------------------------------- 1 | # Cloud Systems Visualization 2 | 3 | Effectively visualizing cloud systems is key to not only building, but also growing and maintaining sytems. There are a number of tools and techniques to use. 4 | These include diagramming, drawing and connecting tools to existing (deployed) systems. I did a series of keynotes about this topic as well. 5 | 6 | ## Talks and Decks 7 | 8 | ### Viz Systems 9 | - 📺 Keynote: 2019 / 'Viz Cloud Systems' / GOTO: Berlin - [keynote](https://www.youtube.com/watch?v=HHitdmje1ok) 10 | - 📣 Slide deck: 2019 'Visualizing Cloud Systems' - [link](https://slides.com/lynnlangit/goto-viz-cloud-systems) 11 | - 📺 Talk: 2020 / 'Viz Cloud Systems' / GOTO: Chicago - [talk](https://www.youtube.com/watch?v=htmEA-dpX_4) 12 | - 📣 Slide deck: 2020 'Visualizing Cloud Systems' - [link](https://slides.com/lynnlangit/goto-visualizing-cloud-systems) 13 | - 📺 Talk: 2019 / 'Viz Cloud Systems' / Kandddinsky: Berlin - [talk](https://www.youtube.com/watch?v=DJdydx4g0v4) 14 | - 📣 Slide deck: 2020 'Cloud for Machine Learning' - [link](https://slides.com/lynnlangit/cloud-for-machine-learning) 15 | 16 | ### Serverless 17 | - 📺 Keynote: 2019 / 'Viz Serverless Systems' / ServerlessConf: London - [keynote](https://www.youtube.com/watch?v=eNmGQOAedQ4) 18 | - 📣 Slide deck: 2019 'Visualizing Serverless Systems' - [link](https://slides.com/lynnlangit/viz-cloud-systems-18) 19 | - 📺 Talk: 2019 / 'Serverless Architectures' / NDC: Minnesota - [talk](https://www.youtube.com/watch?v=od4mrgJ9wW8) 20 | - 📺 Talk: 2017 / 'Serverless Reality' / NDC: Oslo - [talk](https://www.youtube.com/watch?v=PgZ2dxnj734) 21 | - 📣 Slide deck: 2018 'Serverless SQL' - [link](https://slides.com/lynnlangit/serverless-sql-queries-10) 22 | 23 | ## Tools 24 | - 🖌️ Excalidraw: Hand-drawn looking diagrams - [link](https://excalidraw.com/) 25 | - 📣 Beautiful.ai: Stylized slides with diagrams - [link](https://www.beautiful.ai/) 26 | - 🛠️ Lucidcharts: general purpose diagramming tool, some AWS integration - [link](https://lucid.app/) 27 | - 🛠️ Mindmup (Mindmaps): maps and decision trees - [link](https://www.mindmup.com/) 28 | - 🛠️ Hava.io: live cloud diagrams, multiple system perspectives - [link](https://app.hava.io/) 29 | - 🛠️ Diagrams.com: cloud diagrams as code - [link](https://diagrams.mingrammer.com/docs/getting-started/examples) 30 | - 🛠️ Structurizr: Diagram code and systems - [link](https://structurizr.com/) 31 | 32 | ## My Techniques and Articles 33 | - 📐 **Sketching as a starting point** - example (GCP CI/CD pipeline) -- [link](https://acloudguru.com/blog/engineering/cloud-based-ci-cd-on-gcp) 34 | - 📐 **User Perspectives (Researcher, Lab Lead, ...)** - example (Terra.bio on GCP WDL Workflows) -- [link](https://lynnlangit.medium.com/cloud-native-hello-world-for-bioinformatics-3beb1ab820a) 35 | - 📐 **Just-enough / evolving diagrams** - example (Azure Genomics Pipelines) --[link](https://lynnlangit.medium.com/azure-for-genomic-scale-workloads-ad3c989a3d0b) 36 | - 📐 **Right-sizing** - example (VariantSpark on AWS pipeline -- [link](https://lynnlangit.medium.com/scaling-custom-machine-learning-on-aws-part-3-kubernetes-5427d96f825b) 37 | - 📐 **Connected / live diagrams** - see link to Hava.io 38 | 39 | ### Other Resources 40 | - 📖 Article: Technical Perspectives (Dev, DevOps, Security) - "The 5 Types of Architecture Diagrams" --[link](https://www.readysetcloud.io/blog/allen.helton/the-5-types-of-architecture-diagrams/) 41 | - 📖 Article: How to review a Software Architecture Diagram (from Simon Brown) -- [link](https://dev.to/simonbrown/how-to-review-a-software-architecture-diagram-6p0) 42 | - 📖 Post: Best Practices for Architecture Diagrams -- [link](https://sportebois.medium.com/better-architecture-diagrams-for-agile-teams-actionable-tips-and-lessons-e76627dc4315) 43 | - ⚙️ Standards: Fundamental Modeling Concepts (FMC), visualization guidelines -[link](http://www.fmc-modeling.org/visualization_guidelines) 44 | 45 | --- 46 | 47 | ## Example Visualizations 48 | 49 | See this repo page for cloud system visualization examples --> [link](https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/1_Viz-Systems/VIZ-examples.md) 50 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/1_Viz-Systems/VIZ-examples.md: -------------------------------------------------------------------------------- 1 | # Cloud Systems Visualization Examples 2 | 3 | ## Talks and Decks 4 | 5 | See this page for a list with links --> [link](https://github.com/lynnlangit/learning-cloud/tree/master/CLOUD-PATTERNS/1_Viz-Systems) 6 | 7 | --- 8 | 9 | ## Example Visualizations 10 | The following examples illustrate various concepts in cloud systems visualization. Description plus tool used listed for each example. 11 | 12 | ### 1. Conceptual system for Transactional Website (Excalidraw) 13 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/modern-cloud-arch.png" width=800> 14 | 15 | ### 2. Conceptual design for Data Lake (Beautiful.ai) 16 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/data-lake.png" width=800> 17 | 18 | ### 3. Conceptual design for Genomic Data Pipeline (Beautiful.ai) 19 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/genomic-pipeline.png" width=800> 20 | 21 | ### 4. Cloud Pipeline implementation genomics choices (MindMup) 22 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/research-pipelines.png" width=1000> 23 | 24 | ### 5. Sketch of architectural pattern for Cloud Lake (Excalidraw) 25 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/lake-sketch.png" width=800> 26 | 27 | ### 6. Red-Yellow-Green DevOps progress (Lucidcharts) 28 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/RYG-progress.png" width=1000> 29 | 30 | ### 7. AWS Genomics Pipeline (Lucidcharts) 31 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/aws-genomics-arch.png" width=1000> 32 | 33 | ### 8. AWS CI-CD pipeline (Lucidcharts) 34 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/aws-ci-cd.png" width=1000> 35 | 36 | ### 9. GCP Bioinformatics Processes including DataMesh (Excalidraw) 37 | <img src="https://github.com/lynnlangit/gcp-for-bioinformatics/blob/master/images/batch-pipelines.png" width=1000> 38 | 39 | ### 10. GCP Scaling Jobs by Type (Lucidcharts) 40 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/scale-jobs-arch.png" width=1000> 41 | 42 | 43 | 44 | --- 45 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/1_Viz-Systems/VIZ-four-evolve.md: -------------------------------------------------------------------------------- 1 | # Cloud System Visualization Evolving Example 2 | 3 | ## Concepts and Examples 4 | 5 | - See this page for a list with links --> https://github.com/lynnlangit/learning-cloud/blob/master/CLOUD-PATTERNS/VIZ-concepts.md 6 | - See this page for a list with examples --> https://github.com/lynnlangit/learning-cloud/blob/master/CLOUD-PATTERNS/VIZ-concepts.md 7 | 8 | --- 9 | 10 | ## Four Evolving Example Visualizations 11 | The following examples illustrate evolving a cloud architecture via visualization. Architecture moves from client/server to microservices. 12 | 13 | ### 1. AWS Client/Server 14 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/LAMP-1.png" width=800> 15 | 16 | ### 2. AWS Client/Server w/HA 17 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/LAMP-2.png" width=800> 18 | 19 | ### 3. AWS Serverless 20 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/LAMP-3.png" width=800> 21 | 22 | ### 4. AWS Serverless w/ CI-CD 23 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/LAMP-4.png" width=1000> 24 | 25 | 26 | --- 27 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/1_Viz-Systems/Viz-Cloud-Genomics/README.md: -------------------------------------------------------------------------------- 1 | # Vizualize Cloud Genomic Pipelines 2 | 3 | Examples used in understand building Bioinformatics data analysis pipelines on the public cloud. 4 | 5 | ## Overview 6 | 7 | <img src="https://github.com/lynnlangit/TeamTeri/raw/master/Images/NGS-Workflow.png" width=600 align="right"> 8 | 9 | Sequencing top level processes types are listed below and shown in the conceptual diagram: 10 | - Wet lab / sequencer - prepped samples are sequenced on a machine 11 | - **Primary analysis** pipeline of sequencer data - sequencer machine output files are analyzed 12 | - **Secondary analysis** pipeline of primary analysis data - primary analysis output files are analyzed 13 | - **Teritary analysis** pipeline of secondary analysis data - secondary analysis output files are analyzed 14 | - Data storage and access - this includes genomic reference datasets, along with storage of genomic files all along these processes 15 | 16 | High level processes diagram shown to the right: 17 | 18 | 19 | 20 | --- 21 | 22 | ## Bio Tools Cloud Options 23 | 24 | Shown below are 5 different patterns (on GCP) for deploying the COMPUTE layer to support scalable bioinformatics tools. Simplified data lake (bucket) pattern is shown for the DATA layer. 25 | 26 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/viz-tools.png" width=1000> 27 | 28 | ### GCP Bioinfomatics 29 | 30 | Info about genomic pipeline architectures - [link](https://github.com/lynnlangit/gcp-for-bioinformatics/blob/master/6_ARCHITECTURE.md) and shown below. Example shows 'vision-on-a-page' for primary, secondary and tertiary cloud-based bioinformatics data analysis. Example uses simplified representation of DATA layer and focuses on COMPUTE layer concepts for this reference architecture. 31 | 32 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/new-main.png" width=1000> 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/2_DevOps/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Patterns 2 | 3 | Cloud DevOps Patterns center around cloud service infrastructure deployment tools, types and patterns. 4 | 5 | There are many choices. 6 | The diagram below summarizes different ways I work with clients to deploy cloud solutions. 7 | 8 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/deploys.png" width=800> 9 | 10 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/2_DevOps/Terraform/README.md: -------------------------------------------------------------------------------- 1 | # Terraform Basics 2 | 3 | (From the Terraform docs...) 4 | - *"Terraform is an **infrastructure as code tool** that lets you define and manage infrastructure resources through human-readable configuration files.* 5 | - *It allows you to use a consistent workflow over your infrastructure lifecycle, regardless of the resource provider. (supports AWS, Azure, GCP and more)* 6 | - *Infrastructure as code workflows let you declaratively manage a variety of services and automate your changes to them, reducing the risk of human error through manual operations."* 7 | 8 | - Concise article "What is Terraform?" --> https://medium.com/nerd-for-tech/nfrastructure-as-code-using-terraform-cb383017cbeb 9 | 10 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/terraform-arch.png" width=800> 11 | 12 | ## Using Terraform 13 | 14 | Basic commands are as follows: 15 | - create a `main.nf` file in the current directory (example shown in this directory) 16 | - run these commands 17 | - `terraform init` to initialize the project 18 | - `terraform plan` to plan the changes 19 | - `terraform apply` to apply the changes 20 | - `terraform destroy` to destroy the project 21 | 22 | ## Terraform Concepts 23 | 24 | There are a number of patters/concepts to consider/include: 25 | - Terraform Modules 26 | - Terraform Workspaces 27 | - Variable Files (tfvars) 28 | - Secrets storage / maangement (integrate w/provider, i.e. AWS Secrets Manager, etc...) 29 | - Testing - Terratest libraries 30 | - Terraform CDK (use programming languages to generate TF files) 31 | - CI/CD env - Terraform Cloud or provider (i.e. AWS Code Deploy, Code Build, Code Commit, etc...) 32 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/2_DevOps/Terraform/main-aws.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "us-east-1" 3 | # access_key = "xxx" 4 | # secret_key = "yyg" 5 | } 6 | 7 | resource "aws_bucket" "my_first_bucket" { 8 | bucket = "my-first-bucket" 9 | acl = "private" 10 | versioning { 11 | enabled = true 12 | } 13 | } -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/2_DevOps/Terraform/main-azure.tf: -------------------------------------------------------------------------------- 1 | //create a terraform main file that creates a virtual machine in azure 2 | provider "azurerm" { 3 | version = "=2.0.0" 4 | features {} 5 | } 6 | resource "azurerm_resource_group" "my_resource_group" { 7 | name = "my-resource-group" 8 | location = "West Europe" 9 | } 10 | resource "azurerm_virtual_network" "my_virtual_network" { 11 | name = "my-virtual-network" 12 | address_space = ["address_space"] 13 | location = azurerm_resource_group.my_resource_group.location 14 | resource_group_name = azurerm_resource_group.my_resource_group.name 15 | } 16 | resource "azurerm_subnet" "my_subnet" { 17 | name = "my-subnet" 18 | resource_group_name = azurerm_resource_group.my_resource_group.name 19 | virtual_network_name = azurerm_virtual_network.my_virtual_network.name 20 | address_prefixes = ["address_prefixes"] 21 | } 22 | resource "azurerm_network_interface" "my_network_interface" { 23 | name = "my-network-interface" 24 | location = azurerm_resource_group.my_resource_group.location 25 | resource_group_name = azurerm_resource_group.my_resource_group.name 26 | ip_configuration { 27 | name = "my-ip-configuration" 28 | subnet_id = azurerm_subnet.my_subnet.id 29 | private_ip_address_allocation = "Dynamic" 30 | } 31 | } 32 | resource "azurerm_public_ip" "my_public_ip" { 33 | name = "my-public-ip" 34 | location = azurerm_resource_group.my_resource_group.location 35 | resource_group_name = azurerm_resource_group.my_resource_group.name 36 | allocation_method = "Dynamic" 37 | } 38 | resource "azurerm_network_interface_backend_address_pool_association" "my_network_interface_backend_address_pool_association" { 39 | network_interface_id = azurerm_network_interface.my_network_interface.id 40 | ip_configuration_name = azurerm_network_interface.my_network_interface.ip_configuration[0].name 41 | backend_address_pool_id = azurerm_lb_backend_address_pool.my_backend_address_pool.id 42 | } 43 | resource "azurerm_lb" "my_lb" { 44 | name = "my-lb" 45 | location = azurerm_resource_group.my_resource_group.location 46 | resource_group_name = azurerm_resource_group.my_resource_group.name 47 | frontend_ip_configuration { 48 | name = "my-frontend-ip-configuration" 49 | public_ip_address_id = azurerm_public_ip.my_public_ip.id 50 | } 51 | } 52 | resource "azurerm_lb_backend_address_pool" "my_backend_address_pool" { 53 | name = "my-backend-address-pool" 54 | resource_group_name = azurerm_resource_group.my_resource_group.name 55 | loadbalancer_id = azurerm_lb.my_lb.id 56 | } 57 | resource "azurerm_lb_nat_pool" "my_lb_nat_pool" { 58 | name = "my-lb-nat-pool" 59 | resource_group_name = azurerm_resource_group.my_resource_group.name 60 | location = azurerm_resource_group.my_resource_group.location 61 | loadbalancer_id = azurerm_lb.my_lb.id 62 | protocol = "Tcp" 63 | frontend_port_start = 50000 64 | frontend_port_end = 50119 65 | backend_port = 22 66 | } 67 | resource "azurerm_virtual_machine" "my_virtual_machine" { 68 | name = "my-virtual-machine" 69 | location = azurerm_resource_group.my_resource_group.location 70 | resource_group_name = azurerm_resource_group.my_resource_group.name 71 | network_interface_ids = [azurerm_network_interface.my_network_interface.id] 72 | vm_size = "Standard_B1ls" 73 | delete_os_disk_on_termination = true 74 | delete_data_disks_on_termination = true 75 | storage_image_reference { 76 | publisher = "Canonical" 77 | offer = "UbuntuServer" 78 | sku = "18.04-LTS" 79 | version = "latest" 80 | } 81 | storage_os_disk { 82 | name = "my-os-disk" 83 | caching = "ReadWrite" 84 | create_option = "FromImage" 85 | managed_disk_type = "Standard_LRS" 86 | } 87 | os_profile { 88 | computer_name = "my-computer-name" 89 | admin_username = "my-admin-username" 90 | admin_password = "my-admin-password" 91 | } 92 | os_profile_linux_config { 93 | disable_password_authentication = false 94 | } 95 | boot_diagnostics { 96 | storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint 97 | } 98 | } 99 | resource "azurerm_storage_account" "my_storage_account" { 100 | name = "my-storage-account" 101 | resource_group_name = azurerm_resource_group.my_resource_group.name 102 | location = azurerm_resource_group.my_resource_group.location 103 | account_tier = "Standard" 104 | account_replication_type = "LRS" 105 | enable_https_traffic_only = true 106 | } 107 | resource "azurerm_storage_container" "my_storage_container" { 108 | name = "my-storage-container" 109 | storage_account_name = azurerm_storage_account.my_storage_account.name 110 | container_access_type = "private" 111 | } 112 | resource "azurerm_storage_share" "my_storage_share" { 113 | name = "my-storage-share" 114 | storage_account_name = azurerm_storage_account.my_storage_account.name 115 | quota = 50 116 | } 117 | resource "azurerm_storage_share_directory" "my_storage_share_directory" { 118 | name = "my-storage-share-directory" 119 | storage_share_name = azurerm_storage_share.my_storage_share.name 120 | storage_account_name = azurerm_storage_account.my_storage_account.name 121 | } 122 | resource "azurerm_storage_share_file" "my_storage_share_file" { 123 | name = "my-storage-share-file" 124 | storage_share_name = azurerm_storage_share.my_storage_share.name 125 | storage_account_name = azurerm_storage_account.my_storage_account.name 126 | source = "source" 127 | } 128 | resource "azurerm_storage_blob" "my_storage_blob" { 129 | name = "my-storage-blob" 130 | storage_account_name = azurerm_storage_account.my_storage_account.name 131 | storage_container_name = azurerm_storage_container.my_storage_container.name 132 | type = "Block" 133 | source = "source" 134 | } 135 | resource "azurerm_storage_queue" "my_storage_queue" { 136 | name = "my-storage-queue" 137 | storage_account_name = azurerm_storage_account.my_storage_account.name 138 | } 139 | resource "azurerm_storage_table" "my_storage_table" { 140 | name = "my-storage-table" 141 | storage_account_name = azurerm_storage_account.my_storage_account.name 142 | } 143 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/2_DevOps/Terraform/main-gcp.tf: -------------------------------------------------------------------------------- 1 | provider "gcp" { 2 | region = "us-central1" 3 | project = "my-test-project" 4 | } 5 | 6 | resource "google_compute_instance" "my_test_instance" { 7 | name = "my-test-instance" 8 | machine_type = "f1-micro" 9 | zone = "us-central1-a" 10 | 11 | boot_disk { 12 | initialize_params { 13 | image = "debian-cloud/debian-9" 14 | } 15 | } 16 | 17 | network_interface { 18 | network = "default" 19 | 20 | access_config { 21 | // Include this section to give the instance a public IP address 22 | public_ip = "true" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/3_Machine-Learning/README.md: -------------------------------------------------------------------------------- 1 | # ML Patterns 2 | 3 | ML (Machine Learning), also called AI (Artificial Intelligence) is a set of services and tools. Each cloud vendor offers a mixture of these items. 4 | 5 | ## ML Basics 6 | 7 | If you are new to ML, core libraries and ML algorithm visualization sites can speed up learning. 8 | - Interactive Visualizations at 'MLU-Explain' - https://mlu-explain.github.io/ 9 | - Core Python learning ML library of 'sci-kit learn' - https://scikit-learn.org/ 10 | - Google AI, ML education site - https://ai.google/education/ 11 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/4_Prompt-Katas/Learn-More.md: -------------------------------------------------------------------------------- 1 | # Learn More about Cloud (and Code) Prompting 2 | 3 | - "The Illustrated Transformer" --> https://jalammar.github.io/illustrated-transformer/ 4 | - Fun dots Gemini Demo --> https://huggingface.co/spaces/Trudy/gemini-realtime-dots 5 | - Live Coding with Gemini --> https://huggingface.co/spaces/Trudy/gemini-live-p5 6 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/4_Prompt-Katas/Prompt-tips.md: -------------------------------------------------------------------------------- 1 | # Prompt Tips 2 | 3 | ## Follow the standard format 4 | - As a 'who the LLM is' 5 | - Using 'provide context' 6 | - Generate 'describe output in detail' as 'describe output format` (i.e. list, table, etc...) 7 | - Limit output values, i,e `Answer with <valueA> or <valueB> only` 8 | - For a 'who is the output audience' 9 | 10 | ## Improvements 11 | - Work on one task at a time 12 | - Do not skip steps 13 | - Show your reasoning 14 | - Cite sources including URLs 15 | - If you can not generate cited information do not guess, say 'I can not find relavent information' 16 | - Provide examples of desired output 17 | 18 | ## Tone 19 | - Be specific 20 | - Use active voice 21 | - Use 'West Coast' US English 22 | - Does politeness matter? i.e. 'please, thanks, good job...' etc 23 | 24 | ## Pre-RAG Augmentation 25 | - 'Trial' RAG via huge context windows (Gemini 2M tokens) 26 | - Provide URLs -or- directly upload PDFs 27 | 28 | # For Specific LLMs 29 | 30 | ## Gemini for Google Cloud 31 | - Prompt Guidance --> https://cloud.google.com/gemini/docs/discover/write-prompts 32 | 33 | ## Google Gemini API 34 | - Prompt Guidance --> https://ai.google.dev/gemini-api/docs/prompting-strategies 35 | 36 | ## Google Imagen 37 | - Prompt Guidance --> https://ai.google.dev/gemini-api/docs/imagen-prompt-guide 38 | 39 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/4_Prompt-Katas/Prompts.md: -------------------------------------------------------------------------------- 1 | # List of Prompts 2 | 3 | Problems/ tools / prompts 4 | 5 | ## Date 6 | 7 | ### March 25, 2025 8 | - Problem / Task: **Test the impact of politeness** 9 | - Test prompt: "Prompt: You are an expert in creating effective prompts for <LLM>. Do these tasks one at a time. 10 | Do not skip steps. The first task is to explain the impact of including 'polite words' such as 'please' and 'thank you' in prompts. Return the results in a list. 11 | The second task is to provide an two contrastive examples of a complex prompt and generated results: one includes "polite words" and the other does not. Return the results in a list as well. 12 | - Tested with Google Gemini, ChatGPT and Claude.ai - most significant impact noted in Claude.ai output. 13 | 14 | ### For March 20, 2025 15 | - Problem/Task(s): **Slurm-to-Batch/Singularity(Apptainer) to Docker** 16 | 1. Backgrounder: *You are an expert in application container architecture and implementation. Generate 5 key steps to translate existing Singularity container to Docker containers to be run on Google Cloud using the Google Batch service. Produce the output in a table.* 17 | 2. Add context: *You are a Cloud Architect who specializes in designing and building proof of concept architectures which include best practices for Google Cloud.* 18 | 3. Add transparency: <Add to prompt> *Work step-by-step and show your work. Cite URL references. Rank output steps in priority order.* 19 | 4. Try different models: Try with experiemental and thinking models 20 | 5. Try different model params: reduce Temperature, add grounding with Google search 21 | 6. Try different tools within Google ecosystem, try Claude, try Perplexity 22 | 7. If time, switch back to my account and show GitHub Copilot Workspaces 23 | 8. RESEARCH prompt: *Show me the 5 most important papers that contributed to application container technology standards, i.e. singularity, docker. Provide citations* 24 | 25 | ## Backlog / Ideas 26 | 27 | ### Cloud Tasks 28 | 29 | ### Architecture 30 | - Update diagram per client requirments 31 | - Build deployment script for cloud x 32 | 33 | #### Docker Containers 34 | - Describe required Docker dev environment and provide setup instructions 35 | - Create a Dockerfile 36 | - Improve a Dockerfile 37 | - Build/deploy/test container image locally 38 | - Suggest security remidiation methods for container image 39 | - List build options for a cloud 40 | - Create deployment script 41 | - Translate a Singularity (or Apptainer) container to a Docker container 42 | 43 | ### Human Health Tasks 44 | 45 | #### Bioinformatics 46 | - Summarize published research on topic x - DeepResearch 47 | - Segment image (cellular / nuclear) 48 | - Predict protein structure - AlphaFold 49 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/4_Prompt-Katas/README.md: -------------------------------------------------------------------------------- 1 | # Cloud Prompt Katas 2 | 3 | Concept: Use cloud tasks as a basis for testing quality of output of GenAI tool prompts. 4 | 5 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/prompt-kata-group.png" width=800> 6 | 7 | ## Concepts / Test Kata Problems 8 | - derive from tool testing 9 | - derive from problem/tasks 10 | - derive from 'found' prompts 11 | 12 | ### GenAI / LLM Exploration Concepts 13 | Katas for practice/play/learning w/Prompts as 'code' 14 | - Iteration on exact prompt langauge as 'params' 15 | - Attention to tool-based prompt guidance/automated prompt re-writing 16 | - Big (general purpose) / small (domain-specific) LLM comparisons 17 | - Tool (GUI) vs API calls 18 | - Improvements via examining output from 'thinking' LLM models 19 | 20 | ### Validation 21 | - HITL - domain expertise as validation 22 | - Advsersarial 23 | - different models settings within tool 24 | - different models within tool 25 | - different tools 26 | - Automated 27 | - methods of automated, quantified output quality validation 28 | 29 | ## List of Candidate GenAI Tools 30 | 31 | ### General Purpose 32 | - ChatGPT / OpenAI 33 | - Google Gemini 34 | - Claude / Anthropic 35 | 36 | ### Domain-specific 37 | - Code: GitHub CoPilot & Copilot Repositories 38 | - Code: Repl.it 39 | - Cloud: GCP Gemini 40 | - Cloud: Amazon Q 41 | - Images: Google Imagen3 42 | 43 | - Medical Images: BioMedCLIP (open source foundational LLM) 44 | - Video: Google Veo2 45 | - Data: Databricks Genie, DBRX 46 | 47 | ### New Search Engines 48 | - Perplexity (multiple models) 49 | 50 | ### Ethical 'no's 51 | - DeepSeek 52 | - Llama 53 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/4_Prompt-Katas/gemini-for-google-workspace-prompting-guide-101.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/4_Prompt-Katas/gemini-for-google-workspace-prompting-guide-101.pdf -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/README.md: -------------------------------------------------------------------------------- 1 | # Patterns 2 | 3 | ### Core Cloud 4 | 5 | <kbd><img src="https://miro.medium.com/max/1100/1*qXdSJxH7DtetjDlGQRyFgA.png" width=800></kbd> 6 | 7 | Core Cloud Patterns and design considerations, summarized below with a checklist, article and talk. 8 | 9 | - ✅ My Checklist: **"What is the Current State of Your Cloud Deployments?"** - do a checkup of your cloud env to get a baseline - [link](https://lynnlangit.medium.com/10-legacy-cloud-considerations-44b2a5073706?sk=75a729b527de05fa13103a913c9a45db) 10 | - :book: My Article: **"6 Cloud Adoption Patterns"** - particularly applies to enterprise-sized companies - [link](https://lynnlangit.medium.com/cloud-adoption-patterns-d47ffc5789fe) 11 | - :tv: My Talk: **"Cloud Adoption Patterns"** - expanded talk-version of article above - [link](https://www.youtube.com/watch?v=_su5lPuENNo) 12 | 13 | ### 4 Steps to Your First Cloud Native Applicattion 14 | 1. Your_Code ➡️ Your_App ? (add DevOps or 'infrastructure as code') 15 | 2. Your_Methods ➡️ Your_App ? (use Microservices / Functions or 'serverless') 16 | 3. Your_Data as Streams | CRUD | Batches ➡️ Data Methods? (select data store or SQL | NoSQL | DataLake [buckets]) 17 | 4. CODE + DATA + OTHER_SERVICES ➡️ Cloud Native App Services? (implement 'other cloud service' or 'security [IAM]...') 18 | 19 | ### What are *Other* Cloud Service Types? 20 | 21 | - 🔐 Users | Accounts - Roles & Permissions - IAM comparison blog post - [link](https://ermetic.com/blog/cloud/aws-azure-and-gcp-the-ultimate-iam-comparison/) 22 | - 💳 Costs - Billing & Control 23 | - 📁 App Organization - Folders & Projects 24 | - 🔥 Up Time - Monitoring & Alerts 25 | - 🏗️ Updating - CI/CD 26 | - 📚 Data - Data Mesh - [link](https://www.datamesh-architecture.com/) 27 | - ✨ Advanced Processing - ML / AI 28 | 29 | --- 30 | 31 | ## End-to-end Example 32 | 33 | Shown below are the building blocks of a modern cloud architecture 34 | 35 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/0_CLOUD-PATTERNS/images/modern-cloud-arch.png" width=800> 36 | -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/RYG-progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/RYG-progress.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/aws-genomics-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/aws-genomics-arch.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/data-lake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/data-lake.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/deployment-types-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/deployment-types-color.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/deployment-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/deployment-types.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/deploys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/deploys.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/genomic-pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/genomic-pipeline.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/lake-sketch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/lake-sketch.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/modern-cloud-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/modern-cloud-arch.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/new-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/new-main.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/research-pipelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/research-pipelines.png -------------------------------------------------------------------------------- /0_CLOUD-PATTERNS/images/scale-jobs-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/0_CLOUD-PATTERNS/images/scale-jobs-arch.png -------------------------------------------------------------------------------- /AWS/AWS-CLOUDLAKES.md: -------------------------------------------------------------------------------- 1 | # Patterns for AWS Cloud Data Lakes 2 | 3 | ## Raw Kubernetes 4 | 5 | The reference pattern... 6 | 7 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/cloud-k8.png"> 8 | 9 | ## Managed Kubernetes / EKS 10 | 11 | AWS includes the [`Elastic Kubernetes Service`](https://aws.amazon.com/eks/) as a container cluster controller. EKS can be configured to use an auto-scaling service. Also `AWS Batch` (see below) can be used. 12 | 13 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/aws-k8.png"> 14 | 15 | 16 | --- 17 | ## AWS Genomics 18 | 19 | ### GATK, CROMWELL & BATCH 20 | 21 | AWS includes the [AWS Batch service](https://aws.amazon.com/batch/) for burstable genomic-scale data pipelines. Pattern is shown below for the GATK analysis toolkit. 22 | 23 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/aws-cromwell.png"> 24 | 25 | ### IDSeq & Batch 26 | 27 | AWS includes the [AWS Batch service](https://aws.amazon.com/batch/) for burstable genomic-scale data pipelines. Pattern is shown below for the [IDSeq](https://www.discoveridseq.com/) toolkit. 28 | 29 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/aws-idseq.png"> 30 | 31 | 32 | ### Nextflow & Batch 33 | 34 | AWS includes the [AWS Batch service](https://aws.amazon.com/batch/) for burstable genomic-scale data pipelines. Pattern is shown below for a Nextflow analysis toolkit. 35 | 36 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/aws-nextflow.png"> 37 | 38 | ### VariantSpark & Batch 39 | 40 | AWS includes the [AWS Batch service](https://aws.amazon.com/batch/) for burstable genomic-scale data pipelines. Pattern is shown below for the VariantSpark toolkit. 41 | 42 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/aws-variantspark.png"> 43 | -------------------------------------------------------------------------------- /AWS/README.md: -------------------------------------------------------------------------------- 1 | # AWS Resources 2 | 3 | ## My Courses on LinkedIn Learning 4 | 5 | 📺 My AWS courses on LinkedIn Learning - [link](https://www.linkedin.com/learning/search?entityType=COURSE&keywords=aws%20%2B%20lynn%20langit) - **18 courses!**: 6 | - **AWS for DevOps for Beginners** - best practices, core concepts by example - [link](https://www.linkedin.com/learning/aws-devops-best-practices-for-beginners) 7 | - **AWS for Data Series**: Machine Learning, Data Analytics, Data Services, Data Security 8 | - **AWS for DevOps Series**: AWS Controlling Cost- [link](https://www.linkedin.com/learning/amazon-web-services-controlling-cost) , Monitoring, Metrics & Logging, High Availability & Elasticity, Continuous Delivery & Process, Security, Governance & Validation, Amazon Workspaces 9 | - **AWS Architects Series**: Advanced Security, High Availability & Continuous Delivery, Network & Storage Design; Design & Implement Systems 10 | - **Big Data courses**: Learning Hadoop and Spark - [link](https://github.com/lynnlangit/learning-hadoop-and-spark), Learning NoSQL - [link](https://github.com/lynnlangit/learning-nosql) - includes AWS content 11 | - **End-user Computing course**: Learning Amazon Workspaces - [link](https://www.linkedin.com/learning/amazon-workspaces-deploy-virtual-desktops-14472889) 12 | 13 | ## My Other AWS Resources 14 | 15 | My AWS notes/links/sample code in GitHub Repos and other writings and screencasts (on YouTube) 16 | 17 | - :star: updating in 2024 - open source course **"aws-for-bioinformatics"** on YouTube/GitHub - [link](https://github.com/lynnlangit/aws-for-bioinformatics) 18 | - :octocat: My example AWS GitHub Repos 19 | - **'hello-aws-data-services'** - [link](https://github.com/lynnlangit/Hello-AWS-Data-Services) 20 | - **'aws-cost-control'** - [link](https://github.com/lynnlangit/aws-cost-control) 21 | - **'learning-hadoop-and-spark'** - [link](https://github.com/lynnlangit/learning-hadoop-and-spark) 22 | - **'learning-nosql'** - [link](https://github.com/lynnlangit/learning-nosql) 23 | - **'learning-amazon-workspaces'** - [link](https://github.com/lynnlangit/learning-amazon-workspaces) 24 | - 📚 My Medium AWS Articles - [link](https://medium.com/search?q=aws%20langit) 25 | - 📺 My YouTube AWS Serverless Playlist for **serverless AWS** - [link](https://www.youtube.com/playlist?list=PL4Q4HssKcxYsa2A2D2_Zln2tkL4v4-ymO) 26 | - 📺 My YouTube general AWS Playlist for **general AWS** - [link](https://www.youtube.com/playlist?list=PL93B06369FAD34284) 27 | - 🏆 AWS Community Hero (for Data) - [link](https://aws.amazon.com/developer/community/heroes/lynn-langit/?did=dh_card&trk=dh_card) 28 | 29 | --- 30 | 31 | ## Top Open Source AWS Resources 32 | 33 | - :octocat: Open Guide for AWS on GitHub - [link](https://github.com/open-guides/og-aws) 34 | - 📚 short article: 'how to get started learning AWS - [link](https://dev.to/loujaybee/where-and-how-to-start-learning-aws-as-a-beginner-27ab) 35 | - :octocat: How they AWS - [link](https://github.com/upgundecha/howtheyaws) 36 | - :octocat: Awesome AWS Security - [link](https://github.com/jassics/awesome-aws-security) 37 | - 📚 AWS Architecture Center, includes reference architectures - [link](https://aws.amazon.com/architecture) 38 | 39 | ### AWS Certification Information 40 | 41 | - List of certifications for AWS: 42 | - Main certification site - [link](https://aws.amazon.com/certification/) 43 | - Cert Prep site - [link]( https://aws.amazon.com/certification/certification-prep/) 44 | 45 |  46 | -------------------------------------------------------------------------------- /AWS/aws-courses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/AWS/aws-courses.png -------------------------------------------------------------------------------- /AWS/aws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/AWS/aws.png -------------------------------------------------------------------------------- /AlibabaCloud/README.md: -------------------------------------------------------------------------------- 1 | # Alibaba Cloud Resources 2 | 3 |  4 | 5 | 6 | - 📺 My course **'Learning Alibaba Cloud'** (2 hours) - [link](https://www.linkedin.com/learning/learning-alibaba-cloud). Learning objectives: 7 | - Setting up an Alibaba Cloud account 8 | - Creating and configuring VMs 9 | - Creating and configuring container clusters 10 | - Creating functions 11 | - Creating storage buckets and databases 12 | - Managing resources with Cloud Shell 13 | - Accessing the Marketplace 14 | - Using the API Explorer console and templates 15 | - :octocat: My companion Repo 16 | - **'Learning Alibaba Cloud'** - [link](https://github.com/lynnlangit/learning-alibaba-cloud) 17 | - Alibaba Cloud Community Builders - [link](https://www.alibabacloud.com/campaign/communitybuilder) 18 | 19 | --- 20 | 21 | ## Other Resources & Certification Info 22 | 23 | - List of certifications for Alibaba Cloud - main [link](https://edu.alibabacloud.com/certification) 24 | 25 |  26 | -------------------------------------------------------------------------------- /AlibabaCloud/alibaba-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/AlibabaCloud/alibaba-cloud.png -------------------------------------------------------------------------------- /Azure/Azure-CLOUDLAKES.md: -------------------------------------------------------------------------------- 1 | # Patterns for Azure Cloud Data Lakes 2 | 3 | ## Raw Kubernetes 4 | 5 | The raw pattern... 6 | 7 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/cloud-k8.png"> 8 | 9 | 10 | --- 11 | ## Azure Genomics 12 | 13 | Azure includes the [`Azure Kubernetes Service`](https://azure.microsoft.com/en-us/services/kubernetes-service) as a container cluster controller. Azure also includes the [`Azure Batch Service`](https://docs.microsoft.com/en-us/azure/batch/batch-technical-overview). 14 | 15 | See our article on Medium ['Azure Genomics w/cromwell'](https://lynnlangit.medium.com/azure-for-genomic-scale-workloads-ad3c989a3d0b). Note current implementation uses the [TES-Azure API](https://github.com/microsoft/tes-azure) to 'connect' cromwell with Azure Batch service. 16 | 17 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/azure-cromwell.png"> 18 | 19 | 20 | -------------------------------------------------------------------------------- /Azure/README.md: -------------------------------------------------------------------------------- 1 | # Azure Resources 2 | 3 | - 📺 My course **'Azure Databricks'** (3 hours) - [link](https://www.linkedin.com/learning/azure-spark-databricks-essential-training). Learning Objectives: 4 | - Business scenarios for Apache Spark 5 | - Setting up a cluster 6 | - Using Python, R, and Scala notebooks 7 | - Scaling Azure Databricks workflows 8 | - Data pipelines with Azure Databricks 9 | - Machine learning architectures 10 | - Using Azure Databricks for data warehousing 11 | - :octocat: Link to example Azure Databricks notebooks - [link](https://github.com/lynnlangit/learning-hadoop-and-spark/tree/master/5-Use-Spark/Jupyter-Notebooks/azure_databricks_notebooks) 12 | - My example GitHub Repos 13 | - :octocat: **'learning-hadoop-and-spark'** - [link](https://github.com/lynnlangit/learning-hadoop-and-spark) 14 | - :octocat: **'Learning Cromwell on Azure'** [link](https://github.com/lynnlangit/learning-cromwell-on-azure) 15 | - :octocat: **'learning Github Codespaces'** - [link](https://github.com/lynnlangit/learning-codespaces) 16 | - :octocat: **'learning-quantum'** - [link](https://github.com/lynnlangit/learning-quantum/tree/main/2_cloud-vendors/azure-quantum) learning Q# and more 17 | - 📖 My Medium Articles - [link](https://medium.com/search?q=azure%20langit) 18 | - 🏆 My Microsoft Regional Director award - [link](https://rd.microsoft.com/en-us/lynn-langit) 19 | 20 | --- 21 | 22 | ## Other Resources & Certification Info 23 | 24 | - Azure Cheat Sheet - list of all Azure services on one page - [link](https://github.com/milanm/azure-cheat-sheet) 25 | - Azure Architecture center, includes reference architectures - [link](https://docs.microsoft.com/en-us/azure/architecture/) 26 | - Online poster with all certification types (see Azure section) - [link](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE2PjDI) 27 | - Shown below Microsoft certifications by job role 28 |  29 | -------------------------------------------------------------------------------- /Azure/azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/Azure/azure.png -------------------------------------------------------------------------------- /GCP/GCP-CLOUDLAKES.md: -------------------------------------------------------------------------------- 1 | # Patterns for GCP Cloud Data Lakes 2 | 3 | ## Raw Kubernetes 4 | 5 | The reference pattern... 6 | 7 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/cloud-k8.png"> 8 | 9 | ## Managed Kubernetes / GKE 10 | 11 | GCP includes the [`Google Kubernetes Engine`](https://cloud.google.com/kubernetes-engine) as a container cluster controller. GKE can be configured to use an auto-scaling service. Also PAPI, which is now called `Google Life Sciences API` (see below) can be used. 12 | 13 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/gcp-k8.png"> 14 | 15 | 16 | --- 17 | ## GCP Genomics 18 | 19 | ### GATK & PAPI 20 | 21 | GCP includes the [Google Cloud Life Sciences API](https://cloud.google.com/life-sciences/docs/reference/rest) (was called the Pipelines API) for burstable genomic-scale data pipelines. Pattern is shown below for the GATK analysis toolkit. 22 | 23 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/gcp-cromwell.png"> 24 | 25 | ### DeepVariant & PAPI 26 | 27 | GCP includes the [Google Cloud Life Sciences API](https://cloud.google.com/life-sciences/docs/reference/rest) (was called the Pipelines API) for burstable genomic-scale data pipelines. Pattern is shown below for the DeepVariant analysis toolkit. 28 | 29 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/gcp-deepvariant.png"> 30 | 31 | 32 | ### Nextflow & PAPI 33 | 34 | GCP includes the [Google Cloud Life Sciences API](https://cloud.google.com/life-sciences/docs/reference/rest) (was called the Pipelines API) for burstable genomic-scale data pipelines. Pattern is shown below for a Nextflow analysis toolkit. 35 | 36 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/gcp-nextflow.png"> 37 | -------------------------------------------------------------------------------- /GCP/README.md: -------------------------------------------------------------------------------- 1 | # GCP Resources 2 | 3 | I have created a number of courses for GCP. Many are on Linked In Learning with associated Repos on GitHub. 4 | NOTE: A couple of these courses are fully open source (on GitHub and YouTube). 5 | 6 | ## Courses 7 | 8 | ### GCP Courses 9 | 10 | - My GCP Courses on LinkedIn Learning - [link](https://www.linkedin.com/learning/search?entityType=COURSE&keywords=gcp%20langit) to all GCP courses 11 | - 📺 **'GCP Essentials'** - this is the first course to take in this series - [link](https://www.linkedin.com/learning/google-cloud-platform-essential-training-for-administrators-22141609) 12 | - 📺 **'GCP Enterprise Essentials'** - take this course if you are an enterprise cloud professionals - [link](https://www.linkedin.com/learning/google-cloud-platform-for-enterprise-essential-training-22140980) 13 | - 📺 **'GCP Tools'** course on [LI_L](https://www.linkedin.com/learning/learning-google-cloud-developer-and-devops-tools) & associated Repo folder in `tools` section at - [link](https://github.com/lynnlangit/gcp-essentials/tree/master/0_setup_and_iam_and_costs/tools) 14 | - 📺 **'GCP Cost Control'** course on [LI_L](https://www.linkedin.com/learning/google-cloud-controlling-cost), and associated Repo page at - [link](https://github.com/lynnlangit/gcp-essentials/tree/master/0_setup_and_iam_and_costs/0c_cost_control) 15 | - 📺 **'Learning Hadoop'** - this is the first course to take in this series 16 | - 📺 **'Cloud Hadoop: Scaling Apache Spark'** - uses GCP Dataproc - take this course to learn to use/scale Spark on GCP 17 | - 📺 **'Cloud NoSQL for SQL Pros'** - this course covers both GCP and AWS NoSQL data services 18 | 19 | ### Google Gemini & Machine Lerning Courses 20 | - 📺 **'Google Gemini for Developers'** - this course introduces the Google Gemini for developers at [link](https://www.linkedin.com/learning/google-gemini-for-developers-24018542) 21 | - 📺 **'Advanced Google Gemini'** - this course explores buiding LLM apps using the Google Gemini for developers at [link](https://www.linkedin.com/learning/advanced-gemini-for-developers) 22 | - 📺 **'GCP Machine Learning'** - this course covers machine learning on GCP at [link](https://www.linkedin.com/learning/google-cloud-platform-for-machine-learning-essential-training-23457382) 23 | - 📺 **'Spark and NoSQL'** courses on LinkedIn Learning (includes lots of GCP info)- [link](https://www.linkedin.com/learning/search?entityType=COURSE&keywords=hadoop%20spark%20langit) 24 | 25 | ## Repos 26 | 27 | - My example GCP Repos and associated Courses 28 | - :octocat: **'gcp-essentials'** - [link](https://github.com/lynnlangit/gcp-essentials) - companion to my LI_L 'GCP Essentials' course 29 | - :octocat: **'gcp-ml'** - [link](https://github.com/lynnlangit/gcp-essentials/tree/master/6_AI-ML) - compantion to my my LI_L 'GCP ML' and my 'Google Gemini' courses 30 | - :octocat: **'learning-hadoop-and-spark'** - [link](https://github.com/lynnlangit/learning-hadoop-and-spark) - companion to my LI_L 'Learning Hadoop' course 31 | - :octocat: **'learning-nosql'** - [link](https://github.com/lynnlangit/learning-nosql) - compantion to my LI_L 'NoSQL' course 32 | - :octocat: **'gcp-for-bioinformatics'** - [link](https://github.com/lynnlangit/gcp-for-bioinformatics) - includes YouTube screencast demo playlist - FREE COURSE! 33 | 34 | ## Articles, Screencasts and more 35 | 36 | - 📚 My GCP Medium Articles - [link](https://medium.com/search?q=gcp%20langit) 37 | - 📺 My YouTube bioinformatics GCP playlist - [link](https://www.youtube.com/playlist?list=PL4Q4HssKcxYtE5Tae3epNab3mK9iP1iWX) 38 | - 📺 My YouTube general GCP playlist - [link](https://www.youtube.com/playlist?list=PL6971A0258365F21E) 39 | - 🏆 My GDE (Google Developer Expert for Cloud) award - [link](https://developers.google.com/community/experts/directory/profile/profile-lynn_langit) 40 | 41 | --- 42 | 43 | ## Other Resources & Certification Info 44 | 45 | - GCP Community Resources, including tutorials - [link](https://cloud.google.com/community/) 46 | - GCP code samples - [link](https://cloud.google.com/docs/samples) 47 | - GCP Services, defined concisely on one page - [link](https://github.com/gregsramblings/google-cloud-4-words) 48 | - GCP Services compared to AWS and Azure services - [link](https://cloud.google.com/docs/compare/aws?hl=en_US) 49 | - List of certifications for Google Cloud Platform - [Link](https://cloud.google.com/certification) and shown below 50 | 51 |  52 | 53 | ---- 54 | 55 | -------------------------------------------------------------------------------- /GCP/gcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/GCP/gcp.png -------------------------------------------------------------------------------- /IBM/README.md: -------------------------------------------------------------------------------- 1 | # IBM Cloud Resources 2 | 3 | I am currently exploring **quantum computing** using IBM cloud resources. IBM Cloud includes a number of types of services, summarized and shown below. 4 | 5 | 6 | - :octocat: My Repo 'learning-quantum' has links and other resources - [link](https://github.com/lynnlangit/learning-quantum) 7 | - 🗞️ IBM Qiskit Cloud Quantum Developer certification - [link](https://www.ibm.com/training/certification/ibm-certified-associate-developer-quantum-computation-using-qiskit-v02x-C0010300) 8 | 9 | <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/ibm-cloud.png" width=600> 10 | --- 11 | 12 | 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | Copyright 2020-2023 Lynn Langit 179 | 180 | Licensed under the Apache License, Version 2.0 (the "License"); 181 | you may not use this file except in compliance with the License. 182 | You may obtain a copy of the License at 183 | 184 | http://www.apache.org/licenses/LICENSE-2.0 185 | 186 | Unless required by applicable law or agreed to in writing, software 187 | distributed under the License is distributed on an "AS IS" BASIS, 188 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 189 | See the License for the specific language governing permissions and 190 | limitations under the License. 191 | -------------------------------------------------------------------------------- /NVIDIA/README.md: -------------------------------------------------------------------------------- 1 | # NVIDIA Cloud Resources 2 | 3 | I am currently exploring **quantum computing** using NVIDIA cloud resources. NVIDIA Cloud includes a number of types of services, summarized and shown below. Also see [my other GitHub repo](https://github.com/lynnlangit/learning-quantum/tree/main/2_cloud-vendors/NVIDIA%20CUDA-Q). 4 | 5 | NVIDIA recently started offering GenAI (and other) types of technical certifications --> [link](https://www.nvidia.com/en-us/learn/certification/) 6 | 7 | ## About Nvidia CUDA-Q 8 | 9 | From Nvidia's site --> https://nvidia.github.io/cuda-quantum/latest/using/quick_start.html 10 | 11 | *"CUDA-Q streamlines hybrid application development and promotes productivity and scalability in quantum computing. It offers a unified programming model designed for a hybrid setting—that is, CPUs, GPUs, and QPUs working together. CUDA-Q contains support for programming in Python and in C++. Learn more about the key benefits of CUDA-Q."* 12 | 13 | *"This Quick Start page guides you through installing CUDA-Q and running your first program. If you have already installed and configured CUDA-Q, or if you are using our Docker image, you can move directly to our Basics Section. More information about working with containers and Docker alternatives can be found in our complete Installation Guide."* 14 | 15 | ### Building 16 | 17 | *"We can define our quantum kernel as a typical Python function, with the additional use of the `@cudaq.kernel` decorator. Let’s begin with a simple GHZ-state example, producing a state of maximal entanglement amongst an allocated set of qubits."* 18 | 19 | ``` 20 | import cudaq 21 | 22 | @cudaq.kernel 23 | def kernel(qubit_count: int): 24 | qvector = cudaq.qvector(qubit_count) 25 | 26 | # Place the first qubit in the superposition state. 27 | h(qvector[0]) 28 | 29 | # Loop through the allocated qubits and apply controlled-X, 30 | # or CNOT, operations between them. 31 | for qubit in range(qubit_count - 1): 32 | x.ctrl(qvector[qubit], qvector[qubit + 1]) 33 | 34 | # Measure the qubits. 35 | mz(qvector) 36 | ``` 37 | 38 | ### Running 39 | 40 | See this page --> https://nvidia.github.io/cuda-quantum/latest/using/basics/run_kernel.html#sample 41 | 42 | 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learning Cloud 2 | 3 | ## What's in this Repo 4 | 5 | This Repo contains links to **100+ resources** I've created for you to learn to work on the public cloud. 6 | Links, examples, short explanations and architectures are included for AWS, Azure, or GCP & more. 7 | 8 | ## What's NEW 9 | 10 | <details><summary>In 2025 / LinkedIn Learning Courses</summary><br> 11 | 12 | I have published more than 30 courses on AI, Cloud and Data topics on LinkedIn Learning - [here](https://www.linkedin.com/learning/instructors/lynn-langit) 13 | 14 | - ⭐ PUBLISHED - 100% update - both courses [**'Google Gemini v 2.x for Devs (Beg & Adv)'**](https://www.linkedin.com/learning/google-gemini-for-developers-25832309) 15 | - ⭐ PUBLISHED - Updated with GenAI content [**'Cloud Careers and Certifications'**](https://www.linkedin.com/learning/cloud-computing-careers-and-certifications) 16 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/gcp.png" width=25> Recorded - New course **'Google Agentspaces'** 17 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/gcp.png" width=25> Scheduled - New course **'Google VEO3'** 18 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/aws.png" width=25> Scheduled - New course **'AWS GenAI DevOps'** 19 | </details> 20 | 21 | ### MOST VIEWED CONTENT 22 | 23 | <details><summary>Most viewed Cloud & GenAI Content</summary> 24 | 25 | #### GenAI Courses on Linked In Learning 26 | 27 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/gcp.png" width=25> **`Google Gemini for Developers`** - [link to repo](https://github.com/lynnlangit/gcp-essentials/tree/master/6_AI-ML/2_gemini_LLM) and [course](https://www.linkedin.com/learning/google-gemini-for-developers-25832309) 28 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/gcp.png" width=25> **`Advanced Google Gemini for Developers`** - [link to repo](https://github.com/lynnlangit/gcp-essentials/blob/master/6_AI-ML/2_gemini_LLM/ADV-LLM-Dev.md) and [course](https://www.linkedin.com/learning/advanced-gemini-for-developers) 29 | - <img src="https://github.com/lynnlangit/learning-cloud/blob/master/images/databricks-icon.png" width=20> **`Learn Databricks Gen AI`** - [link to course](https://www.linkedin.com/learning/learn-databricks-genai) 30 | - <img src="https://github.com/lynnlangit/sample-data/blob/master/1_sample_data/emoji-icons/chat-gpt.png" width=20> **`5+ min of my ChatGPT`** - screencast series (on YouTube as playlist)--[link to playlist](https://www.youtube.com/playlist?list=PL4Q4HssKcxYuwbVAgVqwM5od3yLtg9NM0) 31 | 32 | 33 | #### GCP Topics 34 | - 🧬 📺 :octocat: **`GCP-for-Bioinformatics`** [FREE course on GitHub](https://github.com/lynnlangit/gcp-for-bioinformatics) 35 | - 📺 :octocat: **`Serverless Architecture`** course - [link](https://www.linkedin.com/learning/serverless-architecture-19870153) & [repo](https://github.com/lynnlangit/serverless-architecture) 36 | - 📺 :octocat: **`GCP Essentials`** and **`GCP Enterprise`** courses on LI_L - see repo for updates - [link](https://github.com/lynnlangit/gcp-essentials) 37 | - 📺 :octocat: **`GCP Tools`** [course on LI_L](https://www.linkedin.com/learning/learning-google-cloud-developer-and-devops-tools) & associated repo examples in `tools` folder at [link](https://github.com/lynnlangit/gcp-essentials/blob/master/1_storage/tools/README.md) 38 | - 📺 :octocat: **`GCP Cost Control`** [course on LI_L](https://www.linkedin.com/learning/google-cloud-controlling-cost), see repo [link](https://github.com/lynnlangit/gcp-essentials/tree/master/0_setup_and_iam_and_costs/0c_cost_control) too 39 | 40 | 41 | #### Data, Machine Learning and More 42 | - 📺 :octocat:**`Learning SnowflakeDB`** [course on LI_L](https://www.linkedin.com/learning/learning-snowflakedb) & associated repo at [link](https://github.com/lynnlangit/learn-snowflakedb) 43 | - 📺 :octocat: **`Cloud Quantum Computing`** [course on LI_L](https://www.linkedin.com/learning/cloud-quantum-computing-essentials) & associated working repo at [link](https://github.com/lynnlangit/learning-quantum/tree/main/2_cloud-vendors) 44 | - :octocat: Studies on **`Learning Ethical AI`** , my resources repo at [link](https://github.com/lynnlangit/learning-ethical-ai) 45 | - 🧬 :octocat: In preview - **`aws-for-bioinformatics`** a FREE and open source course on GitHub and YouTube - [link](https://github.com/lynnlangit/aws-for-bioinformatics) 46 | - 📚 :octocat: 📺 **`Learning Data Mesh`** [repo + book club](https://github.com/lynnlangit/learning-data-mesh) 47 | 48 | </details> 49 | 50 | --- 51 | 52 | ### ALL CONTENT: 100+ Cloud Courses, Articles 53 | 54 | <details><summary>All Cloud Content</summary> 55 | 56 | #### All Cloud Courses 57 | - 📚 my **cloud courses** on LinkedIn Learning (30) - [link](https://www.linkedin.com/learning/instructors/lynn-langit) 58 | - :octocat: my **example code** in Github repos (10+) - [link](https://github.com/lynnlangit) 59 | - 📖 my **system visualization** tools, talks and examples (list) - [link](https://github.com/lynnlangit/learning-cloud/tree/master/0_CLOUD-PATTERNS/1_Viz-Systems) 60 | - 🧬 :octocat: my **course on bioinformatics for cloud** on GitHub (`TeamTeri`) - [link](https://github.com/lynnlangit/TeamTeri) 61 | 62 | #### Cloud Architectures, Patterns and Articles 63 | - :octocat: My `CLOUD-PATTERNS` section to share best practice patterns and tools for cloud workloads - [link](https://github.com/lynnlangit/learning-cloud/tree/master/0_CLOUD-PATTERNS) 64 | - 📺 :octocat: My `Serverless Architecture` companion repo to my course on LI_L - [link](https://www.linkedin.com/learning/serverless-architecture-19870153) 65 | - 📚 **`Lynn Langit's Cloud World`** [on Substack](https://lynnlangit.substack.com/) 66 | - 📖 my **technical articles** on Medium (40) - cloud topics - [link](https://medium.com/search?q=langit%20cloud) 67 | - 📖 my **micro-blogging** on Dev.to (many...) - [link](https://dev.to/lynnlangit) 68 | 69 | #### All Cloud Screencasts, Sample Data and Slide Decks 70 | - 🗣️ my **screencasts/talks** on YouTube (50+) - cloud topics and more - [link](https://www.youtube.com/c/LynnLangit/playlists) 71 | - 🗄️ my **sample data** in GitHub repo (10+) kinds of sample data - [link](https://github.com/lynnlangit/sample-data) 72 | - 🗣️ my **slide decks** on Slides.com (many...) - [link](https://slides.com/lynnlangit) 73 | 74 | </details> 75 | 76 | --- 77 | 78 | ### Tl;dr: "How do I get started in cloud?" 79 | 80 | If you are completely **new to cloud**, you might want to go here first --> [link](https://github.com/lynnlangit/learning-cloud/tree/master/0_CLOUD-PATTERNS/0_Starting-Points) 81 | Also see my ⭐⭐⭐ - **FAQ course** - [Insights on Cloud Computing](https://www.linkedin.com/learning/insights-on-cloud-computing-with-lynn-langit) ⭐⭐⭐ 82 | -------------------------------------------------------------------------------- /images/0-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/0-main.png -------------------------------------------------------------------------------- /images/1-main-gpt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/1-main-gpt.png -------------------------------------------------------------------------------- /images/2a-ex-BQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/2a-ex-BQ.png -------------------------------------------------------------------------------- /images/2b-ex-Azure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/2b-ex-Azure.png -------------------------------------------------------------------------------- /images/2c-ex-serverless-aws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/2c-ex-serverless-aws.png -------------------------------------------------------------------------------- /images/LAMP-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/LAMP-1.png -------------------------------------------------------------------------------- /images/LAMP-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/LAMP-2.png -------------------------------------------------------------------------------- /images/LAMP-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/LAMP-3.png -------------------------------------------------------------------------------- /images/LAMP-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/LAMP-4.png -------------------------------------------------------------------------------- /images/alibaba-locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/alibaba-locations.png -------------------------------------------------------------------------------- /images/aws-ci-cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/aws-ci-cd.png -------------------------------------------------------------------------------- /images/aws-locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/aws-locations.png -------------------------------------------------------------------------------- /images/azure-locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/azure-locations.png -------------------------------------------------------------------------------- /images/data-lakes/CLOUDLAKES.md: -------------------------------------------------------------------------------- 1 | # Patterns for Cloud Data Lakes 2 | ## Raw Kubernetes 3 | 4 | This is the general pattern. See specific vendor `CLOUDLAKE.md` files in each folder for examples using that cloud vendor's data lake servics. 5 | 6 | <img src="https://github.com/lynnlangit/learning-cloud/blob/38919ae405d672286aec0a33ebe01e1b42c3d096/images/data-lakes/cloud-k8.png"> 7 | 8 | -------------------------------------------------------------------------------- /images/data-lakes/aws-cromwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/aws-cromwell.png -------------------------------------------------------------------------------- /images/data-lakes/aws-idseq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/aws-idseq.png -------------------------------------------------------------------------------- /images/data-lakes/aws-k8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/aws-k8.png -------------------------------------------------------------------------------- /images/data-lakes/aws-nextflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/aws-nextflow.png -------------------------------------------------------------------------------- /images/data-lakes/aws-variantspark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/aws-variantspark.png -------------------------------------------------------------------------------- /images/data-lakes/azure-cromwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/azure-cromwell.png -------------------------------------------------------------------------------- /images/data-lakes/cloud-k8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/cloud-k8.png -------------------------------------------------------------------------------- /images/data-lakes/excalidraw-files/cromwell.excalidraw: -------------------------------------------------------------------------------- 1 | { 2 | "type": "excalidraw", 3 | "version": 2, 4 | "source": "https://excalidraw.com", 5 | "elements": [ 6 | { 7 | "type": "ellipse", 8 | "version": 302, 9 | "versionNonce": 1309521257, 10 | "isDeleted": false, 11 | "id": "zlVzpBEIsqx2xRwFRPXHJ", 12 | "fillStyle": "hachure", 13 | "strokeWidth": 1, 14 | "strokeStyle": "solid", 15 | "roughness": 1, 16 | "opacity": 100, 17 | "angle": 0, 18 | "x": 505.06640625, 19 | "y": -90.59375, 20 | "strokeColor": "#000000", 21 | "backgroundColor": "transparent", 22 | "width": 382.1953125, 23 | "height": 126.4609375, 24 | "seed": 1280939653, 25 | "groupIds": [], 26 | "strokeSharpness": "sharp", 27 | "boundElementIds": [ 28 | "2bwDydvuGfzL4uUIQYjn-", 29 | "StNZak6JEplwGlvK-ArDP" 30 | ] 31 | }, 32 | { 33 | "type": "rectangle", 34 | "version": 258, 35 | "versionNonce": 871596647, 36 | "isDeleted": false, 37 | "id": "VtDV9u6NmTT-vfiwxOT33", 38 | "fillStyle": "hachure", 39 | "strokeWidth": 1, 40 | "strokeStyle": "solid", 41 | "roughness": 1, 42 | "opacity": 100, 43 | "angle": 0, 44 | "x": 393.23828125, 45 | "y": 335.25, 46 | "strokeColor": "#000000", 47 | "backgroundColor": "transparent", 48 | "width": 567.96484375, 49 | "height": 104.83203125, 50 | "seed": 1579437259, 51 | "groupIds": [], 52 | "strokeSharpness": "sharp", 53 | "boundElementIds": [] 54 | }, 55 | { 56 | "type": "arrow", 57 | "version": 652, 58 | "versionNonce": 1536542121, 59 | "isDeleted": false, 60 | "id": "2bwDydvuGfzL4uUIQYjn-", 61 | "fillStyle": "hachure", 62 | "strokeWidth": 4, 63 | "strokeStyle": "solid", 64 | "roughness": 1, 65 | "opacity": 100, 66 | "angle": 0.592498660329726, 67 | "x": 505.72164672983695, 68 | "y": 11.909577034053399, 69 | "strokeColor": "#000000", 70 | "backgroundColor": "transparent", 71 | "width": 45.479226982944965, 72 | "height": 29.992100001047728, 73 | "seed": 235710949, 74 | "groupIds": [], 75 | "strokeSharpness": "round", 76 | "boundElementIds": [], 77 | "startBinding": { 78 | "elementId": "zlVzpBEIsqx2xRwFRPXHJ", 79 | "gap": 5.629168967372168, 80 | "focus": 0.9873239877485909 81 | }, 82 | "endBinding": { 83 | "elementId": "EVjuM1xw_szZM-e_F4rwo", 84 | "gap": 7.281994671415327, 85 | "focus": -0.3261348100511172 86 | }, 87 | "points": [ 88 | [ 89 | 0, 90 | 0 91 | ], 92 | [ 93 | 45.479226982944965, 94 | 29.992100001047728 95 | ] 96 | ], 97 | "lastCommittedPoint": null, 98 | "startArrowhead": null, 99 | "endArrowhead": "arrow" 100 | }, 101 | { 102 | "type": "text", 103 | "version": 215, 104 | "versionNonce": 747787815, 105 | "isDeleted": false, 106 | "id": "dZkyzjKAYBmqL7f0-efx0", 107 | "fillStyle": "hachure", 108 | "strokeWidth": 4, 109 | "strokeStyle": "solid", 110 | "roughness": 1, 111 | "opacity": 100, 112 | "angle": 0, 113 | "x": 974.71484375, 114 | "y": 363.21484375, 115 | "strokeColor": "#000000", 116 | "backgroundColor": "transparent", 117 | "width": 296, 118 | "height": 45, 119 | "seed": 868248171, 120 | "groupIds": [], 121 | "strokeSharpness": "sharp", 122 | "boundElementIds": [], 123 | "fontSize": 36, 124 | "fontFamily": 1, 125 | "text": "Compute Cluster", 126 | "baseline": 32, 127 | "textAlign": "left", 128 | "verticalAlign": "top" 129 | }, 130 | { 131 | "type": "text", 132 | "version": 420, 133 | "versionNonce": 812808487, 134 | "isDeleted": false, 135 | "id": "ViMwgoSJlSdexkWic_sd-", 136 | "fillStyle": "hachure", 137 | "strokeWidth": 4, 138 | "strokeStyle": "solid", 139 | "roughness": 1, 140 | "opacity": 100, 141 | "angle": 0, 142 | "x": 975.02734375, 143 | "y": 285.703125, 144 | "strokeColor": "#000000", 145 | "backgroundColor": "transparent", 146 | "width": 388, 147 | "height": 45, 148 | "seed": 861511145, 149 | "groupIds": [], 150 | "strokeSharpness": "sharp", 151 | "boundElementIds": [], 152 | "fontSize": 36, 153 | "fontFamily": 1, 154 | "text": "VM/Cluster Controller", 155 | "baseline": 32, 156 | "textAlign": "left", 157 | "verticalAlign": "top" 158 | }, 159 | { 160 | "type": "text", 161 | "version": 558, 162 | "versionNonce": 3914985, 163 | "isDeleted": false, 164 | "id": "23LmKPqO5JHIF_SaYTwFv", 165 | "fillStyle": "hachure", 166 | "strokeWidth": 4, 167 | "strokeStyle": "solid", 168 | "roughness": 1, 169 | "opacity": 100, 170 | "angle": 0, 171 | "x": 979.3515625, 172 | "y": 221.37109375, 173 | "strokeColor": "#000000", 174 | "backgroundColor": "transparent", 175 | "width": 449, 176 | "height": 45, 177 | "seed": 1739888681, 178 | "groupIds": [], 179 | "strokeSharpness": "sharp", 180 | "boundElementIds": [], 181 | "fontSize": 36, 182 | "fontFamily": 1, 183 | "text": "Job/Container Controller", 184 | "baseline": 32, 185 | "textAlign": "left", 186 | "verticalAlign": "top" 187 | }, 188 | { 189 | "type": "rectangle", 190 | "version": 379, 191 | "versionNonce": 143081961, 192 | "isDeleted": false, 193 | "id": "pIBNj-19gO7d039D-gd5b", 194 | "fillStyle": "hachure", 195 | "strokeWidth": 1, 196 | "strokeStyle": "solid", 197 | "roughness": 1, 198 | "opacity": 100, 199 | "angle": 0, 200 | "x": 392.63671875, 201 | "y": 273.056640625, 202 | "strokeColor": "#000000", 203 | "backgroundColor": "transparent", 204 | "width": 567.33203125, 205 | "height": 59.796875, 206 | "seed": 1806739271, 207 | "groupIds": [], 208 | "strokeSharpness": "sharp", 209 | "boundElementIds": [] 210 | }, 211 | { 212 | "type": "rectangle", 213 | "version": 516, 214 | "versionNonce": 1013596295, 215 | "isDeleted": false, 216 | "id": "EVjuM1xw_szZM-e_F4rwo", 217 | "fillStyle": "hachure", 218 | "strokeWidth": 1, 219 | "strokeStyle": "solid", 220 | "roughness": 1, 221 | "opacity": 100, 222 | "angle": 0, 223 | "x": 395.2578125, 224 | "y": 59.326171875, 225 | "strokeColor": "#000000", 226 | "backgroundColor": "transparent", 227 | "width": 563.171875, 228 | "height": 157.953125, 229 | "seed": 1213457799, 230 | "groupIds": [], 231 | "strokeSharpness": "sharp", 232 | "boundElementIds": [ 233 | "2bwDydvuGfzL4uUIQYjn-", 234 | "StNZak6JEplwGlvK-ArDP" 235 | ] 236 | }, 237 | { 238 | "type": "rectangle", 239 | "version": 760, 240 | "versionNonce": 1591177799, 241 | "isDeleted": false, 242 | "id": "TwniV7N7snlYBqIB1Uqpi", 243 | "fillStyle": "solid", 244 | "strokeWidth": 1, 245 | "strokeStyle": "solid", 246 | "roughness": 1, 247 | "opacity": 100, 248 | "angle": 0, 249 | "x": 470.92381035557224, 250 | "y": 350.41470274298, 251 | "strokeColor": "#000000", 252 | "backgroundColor": "#ced4da", 253 | "width": 45.06253553885557, 254 | "height": 68.91712926798951, 255 | "seed": 196377065, 256 | "groupIds": [ 257 | "HpBWU6qszDqSPRUtrKIeI" 258 | ], 259 | "strokeSharpness": "sharp", 260 | "boundElementIds": [] 261 | }, 262 | { 263 | "type": "rectangle", 264 | "version": 910, 265 | "versionNonce": 843381161, 266 | "isDeleted": false, 267 | "id": "EY915Av-DpsFUNM5cbUgf", 268 | "fillStyle": "solid", 269 | "strokeWidth": 1, 270 | "strokeStyle": "solid", 271 | "roughness": 1, 272 | "opacity": 100, 273 | "angle": 0, 274 | "x": 476.08297529621694, 275 | "y": 355.66898435688034, 276 | "strokeColor": "#000000", 277 | "backgroundColor": "#fff", 278 | "width": 35.50788279378928, 279 | "height": 52.708882312110724, 280 | "seed": 324482343, 281 | "groupIds": [ 282 | "HpBWU6qszDqSPRUtrKIeI" 283 | ], 284 | "strokeSharpness": "sharp", 285 | "boundElementIds": [] 286 | }, 287 | { 288 | "type": "ellipse", 289 | "version": 954, 290 | "versionNonce": 1004507495, 291 | "isDeleted": false, 292 | "id": "gkB6l8yo6eqvsJQBn1bvR", 293 | "fillStyle": "solid", 294 | "strokeWidth": 1, 295 | "strokeStyle": "solid", 296 | "roughness": 1, 297 | "opacity": 100, 298 | "angle": 0, 299 | "x": 490.20099039962946, 300 | "y": 410.633584626984, 301 | "strokeColor": "#000000", 302 | "backgroundColor": "#fff", 303 | "width": 7.271852586964892, 304 | "height": 7.271852586964892, 305 | "seed": 1488934089, 306 | "groupIds": [ 307 | "HpBWU6qszDqSPRUtrKIeI" 308 | ], 309 | "strokeSharpness": "sharp", 310 | "boundElementIds": [] 311 | }, 312 | { 313 | "type": "rectangle", 314 | "version": 602, 315 | "versionNonce": 548002953, 316 | "isDeleted": false, 317 | "id": "QlPkkcmTuJ0qvCk9DskJ-", 318 | "fillStyle": "cross-hatch", 319 | "strokeWidth": 1, 320 | "strokeStyle": "solid", 321 | "roughness": 1, 322 | "opacity": 100, 323 | "angle": 0, 324 | "x": 481.3515800647513, 325 | "y": 362.3785340453914, 326 | "strokeColor": "#000000", 327 | "backgroundColor": "#fab005", 328 | "width": 24.970673256720772, 329 | "height": 12.656234861443139, 330 | "seed": 354678855, 331 | "groupIds": [ 332 | "HpBWU6qszDqSPRUtrKIeI" 333 | ], 334 | "strokeSharpness": "sharp", 335 | "boundElementIds": [] 336 | }, 337 | { 338 | "type": "rectangle", 339 | "version": 644, 340 | "versionNonce": 2094451847, 341 | "isDeleted": false, 342 | "id": "ajhBN965UUbpRv9dP-uOM", 343 | "fillStyle": "cross-hatch", 344 | "strokeWidth": 1, 345 | "strokeStyle": "solid", 346 | "roughness": 1, 347 | "opacity": 100, 348 | "angle": 0, 349 | "x": 481.3515800647513, 350 | "y": 385.0049578705992, 351 | "strokeColor": "#000000", 352 | "backgroundColor": "#fab005", 353 | "width": 24.970673256720772, 354 | "height": 12.656234861443139, 355 | "seed": 963367849, 356 | "groupIds": [ 357 | "HpBWU6qszDqSPRUtrKIeI" 358 | ], 359 | "strokeSharpness": "sharp", 360 | "boundElementIds": [] 361 | }, 362 | { 363 | "type": "rectangle", 364 | "version": 807, 365 | "versionNonce": 1189699207, 366 | "isDeleted": false, 367 | "id": "9QP3IQ6gr73nIRVd9Bz53", 368 | "fillStyle": "solid", 369 | "strokeWidth": 1, 370 | "strokeStyle": "solid", 371 | "roughness": 1, 372 | "opacity": 100, 373 | "angle": 0, 374 | "x": 540.3281072305722, 375 | "y": 350.5219041160052, 376 | "strokeColor": "#000000", 377 | "backgroundColor": "#ced4da", 378 | "width": 45.06253553885557, 379 | "height": 68.91712926798951, 380 | "seed": 1791806793, 381 | "groupIds": [ 382 | "dsCIXBVIBQH_GD-8j6RDO" 383 | ], 384 | "strokeSharpness": "sharp", 385 | "boundElementIds": [] 386 | }, 387 | { 388 | "type": "rectangle", 389 | "version": 957, 390 | "versionNonce": 2110189929, 391 | "isDeleted": false, 392 | "id": "Sdf2LsSp5g-Uf1b7MXrmV", 393 | "fillStyle": "solid", 394 | "strokeWidth": 1, 395 | "strokeStyle": "solid", 396 | "roughness": 1, 397 | "opacity": 100, 398 | "angle": 0, 399 | "x": 545.487272171217, 400 | "y": 355.7761857299056, 401 | "strokeColor": "#000000", 402 | "backgroundColor": "#fff", 403 | "width": 35.50788279378928, 404 | "height": 52.708882312110724, 405 | "seed": 254298055, 406 | "groupIds": [ 407 | "dsCIXBVIBQH_GD-8j6RDO" 408 | ], 409 | "strokeSharpness": "sharp", 410 | "boundElementIds": [] 411 | }, 412 | { 413 | "type": "ellipse", 414 | "version": 1001, 415 | "versionNonce": 1533670823, 416 | "isDeleted": false, 417 | "id": "-N6O6FhWj49NSLE7mxoFU", 418 | "fillStyle": "solid", 419 | "strokeWidth": 1, 420 | "strokeStyle": "solid", 421 | "roughness": 1, 422 | "opacity": 100, 423 | "angle": 0, 424 | "x": 559.6052872746295, 425 | "y": 410.7407860000093, 426 | "strokeColor": "#000000", 427 | "backgroundColor": "#fff", 428 | "width": 7.271852586964892, 429 | "height": 7.271852586964892, 430 | "seed": 204880937, 431 | "groupIds": [ 432 | "dsCIXBVIBQH_GD-8j6RDO" 433 | ], 434 | "strokeSharpness": "sharp", 435 | "boundElementIds": [] 436 | }, 437 | { 438 | "type": "rectangle", 439 | "version": 649, 440 | "versionNonce": 1620499529, 441 | "isDeleted": false, 442 | "id": "FOR1ct1Nc-h6upXT_JcU7", 443 | "fillStyle": "cross-hatch", 444 | "strokeWidth": 1, 445 | "strokeStyle": "solid", 446 | "roughness": 1, 447 | "opacity": 100, 448 | "angle": 0, 449 | "x": 550.7558769397513, 450 | "y": 362.48573541841665, 451 | "strokeColor": "#000000", 452 | "backgroundColor": "#fab005", 453 | "width": 24.970673256720772, 454 | "height": 12.656234861443139, 455 | "seed": 645510887, 456 | "groupIds": [ 457 | "dsCIXBVIBQH_GD-8j6RDO" 458 | ], 459 | "strokeSharpness": "sharp", 460 | "boundElementIds": [] 461 | }, 462 | { 463 | "type": "rectangle", 464 | "version": 691, 465 | "versionNonce": 1040885959, 466 | "isDeleted": false, 467 | "id": "4lacE4EH2Z2rF6vzeOXP2", 468 | "fillStyle": "cross-hatch", 469 | "strokeWidth": 1, 470 | "strokeStyle": "solid", 471 | "roughness": 1, 472 | "opacity": 100, 473 | "angle": 0, 474 | "x": 550.7558769397513, 475 | "y": 385.11215924362443, 476 | "strokeColor": "#000000", 477 | "backgroundColor": "#fab005", 478 | "width": 24.970673256720772, 479 | "height": 12.656234861443139, 480 | "seed": 1615777545, 481 | "groupIds": [ 482 | "dsCIXBVIBQH_GD-8j6RDO" 483 | ], 484 | "strokeSharpness": "sharp", 485 | "boundElementIds": [] 486 | }, 487 | { 488 | "type": "rectangle", 489 | "version": 860, 490 | "versionNonce": 1455209159, 491 | "isDeleted": false, 492 | "id": "ygI0WxAtz2Cq7WXMEnC7-", 493 | "fillStyle": "solid", 494 | "strokeWidth": 1, 495 | "strokeStyle": "solid", 496 | "roughness": 1, 497 | "opacity": 100, 498 | "angle": 0, 499 | "x": 609.1640447305722, 500 | "y": 351.1039353660052, 501 | "strokeColor": "#000000", 502 | "backgroundColor": "#ced4da", 503 | "width": 45.06253553885557, 504 | "height": 68.91712926798951, 505 | "seed": 838782889, 506 | "groupIds": [ 507 | "cCbUVFUXUvSNeD4GVR-Lc" 508 | ], 509 | "strokeSharpness": "sharp", 510 | "boundElementIds": [] 511 | }, 512 | { 513 | "type": "rectangle", 514 | "version": 1010, 515 | "versionNonce": 211188009, 516 | "isDeleted": false, 517 | "id": "bW1wndWOIqb1HEil55-ju", 518 | "fillStyle": "solid", 519 | "strokeWidth": 1, 520 | "strokeStyle": "solid", 521 | "roughness": 1, 522 | "opacity": 100, 523 | "angle": 0, 524 | "x": 614.323209671217, 525 | "y": 356.3582169799057, 526 | "strokeColor": "#000000", 527 | "backgroundColor": "#fff", 528 | "width": 35.50788279378928, 529 | "height": 52.708882312110724, 530 | "seed": 232135527, 531 | "groupIds": [ 532 | "cCbUVFUXUvSNeD4GVR-Lc" 533 | ], 534 | "strokeSharpness": "sharp", 535 | "boundElementIds": [] 536 | }, 537 | { 538 | "type": "ellipse", 539 | "version": 1054, 540 | "versionNonce": 151505383, 541 | "isDeleted": false, 542 | "id": "G-_6pkP9yjs2idw9q0fOD", 543 | "fillStyle": "solid", 544 | "strokeWidth": 1, 545 | "strokeStyle": "solid", 546 | "roughness": 1, 547 | "opacity": 100, 548 | "angle": 0, 549 | "x": 628.4412247746295, 550 | "y": 411.3228172500093, 551 | "strokeColor": "#000000", 552 | "backgroundColor": "#fff", 553 | "width": 7.271852586964892, 554 | "height": 7.271852586964892, 555 | "seed": 1991832201, 556 | "groupIds": [ 557 | "cCbUVFUXUvSNeD4GVR-Lc" 558 | ], 559 | "strokeSharpness": "sharp", 560 | "boundElementIds": [] 561 | }, 562 | { 563 | "type": "rectangle", 564 | "version": 702, 565 | "versionNonce": 1134521353, 566 | "isDeleted": false, 567 | "id": "3uJp7ZBvWj8PhlB9LY_GH", 568 | "fillStyle": "cross-hatch", 569 | "strokeWidth": 1, 570 | "strokeStyle": "solid", 571 | "roughness": 1, 572 | "opacity": 100, 573 | "angle": 0, 574 | "x": 619.5918144397513, 575 | "y": 363.06776666841677, 576 | "strokeColor": "#000000", 577 | "backgroundColor": "#fab005", 578 | "width": 24.970673256720772, 579 | "height": 12.656234861443139, 580 | "seed": 594286215, 581 | "groupIds": [ 582 | "cCbUVFUXUvSNeD4GVR-Lc" 583 | ], 584 | "strokeSharpness": "sharp", 585 | "boundElementIds": [] 586 | }, 587 | { 588 | "type": "rectangle", 589 | "version": 744, 590 | "versionNonce": 1499723015, 591 | "isDeleted": false, 592 | "id": "Ag0xVRGEcwSk7pj1_irb_", 593 | "fillStyle": "cross-hatch", 594 | "strokeWidth": 1, 595 | "strokeStyle": "solid", 596 | "roughness": 1, 597 | "opacity": 100, 598 | "angle": 0, 599 | "x": 619.5918144397513, 600 | "y": 385.69419049362443, 601 | "strokeColor": "#000000", 602 | "backgroundColor": "#fab005", 603 | "width": 24.970673256720772, 604 | "height": 12.656234861443139, 605 | "seed": 703314281, 606 | "groupIds": [ 607 | "cCbUVFUXUvSNeD4GVR-Lc" 608 | ], 609 | "strokeSharpness": "sharp", 610 | "boundElementIds": [] 611 | }, 612 | { 613 | "type": "rectangle", 614 | "version": 919, 615 | "versionNonce": 2036702057, 616 | "isDeleted": false, 617 | "id": "BZn4OgJgXXmF_DBWNYUxX", 618 | "fillStyle": "solid", 619 | "strokeWidth": 1, 620 | "strokeStyle": "solid", 621 | "roughness": 1, 622 | "opacity": 100, 623 | "angle": 0, 624 | "x": 683.3398259805722, 625 | "y": 351.6078416160052, 626 | "strokeColor": "#000000", 627 | "backgroundColor": "#ced4da", 628 | "width": 45.06253553885557, 629 | "height": 68.91712926798951, 630 | "seed": 1342821703, 631 | "groupIds": [ 632 | "Joh6hohuwI9a_dzOsyjpy" 633 | ], 634 | "strokeSharpness": "sharp", 635 | "boundElementIds": [] 636 | }, 637 | { 638 | "type": "rectangle", 639 | "version": 1069, 640 | "versionNonce": 1843588007, 641 | "isDeleted": false, 642 | "id": "DO9q_6LuBY97M8H4OPQuh", 643 | "fillStyle": "solid", 644 | "strokeWidth": 1, 645 | "strokeStyle": "solid", 646 | "roughness": 1, 647 | "opacity": 100, 648 | "angle": 0, 649 | "x": 688.498990921217, 650 | "y": 356.8621232299057, 651 | "strokeColor": "#000000", 652 | "backgroundColor": "#fff", 653 | "width": 35.50788279378928, 654 | "height": 52.708882312110724, 655 | "seed": 1847477929, 656 | "groupIds": [ 657 | "Joh6hohuwI9a_dzOsyjpy" 658 | ], 659 | "strokeSharpness": "sharp", 660 | "boundElementIds": [] 661 | }, 662 | { 663 | "type": "ellipse", 664 | "version": 1113, 665 | "versionNonce": 114312777, 666 | "isDeleted": false, 667 | "id": "JzMxL6vRWPR4IwQEkorWx", 668 | "fillStyle": "solid", 669 | "strokeWidth": 1, 670 | "strokeStyle": "solid", 671 | "roughness": 1, 672 | "opacity": 100, 673 | "angle": 0, 674 | "x": 702.6170060246295, 675 | "y": 411.8267235000093, 676 | "strokeColor": "#000000", 677 | "backgroundColor": "#fff", 678 | "width": 7.271852586964892, 679 | "height": 7.271852586964892, 680 | "seed": 1053660263, 681 | "groupIds": [ 682 | "Joh6hohuwI9a_dzOsyjpy" 683 | ], 684 | "strokeSharpness": "sharp", 685 | "boundElementIds": [] 686 | }, 687 | { 688 | "type": "rectangle", 689 | "version": 761, 690 | "versionNonce": 1106566855, 691 | "isDeleted": false, 692 | "id": "_D2VYMuhmSAXZkfbnVWID", 693 | "fillStyle": "cross-hatch", 694 | "strokeWidth": 1, 695 | "strokeStyle": "solid", 696 | "roughness": 1, 697 | "opacity": 100, 698 | "angle": 0, 699 | "x": 693.7675956897513, 700 | "y": 363.57167291841677, 701 | "strokeColor": "#000000", 702 | "backgroundColor": "#fab005", 703 | "width": 24.970673256720772, 704 | "height": 12.656234861443139, 705 | "seed": 231836041, 706 | "groupIds": [ 707 | "Joh6hohuwI9a_dzOsyjpy" 708 | ], 709 | "strokeSharpness": "sharp", 710 | "boundElementIds": [] 711 | }, 712 | { 713 | "type": "rectangle", 714 | "version": 803, 715 | "versionNonce": 727881001, 716 | "isDeleted": false, 717 | "id": "Lf2HAA4D56SgIg4NdpRfb", 718 | "fillStyle": "cross-hatch", 719 | "strokeWidth": 1, 720 | "strokeStyle": "solid", 721 | "roughness": 1, 722 | "opacity": 100, 723 | "angle": 0, 724 | "x": 693.7675956897513, 725 | "y": 386.19809674362443, 726 | "strokeColor": "#000000", 727 | "backgroundColor": "#fab005", 728 | "width": 24.970673256720772, 729 | "height": 12.656234861443139, 730 | "seed": 420245383, 731 | "groupIds": [ 732 | "Joh6hohuwI9a_dzOsyjpy" 733 | ], 734 | "strokeSharpness": "sharp", 735 | "boundElementIds": [] 736 | }, 737 | { 738 | "type": "rectangle", 739 | "version": 954, 740 | "versionNonce": 1953657833, 741 | "isDeleted": false, 742 | "id": "U2knqjRP6w3CkwNSii4PO", 743 | "fillStyle": "solid", 744 | "strokeWidth": 1, 745 | "strokeStyle": "solid", 746 | "roughness": 1, 747 | "opacity": 100, 748 | "angle": 0, 749 | "x": 754.0624822305722, 750 | "y": 351.8265916160052, 751 | "strokeColor": "#000000", 752 | "backgroundColor": "#ced4da", 753 | "width": 45.06253553885557, 754 | "height": 68.91712926798951, 755 | "seed": 1400096903, 756 | "groupIds": [ 757 | "odaOzFd6ziArfzcl6iVc6" 758 | ], 759 | "strokeSharpness": "sharp", 760 | "boundElementIds": [] 761 | }, 762 | { 763 | "type": "rectangle", 764 | "version": 1104, 765 | "versionNonce": 420338471, 766 | "isDeleted": false, 767 | "id": "NUfbos8okcRzriJ4wmEGv", 768 | "fillStyle": "solid", 769 | "strokeWidth": 1, 770 | "strokeStyle": "solid", 771 | "roughness": 1, 772 | "opacity": 100, 773 | "angle": 0, 774 | "x": 759.221647171217, 775 | "y": 357.0808732299057, 776 | "strokeColor": "#000000", 777 | "backgroundColor": "#fff", 778 | "width": 35.50788279378928, 779 | "height": 52.708882312110724, 780 | "seed": 619718505, 781 | "groupIds": [ 782 | "odaOzFd6ziArfzcl6iVc6" 783 | ], 784 | "strokeSharpness": "sharp", 785 | "boundElementIds": [] 786 | }, 787 | { 788 | "type": "ellipse", 789 | "version": 1148, 790 | "versionNonce": 732827337, 791 | "isDeleted": false, 792 | "id": "kzgoa9DdC4LEE5zgqEcGU", 793 | "fillStyle": "solid", 794 | "strokeWidth": 1, 795 | "strokeStyle": "solid", 796 | "roughness": 1, 797 | "opacity": 100, 798 | "angle": 0, 799 | "x": 773.3396622746295, 800 | "y": 412.0454735000093, 801 | "strokeColor": "#000000", 802 | "backgroundColor": "#fff", 803 | "width": 7.271852586964892, 804 | "height": 7.271852586964892, 805 | "seed": 2132221863, 806 | "groupIds": [ 807 | "odaOzFd6ziArfzcl6iVc6" 808 | ], 809 | "strokeSharpness": "sharp", 810 | "boundElementIds": [] 811 | }, 812 | { 813 | "type": "rectangle", 814 | "version": 796, 815 | "versionNonce": 957734471, 816 | "isDeleted": false, 817 | "id": "YsIiOto8HFayShLZzqqWp", 818 | "fillStyle": "cross-hatch", 819 | "strokeWidth": 1, 820 | "strokeStyle": "solid", 821 | "roughness": 1, 822 | "opacity": 100, 823 | "angle": 0, 824 | "x": 764.4902519397513, 825 | "y": 363.79042291841677, 826 | "strokeColor": "#000000", 827 | "backgroundColor": "#fab005", 828 | "width": 24.970673256720772, 829 | "height": 12.656234861443139, 830 | "seed": 2032751177, 831 | "groupIds": [ 832 | "odaOzFd6ziArfzcl6iVc6" 833 | ], 834 | "strokeSharpness": "sharp", 835 | "boundElementIds": [] 836 | }, 837 | { 838 | "type": "rectangle", 839 | "version": 838, 840 | "versionNonce": 1920159145, 841 | "isDeleted": false, 842 | "id": "RRrLrdLE7boTtZOWOCVqN", 843 | "fillStyle": "cross-hatch", 844 | "strokeWidth": 1, 845 | "strokeStyle": "solid", 846 | "roughness": 1, 847 | "opacity": 100, 848 | "angle": 0, 849 | "x": 764.4902519397513, 850 | "y": 386.41684674362443, 851 | "strokeColor": "#000000", 852 | "backgroundColor": "#fab005", 853 | "width": 24.970673256720772, 854 | "height": 12.656234861443139, 855 | "seed": 109220551, 856 | "groupIds": [ 857 | "odaOzFd6ziArfzcl6iVc6" 858 | ], 859 | "strokeSharpness": "sharp", 860 | "boundElementIds": [] 861 | }, 862 | { 863 | "type": "rectangle", 864 | "version": 1001, 865 | "versionNonce": 228896777, 866 | "isDeleted": false, 867 | "id": "k7ONFTyZKgVkFj1yUSgkH", 868 | "fillStyle": "solid", 869 | "strokeWidth": 1, 870 | "strokeStyle": "solid", 871 | "roughness": 1, 872 | "opacity": 100, 873 | "angle": 0, 874 | "x": 816.3007634805722, 875 | "y": 349.9320603660052, 876 | "strokeColor": "#000000", 877 | "backgroundColor": "#ced4da", 878 | "width": 45.06253553885557, 879 | "height": 68.91712926798951, 880 | "seed": 1199134503, 881 | "groupIds": [ 882 | "E-d8jrrTiSGQUrmfPMFUf" 883 | ], 884 | "strokeSharpness": "sharp", 885 | "boundElementIds": [] 886 | }, 887 | { 888 | "type": "rectangle", 889 | "version": 1151, 890 | "versionNonce": 272953607, 891 | "isDeleted": false, 892 | "id": "3Xmr2bNdgrqBnPGZYs0cs", 893 | "fillStyle": "solid", 894 | "strokeWidth": 1, 895 | "strokeStyle": "solid", 896 | "roughness": 1, 897 | "opacity": 100, 898 | "angle": 0, 899 | "x": 821.459928421217, 900 | "y": 355.1863419799057, 901 | "strokeColor": "#000000", 902 | "backgroundColor": "#fff", 903 | "width": 35.50788279378928, 904 | "height": 52.708882312110724, 905 | "seed": 147346121, 906 | "groupIds": [ 907 | "E-d8jrrTiSGQUrmfPMFUf" 908 | ], 909 | "strokeSharpness": "sharp", 910 | "boundElementIds": [] 911 | }, 912 | { 913 | "type": "ellipse", 914 | "version": 1195, 915 | "versionNonce": 931383017, 916 | "isDeleted": false, 917 | "id": "51fkTk6h8L3hNuaCUSQ8Z", 918 | "fillStyle": "solid", 919 | "strokeWidth": 1, 920 | "strokeStyle": "solid", 921 | "roughness": 1, 922 | "opacity": 100, 923 | "angle": 0, 924 | "x": 835.5779435246295, 925 | "y": 410.1509422500093, 926 | "strokeColor": "#000000", 927 | "backgroundColor": "#fff", 928 | "width": 7.271852586964892, 929 | "height": 7.271852586964892, 930 | "seed": 78764615, 931 | "groupIds": [ 932 | "E-d8jrrTiSGQUrmfPMFUf" 933 | ], 934 | "strokeSharpness": "sharp", 935 | "boundElementIds": [] 936 | }, 937 | { 938 | "type": "rectangle", 939 | "version": 843, 940 | "versionNonce": 1219442727, 941 | "isDeleted": false, 942 | "id": "UeBCozrlskkkfKakLAx9Z", 943 | "fillStyle": "cross-hatch", 944 | "strokeWidth": 1, 945 | "strokeStyle": "solid", 946 | "roughness": 1, 947 | "opacity": 100, 948 | "angle": 0, 949 | "x": 826.7285331897513, 950 | "y": 361.89589166841677, 951 | "strokeColor": "#000000", 952 | "backgroundColor": "#fab005", 953 | "width": 24.970673256720772, 954 | "height": 12.656234861443139, 955 | "seed": 1000673705, 956 | "groupIds": [ 957 | "E-d8jrrTiSGQUrmfPMFUf" 958 | ], 959 | "strokeSharpness": "sharp", 960 | "boundElementIds": [] 961 | }, 962 | { 963 | "type": "rectangle", 964 | "version": 885, 965 | "versionNonce": 1193083337, 966 | "isDeleted": false, 967 | "id": "w4RLvrYXg5raSEFV1Ojjx", 968 | "fillStyle": "cross-hatch", 969 | "strokeWidth": 1, 970 | "strokeStyle": "solid", 971 | "roughness": 1, 972 | "opacity": 100, 973 | "angle": 0, 974 | "x": 826.7285331897513, 975 | "y": 384.52231549362443, 976 | "strokeColor": "#000000", 977 | "backgroundColor": "#fab005", 978 | "width": 24.970673256720772, 979 | "height": 12.656234861443139, 980 | "seed": 170719591, 981 | "groupIds": [ 982 | "E-d8jrrTiSGQUrmfPMFUf" 983 | ], 984 | "strokeSharpness": "sharp", 985 | "boundElementIds": [] 986 | }, 987 | { 988 | "type": "text", 989 | "version": 277, 990 | "versionNonce": 1546160745, 991 | "isDeleted": false, 992 | "id": "3rskx_eeZc8Skvp1WhE2d", 993 | "fillStyle": "hachure", 994 | "strokeWidth": 4, 995 | "strokeStyle": "solid", 996 | "roughness": 1, 997 | "opacity": 100, 998 | "angle": 0, 999 | "x": 885.484375, 1000 | "y": 360.7421875, 1001 | "strokeColor": "#000000", 1002 | "backgroundColor": "transparent", 1003 | "width": 63, 1004 | "height": 45, 1005 | "seed": 2045345031, 1006 | "groupIds": [], 1007 | "strokeSharpness": "sharp", 1008 | "boundElementIds": [], 1009 | "fontSize": 36, 1010 | "fontFamily": 1, 1011 | "text": "VMs", 1012 | "baseline": 32, 1013 | "textAlign": "left", 1014 | "verticalAlign": "top" 1015 | }, 1016 | { 1017 | "type": "text", 1018 | "version": 630, 1019 | "versionNonce": 156538951, 1020 | "isDeleted": false, 1021 | "id": "lDymgv-ZYXi-kAEOuLetd", 1022 | "fillStyle": "hachure", 1023 | "strokeWidth": 4, 1024 | "strokeStyle": "solid", 1025 | "roughness": 1, 1026 | "opacity": 100, 1027 | "angle": 0, 1028 | "x": 463.25, 1029 | "y": 280.23046875, 1030 | "strokeColor": "#000000", 1031 | "backgroundColor": "transparent", 1032 | "width": 135, 1033 | "height": 35, 1034 | "seed": 388454953, 1035 | "groupIds": [], 1036 | "strokeSharpness": "sharp", 1037 | "boundElementIds": [], 1038 | "fontSize": 28, 1039 | "fontFamily": 1, 1040 | "text": "Hypervisor", 1041 | "baseline": 25, 1042 | "textAlign": "left", 1043 | "verticalAlign": "top" 1044 | }, 1045 | { 1046 | "type": "line", 1047 | "version": 2075, 1048 | "versionNonce": 981065735, 1049 | "isDeleted": false, 1050 | "id": "iseRrGV60ltu4_4Z_mO9C", 1051 | "fillStyle": "hachure", 1052 | "strokeWidth": 1, 1053 | "strokeStyle": "solid", 1054 | "roughness": 1, 1055 | "opacity": 100, 1056 | "angle": 0, 1057 | "x": 755.1637776674261, 1058 | "y": 219.6720940635917, 1059 | "strokeColor": "#881fa3", 1060 | "backgroundColor": "#be4bdb", 1061 | "width": 44.383041179642454, 1062 | "height": 52.12767620020764, 1063 | "seed": 1663412137, 1064 | "groupIds": [], 1065 | "strokeSharpness": "sharp", 1066 | "boundElementIds": [], 1067 | "startBinding": null, 1068 | "endBinding": null, 1069 | "points": [ 1070 | [ 1071 | -131.37268276431644, 1072 | -2.842170943040401e-14 1073 | ], 1074 | [ 1075 | -155.17747191501513, 1076 | 9.655610724735936 1077 | ], 1078 | [ 1079 | -155.45758928571422, 1080 | 39.950764179052655 1081 | ], 1082 | [ 1083 | -134.2770272724487, 1084 | 52.12767620020761 1085 | ], 1086 | [ 1087 | -111.56273619862746, 1088 | 39.810100506001824 1089 | ], 1090 | [ 1091 | -111.07454810607177, 1092 | 10.704885691279152 1093 | ], 1094 | [ 1095 | -131.37268276431644, 1096 | -2.842170943040401e-14 1097 | ] 1098 | ], 1099 | "lastCommittedPoint": null, 1100 | "startArrowhead": null, 1101 | "endArrowhead": null 1102 | }, 1103 | { 1104 | "type": "rectangle", 1105 | "version": 419, 1106 | "versionNonce": 1641600199, 1107 | "isDeleted": false, 1108 | "id": "t4bQon3Bw7u9-EWIooWls", 1109 | "fillStyle": "hachure", 1110 | "strokeWidth": 1, 1111 | "strokeStyle": "solid", 1112 | "roughness": 1, 1113 | "opacity": 100, 1114 | "angle": 0, 1115 | "x": 393.6640625, 1116 | "y": 216.62109375, 1117 | "strokeColor": "#000000", 1118 | "backgroundColor": "transparent", 1119 | "width": 567.296875, 1120 | "height": 59.796875, 1121 | "seed": 619071303, 1122 | "groupIds": [], 1123 | "strokeSharpness": "sharp", 1124 | "boundElementIds": [] 1125 | }, 1126 | { 1127 | "type": "text", 1128 | "version": 680, 1129 | "versionNonce": 929580553, 1130 | "isDeleted": false, 1131 | "id": "5woIrw3vSnVvtlSlYYt0I", 1132 | "fillStyle": "hachure", 1133 | "strokeWidth": 4, 1134 | "strokeStyle": "solid", 1135 | "roughness": 1, 1136 | "opacity": 100, 1137 | "angle": 0, 1138 | "x": 678.57421875, 1139 | "y": 286.3203125, 1140 | "strokeColor": "#000000", 1141 | "backgroundColor": "transparent", 1142 | "width": 231, 1143 | "height": 35, 1144 | "seed": 989530631, 1145 | "groupIds": [], 1146 | "strokeSharpness": "sharp", 1147 | "boundElementIds": [], 1148 | "fontSize": 28, 1149 | "fontFamily": 1, 1150 | "text": "AWS auto-scaler", 1151 | "baseline": 25, 1152 | "textAlign": "left", 1153 | "verticalAlign": "top" 1154 | }, 1155 | { 1156 | "type": "line", 1157 | "version": 1991, 1158 | "versionNonce": 1612290889, 1159 | "isDeleted": false, 1160 | "id": "q1nLcIAgCHsOXP6h4YCV2", 1161 | "fillStyle": "hachure", 1162 | "strokeWidth": 1, 1163 | "strokeStyle": "solid", 1164 | "roughness": 1, 1165 | "opacity": 100, 1166 | "angle": 0, 1167 | "x": 783.082474945893, 1168 | "y": 278.4283493998962, 1169 | "strokeColor": "#087f5b", 1170 | "backgroundColor": "#12b886", 1171 | "width": 44.383041179642454, 1172 | "height": 52.12767620020764, 1173 | "seed": 1763481639, 1174 | "groupIds": [], 1175 | "strokeSharpness": "sharp", 1176 | "boundElementIds": [], 1177 | "startBinding": null, 1178 | "endBinding": null, 1179 | "points": [ 1180 | [ 1181 | -131.37268276431644, 1182 | -2.842170943040401e-14 1183 | ], 1184 | [ 1185 | -155.17747191501513, 1186 | 9.655610724735936 1187 | ], 1188 | [ 1189 | -155.45758928571422, 1190 | 39.950764179052655 1191 | ], 1192 | [ 1193 | -134.2770272724487, 1194 | 52.12767620020761 1195 | ], 1196 | [ 1197 | -111.56273619862746, 1198 | 39.810100506001824 1199 | ], 1200 | [ 1201 | -111.07454810607177, 1202 | 10.704885691279152 1203 | ], 1204 | [ 1205 | -131.37268276431644, 1206 | -2.842170943040401e-14 1207 | ] 1208 | ], 1209 | "lastCommittedPoint": null, 1210 | "startArrowhead": null, 1211 | "endArrowhead": null 1212 | }, 1213 | { 1214 | "type": "arrow", 1215 | "version": 767, 1216 | "versionNonce": 2114005129, 1217 | "isDeleted": false, 1218 | "id": "StNZak6JEplwGlvK-ArDP", 1219 | "fillStyle": "hachure", 1220 | "strokeWidth": 4, 1221 | "strokeStyle": "solid", 1222 | "roughness": 1, 1223 | "opacity": 100, 1224 | "angle": 5.121696047664543, 1225 | "x": 815.4658076378854, 1226 | "y": 26.04394769161611, 1227 | "strokeColor": "#000000", 1228 | "backgroundColor": "transparent", 1229 | "width": 49.494178979189996, 1230 | "height": 13.620173811743722, 1231 | "seed": 1067191401, 1232 | "groupIds": [], 1233 | "strokeSharpness": "round", 1234 | "boundElementIds": [], 1235 | "endBinding": { 1236 | "elementId": "zlVzpBEIsqx2xRwFRPXHJ", 1237 | "gap": 5.864940303397631, 1238 | "focus": -0.9735444299651743 1239 | }, 1240 | "points": [ 1241 | [ 1242 | 0, 1243 | 0 1244 | ], 1245 | [ 1246 | 49.494178979189996, 1247 | 13.620173811743722 1248 | ] 1249 | ], 1250 | "lastCommittedPoint": null, 1251 | "startArrowhead": null, 1252 | "endArrowhead": "arrow", 1253 | "startBinding": { 1254 | "elementId": "EVjuM1xw_szZM-e_F4rwo", 1255 | "gap": 6.560631539647905, 1256 | "focus": 0.22686973052578552 1257 | } 1258 | }, 1259 | { 1260 | "type": "rectangle", 1261 | "version": 4471, 1262 | "versionNonce": 1821347305, 1263 | "isDeleted": false, 1264 | "id": "z8ktQpJyBi8dfvZTvD33K", 1265 | "fillStyle": "solid", 1266 | "strokeWidth": 2, 1267 | "strokeStyle": "solid", 1268 | "roughness": 1, 1269 | "opacity": 100, 1270 | "angle": 0, 1271 | "x": 558.5047020180216, 1272 | "y": -50.88765189202803, 1273 | "strokeColor": "#000000", 1274 | "backgroundColor": "#fff", 1275 | "width": 32.22784587503368, 1276 | "height": 48.903965306939746, 1277 | "seed": 1395719625, 1278 | "groupIds": [ 1279 | "7Ar-ivOKKREHasJ5rL9Vv" 1280 | ], 1281 | "strokeSharpness": "sharp", 1282 | "boundElementIds": [ 1283 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1284 | "XIl_NhaFtRO00pX5Pq6VU", 1285 | "EndiSTFlx1AT7vcBVjgve" 1286 | ] 1287 | }, 1288 | { 1289 | "type": "rectangle", 1290 | "version": 4520, 1291 | "versionNonce": 275210535, 1292 | "isDeleted": false, 1293 | "id": "2ZvbAPUsvtx5WfWpZ0Yrm", 1294 | "fillStyle": "solid", 1295 | "strokeWidth": 2, 1296 | "strokeStyle": "solid", 1297 | "roughness": 1, 1298 | "opacity": 100, 1299 | "angle": 0, 1300 | "x": 555.0632420134725, 1301 | "y": -54.088654986831905, 1302 | "strokeColor": "#000000", 1303 | "backgroundColor": "#fff", 1304 | "width": 32.22784587503368, 1305 | "height": 48.903965306939746, 1306 | "seed": 1925013319, 1307 | "groupIds": [ 1308 | "GgmRYzzDzezagWvJBdm8N", 1309 | "7Ar-ivOKKREHasJ5rL9Vv" 1310 | ], 1311 | "strokeSharpness": "sharp", 1312 | "boundElementIds": [ 1313 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1314 | "XIl_NhaFtRO00pX5Pq6VU", 1315 | "EndiSTFlx1AT7vcBVjgve" 1316 | ] 1317 | }, 1318 | { 1319 | "type": "rectangle", 1320 | "version": 4618, 1321 | "versionNonce": 353888457, 1322 | "isDeleted": false, 1323 | "id": "vdOAa2P3m-FqDCNiCmIih", 1324 | "fillStyle": "solid", 1325 | "strokeWidth": 2, 1326 | "strokeStyle": "solid", 1327 | "roughness": 1, 1328 | "opacity": 100, 1329 | "angle": 0, 1330 | "x": 550.7792922436695, 1331 | "y": -57.85225091491162, 1332 | "strokeColor": "#000000", 1333 | "backgroundColor": "#fff", 1334 | "width": 32.22784587503368, 1335 | "height": 48.903965306939746, 1336 | "seed": 700472489, 1337 | "groupIds": [ 1338 | "7Ar-ivOKKREHasJ5rL9Vv" 1339 | ], 1340 | "strokeSharpness": "sharp", 1341 | "boundElementIds": [ 1342 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1343 | "XIl_NhaFtRO00pX5Pq6VU", 1344 | "EndiSTFlx1AT7vcBVjgve" 1345 | ] 1346 | }, 1347 | { 1348 | "type": "draw", 1349 | "version": 3741, 1350 | "versionNonce": 1464771655, 1351 | "isDeleted": false, 1352 | "id": "5f9deUrDjZ3mGG5VwP1tA", 1353 | "fillStyle": "solid", 1354 | "strokeWidth": 1, 1355 | "strokeStyle": "solid", 1356 | "roughness": 1, 1357 | "opacity": 100, 1358 | "angle": 0, 1359 | "x": 556.5652830241524, 1360 | "y": -35.182197544310895, 1361 | "strokeColor": "#000000", 1362 | "backgroundColor": "#fff", 1363 | "width": 21.23935931101259, 1364 | "height": 1.481905982978408, 1365 | "seed": 377478759, 1366 | "groupIds": [ 1367 | "7Ar-ivOKKREHasJ5rL9Vv" 1368 | ], 1369 | "strokeSharpness": "round", 1370 | "boundElementIds": [], 1371 | "points": [ 1372 | [ 1373 | 0, 1374 | -1.0809527239220595 1375 | ], 1376 | [ 1377 | 18.432660413931682, 1378 | -1.0091850257935375 1379 | ], 1380 | [ 1381 | 21.23935931101259, 1382 | -2.491091008771946 1383 | ] 1384 | ], 1385 | "lastCommittedPoint": null, 1386 | "startArrowhead": null, 1387 | "endArrowhead": null 1388 | }, 1389 | { 1390 | "type": "draw", 1391 | "version": 3767, 1392 | "versionNonce": 93448105, 1393 | "isDeleted": false, 1394 | "id": "0It5rGkgwQDC6G8oDHqAw", 1395 | "fillStyle": "solid", 1396 | "strokeWidth": 1, 1397 | "strokeStyle": "solid", 1398 | "roughness": 1, 1399 | "opacity": 100, 1400 | "angle": 0, 1401 | "x": 557.6195078952185, 1402 | "y": -49.01235053914373, 1403 | "strokeColor": "#000000", 1404 | "backgroundColor": "#fff", 1405 | "width": 20.77771844196958, 1406 | "height": 1.2782408936947272, 1407 | "seed": 2025906057, 1408 | "groupIds": [ 1409 | "7Ar-ivOKKREHasJ5rL9Vv" 1410 | ], 1411 | "strokeSharpness": "round", 1412 | "boundElementIds": [], 1413 | "points": [ 1414 | [ 1415 | 0, 1416 | -1.5250569903199922 1417 | ], 1418 | [ 1419 | 7.675264364719304, 1420 | -2.8032978840147194 1421 | ], 1422 | [ 1423 | 20.77771844196958, 1424 | -1.674411389127978 1425 | ] 1426 | ], 1427 | "lastCommittedPoint": null, 1428 | "startArrowhead": null, 1429 | "endArrowhead": null 1430 | }, 1431 | { 1432 | "type": "draw", 1433 | "version": 3792, 1434 | "versionNonce": 1117815655, 1435 | "isDeleted": false, 1436 | "id": "5iQaq3OAWq1EeDhEgqXso", 1437 | "fillStyle": "solid", 1438 | "strokeWidth": 1, 1439 | "strokeStyle": "solid", 1440 | "roughness": 1, 1441 | "opacity": 100, 1442 | "angle": 0, 1443 | "x": 557.3254007880512, 1444 | "y": -18.80632888907123, 1445 | "strokeColor": "#000000", 1446 | "backgroundColor": "#fff", 1447 | "width": 22.040441995528322, 1448 | "height": 1.9518837165130463, 1449 | "seed": 400914823, 1450 | "groupIds": [ 1451 | "7Ar-ivOKKREHasJ5rL9Vv" 1452 | ], 1453 | "strokeSharpness": "round", 1454 | "boundElementIds": [], 1455 | "points": [ 1456 | [ 1457 | 0, 1458 | -1.0691598323638951 1459 | ], 1460 | [ 1461 | 12.04339561297506, 1462 | -1.1855398833831219 1463 | ], 1464 | [ 1465 | 17.153876880715732, 1466 | -0.013402508699010725 1467 | ], 1468 | [ 1469 | 22.040441995528322, 1470 | -1.9652862252120569 1471 | ] 1472 | ], 1473 | "lastCommittedPoint": null, 1474 | "startArrowhead": null, 1475 | "endArrowhead": null 1476 | }, 1477 | { 1478 | "type": "draw", 1479 | "version": 3829, 1480 | "versionNonce": 405342857, 1481 | "isDeleted": false, 1482 | "id": "nxJtTKMpuySOyw2-7-DBI", 1483 | "fillStyle": "solid", 1484 | "strokeWidth": 1, 1485 | "strokeStyle": "solid", 1486 | "roughness": 1, 1487 | "opacity": 100, 1488 | "angle": 0, 1489 | "x": 555.7979721139709, 1490 | "y": -13.44393377834898, 1491 | "strokeColor": "#000000", 1492 | "backgroundColor": "#fff", 1493 | "width": 24.808347542269377, 1494 | "height": 1.3267325816194155, 1495 | "seed": 1584268905, 1496 | "groupIds": [ 1497 | "7Ar-ivOKKREHasJ5rL9Vv" 1498 | ], 1499 | "strokeSharpness": "round", 1500 | "boundElementIds": [], 1501 | "points": [ 1502 | [ 1503 | 0, 1504 | -1.2496673365292923 1505 | ], 1506 | [ 1507 | 4.635510175525229, 1508 | -1.781630090586143 1509 | ], 1510 | [ 1511 | 7.355219224416346, 1512 | -1.6337215048928169 1513 | ], 1514 | [ 1515 | 21.09388424723848, 1516 | -0.9703552140831074 1517 | ], 1518 | [ 1519 | 24.808347542269377, 1520 | -2.297087795702523 1521 | ] 1522 | ], 1523 | "lastCommittedPoint": null, 1524 | "startArrowhead": null, 1525 | "endArrowhead": null 1526 | }, 1527 | { 1528 | "type": "draw", 1529 | "version": 3794, 1530 | "versionNonce": 581533319, 1531 | "isDeleted": false, 1532 | "id": "E6E2Tnb8FlwVhZr5RQtfs", 1533 | "fillStyle": "solid", 1534 | "strokeWidth": 1, 1535 | "strokeStyle": "solid", 1536 | "roughness": 1, 1537 | "opacity": 100, 1538 | "angle": 0, 1539 | "x": 556.7213926420152, 1540 | "y": -42.877959827038225, 1541 | "strokeColor": "#000000", 1542 | "backgroundColor": "#fff", 1543 | "width": 21.39841204740554, 1544 | "height": 1.1288864948867414, 1545 | "seed": 204124327, 1546 | "groupIds": [ 1547 | "7Ar-ivOKKREHasJ5rL9Vv" 1548 | ], 1549 | "strokeSharpness": "round", 1550 | "boundElementIds": [], 1551 | "points": [ 1552 | [ 1553 | 0, 1554 | -0.32167362921772585 1555 | ], 1556 | [ 1557 | 8.29595797015527, 1558 | -0.5912874140789839 1559 | ], 1560 | [ 1561 | 21.39841204740554, 1562 | 0.5375990808077575 1563 | ] 1564 | ], 1565 | "lastCommittedPoint": null, 1566 | "startArrowhead": null, 1567 | "endArrowhead": null 1568 | }, 1569 | { 1570 | "type": "draw", 1571 | "version": 3809, 1572 | "versionNonce": 1436078441, 1573 | "isDeleted": false, 1574 | "id": "UIXcN08eOh6BHxYjSkkVo", 1575 | "fillStyle": "solid", 1576 | "strokeWidth": 1, 1577 | "strokeStyle": "solid", 1578 | "roughness": 1, 1579 | "opacity": 100, 1580 | "angle": 0, 1581 | "x": 556.4139802308714, 1582 | "y": -27.855078199690965, 1583 | "strokeColor": "#000000", 1584 | "backgroundColor": "#fff", 1585 | "width": 21.39841204740554, 1586 | "height": 1.1288864948867414, 1587 | "seed": 630411593, 1588 | "groupIds": [ 1589 | "7Ar-ivOKKREHasJ5rL9Vv" 1590 | ], 1591 | "strokeSharpness": "round", 1592 | "boundElementIds": [], 1593 | "points": [ 1594 | [ 1595 | 0, 1596 | -0.32167362921772585 1597 | ], 1598 | [ 1599 | 3.690654045722796, 1600 | 0.3294487619528638 1601 | ], 1602 | [ 1603 | 8.29595797015527, 1604 | -0.5912874140789839 1605 | ], 1606 | [ 1607 | 21.39841204740554, 1608 | 0.5375990808077575 1609 | ] 1610 | ], 1611 | "lastCommittedPoint": null, 1612 | "startArrowhead": null, 1613 | "endArrowhead": null 1614 | }, 1615 | { 1616 | "type": "rectangle", 1617 | "version": 4528, 1618 | "versionNonce": 170268071, 1619 | "isDeleted": false, 1620 | "id": "rJZjdYyEASa2ijOAM0Y1U", 1621 | "fillStyle": "solid", 1622 | "strokeWidth": 2, 1623 | "strokeStyle": "solid", 1624 | "roughness": 1, 1625 | "opacity": 100, 1626 | "angle": 0, 1627 | "x": 612.0222194496591, 1628 | "y": -50.364214392028074, 1629 | "strokeColor": "#000000", 1630 | "backgroundColor": "#fff", 1631 | "width": 32.22784587503368, 1632 | "height": 48.903965306939746, 1633 | "seed": 962950057, 1634 | "groupIds": [ 1635 | "If7uHy4T50VEaK7QkmwLi" 1636 | ], 1637 | "strokeSharpness": "sharp", 1638 | "boundElementIds": [ 1639 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1640 | "XIl_NhaFtRO00pX5Pq6VU", 1641 | "EndiSTFlx1AT7vcBVjgve" 1642 | ] 1643 | }, 1644 | { 1645 | "type": "rectangle", 1646 | "version": 4577, 1647 | "versionNonce": 590134345, 1648 | "isDeleted": false, 1649 | "id": "VUQLiBBsNIILSv86vWJAT", 1650 | "fillStyle": "solid", 1651 | "strokeWidth": 2, 1652 | "strokeStyle": "solid", 1653 | "roughness": 1, 1654 | "opacity": 100, 1655 | "angle": 0, 1656 | "x": 608.5807594451101, 1657 | "y": -53.565217486831955, 1658 | "strokeColor": "#000000", 1659 | "backgroundColor": "#fff", 1660 | "width": 32.22784587503368, 1661 | "height": 48.903965306939746, 1662 | "seed": 278640487, 1663 | "groupIds": [ 1664 | "_76QLrlICWuYKIPHLZ7CM", 1665 | "If7uHy4T50VEaK7QkmwLi" 1666 | ], 1667 | "strokeSharpness": "sharp", 1668 | "boundElementIds": [ 1669 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1670 | "XIl_NhaFtRO00pX5Pq6VU", 1671 | "EndiSTFlx1AT7vcBVjgve" 1672 | ] 1673 | }, 1674 | { 1675 | "type": "rectangle", 1676 | "version": 4675, 1677 | "versionNonce": 4376775, 1678 | "isDeleted": false, 1679 | "id": "TG63ZZfN6Et8Eq9zn06gR", 1680 | "fillStyle": "solid", 1681 | "strokeWidth": 2, 1682 | "strokeStyle": "solid", 1683 | "roughness": 1, 1684 | "opacity": 100, 1685 | "angle": 0, 1686 | "x": 604.296809675307, 1687 | "y": -57.328813414911664, 1688 | "strokeColor": "#000000", 1689 | "backgroundColor": "#fff", 1690 | "width": 32.22784587503368, 1691 | "height": 48.903965306939746, 1692 | "seed": 564860553, 1693 | "groupIds": [ 1694 | "If7uHy4T50VEaK7QkmwLi" 1695 | ], 1696 | "strokeSharpness": "sharp", 1697 | "boundElementIds": [ 1698 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1699 | "XIl_NhaFtRO00pX5Pq6VU", 1700 | "EndiSTFlx1AT7vcBVjgve" 1701 | ] 1702 | }, 1703 | { 1704 | "type": "draw", 1705 | "version": 3797, 1706 | "versionNonce": 817908521, 1707 | "isDeleted": false, 1708 | "id": "maTN0QnsMb3KLPGhxirNM", 1709 | "fillStyle": "solid", 1710 | "strokeWidth": 1, 1711 | "strokeStyle": "solid", 1712 | "roughness": 1, 1713 | "opacity": 100, 1714 | "angle": 0, 1715 | "x": 610.08280045579, 1716 | "y": -34.65876004431094, 1717 | "strokeColor": "#000000", 1718 | "backgroundColor": "#fff", 1719 | "width": 21.23935931101259, 1720 | "height": 1.481905982978408, 1721 | "seed": 1931358855, 1722 | "groupIds": [ 1723 | "If7uHy4T50VEaK7QkmwLi" 1724 | ], 1725 | "strokeSharpness": "round", 1726 | "boundElementIds": [], 1727 | "points": [ 1728 | [ 1729 | 0, 1730 | -1.0809527239220595 1731 | ], 1732 | [ 1733 | 18.432660413931682, 1734 | -1.0091850257935375 1735 | ], 1736 | [ 1737 | 21.23935931101259, 1738 | -2.491091008771946 1739 | ] 1740 | ], 1741 | "lastCommittedPoint": null, 1742 | "startArrowhead": null, 1743 | "endArrowhead": null 1744 | }, 1745 | { 1746 | "type": "draw", 1747 | "version": 3823, 1748 | "versionNonce": 1922832359, 1749 | "isDeleted": false, 1750 | "id": "LQprTOBTGVBqaS-M-O5yj", 1751 | "fillStyle": "solid", 1752 | "strokeWidth": 1, 1753 | "strokeStyle": "solid", 1754 | "roughness": 1, 1755 | "opacity": 100, 1756 | "angle": 0, 1757 | "x": 611.137025326856, 1758 | "y": -48.48891303914377, 1759 | "strokeColor": "#000000", 1760 | "backgroundColor": "#fff", 1761 | "width": 20.77771844196958, 1762 | "height": 1.2782408936947272, 1763 | "seed": 2063162729, 1764 | "groupIds": [ 1765 | "If7uHy4T50VEaK7QkmwLi" 1766 | ], 1767 | "strokeSharpness": "round", 1768 | "boundElementIds": [], 1769 | "points": [ 1770 | [ 1771 | 0, 1772 | -1.5250569903199922 1773 | ], 1774 | [ 1775 | 7.675264364719304, 1776 | -2.8032978840147194 1777 | ], 1778 | [ 1779 | 20.77771844196958, 1780 | -1.674411389127978 1781 | ] 1782 | ], 1783 | "lastCommittedPoint": null, 1784 | "startArrowhead": null, 1785 | "endArrowhead": null 1786 | }, 1787 | { 1788 | "type": "draw", 1789 | "version": 3848, 1790 | "versionNonce": 650051081, 1791 | "isDeleted": false, 1792 | "id": "mwM86dpbmagOUz7PpsxSq", 1793 | "fillStyle": "solid", 1794 | "strokeWidth": 1, 1795 | "strokeStyle": "solid", 1796 | "roughness": 1, 1797 | "opacity": 100, 1798 | "angle": 0, 1799 | "x": 610.8429182196887, 1800 | "y": -18.282891389071267, 1801 | "strokeColor": "#000000", 1802 | "backgroundColor": "#fff", 1803 | "width": 22.040441995528322, 1804 | "height": 1.9518837165130463, 1805 | "seed": 1373915559, 1806 | "groupIds": [ 1807 | "If7uHy4T50VEaK7QkmwLi" 1808 | ], 1809 | "strokeSharpness": "round", 1810 | "boundElementIds": [], 1811 | "points": [ 1812 | [ 1813 | 0, 1814 | -1.0691598323638951 1815 | ], 1816 | [ 1817 | 12.04339561297506, 1818 | -1.1855398833831219 1819 | ], 1820 | [ 1821 | 17.153876880715732, 1822 | -0.013402508699010725 1823 | ], 1824 | [ 1825 | 22.040441995528322, 1826 | -1.9652862252120569 1827 | ] 1828 | ], 1829 | "lastCommittedPoint": null, 1830 | "startArrowhead": null, 1831 | "endArrowhead": null 1832 | }, 1833 | { 1834 | "type": "draw", 1835 | "version": 3885, 1836 | "versionNonce": 1732150023, 1837 | "isDeleted": false, 1838 | "id": "ddWdjlyr9nJsE7tg_xxeb", 1839 | "fillStyle": "solid", 1840 | "strokeWidth": 1, 1841 | "strokeStyle": "solid", 1842 | "roughness": 1, 1843 | "opacity": 100, 1844 | "angle": 0, 1845 | "x": 609.3154895456084, 1846 | "y": -12.92049627834902, 1847 | "strokeColor": "#000000", 1848 | "backgroundColor": "#fff", 1849 | "width": 24.808347542269377, 1850 | "height": 1.3267325816194155, 1851 | "seed": 1687930953, 1852 | "groupIds": [ 1853 | "If7uHy4T50VEaK7QkmwLi" 1854 | ], 1855 | "strokeSharpness": "round", 1856 | "boundElementIds": [], 1857 | "points": [ 1858 | [ 1859 | 0, 1860 | -1.2496673365292923 1861 | ], 1862 | [ 1863 | 4.635510175525229, 1864 | -1.781630090586143 1865 | ], 1866 | [ 1867 | 7.355219224416346, 1868 | -1.6337215048928169 1869 | ], 1870 | [ 1871 | 21.09388424723848, 1872 | -0.9703552140831074 1873 | ], 1874 | [ 1875 | 24.808347542269377, 1876 | -2.297087795702523 1877 | ] 1878 | ], 1879 | "lastCommittedPoint": null, 1880 | "startArrowhead": null, 1881 | "endArrowhead": null 1882 | }, 1883 | { 1884 | "type": "draw", 1885 | "version": 3850, 1886 | "versionNonce": 337925353, 1887 | "isDeleted": false, 1888 | "id": "TZIBfyNMYpgR_Gmdd9cFU", 1889 | "fillStyle": "solid", 1890 | "strokeWidth": 1, 1891 | "strokeStyle": "solid", 1892 | "roughness": 1, 1893 | "opacity": 100, 1894 | "angle": 0, 1895 | "x": 610.2389100736527, 1896 | "y": -42.35452232703827, 1897 | "strokeColor": "#000000", 1898 | "backgroundColor": "#fff", 1899 | "width": 21.39841204740554, 1900 | "height": 1.1288864948867414, 1901 | "seed": 437943495, 1902 | "groupIds": [ 1903 | "If7uHy4T50VEaK7QkmwLi" 1904 | ], 1905 | "strokeSharpness": "round", 1906 | "boundElementIds": [], 1907 | "points": [ 1908 | [ 1909 | 0, 1910 | -0.32167362921772585 1911 | ], 1912 | [ 1913 | 8.29595797015527, 1914 | -0.5912874140789839 1915 | ], 1916 | [ 1917 | 21.39841204740554, 1918 | 0.5375990808077575 1919 | ] 1920 | ], 1921 | "lastCommittedPoint": null, 1922 | "startArrowhead": null, 1923 | "endArrowhead": null 1924 | }, 1925 | { 1926 | "type": "draw", 1927 | "version": 3865, 1928 | "versionNonce": 1856408103, 1929 | "isDeleted": false, 1930 | "id": "KXlsJYwEWFAYjx-6HOkmD", 1931 | "fillStyle": "solid", 1932 | "strokeWidth": 1, 1933 | "strokeStyle": "solid", 1934 | "roughness": 1, 1935 | "opacity": 100, 1936 | "angle": 0, 1937 | "x": 609.931497662509, 1938 | "y": -27.331640699691008, 1939 | "strokeColor": "#000000", 1940 | "backgroundColor": "#fff", 1941 | "width": 21.39841204740554, 1942 | "height": 1.1288864948867414, 1943 | "seed": 141416233, 1944 | "groupIds": [ 1945 | "If7uHy4T50VEaK7QkmwLi" 1946 | ], 1947 | "strokeSharpness": "round", 1948 | "boundElementIds": [], 1949 | "points": [ 1950 | [ 1951 | 0, 1952 | -0.32167362921772585 1953 | ], 1954 | [ 1955 | 3.690654045722796, 1956 | 0.3294487619528638 1957 | ], 1958 | [ 1959 | 8.29595797015527, 1960 | -0.5912874140789839 1961 | ], 1962 | [ 1963 | 21.39841204740554, 1964 | 0.5375990808077575 1965 | ] 1966 | ], 1967 | "lastCommittedPoint": null, 1968 | "startArrowhead": null, 1969 | "endArrowhead": null 1970 | }, 1971 | { 1972 | "type": "rectangle", 1973 | "version": 4601, 1974 | "versionNonce": 477876169, 1975 | "isDeleted": false, 1976 | "id": "qNZEr26M55TspEjIfpPcv", 1977 | "fillStyle": "solid", 1978 | "strokeWidth": 2, 1979 | "strokeStyle": "solid", 1980 | "roughness": 1, 1981 | "opacity": 100, 1982 | "angle": 0, 1983 | "x": 667.8269069496591, 1984 | "y": -51.129839392028074, 1985 | "strokeColor": "#000000", 1986 | "backgroundColor": "#fff", 1987 | "width": 32.22784587503368, 1988 | "height": 48.903965306939746, 1989 | "seed": 1296656807, 1990 | "groupIds": [ 1991 | "edVK3m1YcJ4vdTsoqOwMa" 1992 | ], 1993 | "strokeSharpness": "sharp", 1994 | "boundElementIds": [ 1995 | "CFu0B4Mw_1wC1Hbgx8Fs0", 1996 | "XIl_NhaFtRO00pX5Pq6VU", 1997 | "EndiSTFlx1AT7vcBVjgve" 1998 | ] 1999 | }, 2000 | { 2001 | "type": "rectangle", 2002 | "version": 4650, 2003 | "versionNonce": 1438690631, 2004 | "isDeleted": false, 2005 | "id": "kNWX72UcQyBuyLC8dc42g", 2006 | "fillStyle": "solid", 2007 | "strokeWidth": 2, 2008 | "strokeStyle": "solid", 2009 | "roughness": 1, 2010 | "opacity": 100, 2011 | "angle": 0, 2012 | "x": 664.3854469451101, 2013 | "y": -54.330842486831955, 2014 | "strokeColor": "#000000", 2015 | "backgroundColor": "#fff", 2016 | "width": 32.22784587503368, 2017 | "height": 48.903965306939746, 2018 | "seed": 362326089, 2019 | "groupIds": [ 2020 | "jGkuNTKHinhUZjQlmTZqr", 2021 | "edVK3m1YcJ4vdTsoqOwMa" 2022 | ], 2023 | "strokeSharpness": "sharp", 2024 | "boundElementIds": [ 2025 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2026 | "XIl_NhaFtRO00pX5Pq6VU", 2027 | "EndiSTFlx1AT7vcBVjgve" 2028 | ] 2029 | }, 2030 | { 2031 | "type": "rectangle", 2032 | "version": 4748, 2033 | "versionNonce": 1709239977, 2034 | "isDeleted": false, 2035 | "id": "i-gvvxK642XL26zt0ztrN", 2036 | "fillStyle": "solid", 2037 | "strokeWidth": 2, 2038 | "strokeStyle": "solid", 2039 | "roughness": 1, 2040 | "opacity": 100, 2041 | "angle": 0, 2042 | "x": 660.101497175307, 2043 | "y": -58.094438414911664, 2044 | "strokeColor": "#000000", 2045 | "backgroundColor": "#fff", 2046 | "width": 32.22784587503368, 2047 | "height": 48.903965306939746, 2048 | "seed": 735812807, 2049 | "groupIds": [ 2050 | "edVK3m1YcJ4vdTsoqOwMa" 2051 | ], 2052 | "strokeSharpness": "sharp", 2053 | "boundElementIds": [ 2054 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2055 | "XIl_NhaFtRO00pX5Pq6VU", 2056 | "EndiSTFlx1AT7vcBVjgve" 2057 | ] 2058 | }, 2059 | { 2060 | "type": "draw", 2061 | "version": 3869, 2062 | "versionNonce": 401173607, 2063 | "isDeleted": false, 2064 | "id": "65izTBQvz6ZDXtcTmqJbQ", 2065 | "fillStyle": "solid", 2066 | "strokeWidth": 1, 2067 | "strokeStyle": "solid", 2068 | "roughness": 1, 2069 | "opacity": 100, 2070 | "angle": 0, 2071 | "x": 665.88748795579, 2072 | "y": -35.42438504431094, 2073 | "strokeColor": "#000000", 2074 | "backgroundColor": "#fff", 2075 | "width": 21.23935931101259, 2076 | "height": 1.481905982978408, 2077 | "seed": 1187952425, 2078 | "groupIds": [ 2079 | "edVK3m1YcJ4vdTsoqOwMa" 2080 | ], 2081 | "strokeSharpness": "round", 2082 | "boundElementIds": [], 2083 | "points": [ 2084 | [ 2085 | 0, 2086 | -1.0809527239220595 2087 | ], 2088 | [ 2089 | 18.432660413931682, 2090 | -1.0091850257935375 2091 | ], 2092 | [ 2093 | 21.23935931101259, 2094 | -2.491091008771946 2095 | ] 2096 | ], 2097 | "lastCommittedPoint": null, 2098 | "startArrowhead": null, 2099 | "endArrowhead": null 2100 | }, 2101 | { 2102 | "type": "draw", 2103 | "version": 3895, 2104 | "versionNonce": 1191129481, 2105 | "isDeleted": false, 2106 | "id": "28QaSKAf_TGvO2vfFL4oz", 2107 | "fillStyle": "solid", 2108 | "strokeWidth": 1, 2109 | "strokeStyle": "solid", 2110 | "roughness": 1, 2111 | "opacity": 100, 2112 | "angle": 0, 2113 | "x": 666.941712826856, 2114 | "y": -49.25453803914377, 2115 | "strokeColor": "#000000", 2116 | "backgroundColor": "#fff", 2117 | "width": 20.77771844196958, 2118 | "height": 1.2782408936947272, 2119 | "seed": 1543138279, 2120 | "groupIds": [ 2121 | "edVK3m1YcJ4vdTsoqOwMa" 2122 | ], 2123 | "strokeSharpness": "round", 2124 | "boundElementIds": [], 2125 | "points": [ 2126 | [ 2127 | 0, 2128 | -1.5250569903199922 2129 | ], 2130 | [ 2131 | 7.675264364719304, 2132 | -2.8032978840147194 2133 | ], 2134 | [ 2135 | 20.77771844196958, 2136 | -1.674411389127978 2137 | ] 2138 | ], 2139 | "lastCommittedPoint": null, 2140 | "startArrowhead": null, 2141 | "endArrowhead": null 2142 | }, 2143 | { 2144 | "type": "draw", 2145 | "version": 3920, 2146 | "versionNonce": 283985799, 2147 | "isDeleted": false, 2148 | "id": "1fqGGi87jUhWG0CpLWVUR", 2149 | "fillStyle": "solid", 2150 | "strokeWidth": 1, 2151 | "strokeStyle": "solid", 2152 | "roughness": 1, 2153 | "opacity": 100, 2154 | "angle": 0, 2155 | "x": 666.6476057196887, 2156 | "y": -19.048516389071267, 2157 | "strokeColor": "#000000", 2158 | "backgroundColor": "#fff", 2159 | "width": 22.040441995528322, 2160 | "height": 1.9518837165130463, 2161 | "seed": 1210051081, 2162 | "groupIds": [ 2163 | "edVK3m1YcJ4vdTsoqOwMa" 2164 | ], 2165 | "strokeSharpness": "round", 2166 | "boundElementIds": [], 2167 | "points": [ 2168 | [ 2169 | 0, 2170 | -1.0691598323638951 2171 | ], 2172 | [ 2173 | 12.04339561297506, 2174 | -1.1855398833831219 2175 | ], 2176 | [ 2177 | 17.153876880715732, 2178 | -0.013402508699010725 2179 | ], 2180 | [ 2181 | 22.040441995528322, 2182 | -1.9652862252120569 2183 | ] 2184 | ], 2185 | "lastCommittedPoint": null, 2186 | "startArrowhead": null, 2187 | "endArrowhead": null 2188 | }, 2189 | { 2190 | "type": "draw", 2191 | "version": 3957, 2192 | "versionNonce": 890378345, 2193 | "isDeleted": false, 2194 | "id": "6-1oW3W-IaMqYVq5hN_7m", 2195 | "fillStyle": "solid", 2196 | "strokeWidth": 1, 2197 | "strokeStyle": "solid", 2198 | "roughness": 1, 2199 | "opacity": 100, 2200 | "angle": 0, 2201 | "x": 665.1201770456084, 2202 | "y": -13.68612127834902, 2203 | "strokeColor": "#000000", 2204 | "backgroundColor": "#fff", 2205 | "width": 24.808347542269377, 2206 | "height": 1.3267325816194155, 2207 | "seed": 967988999, 2208 | "groupIds": [ 2209 | "edVK3m1YcJ4vdTsoqOwMa" 2210 | ], 2211 | "strokeSharpness": "round", 2212 | "boundElementIds": [], 2213 | "points": [ 2214 | [ 2215 | 0, 2216 | -1.2496673365292923 2217 | ], 2218 | [ 2219 | 4.635510175525229, 2220 | -1.781630090586143 2221 | ], 2222 | [ 2223 | 7.355219224416346, 2224 | -1.6337215048928169 2225 | ], 2226 | [ 2227 | 21.09388424723848, 2228 | -0.9703552140831074 2229 | ], 2230 | [ 2231 | 24.808347542269377, 2232 | -2.297087795702523 2233 | ] 2234 | ], 2235 | "lastCommittedPoint": null, 2236 | "startArrowhead": null, 2237 | "endArrowhead": null 2238 | }, 2239 | { 2240 | "type": "draw", 2241 | "version": 3922, 2242 | "versionNonce": 1862844071, 2243 | "isDeleted": false, 2244 | "id": "vQUvNxCjBSm-bTDiZJRLI", 2245 | "fillStyle": "solid", 2246 | "strokeWidth": 1, 2247 | "strokeStyle": "solid", 2248 | "roughness": 1, 2249 | "opacity": 100, 2250 | "angle": 0, 2251 | "x": 666.0435975736527, 2252 | "y": -43.12014732703827, 2253 | "strokeColor": "#000000", 2254 | "backgroundColor": "#fff", 2255 | "width": 21.39841204740554, 2256 | "height": 1.1288864948867414, 2257 | "seed": 847757545, 2258 | "groupIds": [ 2259 | "edVK3m1YcJ4vdTsoqOwMa" 2260 | ], 2261 | "strokeSharpness": "round", 2262 | "boundElementIds": [], 2263 | "points": [ 2264 | [ 2265 | 0, 2266 | -0.32167362921772585 2267 | ], 2268 | [ 2269 | 8.29595797015527, 2270 | -0.5912874140789839 2271 | ], 2272 | [ 2273 | 21.39841204740554, 2274 | 0.5375990808077575 2275 | ] 2276 | ], 2277 | "lastCommittedPoint": null, 2278 | "startArrowhead": null, 2279 | "endArrowhead": null 2280 | }, 2281 | { 2282 | "type": "draw", 2283 | "version": 3937, 2284 | "versionNonce": 1910842185, 2285 | "isDeleted": false, 2286 | "id": "K8BM7ua9WkY46oISJxGWN", 2287 | "fillStyle": "solid", 2288 | "strokeWidth": 1, 2289 | "strokeStyle": "solid", 2290 | "roughness": 1, 2291 | "opacity": 100, 2292 | "angle": 0, 2293 | "x": 665.736185162509, 2294 | "y": -28.097265699691008, 2295 | "strokeColor": "#000000", 2296 | "backgroundColor": "#fff", 2297 | "width": 21.39841204740554, 2298 | "height": 1.1288864948867414, 2299 | "seed": 1803542055, 2300 | "groupIds": [ 2301 | "edVK3m1YcJ4vdTsoqOwMa" 2302 | ], 2303 | "strokeSharpness": "round", 2304 | "boundElementIds": [], 2305 | "points": [ 2306 | [ 2307 | 0, 2308 | -0.32167362921772585 2309 | ], 2310 | [ 2311 | 3.690654045722796, 2312 | 0.3294487619528638 2313 | ], 2314 | [ 2315 | 8.29595797015527, 2316 | -0.5912874140789839 2317 | ], 2318 | [ 2319 | 21.39841204740554, 2320 | 0.5375990808077575 2321 | ] 2322 | ], 2323 | "lastCommittedPoint": null, 2324 | "startArrowhead": null, 2325 | "endArrowhead": null 2326 | }, 2327 | { 2328 | "type": "rectangle", 2329 | "version": 4650, 2330 | "versionNonce": 1692946887, 2331 | "isDeleted": false, 2332 | "id": "K5TPzAqGLOJjnmPZylKou", 2333 | "fillStyle": "solid", 2334 | "strokeWidth": 2, 2335 | "strokeStyle": "solid", 2336 | "roughness": 1, 2337 | "opacity": 100, 2338 | "angle": 0, 2339 | "x": 726.6237819496591, 2340 | "y": -51.817339392028074, 2341 | "strokeColor": "#000000", 2342 | "backgroundColor": "#fff", 2343 | "width": 32.22784587503368, 2344 | "height": 48.903965306939746, 2345 | "seed": 1168443399, 2346 | "groupIds": [ 2347 | "63Z5enRz4WX3uf5ftpDoj" 2348 | ], 2349 | "strokeSharpness": "sharp", 2350 | "boundElementIds": [ 2351 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2352 | "XIl_NhaFtRO00pX5Pq6VU", 2353 | "EndiSTFlx1AT7vcBVjgve" 2354 | ] 2355 | }, 2356 | { 2357 | "type": "rectangle", 2358 | "version": 4699, 2359 | "versionNonce": 2043925033, 2360 | "isDeleted": false, 2361 | "id": "CFBsePAuf2NYdVRrUMVJz", 2362 | "fillStyle": "solid", 2363 | "strokeWidth": 2, 2364 | "strokeStyle": "solid", 2365 | "roughness": 1, 2366 | "opacity": 100, 2367 | "angle": 0, 2368 | "x": 723.1823219451101, 2369 | "y": -55.018342486831955, 2370 | "strokeColor": "#000000", 2371 | "backgroundColor": "#fff", 2372 | "width": 32.22784587503368, 2373 | "height": 48.903965306939746, 2374 | "seed": 420782057, 2375 | "groupIds": [ 2376 | "DKQkPTRXlbxd22nK5vRBe", 2377 | "63Z5enRz4WX3uf5ftpDoj" 2378 | ], 2379 | "strokeSharpness": "sharp", 2380 | "boundElementIds": [ 2381 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2382 | "XIl_NhaFtRO00pX5Pq6VU", 2383 | "EndiSTFlx1AT7vcBVjgve" 2384 | ] 2385 | }, 2386 | { 2387 | "type": "rectangle", 2388 | "version": 4797, 2389 | "versionNonce": 464027879, 2390 | "isDeleted": false, 2391 | "id": "0xgs4h-D0-wa3FMWCAzMv", 2392 | "fillStyle": "solid", 2393 | "strokeWidth": 2, 2394 | "strokeStyle": "solid", 2395 | "roughness": 1, 2396 | "opacity": 100, 2397 | "angle": 0, 2398 | "x": 718.898372175307, 2399 | "y": -58.781938414911664, 2400 | "strokeColor": "#000000", 2401 | "backgroundColor": "#fff", 2402 | "width": 32.22784587503368, 2403 | "height": 48.903965306939746, 2404 | "seed": 670330663, 2405 | "groupIds": [ 2406 | "63Z5enRz4WX3uf5ftpDoj" 2407 | ], 2408 | "strokeSharpness": "sharp", 2409 | "boundElementIds": [ 2410 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2411 | "XIl_NhaFtRO00pX5Pq6VU", 2412 | "EndiSTFlx1AT7vcBVjgve" 2413 | ] 2414 | }, 2415 | { 2416 | "type": "draw", 2417 | "version": 3917, 2418 | "versionNonce": 835298569, 2419 | "isDeleted": false, 2420 | "id": "FgIFSWpD2klgie4TaDYJR", 2421 | "fillStyle": "solid", 2422 | "strokeWidth": 1, 2423 | "strokeStyle": "solid", 2424 | "roughness": 1, 2425 | "opacity": 100, 2426 | "angle": 0, 2427 | "x": 724.68436295579, 2428 | "y": -36.11188504431094, 2429 | "strokeColor": "#000000", 2430 | "backgroundColor": "#fff", 2431 | "width": 21.23935931101259, 2432 | "height": 1.481905982978408, 2433 | "seed": 1395309257, 2434 | "groupIds": [ 2435 | "63Z5enRz4WX3uf5ftpDoj" 2436 | ], 2437 | "strokeSharpness": "round", 2438 | "boundElementIds": [], 2439 | "points": [ 2440 | [ 2441 | 0, 2442 | -1.0809527239220595 2443 | ], 2444 | [ 2445 | 18.432660413931682, 2446 | -1.0091850257935375 2447 | ], 2448 | [ 2449 | 21.23935931101259, 2450 | -2.491091008771946 2451 | ] 2452 | ], 2453 | "lastCommittedPoint": null, 2454 | "startArrowhead": null, 2455 | "endArrowhead": null 2456 | }, 2457 | { 2458 | "type": "draw", 2459 | "version": 3943, 2460 | "versionNonce": 1691732999, 2461 | "isDeleted": false, 2462 | "id": "4e9l9GQ2WFIxfD4OgbB7c", 2463 | "fillStyle": "solid", 2464 | "strokeWidth": 1, 2465 | "strokeStyle": "solid", 2466 | "roughness": 1, 2467 | "opacity": 100, 2468 | "angle": 0, 2469 | "x": 725.738587826856, 2470 | "y": -49.94203803914377, 2471 | "strokeColor": "#000000", 2472 | "backgroundColor": "#fff", 2473 | "width": 20.77771844196958, 2474 | "height": 1.2782408936947272, 2475 | "seed": 1443492423, 2476 | "groupIds": [ 2477 | "63Z5enRz4WX3uf5ftpDoj" 2478 | ], 2479 | "strokeSharpness": "round", 2480 | "boundElementIds": [], 2481 | "points": [ 2482 | [ 2483 | 0, 2484 | -1.5250569903199922 2485 | ], 2486 | [ 2487 | 7.675264364719304, 2488 | -2.8032978840147194 2489 | ], 2490 | [ 2491 | 20.77771844196958, 2492 | -1.674411389127978 2493 | ] 2494 | ], 2495 | "lastCommittedPoint": null, 2496 | "startArrowhead": null, 2497 | "endArrowhead": null 2498 | }, 2499 | { 2500 | "type": "draw", 2501 | "version": 3968, 2502 | "versionNonce": 1430395881, 2503 | "isDeleted": false, 2504 | "id": "VA3--FJurhDuA8wDlH75T", 2505 | "fillStyle": "solid", 2506 | "strokeWidth": 1, 2507 | "strokeStyle": "solid", 2508 | "roughness": 1, 2509 | "opacity": 100, 2510 | "angle": 0, 2511 | "x": 725.4444807196887, 2512 | "y": -19.736016389071267, 2513 | "strokeColor": "#000000", 2514 | "backgroundColor": "#fff", 2515 | "width": 22.040441995528322, 2516 | "height": 1.9518837165130463, 2517 | "seed": 1568307625, 2518 | "groupIds": [ 2519 | "63Z5enRz4WX3uf5ftpDoj" 2520 | ], 2521 | "strokeSharpness": "round", 2522 | "boundElementIds": [], 2523 | "points": [ 2524 | [ 2525 | 0, 2526 | -1.0691598323638951 2527 | ], 2528 | [ 2529 | 12.04339561297506, 2530 | -1.1855398833831219 2531 | ], 2532 | [ 2533 | 17.153876880715732, 2534 | -0.013402508699010725 2535 | ], 2536 | [ 2537 | 22.040441995528322, 2538 | -1.9652862252120569 2539 | ] 2540 | ], 2541 | "lastCommittedPoint": null, 2542 | "startArrowhead": null, 2543 | "endArrowhead": null 2544 | }, 2545 | { 2546 | "type": "draw", 2547 | "version": 4005, 2548 | "versionNonce": 745321255, 2549 | "isDeleted": false, 2550 | "id": "aMrisvZP1LlXyqcUzJXcH", 2551 | "fillStyle": "solid", 2552 | "strokeWidth": 1, 2553 | "strokeStyle": "solid", 2554 | "roughness": 1, 2555 | "opacity": 100, 2556 | "angle": 0, 2557 | "x": 723.9170520456084, 2558 | "y": -14.37362127834902, 2559 | "strokeColor": "#000000", 2560 | "backgroundColor": "#fff", 2561 | "width": 24.808347542269377, 2562 | "height": 1.3267325816194155, 2563 | "seed": 683807079, 2564 | "groupIds": [ 2565 | "63Z5enRz4WX3uf5ftpDoj" 2566 | ], 2567 | "strokeSharpness": "round", 2568 | "boundElementIds": [], 2569 | "points": [ 2570 | [ 2571 | 0, 2572 | -1.2496673365292923 2573 | ], 2574 | [ 2575 | 4.635510175525229, 2576 | -1.781630090586143 2577 | ], 2578 | [ 2579 | 7.355219224416346, 2580 | -1.6337215048928169 2581 | ], 2582 | [ 2583 | 21.09388424723848, 2584 | -0.9703552140831074 2585 | ], 2586 | [ 2587 | 24.808347542269377, 2588 | -2.297087795702523 2589 | ] 2590 | ], 2591 | "lastCommittedPoint": null, 2592 | "startArrowhead": null, 2593 | "endArrowhead": null 2594 | }, 2595 | { 2596 | "type": "draw", 2597 | "version": 3970, 2598 | "versionNonce": 608745161, 2599 | "isDeleted": false, 2600 | "id": "EokFdjCJWSL42XXOjRwAi", 2601 | "fillStyle": "solid", 2602 | "strokeWidth": 1, 2603 | "strokeStyle": "solid", 2604 | "roughness": 1, 2605 | "opacity": 100, 2606 | "angle": 0, 2607 | "x": 724.8404725736527, 2608 | "y": -43.80764732703827, 2609 | "strokeColor": "#000000", 2610 | "backgroundColor": "#fff", 2611 | "width": 21.39841204740554, 2612 | "height": 1.1288864948867414, 2613 | "seed": 1227840649, 2614 | "groupIds": [ 2615 | "63Z5enRz4WX3uf5ftpDoj" 2616 | ], 2617 | "strokeSharpness": "round", 2618 | "boundElementIds": [], 2619 | "points": [ 2620 | [ 2621 | 0, 2622 | -0.32167362921772585 2623 | ], 2624 | [ 2625 | 8.29595797015527, 2626 | -0.5912874140789839 2627 | ], 2628 | [ 2629 | 21.39841204740554, 2630 | 0.5375990808077575 2631 | ] 2632 | ], 2633 | "lastCommittedPoint": null, 2634 | "startArrowhead": null, 2635 | "endArrowhead": null 2636 | }, 2637 | { 2638 | "type": "draw", 2639 | "version": 3985, 2640 | "versionNonce": 718911047, 2641 | "isDeleted": false, 2642 | "id": "plXR5A4EMfjS7cxfSZ-0d", 2643 | "fillStyle": "solid", 2644 | "strokeWidth": 1, 2645 | "strokeStyle": "solid", 2646 | "roughness": 1, 2647 | "opacity": 100, 2648 | "angle": 0, 2649 | "x": 724.533060162509, 2650 | "y": -28.784765699691008, 2651 | "strokeColor": "#000000", 2652 | "backgroundColor": "#fff", 2653 | "width": 21.39841204740554, 2654 | "height": 1.1288864948867414, 2655 | "seed": 694766727, 2656 | "groupIds": [ 2657 | "63Z5enRz4WX3uf5ftpDoj" 2658 | ], 2659 | "strokeSharpness": "round", 2660 | "boundElementIds": [], 2661 | "points": [ 2662 | [ 2663 | 0, 2664 | -0.32167362921772585 2665 | ], 2666 | [ 2667 | 3.690654045722796, 2668 | 0.3294487619528638 2669 | ], 2670 | [ 2671 | 8.29595797015527, 2672 | -0.5912874140789839 2673 | ], 2674 | [ 2675 | 21.39841204740554, 2676 | 0.5375990808077575 2677 | ] 2678 | ], 2679 | "lastCommittedPoint": null, 2680 | "startArrowhead": null, 2681 | "endArrowhead": null 2682 | }, 2683 | { 2684 | "type": "rectangle", 2685 | "version": 4696, 2686 | "versionNonce": 1366881705, 2687 | "isDeleted": false, 2688 | "id": "rvknzda3ixd_o0LBBAW_r", 2689 | "fillStyle": "solid", 2690 | "strokeWidth": 2, 2691 | "strokeStyle": "solid", 2692 | "roughness": 1, 2693 | "opacity": 100, 2694 | "angle": 0, 2695 | "x": 784.3347194496591, 2696 | "y": -52.899370642028074, 2697 | "strokeColor": "#000000", 2698 | "backgroundColor": "#fff", 2699 | "width": 32.22784587503368, 2700 | "height": 48.903965306939746, 2701 | "seed": 187701801, 2702 | "groupIds": [ 2703 | "vKzkjvUgFBZIyF5qiSOE_" 2704 | ], 2705 | "strokeSharpness": "sharp", 2706 | "boundElementIds": [ 2707 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2708 | "XIl_NhaFtRO00pX5Pq6VU", 2709 | "EndiSTFlx1AT7vcBVjgve" 2710 | ] 2711 | }, 2712 | { 2713 | "type": "rectangle", 2714 | "version": 4745, 2715 | "versionNonce": 1459180903, 2716 | "isDeleted": false, 2717 | "id": "0Oy79oz9DMQSWsWhHEwCB", 2718 | "fillStyle": "solid", 2719 | "strokeWidth": 2, 2720 | "strokeStyle": "solid", 2721 | "roughness": 1, 2722 | "opacity": 100, 2723 | "angle": 0, 2724 | "x": 780.8932594451101, 2725 | "y": -56.100373736831955, 2726 | "strokeColor": "#000000", 2727 | "backgroundColor": "#fff", 2728 | "width": 32.22784587503368, 2729 | "height": 48.903965306939746, 2730 | "seed": 320125159, 2731 | "groupIds": [ 2732 | "4AV31D7BJmTaXDRZC6Jkf", 2733 | "vKzkjvUgFBZIyF5qiSOE_" 2734 | ], 2735 | "strokeSharpness": "sharp", 2736 | "boundElementIds": [ 2737 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2738 | "XIl_NhaFtRO00pX5Pq6VU", 2739 | "EndiSTFlx1AT7vcBVjgve" 2740 | ] 2741 | }, 2742 | { 2743 | "type": "rectangle", 2744 | "version": 4843, 2745 | "versionNonce": 805197961, 2746 | "isDeleted": false, 2747 | "id": "eDAIQrnTrhR4BYLBp_uZt", 2748 | "fillStyle": "solid", 2749 | "strokeWidth": 2, 2750 | "strokeStyle": "solid", 2751 | "roughness": 1, 2752 | "opacity": 100, 2753 | "angle": 0, 2754 | "x": 776.609309675307, 2755 | "y": -59.863969664911664, 2756 | "strokeColor": "#000000", 2757 | "backgroundColor": "#fff", 2758 | "width": 32.22784587503368, 2759 | "height": 48.903965306939746, 2760 | "seed": 1616702729, 2761 | "groupIds": [ 2762 | "vKzkjvUgFBZIyF5qiSOE_" 2763 | ], 2764 | "strokeSharpness": "sharp", 2765 | "boundElementIds": [ 2766 | "CFu0B4Mw_1wC1Hbgx8Fs0", 2767 | "XIl_NhaFtRO00pX5Pq6VU", 2768 | "EndiSTFlx1AT7vcBVjgve" 2769 | ] 2770 | }, 2771 | { 2772 | "type": "draw", 2773 | "version": 3962, 2774 | "versionNonce": 404230279, 2775 | "isDeleted": false, 2776 | "id": "utD-4lH7XK2JeL2SdIrNr", 2777 | "fillStyle": "solid", 2778 | "strokeWidth": 1, 2779 | "strokeStyle": "solid", 2780 | "roughness": 1, 2781 | "opacity": 100, 2782 | "angle": 0, 2783 | "x": 782.39530045579, 2784 | "y": -37.19391629431094, 2785 | "strokeColor": "#000000", 2786 | "backgroundColor": "#fff", 2787 | "width": 21.23935931101259, 2788 | "height": 1.481905982978408, 2789 | "seed": 301663239, 2790 | "groupIds": [ 2791 | "vKzkjvUgFBZIyF5qiSOE_" 2792 | ], 2793 | "strokeSharpness": "round", 2794 | "boundElementIds": [], 2795 | "points": [ 2796 | [ 2797 | 0, 2798 | -1.0809527239220595 2799 | ], 2800 | [ 2801 | 18.432660413931682, 2802 | -1.0091850257935375 2803 | ], 2804 | [ 2805 | 21.23935931101259, 2806 | -2.491091008771946 2807 | ] 2808 | ], 2809 | "lastCommittedPoint": null, 2810 | "startArrowhead": null, 2811 | "endArrowhead": null 2812 | }, 2813 | { 2814 | "type": "draw", 2815 | "version": 3988, 2816 | "versionNonce": 563371881, 2817 | "isDeleted": false, 2818 | "id": "DDQXH8ImIInEAsKqjj_si", 2819 | "fillStyle": "solid", 2820 | "strokeWidth": 1, 2821 | "strokeStyle": "solid", 2822 | "roughness": 1, 2823 | "opacity": 100, 2824 | "angle": 0, 2825 | "x": 783.449525326856, 2826 | "y": -51.02406928914377, 2827 | "strokeColor": "#000000", 2828 | "backgroundColor": "#fff", 2829 | "width": 20.77771844196958, 2830 | "height": 1.2782408936947272, 2831 | "seed": 1647076329, 2832 | "groupIds": [ 2833 | "vKzkjvUgFBZIyF5qiSOE_" 2834 | ], 2835 | "strokeSharpness": "round", 2836 | "boundElementIds": [], 2837 | "points": [ 2838 | [ 2839 | 0, 2840 | -1.5250569903199922 2841 | ], 2842 | [ 2843 | 7.675264364719304, 2844 | -2.8032978840147194 2845 | ], 2846 | [ 2847 | 20.77771844196958, 2848 | -1.674411389127978 2849 | ] 2850 | ], 2851 | "lastCommittedPoint": null, 2852 | "startArrowhead": null, 2853 | "endArrowhead": null 2854 | }, 2855 | { 2856 | "type": "draw", 2857 | "version": 4013, 2858 | "versionNonce": 938633127, 2859 | "isDeleted": false, 2860 | "id": "PZ6BGVXXGzIdsUyGV4Ag_", 2861 | "fillStyle": "solid", 2862 | "strokeWidth": 1, 2863 | "strokeStyle": "solid", 2864 | "roughness": 1, 2865 | "opacity": 100, 2866 | "angle": 0, 2867 | "x": 783.1554182196887, 2868 | "y": -20.818047639071267, 2869 | "strokeColor": "#000000", 2870 | "backgroundColor": "#fff", 2871 | "width": 22.040441995528322, 2872 | "height": 1.9518837165130463, 2873 | "seed": 1881860903, 2874 | "groupIds": [ 2875 | "vKzkjvUgFBZIyF5qiSOE_" 2876 | ], 2877 | "strokeSharpness": "round", 2878 | "boundElementIds": [], 2879 | "points": [ 2880 | [ 2881 | 0, 2882 | -1.0691598323638951 2883 | ], 2884 | [ 2885 | 12.04339561297506, 2886 | -1.1855398833831219 2887 | ], 2888 | [ 2889 | 17.153876880715732, 2890 | -0.013402508699010725 2891 | ], 2892 | [ 2893 | 22.040441995528322, 2894 | -1.9652862252120569 2895 | ] 2896 | ], 2897 | "lastCommittedPoint": null, 2898 | "startArrowhead": null, 2899 | "endArrowhead": null 2900 | }, 2901 | { 2902 | "type": "draw", 2903 | "version": 4050, 2904 | "versionNonce": 1149667913, 2905 | "isDeleted": false, 2906 | "id": "XD2JifPTNkfTLn9K8NXDy", 2907 | "fillStyle": "solid", 2908 | "strokeWidth": 1, 2909 | "strokeStyle": "solid", 2910 | "roughness": 1, 2911 | "opacity": 100, 2912 | "angle": 0, 2913 | "x": 781.6279895456084, 2914 | "y": -15.45565252834902, 2915 | "strokeColor": "#000000", 2916 | "backgroundColor": "#fff", 2917 | "width": 24.808347542269377, 2918 | "height": 1.3267325816194155, 2919 | "seed": 749338313, 2920 | "groupIds": [ 2921 | "vKzkjvUgFBZIyF5qiSOE_" 2922 | ], 2923 | "strokeSharpness": "round", 2924 | "boundElementIds": [], 2925 | "points": [ 2926 | [ 2927 | 0, 2928 | -1.2496673365292923 2929 | ], 2930 | [ 2931 | 4.635510175525229, 2932 | -1.781630090586143 2933 | ], 2934 | [ 2935 | 7.355219224416346, 2936 | -1.6337215048928169 2937 | ], 2938 | [ 2939 | 21.09388424723848, 2940 | -0.9703552140831074 2941 | ], 2942 | [ 2943 | 24.808347542269377, 2944 | -2.297087795702523 2945 | ] 2946 | ], 2947 | "lastCommittedPoint": null, 2948 | "startArrowhead": null, 2949 | "endArrowhead": null 2950 | }, 2951 | { 2952 | "type": "draw", 2953 | "version": 4015, 2954 | "versionNonce": 347396807, 2955 | "isDeleted": false, 2956 | "id": "-1wBxYhScp4ztHWmrYET2", 2957 | "fillStyle": "solid", 2958 | "strokeWidth": 1, 2959 | "strokeStyle": "solid", 2960 | "roughness": 1, 2961 | "opacity": 100, 2962 | "angle": 0, 2963 | "x": 782.5514100736527, 2964 | "y": -44.88967857703827, 2965 | "strokeColor": "#000000", 2966 | "backgroundColor": "#fff", 2967 | "width": 21.39841204740554, 2968 | "height": 1.1288864948867414, 2969 | "seed": 1242623559, 2970 | "groupIds": [ 2971 | "vKzkjvUgFBZIyF5qiSOE_" 2972 | ], 2973 | "strokeSharpness": "round", 2974 | "boundElementIds": [], 2975 | "points": [ 2976 | [ 2977 | 0, 2978 | -0.32167362921772585 2979 | ], 2980 | [ 2981 | 8.29595797015527, 2982 | -0.5912874140789839 2983 | ], 2984 | [ 2985 | 21.39841204740554, 2986 | 0.5375990808077575 2987 | ] 2988 | ], 2989 | "lastCommittedPoint": null, 2990 | "startArrowhead": null, 2991 | "endArrowhead": null 2992 | }, 2993 | { 2994 | "type": "draw", 2995 | "version": 4030, 2996 | "versionNonce": 1638947113, 2997 | "isDeleted": false, 2998 | "id": "B3U4kiCtJYhXgefArzfKN", 2999 | "fillStyle": "solid", 3000 | "strokeWidth": 1, 3001 | "strokeStyle": "solid", 3002 | "roughness": 1, 3003 | "opacity": 100, 3004 | "angle": 0, 3005 | "x": 782.243997662509, 3006 | "y": -29.866796949691008, 3007 | "strokeColor": "#000000", 3008 | "backgroundColor": "#fff", 3009 | "width": 21.39841204740554, 3010 | "height": 1.1288864948867414, 3011 | "seed": 1316044201, 3012 | "groupIds": [ 3013 | "vKzkjvUgFBZIyF5qiSOE_" 3014 | ], 3015 | "strokeSharpness": "round", 3016 | "boundElementIds": [], 3017 | "points": [ 3018 | [ 3019 | 0, 3020 | -0.32167362921772585 3021 | ], 3022 | [ 3023 | 3.690654045722796, 3024 | 0.3294487619528638 3025 | ], 3026 | [ 3027 | 8.29595797015527, 3028 | -0.5912874140789839 3029 | ], 3030 | [ 3031 | 21.39841204740554, 3032 | 0.5375990808077575 3033 | ] 3034 | ], 3035 | "lastCommittedPoint": null, 3036 | "startArrowhead": null, 3037 | "endArrowhead": null 3038 | }, 3039 | { 3040 | "type": "text", 3041 | "version": 456, 3042 | "versionNonce": 1127145385, 3043 | "isDeleted": false, 3044 | "id": "2gOxT0-wpq4_aU63NnKJg", 3045 | "fillStyle": "hachure", 3046 | "strokeWidth": 4, 3047 | "strokeStyle": "solid", 3048 | "roughness": 1, 3049 | "opacity": 100, 3050 | "angle": 0, 3051 | "x": 975.828125, 3052 | "y": -59.55859375, 3053 | "strokeColor": "#000000", 3054 | "backgroundColor": "transparent", 3055 | "width": 204, 3056 | "height": 45, 3057 | "seed": 85071529, 3058 | "groupIds": [], 3059 | "strokeSharpness": "sharp", 3060 | "boundElementIds": [], 3061 | "fontSize": 36, 3062 | "fontFamily": 1, 3063 | "text": "Data Lake", 3064 | "baseline": 32, 3065 | "textAlign": "left", 3066 | "verticalAlign": "top" 3067 | }, 3068 | { 3069 | "type": "text", 3070 | "version": 800, 3071 | "versionNonce": 1202246247, 3072 | "isDeleted": false, 3073 | "id": "v4ju6Kt2U2IbZNrpE-4IW", 3074 | "fillStyle": "hachure", 3075 | "strokeWidth": 4, 3076 | "strokeStyle": "solid", 3077 | "roughness": 1, 3078 | "opacity": 100, 3079 | "angle": 0, 3080 | "x": 623.2265625, 3081 | "y": 154.875, 3082 | "strokeColor": "#000000", 3083 | "backgroundColor": "transparent", 3084 | "width": 286, 3085 | "height": 35, 3086 | "seed": 303994889, 3087 | "groupIds": [], 3088 | "strokeSharpness": "sharp", 3089 | "boundElementIds": [], 3090 | "fontSize": 28, 3091 | "fontFamily": 1, 3092 | "text": "Docker (IDSeq-dag)", 3093 | "baseline": 25, 3094 | "textAlign": "left", 3095 | "verticalAlign": "top" 3096 | }, 3097 | { 3098 | "type": "text", 3099 | "version": 803, 3100 | "versionNonce": 200055753, 3101 | "isDeleted": false, 3102 | "id": "2PRYSB6wOEAUufkawz8-o", 3103 | "fillStyle": "hachure", 3104 | "strokeWidth": 4, 3105 | "strokeStyle": "solid", 3106 | "roughness": 1, 3107 | "opacity": 100, 3108 | "angle": 0, 3109 | "x": 621.9121420373465, 3110 | "y": 80.75, 3111 | "strokeColor": "#000000", 3112 | "backgroundColor": "transparent", 3113 | "width": 165, 3114 | "height": 35, 3115 | "seed": 1805775143, 3116 | "groupIds": [], 3117 | "strokeSharpness": "sharp", 3118 | "boundElementIds": [], 3119 | "fontSize": 28, 3120 | "fontFamily": 1, 3121 | "text": "WDL, JSON", 3122 | "baseline": 25, 3123 | "textAlign": "left", 3124 | "verticalAlign": "top" 3125 | }, 3126 | { 3127 | "type": "line", 3128 | "version": 4846, 3129 | "versionNonce": 780065863, 3130 | "isDeleted": false, 3131 | "id": "eXhngY9oP-rwc8Z4TU3Ei", 3132 | "fillStyle": "hachure", 3133 | "strokeWidth": 1, 3134 | "strokeStyle": "solid", 3135 | "roughness": 1, 3136 | "opacity": 100, 3137 | "angle": 1.5707963267948957, 3138 | "x": 496.91610121251296, 3139 | "y": 73.34751510372733, 3140 | "strokeColor": "#087f5b", 3141 | "backgroundColor": "#40c057", 3142 | "width": 52.317507746132115, 3143 | "height": 154.56722543646003, 3144 | "seed": 1597895015, 3145 | "groupIds": [ 3146 | "xozIjy99Bp9kVlJajWyfz" 3147 | ], 3148 | "strokeSharpness": "round", 3149 | "boundElementIds": [], 3150 | "startBinding": null, 3151 | "endBinding": null, 3152 | "points": [ 3153 | [ 3154 | -0.24755378372925183, 3155 | -40.169554027464216 3156 | ], 3157 | [ 3158 | -0.07503751055611152, 3159 | 76.6515171914404 3160 | ], 3161 | [ 3162 | -0.23948042713317108, 3163 | 89.95108885873196 3164 | ], 3165 | [ 3166 | 2.446913573036335, 3167 | 95.69766931810295 3168 | ], 3169 | [ 3170 | 11.802146636255692, 3171 | 100.56113713047068 3172 | ], 3173 | [ 3174 | 27.615140546177496, 3175 | 102.07554835500338 3176 | ], 3177 | [ 3178 | 42.72341054254274, 3179 | 99.65756899883291 3180 | ], 3181 | [ 3182 | 50.75054563137204, 3183 | 93.87501510096598 3184 | ], 3185 | [ 3186 | 51.88266441510958, 3187 | 89.00026150397161 3188 | ], 3189 | [ 3190 | 52.04166639997853, 3191 | 78.29287333983132 3192 | ], 3193 | [ 3194 | 51.916868330459295, 3195 | -30.36891819848148 3196 | ], 3197 | [ 3198 | 51.635533423123285, 3199 | -40.63545540065934 3200 | ], 3201 | [ 3202 | 48.27622163143906, 3203 | -46.37349057843314 3204 | ], 3205 | [ 3206 | 41.202227904674494, 3207 | -49.69665692879073 3208 | ], 3209 | [ 3210 | 25.081551986374073, 3211 | -52.49167708145666 3212 | ], 3213 | [ 3214 | 12.15685839679867, 3215 | -50.825000270901 3216 | ], 3217 | [ 3218 | 1.9916746648394732, 3219 | -45.171835889467935 3220 | ], 3221 | [ 3222 | -0.2758413461535838, 3223 | -40.23974757720194 3224 | ], 3225 | [ 3226 | -0.24755378372925183, 3227 | -40.169554027464216 3228 | ] 3229 | ], 3230 | "lastCommittedPoint": null, 3231 | "startArrowhead": null, 3232 | "endArrowhead": null 3233 | }, 3234 | { 3235 | "type": "line", 3236 | "version": 2485, 3237 | "versionNonce": 580988841, 3238 | "isDeleted": false, 3239 | "id": "9WBKAjwNpt7Q9jLFI643C", 3240 | "fillStyle": "solid", 3241 | "strokeWidth": 1, 3242 | "strokeStyle": "solid", 3243 | "roughness": 1, 3244 | "opacity": 100, 3245 | "angle": 1.5707963267948957, 3246 | "x": 472.14113702442677, 3247 | "y": 94.30348935426694, 3248 | "strokeColor": "#087f5b", 3249 | "backgroundColor": "transparent", 3250 | "width": 50.7174766392476, 3251 | "height": 12.698053371678215, 3252 | "seed": 820083849, 3253 | "groupIds": [ 3254 | "xozIjy99Bp9kVlJajWyfz" 3255 | ], 3256 | "strokeSharpness": "round", 3257 | "boundElementIds": [], 3258 | "startBinding": null, 3259 | "endBinding": null, 3260 | "points": [ 3261 | [ 3262 | 0, 3263 | -2.0205717204386002 3264 | ], 3265 | [ 3266 | 1.3361877396713384, 3267 | 3.0410845646550486 3268 | ], 3269 | [ 3270 | 7.098613049589299, 3271 | 7.287767671898479 3272 | ], 3273 | [ 3274 | 14.766422451441104, 3275 | 9.859533283467512 3276 | ], 3277 | [ 3278 | 26.779003528407447, 3279 | 10.093886705011586 3280 | ], 3281 | [ 3282 | 40.79727342221974, 3283 | 8.456559589697127 3284 | ], 3285 | [ 3286 | 48.98410145879092, 3287 | 2.500000505196364 3288 | ], 3289 | [ 3290 | 50.7174766392476, 3291 | -2.6041666666666288 3292 | ] 3293 | ], 3294 | "lastCommittedPoint": null, 3295 | "startArrowhead": null, 3296 | "endArrowhead": null 3297 | }, 3298 | { 3299 | "type": "line", 3300 | "version": 2618, 3301 | "versionNonce": 923384679, 3302 | "isDeleted": false, 3303 | "id": "wQjAtrv40bzDckfypoHZA", 3304 | "fillStyle": "solid", 3305 | "strokeWidth": 1, 3306 | "strokeStyle": "solid", 3307 | "roughness": 1, 3308 | "opacity": 100, 3309 | "angle": 1.5707963267948957, 3310 | "x": 517.5669181728687, 3311 | "y": 94.75835969569083, 3312 | "strokeColor": "#087f5b", 3313 | "backgroundColor": "transparent", 3314 | "width": 50.57247907260371, 3315 | "height": 10.178760037658167, 3316 | "seed": 1701391495, 3317 | "groupIds": [ 3318 | "xozIjy99Bp9kVlJajWyfz" 3319 | ], 3320 | "strokeSharpness": "round", 3321 | "boundElementIds": [], 3322 | "startBinding": null, 3323 | "endBinding": null, 3324 | "points": [ 3325 | [ 3326 | 0, 3327 | -2.136356936862347 3328 | ], 3329 | [ 3330 | 1.332367676378171, 3331 | 1.9210669226078037 3332 | ], 3333 | [ 3334 | 7.078318632616268, 3335 | 5.325208253515953 3336 | ], 3337 | [ 3338 | 14.724206326638113, 3339 | 7.386735659885842 3340 | ], 3341 | [ 3342 | 26.70244431044034, 3343 | 7.574593370991538 3344 | ], 3345 | [ 3346 | 40.68063699304561, 3347 | 6.262111896696538 3348 | ], 3349 | [ 3350 | 48.84405948536458, 3351 | 1.4873339211608216 3352 | ], 3353 | [ 3354 | 50.57247907260371, 3355 | -2.6041666666666288 3356 | ] 3357 | ], 3358 | "lastCommittedPoint": null, 3359 | "startArrowhead": null, 3360 | "endArrowhead": null 3361 | }, 3362 | { 3363 | "type": "ellipse", 3364 | "version": 5584, 3365 | "versionNonce": 1678725769, 3366 | "isDeleted": false, 3367 | "id": "KPN0KnvnI8-uG7ax5ILuC", 3368 | "fillStyle": "solid", 3369 | "strokeWidth": 1, 3370 | "strokeStyle": "solid", 3371 | "roughness": 1, 3372 | "opacity": 100, 3373 | "angle": 1.5707963267948957, 3374 | "x": 564.1716913049837, 3375 | "y": 86.76880683794023, 3376 | "strokeColor": "#087f5b", 3377 | "backgroundColor": "#fff", 3378 | "width": 51.27812853552538, 3379 | "height": 22.797152568995934, 3380 | "seed": 1651704681, 3381 | "groupIds": [ 3382 | "xozIjy99Bp9kVlJajWyfz" 3383 | ], 3384 | "strokeSharpness": "sharp", 3385 | "boundElementIds": [ 3386 | "bxuMGTzXLn7H-uBCptINx" 3387 | ] 3388 | }, 3389 | { 3390 | "type": "text", 3391 | "version": 525, 3392 | "versionNonce": 609819591, 3393 | "isDeleted": false, 3394 | "id": "7QKWIYRiZ_QomEUOJN_-C", 3395 | "fillStyle": "hachure", 3396 | "strokeWidth": 4, 3397 | "strokeStyle": "solid", 3398 | "roughness": 1, 3399 | "opacity": 100, 3400 | "angle": 0, 3401 | "x": 983.046875, 3402 | "y": 115.88671875, 3403 | "strokeColor": "#000000", 3404 | "backgroundColor": "transparent", 3405 | "width": 345, 3406 | "height": 45, 3407 | "seed": 1421876361, 3408 | "groupIds": [], 3409 | "strokeSharpness": "sharp", 3410 | "boundElementIds": [], 3411 | "fontSize": 36, 3412 | "fontFamily": 1, 3413 | "text": "Pipeline and params", 3414 | "baseline": 32, 3415 | "textAlign": "left", 3416 | "verticalAlign": "top" 3417 | }, 3418 | { 3419 | "type": "rectangle", 3420 | "version": 802, 3421 | "versionNonce": 127693511, 3422 | "isDeleted": false, 3423 | "id": "r6WoG0fu_dhw1vFvBxy8B", 3424 | "fillStyle": "solid", 3425 | "strokeWidth": 1, 3426 | "strokeStyle": "solid", 3427 | "roughness": 1, 3428 | "opacity": 100, 3429 | "angle": 0, 3430 | "x": 405.36326348057213, 3431 | "y": 350.6742478660052, 3432 | "strokeColor": "#000000", 3433 | "backgroundColor": "#ced4da", 3434 | "width": 45.06253553885557, 3435 | "height": 68.91712926798951, 3436 | "seed": 1255717671, 3437 | "groupIds": [ 3438 | "V9cMTxweWCLrsDwb2yS8e" 3439 | ], 3440 | "strokeSharpness": "sharp", 3441 | "boundElementIds": [] 3442 | }, 3443 | { 3444 | "type": "rectangle", 3445 | "version": 952, 3446 | "versionNonce": 615399721, 3447 | "isDeleted": false, 3448 | "id": "3BjP49Q_8IaIx1jFbhyuV", 3449 | "fillStyle": "solid", 3450 | "strokeWidth": 1, 3451 | "strokeStyle": "solid", 3452 | "roughness": 1, 3453 | "opacity": 100, 3454 | "angle": 0, 3455 | "x": 410.52242842121694, 3456 | "y": 355.9285294799056, 3457 | "strokeColor": "#000000", 3458 | "backgroundColor": "#fff", 3459 | "width": 35.50788279378928, 3460 | "height": 52.708882312110724, 3461 | "seed": 2021732041, 3462 | "groupIds": [ 3463 | "V9cMTxweWCLrsDwb2yS8e" 3464 | ], 3465 | "strokeSharpness": "sharp", 3466 | "boundElementIds": [] 3467 | }, 3468 | { 3469 | "type": "ellipse", 3470 | "version": 996, 3471 | "versionNonce": 1966113255, 3472 | "isDeleted": false, 3473 | "id": "uczqy0jURTkzxXf8uuLyC", 3474 | "fillStyle": "solid", 3475 | "strokeWidth": 1, 3476 | "strokeStyle": "solid", 3477 | "roughness": 1, 3478 | "opacity": 100, 3479 | "angle": 0, 3480 | "x": 424.64044352462946, 3481 | "y": 410.8931297500093, 3482 | "strokeColor": "#000000", 3483 | "backgroundColor": "#fff", 3484 | "width": 7.271852586964892, 3485 | "height": 7.271852586964892, 3486 | "seed": 780451399, 3487 | "groupIds": [ 3488 | "V9cMTxweWCLrsDwb2yS8e" 3489 | ], 3490 | "strokeSharpness": "sharp", 3491 | "boundElementIds": [] 3492 | }, 3493 | { 3494 | "type": "rectangle", 3495 | "version": 644, 3496 | "versionNonce": 360592393, 3497 | "isDeleted": false, 3498 | "id": "F3GtFC_BW_vq8ERg-l-GB", 3499 | "fillStyle": "cross-hatch", 3500 | "strokeWidth": 1, 3501 | "strokeStyle": "solid", 3502 | "roughness": 1, 3503 | "opacity": 100, 3504 | "angle": 0, 3505 | "x": 415.7910331897512, 3506 | "y": 362.63807916841665, 3507 | "strokeColor": "#000000", 3508 | "backgroundColor": "#fab005", 3509 | "width": 24.970673256720772, 3510 | "height": 12.656234861443139, 3511 | "seed": 2011327913, 3512 | "groupIds": [ 3513 | "V9cMTxweWCLrsDwb2yS8e" 3514 | ], 3515 | "strokeSharpness": "sharp", 3516 | "boundElementIds": [] 3517 | }, 3518 | { 3519 | "type": "rectangle", 3520 | "version": 686, 3521 | "versionNonce": 800435463, 3522 | "isDeleted": false, 3523 | "id": "fHbBAQy816ch_oBPadwmQ", 3524 | "fillStyle": "cross-hatch", 3525 | "strokeWidth": 1, 3526 | "strokeStyle": "solid", 3527 | "roughness": 1, 3528 | "opacity": 100, 3529 | "angle": 0, 3530 | "x": 415.7910331897512, 3531 | "y": 385.26450299362443, 3532 | "strokeColor": "#000000", 3533 | "backgroundColor": "#fab005", 3534 | "width": 24.970673256720772, 3535 | "height": 12.656234861443139, 3536 | "seed": 1073962343, 3537 | "groupIds": [ 3538 | "V9cMTxweWCLrsDwb2yS8e" 3539 | ], 3540 | "strokeSharpness": "sharp", 3541 | "boundElementIds": [] 3542 | }, 3543 | { 3544 | "type": "diamond", 3545 | "version": 866, 3546 | "versionNonce": 1444230057, 3547 | "isDeleted": false, 3548 | "id": "oR1lqlew-T6PK3Ew2qSEX", 3549 | "fillStyle": "solid", 3550 | "strokeWidth": 1, 3551 | "strokeStyle": "solid", 3552 | "roughness": 1, 3553 | "opacity": 100, 3554 | "angle": 0, 3555 | "x": 408.5474111234828, 3556 | "y": 301.921667919573, 3557 | "strokeColor": "#c92a2a", 3558 | "backgroundColor": "#fd8888", 3559 | "width": 52.702868007120905, 3560 | "height": 17.204717742153658, 3561 | "seed": 1547875881, 3562 | "groupIds": [ 3563 | "Cw9EMrjC4vhfQYaQ72BL9" 3564 | ], 3565 | "strokeSharpness": "sharp", 3566 | "boundElementIds": [] 3567 | }, 3568 | { 3569 | "type": "diamond", 3570 | "version": 907, 3571 | "versionNonce": 667416423, 3572 | "isDeleted": false, 3573 | "id": "D1WvQ9OE0ImKZf-ipTuRh", 3574 | "fillStyle": "solid", 3575 | "strokeWidth": 1, 3576 | "strokeStyle": "solid", 3577 | "roughness": 1, 3578 | "opacity": 100, 3579 | "angle": 0, 3580 | "x": 408.5474111234828, 3581 | "y": 297.77094281830773, 3582 | "strokeColor": "#c92a2a", 3583 | "backgroundColor": "#fd8888", 3584 | "width": 52.702868007120905, 3585 | "height": 17.204717742153658, 3586 | "seed": 118086887, 3587 | "groupIds": [ 3588 | "Cw9EMrjC4vhfQYaQ72BL9" 3589 | ], 3590 | "strokeSharpness": "sharp", 3591 | "boundElementIds": [] 3592 | }, 3593 | { 3594 | "type": "diamond", 3595 | "version": 987, 3596 | "versionNonce": 308467337, 3597 | "isDeleted": false, 3598 | "id": "DHJtFq7OREhGy60-9dmjp", 3599 | "fillStyle": "solid", 3600 | "strokeWidth": 1, 3601 | "strokeStyle": "solid", 3602 | "roughness": 1, 3603 | "opacity": 100, 3604 | "angle": 0, 3605 | "x": 408.5474111234828, 3606 | "y": 291.8616460169046, 3607 | "strokeColor": "#c92a2a", 3608 | "backgroundColor": "#fd8888", 3609 | "width": 52.702868007120905, 3610 | "height": 17.204717742153658, 3611 | "seed": 750520585, 3612 | "groupIds": [ 3613 | "Cw9EMrjC4vhfQYaQ72BL9" 3614 | ], 3615 | "strokeSharpness": "sharp", 3616 | "boundElementIds": [] 3617 | }, 3618 | { 3619 | "type": "diamond", 3620 | "version": 1029, 3621 | "versionNonce": 1522692743, 3622 | "isDeleted": false, 3623 | "id": "Br3PmSwoenfR5O4JeXdd7", 3624 | "fillStyle": "solid", 3625 | "strokeWidth": 1, 3626 | "strokeStyle": "solid", 3627 | "roughness": 1, 3628 | "opacity": 100, 3629 | "angle": 0, 3630 | "x": 408.5474111234828, 3631 | "y": 285.9986143382732, 3632 | "strokeColor": "#c92a2a", 3633 | "backgroundColor": "#fd8888", 3634 | "width": 52.702868007120905, 3635 | "height": 17.204717742153658, 3636 | "seed": 330016775, 3637 | "groupIds": [ 3638 | "Cw9EMrjC4vhfQYaQ72BL9" 3639 | ], 3640 | "strokeSharpness": "sharp", 3641 | "boundElementIds": [] 3642 | }, 3643 | { 3644 | "type": "text", 3645 | "version": 679, 3646 | "versionNonce": 701643655, 3647 | "isDeleted": false, 3648 | "id": "FqNGxEZ8V0eb1HD_5akT2", 3649 | "fillStyle": "hachure", 3650 | "strokeWidth": 4, 3651 | "strokeStyle": "solid", 3652 | "roughness": 1, 3653 | "opacity": 100, 3654 | "angle": 0, 3655 | "x": 461.0778569382586, 3656 | "y": 223.73046875, 3657 | "strokeColor": "#000000", 3658 | "backgroundColor": "transparent", 3659 | "width": 109, 3660 | "height": 35, 3661 | "seed": 1403010409, 3662 | "groupIds": [], 3663 | "strokeSharpness": "sharp", 3664 | "boundElementIds": [], 3665 | "fontSize": 28, 3666 | "fontFamily": 1, 3667 | "text": "Daemon", 3668 | "baseline": 25, 3669 | "textAlign": "left", 3670 | "verticalAlign": "top" 3671 | }, 3672 | { 3673 | "type": "diamond", 3674 | "version": 903, 3675 | "versionNonce": 989890983, 3676 | "isDeleted": false, 3677 | "id": "Q5tkdCrufCLyYciaL1GRf", 3678 | "fillStyle": "solid", 3679 | "strokeWidth": 1, 3680 | "strokeStyle": "solid", 3681 | "roughness": 1, 3682 | "opacity": 100, 3683 | "angle": 0, 3684 | "x": 406.3752680617414, 3685 | "y": 245.421667919573, 3686 | "strokeColor": "#c92a2a", 3687 | "backgroundColor": "#fd8888", 3688 | "width": 52.702868007120905, 3689 | "height": 17.204717742153658, 3690 | "seed": 1671129511, 3691 | "groupIds": [ 3692 | "eFiy61aCtGkQvZ8MscU8U" 3693 | ], 3694 | "strokeSharpness": "sharp", 3695 | "boundElementIds": [] 3696 | }, 3697 | { 3698 | "type": "diamond", 3699 | "version": 944, 3700 | "versionNonce": 1516472393, 3701 | "isDeleted": false, 3702 | "id": "tTfHqUvlLRFRDXjt2XKIC", 3703 | "fillStyle": "solid", 3704 | "strokeWidth": 1, 3705 | "strokeStyle": "solid", 3706 | "roughness": 1, 3707 | "opacity": 100, 3708 | "angle": 0, 3709 | "x": 406.3752680617414, 3710 | "y": 241.27094281830773, 3711 | "strokeColor": "#c92a2a", 3712 | "backgroundColor": "#fd8888", 3713 | "width": 52.702868007120905, 3714 | "height": 17.204717742153658, 3715 | "seed": 1164355657, 3716 | "groupIds": [ 3717 | "eFiy61aCtGkQvZ8MscU8U" 3718 | ], 3719 | "strokeSharpness": "sharp", 3720 | "boundElementIds": [] 3721 | }, 3722 | { 3723 | "type": "diamond", 3724 | "version": 1024, 3725 | "versionNonce": 363773127, 3726 | "isDeleted": false, 3727 | "id": "cl6IRQN4lp5bdGDN_AMNO", 3728 | "fillStyle": "solid", 3729 | "strokeWidth": 1, 3730 | "strokeStyle": "solid", 3731 | "roughness": 1, 3732 | "opacity": 100, 3733 | "angle": 0, 3734 | "x": 406.3752680617414, 3735 | "y": 235.36164601690461, 3736 | "strokeColor": "#c92a2a", 3737 | "backgroundColor": "#fd8888", 3738 | "width": 52.702868007120905, 3739 | "height": 17.204717742153658, 3740 | "seed": 669883591, 3741 | "groupIds": [ 3742 | "eFiy61aCtGkQvZ8MscU8U" 3743 | ], 3744 | "strokeSharpness": "sharp", 3745 | "boundElementIds": [] 3746 | }, 3747 | { 3748 | "type": "diamond", 3749 | "version": 1066, 3750 | "versionNonce": 1866307369, 3751 | "isDeleted": false, 3752 | "id": "oS2Iww0CZTkMa1clZ4lL2", 3753 | "fillStyle": "solid", 3754 | "strokeWidth": 1, 3755 | "strokeStyle": "solid", 3756 | "roughness": 1, 3757 | "opacity": 100, 3758 | "angle": 0, 3759 | "x": 406.3752680617414, 3760 | "y": 229.49861433827323, 3761 | "strokeColor": "#c92a2a", 3762 | "backgroundColor": "#fd8888", 3763 | "width": 52.702868007120905, 3764 | "height": 17.204717742153658, 3765 | "seed": 1289533225, 3766 | "groupIds": [ 3767 | "eFiy61aCtGkQvZ8MscU8U" 3768 | ], 3769 | "strokeSharpness": "sharp", 3770 | "boundElementIds": [] 3771 | }, 3772 | { 3773 | "type": "text", 3774 | "version": 776, 3775 | "versionNonce": 714688489, 3776 | "isDeleted": false, 3777 | "id": "sHxAN4B20XKYCXgLMiQBY", 3778 | "fillStyle": "hachure", 3779 | "strokeWidth": 4, 3780 | "strokeStyle": "solid", 3781 | "roughness": 1, 3782 | "opacity": 100, 3783 | "angle": 0, 3784 | "x": 649.30078125, 3785 | "y": 225.609375, 3786 | "strokeColor": "#000000", 3787 | "backgroundColor": "transparent", 3788 | "width": 302, 3789 | "height": 35, 3790 | "seed": 50106313, 3791 | "groupIds": [], 3792 | "strokeSharpness": "sharp", 3793 | "boundElementIds": [], 3794 | "fontSize": 28, 3795 | "fontFamily": 1, 3796 | "text": "miniwdl/Docker Swarm", 3797 | "baseline": 25, 3798 | "textAlign": "left", 3799 | "verticalAlign": "top" 3800 | }, 3801 | { 3802 | "id": "lU4fXWuaep1BlQ5GzdpTk", 3803 | "type": "rectangle", 3804 | "x": 451.93663194444446, 3805 | "y": 150.89583333333337, 3806 | "width": 38.541666666666686, 3807 | "height": 45.2734375, 3808 | "angle": 0, 3809 | "strokeColor": "#087f5b", 3810 | "backgroundColor": "#12b886", 3811 | "fillStyle": "solid", 3812 | "strokeWidth": 2, 3813 | "strokeStyle": "solid", 3814 | "roughness": 2, 3815 | "opacity": 50, 3816 | "groupIds": [], 3817 | "strokeSharpness": "sharp", 3818 | "seed": 1555519817, 3819 | "version": 130, 3820 | "versionNonce": 1854664583, 3821 | "isDeleted": false, 3822 | "boundElementIds": null 3823 | }, 3824 | { 3825 | "id": "uG9UQ5srlOotzUBWUyWP1", 3826 | "type": "rectangle", 3827 | "x": 504.2022569444444, 3828 | "y": 152.67317708333337, 3829 | "width": 38.541666666666686, 3830 | "height": 45.2734375, 3831 | "angle": 0, 3832 | "strokeColor": "#087f5b", 3833 | "backgroundColor": "#12b886", 3834 | "fillStyle": "solid", 3835 | "strokeWidth": 2, 3836 | "strokeStyle": "solid", 3837 | "roughness": 2, 3838 | "opacity": 50, 3839 | "groupIds": [], 3840 | "strokeSharpness": "sharp", 3841 | "seed": 397601801, 3842 | "version": 179, 3843 | "versionNonce": 1384816999, 3844 | "isDeleted": false, 3845 | "boundElementIds": null 3846 | }, 3847 | { 3848 | "id": "0C8HS2fHs3B0S0iC8_TEv", 3849 | "type": "rectangle", 3850 | "x": 558.3689236111111, 3851 | "y": 149.92578125, 3852 | "width": 38.541666666666686, 3853 | "height": 45.2734375, 3854 | "angle": 0, 3855 | "strokeColor": "#087f5b", 3856 | "backgroundColor": "#12b886", 3857 | "fillStyle": "solid", 3858 | "strokeWidth": 2, 3859 | "strokeStyle": "solid", 3860 | "roughness": 2, 3861 | "opacity": 50, 3862 | "groupIds": [], 3863 | "strokeSharpness": "sharp", 3864 | "seed": 1569115015, 3865 | "version": 241, 3866 | "versionNonce": 1812402153, 3867 | "isDeleted": false, 3868 | "boundElementIds": null 3869 | } 3870 | ], 3871 | "appState": { 3872 | "gridSize": null, 3873 | "viewBackgroundColor": "#ffffff" 3874 | } 3875 | } -------------------------------------------------------------------------------- /images/data-lakes/gcp-cromwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/gcp-cromwell.png -------------------------------------------------------------------------------- /images/data-lakes/gcp-deepvariant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/gcp-deepvariant.png -------------------------------------------------------------------------------- /images/data-lakes/gcp-k8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/gcp-k8.png -------------------------------------------------------------------------------- /images/data-lakes/gcp-nextflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/gcp-nextflow.png -------------------------------------------------------------------------------- /images/data-lakes/raw-k8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/data-lakes/raw-k8.png -------------------------------------------------------------------------------- /images/databricks-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/databricks-icon.png -------------------------------------------------------------------------------- /images/gcp-locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/gcp-locations.png -------------------------------------------------------------------------------- /images/gcp-networks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/gcp-networks.png -------------------------------------------------------------------------------- /images/ibm-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/ibm-cloud.png -------------------------------------------------------------------------------- /images/learning-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/learning-cloud.png -------------------------------------------------------------------------------- /images/logos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/logos.png -------------------------------------------------------------------------------- /images/prompt-kata-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/prompt-kata-group.png -------------------------------------------------------------------------------- /images/terraform-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/terraform-arch.png -------------------------------------------------------------------------------- /images/trends.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/trends.png -------------------------------------------------------------------------------- /images/viz-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/images/viz-tools.png -------------------------------------------------------------------------------- /z_utilities/.devcontainer/DOCKERFILE: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/vscode/devcontainers/base:debian-10 2 | 3 | RUN apt-get update \ 4 | && export DEBIAN_FRONTEND=noninteractive \ 5 | && apt-get -y install --no-install-recommends graphviz 6 | 7 | -------------------------------------------------------------------------------- /z_utilities/.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Markdown Editing", 3 | "dockerFile": "DOCKERFILE", 4 | 5 | "settings": { 6 | "terminal.integrated.shell.linux": "/bin/bash" 7 | }, 8 | 9 | "extensions": [ 10 | "yzhang.markdown-all-in-one", 11 | "streetsidesoftware.code-spell-checker", 12 | "DavidAnson.vscode-markdownlint", 13 | "shd101wyy.markdown-preview-enhanced", 14 | "bierner.github-markdown-preview" 15 | ] 16 | 17 | } -------------------------------------------------------------------------------- /z_utilities/.metals/metals.h2.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynnlangit/learning-cloud/c984dea307b4f39d2e5a7aa7ec66dde773705d2f/z_utilities/.metals/metals.h2.db -------------------------------------------------------------------------------- /z_utilities/.tours/aws-tour.tour: -------------------------------------------------------------------------------- 1 | { 2 | "title": "AWS-tour", 3 | "steps": [ 4 | { 5 | "file": "AWS/README.md", 6 | "line": 7, 7 | "description": "These courses are for specific topics in AWS", 8 | "title": "AWS for Data Science" 9 | }, 10 | { 11 | "file": "AWS/README.md", 12 | "line": 8, 13 | "description": "These courses are for AWS DevOps topics", 14 | "title": "AWS for DevOps" 15 | }, 16 | { 17 | "file": "AWS/README.md", 18 | "line": 9, 19 | "description": "This course series is for Cloud Architects", 20 | "title": "AWS for Architects" 21 | }, 22 | { 23 | "file": "AWS/README.md", 24 | "line": 13, 25 | "description": "Example GitHub Repos include scripts, demos and sample datasets", 26 | "title": "Example GitHub Repos" 27 | }, 28 | { 29 | "file": "AWS/README.md", 30 | "line": 24, 31 | "description": "The open guide to AWS is a useful resource, written by the user community\n[Open Website in browser](command:vscode.open?[\"https://github.com/open-guides/og-aws\"])", 32 | "title": "The Open Guide to AWS on GitHub" 33 | } 34 | ], 35 | "ref": "master" 36 | } -------------------------------------------------------------------------------- /z_utilities/.tours/cloud-tour.tour: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Cloud-tour", 3 | "steps": [ 4 | { 5 | "file": "README.md", 6 | "line": 9, 7 | "description": "This link goes to my LinkedIn Learning Cloud courses", 8 | "title": "LinkedIn Learning Courses" 9 | }, 10 | { 11 | "file": "README.md", 12 | "line": 12, 13 | "description": "This link goes to my YouTube Channel. I have playlists by topic there too.", 14 | "title": "YouTube Screencasts" 15 | }, 16 | { 17 | "file": "README.md", 18 | "line": 22, 19 | "description": "I have one page per cloud in this repo. Go to the vendor folder, then the `README.md` file in that folder.\n\nFor example for AWS, [Open AWS CodeTour](command:codetour.startTourByTitle?[\"AWS-tour\"])", 20 | "title": "GOTO AWS CodeTour" 21 | }, 22 | { 23 | "file": "README.md", 24 | "line": 23, 25 | "description": "I have one page per cloud in this repo. Go to the vendor folder, then the `README.md` file in that folder.\n\nFor example for AWS, [Open GCP CodeTour](command:codetour.startTourByTitle?[\"GCP-tour\"])" 26 | } 27 | ], 28 | "ref": "master" 29 | } -------------------------------------------------------------------------------- /z_utilities/.tours/gcp-tour.tour: -------------------------------------------------------------------------------- 1 | { 2 | "title": "GCP-tour", 3 | "steps": [ 4 | { 5 | "file": "GCP/README.md", 6 | "line": 7, 7 | "description": "The 'missing' GCP course - designed for beginners to the GCP cloud" 8 | }, 9 | { 10 | "file": "GCP/README.md", 11 | "line": 11, 12 | "description": "Uses GCP Dataproc - managed Hadoop and Spark" 13 | }, 14 | { 15 | "file": "GCP/README.md", 16 | "line": 19, 17 | "description": "Fully open source and free course for GCP - all examples use genomic datasets" 18 | } 19 | ], 20 | "ref": "master" 21 | } -------------------------------------------------------------------------------- /z_utilities/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "bioinformatics", 4 | "langit", 5 | "screencasts" 6 | ], 7 | "extensions.ignoreRecommendations": true, 8 | "files.autoSave": "afterDelay", 9 | "typescript.tsc.autoDetect": "off", 10 | "npm.autoDetect": "off", 11 | "debug.allowBreakpointsEverywhere": true, 12 | "html.autoClosingTags": false, 13 | "files.watcherExclude": { 14 | "**/target": true 15 | } 16 | } --------------------------------------------------------------------------------