├── .assets ├── code.theme ├── lint.config.json └── template.pptx ├── .github └── workflows │ ├── build.yml │ └── validate.yml ├── .gitignore ├── LICENSE ├── readme.md └── talks ├── app_service_web.md ├── azure_sdk_js.md ├── azure_sdk_net.md └── media ├── app_services.png ├── docker.png ├── github.png ├── oryx.png ├── sdk_current_state.png ├── sdk_new_state.png ├── static_web_apps.png └── static_web_apps_breakdown.png /.assets/code.theme: -------------------------------------------------------------------------------- 1 | { 2 | "text-color": "#D4D4D4", 3 | "background-color": "#1E1E1E", 4 | "line-number-color": null, 5 | "line-number-background-color": null, 6 | "text-styles": { 7 | "Other": { 8 | "text-color": "#efef8f", 9 | "background-color": null, 10 | "bold": false, 11 | "italic": false, 12 | "underline": false 13 | }, 14 | "Attribute": { 15 | "text-color": null, 16 | "background-color": null, 17 | "bold": false, 18 | "italic": false, 19 | "underline": false 20 | }, 21 | "SpecialString": { 22 | "text-color": "#CE9178", 23 | "background-color": null, 24 | "bold": false, 25 | "italic": false, 26 | "underline": false 27 | }, 28 | "Annotation": { 29 | "text-color": "#7f9f7f", 30 | "background-color": null, 31 | "bold": true, 32 | "italic": false, 33 | "underline": false 34 | }, 35 | "Function": { 36 | "text-color": "#569CD6", 37 | "background-color": null, 38 | "bold": false, 39 | "italic": false, 40 | "underline": false 41 | }, 42 | "String": { 43 | "text-color": "#CE9178", 44 | "background-color": null, 45 | "bold": false, 46 | "italic": false, 47 | "underline": false 48 | }, 49 | "ControlFlow": { 50 | "text-color": "#f0dfaf", 51 | "background-color": null, 52 | "bold": false, 53 | "italic": false, 54 | "underline": false 55 | }, 56 | "Operator": { 57 | "text-color": "#f0efd0", 58 | "background-color": null, 59 | "bold": false, 60 | "italic": false, 61 | "underline": false 62 | }, 63 | "Error": { 64 | "text-color": "#c3bf9f", 65 | "background-color": null, 66 | "bold": false, 67 | "italic": false, 68 | "underline": false 69 | }, 70 | "BaseN": { 71 | "text-color": "#dca3a3", 72 | "background-color": null, 73 | "bold": false, 74 | "italic": false, 75 | "underline": false 76 | }, 77 | "Alert": { 78 | "text-color": "#ffcfaf", 79 | "background-color": null, 80 | "bold": false, 81 | "italic": false, 82 | "underline": false 83 | }, 84 | "Variable": { 85 | "text-color": null, 86 | "background-color": null, 87 | "bold": false, 88 | "italic": false, 89 | "underline": false 90 | }, 91 | "BuiltIn": { 92 | "text-color": null, 93 | "background-color": null, 94 | "bold": false, 95 | "italic": false, 96 | "underline": false 97 | }, 98 | "Extension": { 99 | "text-color": null, 100 | "background-color": null, 101 | "bold": false, 102 | "italic": false, 103 | "underline": false 104 | }, 105 | "Preprocessor": { 106 | "text-color": "#ffcfaf", 107 | "background-color": null, 108 | "bold": true, 109 | "italic": false, 110 | "underline": false 111 | }, 112 | "Information": { 113 | "text-color": "#7f9f7f", 114 | "background-color": null, 115 | "bold": true, 116 | "italic": false, 117 | "underline": false 118 | }, 119 | "VerbatimString": { 120 | "text-color": "#CE9178", 121 | "background-color": null, 122 | "bold": false, 123 | "italic": false, 124 | "underline": false 125 | }, 126 | "Warning": { 127 | "text-color": "#7f9f7f", 128 | "background-color": null, 129 | "bold": true, 130 | "italic": false, 131 | "underline": false 132 | }, 133 | "Documentation": { 134 | "text-color": "#7f9f7f", 135 | "background-color": null, 136 | "bold": false, 137 | "italic": false, 138 | "underline": false 139 | }, 140 | "Import": { 141 | "text-color": null, 142 | "background-color": null, 143 | "bold": false, 144 | "italic": false, 145 | "underline": false 146 | }, 147 | "Char": { 148 | "text-color": "#dca3a3", 149 | "background-color": null, 150 | "bold": false, 151 | "italic": false, 152 | "underline": false 153 | }, 154 | "DataType": { 155 | "text-color": "#dfdfbf", 156 | "background-color": null, 157 | "bold": false, 158 | "italic": false, 159 | "underline": false 160 | }, 161 | "Float": { 162 | "text-color": "#c0bed1", 163 | "background-color": null, 164 | "bold": false, 165 | "italic": false, 166 | "underline": false 167 | }, 168 | "Comment": { 169 | "text-color": "#7f9f7f", 170 | "background-color": null, 171 | "bold": false, 172 | "italic": false, 173 | "underline": false 174 | }, 175 | "CommentVar": { 176 | "text-color": "#7f9f7f", 177 | "background-color": null, 178 | "bold": true, 179 | "italic": false, 180 | "underline": false 181 | }, 182 | "Constant": { 183 | "text-color": "#dca3a3", 184 | "background-color": null, 185 | "bold": true, 186 | "italic": false, 187 | "underline": false 188 | }, 189 | "SpecialChar": { 190 | "text-color": "#dca3a3", 191 | "background-color": null, 192 | "bold": false, 193 | "italic": false, 194 | "underline": false 195 | }, 196 | "DecVal": { 197 | "text-color": "#dcdccc", 198 | "background-color": null, 199 | "bold": false, 200 | "italic": false, 201 | "underline": false 202 | }, 203 | "Keyword": { 204 | "text-color": "#D4D4D4", 205 | "background-color": null, 206 | "bold": false, 207 | "italic": false, 208 | "underline": false 209 | } 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /.assets/lint.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "MD013": false 3 | } -------------------------------------------------------------------------------- /.assets/template.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/.assets/template.pptx -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: 'Produce Presentation Content' 2 | on: 3 | push: 4 | paths: 5 | - 'talks/**' 6 | branches: 7 | - main 8 | jobs: 9 | build-pptx: 10 | name: 'Build PowerPoint Presentation' 11 | runs-on: ubuntu-latest 12 | container: 13 | image: seesharprun/pandoc-build 14 | steps: 15 | - name: 'Checkout Code' 16 | uses: actions/checkout@v2 17 | - name: 'Run Pandoc Builds' 18 | run: ls | grep '.md' | xargs basename -s '.md' | xargs -I % sh -c "pandoc %.md --standalone --slide-level=3 --reference-doc=../.assets/template.pptx --highlight-style=../.assets/code.theme --variable=monofont:'Consolas' --output %-v${{ github.run_number }}.pptx" 19 | working-directory: ./talks 20 | - name: 'Upload Presentation Artifacts' 21 | uses: actions/upload-artifact@v2 22 | with: 23 | name: presentations 24 | path: ./talks/*.pptx 25 | release-content: 26 | name: 'Create GitHub Release' 27 | runs-on: ubuntu-latest 28 | needs: [ build-pptx ] 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | steps: 32 | - name: 'Download Presentation Artifacts' 33 | uses: actions/download-artifact@v2 34 | with: 35 | name: presentations 36 | - name: 'Create GitHub Release' 37 | uses: softprops/action-gh-release@v1 38 | with: 39 | files: ./**/*.pptx 40 | tag_name: v${{ github.run_number }} 41 | name: Release V${{ github.run_number }} -------------------------------------------------------------------------------- /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: 'Validate Presentation Build' 2 | on: 3 | pull_request: 4 | branches: 5 | - main 6 | jobs: 7 | validate-markdown: 8 | name: 'Validate Markdown' 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: 'Checkout Code' 12 | uses: actions/checkout@v2 13 | - name: 'Lint Markdown' 14 | uses: nosborn/github-action-markdown-cli@v1.1.1 15 | with: 16 | config_file: '.assets/lint.config.json' 17 | files: '**/*.md' 18 | build-pptx: 19 | name: 'Build PowerPoint Presentation' 20 | runs-on: ubuntu-latest 21 | container: 22 | image: seesharprun/pandoc-build 23 | steps: 24 | - name: 'Checkout Code' 25 | uses: actions/checkout@v2 26 | - name: 'Run Pandoc Builds' 27 | run: ls | grep '.md' | xargs basename -s '.md' | xargs -I % sh -c "pandoc %.md --standalone --slide-level=3 --reference-doc=../.assets/template.pptx --highlight-style=../.assets/code.theme --variable=monofont:'Consolas' --output %-draft.pptx" 28 | working-directory: ./talks 29 | - name: 'Upload Presentation Artifacts' 30 | uses: actions/upload-artifact@v2 31 | with: 32 | name: presentations 33 | path: ./talks/*.pptx -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /* 2 | !.gitignore 3 | !license 4 | !readme.md 5 | !.github/ 6 | !.assets/ 7 | .assets/* 8 | !.assets/*.json 9 | !.assets/*.pptx 10 | !.assets/*.theme 11 | .assets/~$*.pptx 12 | !talks/ 13 | talks/* 14 | !talks/*.md 15 | !talks/media/ 16 | talks/media/* 17 | !talks/media/*.png 18 | !talks/media/*.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2020 Microsoft 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Community talks 2 | 3 | This repository is home to a collection of Azure presentations that you are free to use in any community event. The presentations are licensed under the [MIT License][license]. 4 | 5 | ## Lightning Talks 6 | 7 | Each lightning talk is designed to take ~15 minutes to present and includes 1-2 quick hands-on demos. Each talk consists of a Markdown file for source content and a PPTX file in the [latest GitHub release][release-latest]. Each talk also includes a link to a YouTube train-the-trainer video showing an example of the many ways you can deliver this content for your audience. 8 | 9 | | Talk | Markdown Source | PowerPoint Presentation | Train the Trainer Video | 10 | | :--- | ---: | ---: | ---: | 11 | | Host your web apps with Azure App Service | [app_service_web.md][talk-app_service_web-source] | [app_service_web.pptx][release-latest] | [YouTube][talk-app_service_web-video] | 12 | | The New Azure SDK for .NET | [azure_sdk_net.md][talk-azure_sdk_net-source] | [azure_sdk_net.pptx][release-latest] | [YouTube][talk-azure_sdk_net-video] 13 | | The New Azure SDK for JavaScript | [azure_sdk_js.md][talk-azure_sdk_js-source] | [azure_sdk_js.pptx][release-latest] | [YouTube][talk-azure_sdk_js-video] 14 | 15 | ## Contributing 16 | 17 | You can submit change requests, ideas and bugs using the [Issues][issues] tab here in the repository. You can also contribute new presentations or significant changes to existing presentations using the [Pull Request][pull_requests] tab. 18 | 19 | > **🙋 Need an example?** Use one of the existing presentations to see an example of the style and structure used to build our presentations in Markdown. The structure is based on the online [Pandoc slide show Markdown documentation][pandoc-guidance]. 20 | 21 | [issues]: ../../issues 22 | [license]: LICENSE 23 | [pull_requests]: ../../pulls 24 | [pandoc-guidance]: https://pandoc.org/MANUAL.html#slide-shows 25 | [release-latest]: ../../releases/latest 26 | [talk-app_service_web-source]: talks/app_service_web.md 27 | [talk-app_service_web-video]: https://youtube.com/microsoftdevradio 28 | [talk-azure_sdk_js-source]: talks/azure_sdk_js.md 29 | [talk-azure_sdk_js-video]: https://youtube.com/microsoftdevradio 30 | [talk-azure_sdk_net-source]: talks/azure_sdk_net.md 31 | [talk-azure_sdk_net-video]: https://youtube.com/microsoftdevradio 32 | -------------------------------------------------------------------------------- /talks/app_service_web.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Host your web apps with Azure App Service 3 | author: Presenter Name 4 | --- 5 | 6 | ## What is App Service❓ What are Web Apps❓ 7 | 8 | ### App Service 9 | 10 | :::::::::::::: {.columns} 11 | ::: {.column width="50%"} 12 | 13 | - HTTP-based service for _hosting web applications_ 14 | - Develop in your favorite server-side language including: 15 | - .NET 16 | - Java 17 | - Ruby 18 | - Node.js 19 | - Python 20 | - PHP 21 | - _Scale_ and _run_ applications with little to no friction 22 | 23 | ::: 24 | ::: {.column width="50%"} 25 | 26 | ![ ][images-app_services] 27 | 28 | ::: 29 | :::::::::::::: 30 | 31 | ::: notes 32 | 33 | App services supports many languages natively and can automatically build the code as part of the deployment process 34 | 35 | Scale up and out can happen both manually and automatically making it easier to achieve global scale 36 | 37 | Code is ran in a fully-managed production environment with automatic OS and framework patching 38 | 39 | ::: 40 | 41 | ### Code-based Web Apps 42 | 43 | :::::::::::::: {.columns} 44 | ::: {.column width="50%"} 45 | 46 | ![ ][images-oryx] 47 | 48 | ::: 49 | ::: {.column width="50%"} 50 | 51 | Deploy code to Web Apps 52 | 53 | - Deploy code directly from a _deployment source_ 54 | - GitHub 55 | - Azure Repos 56 | - OneDrive 57 | - Code is _built automatically_ using the Oryx ([github.com/microsoft/oryx][]) build system 58 | - You can configure _continuous deployment_ and use _deployment slots_ 59 | 60 | ::: 61 | :::::::::::::: 62 | 63 | ::: notes 64 | 65 | This was the original way to deploy to App Service Web Apps (using Kudu) 66 | 67 | When you deploy code, Oryx will detect the framework using built-in rules, and then perform a build 68 | 69 | It's trivial to configure automated deployment processes and deploy to slots other than your production slot 70 | 71 | ::: 72 | 73 | ### Container-based Web Apps 74 | 75 | :::::::::::::: {.columns} 76 | ::: {.column width="50%"} 77 | 78 | ![ ][images-docker] 79 | 80 | ::: 81 | ::: {.column width="50%"} 82 | 83 | Use Docker containers with Web Apps 84 | 85 | - Host applications using a _custom container_ from 86 | - Docker Hub 87 | - Azure Container Registry 88 | - GitHub Packages 89 | - Run _multi-container_ applications with _Docker Compose_ 90 | - Configure _continuous deployment_ from container registries 91 | 92 | ::: 93 | :::::::::::::: 94 | 95 | ::: notes 96 | 97 | If you already are invested in Docker, this is the far easier path 98 | 99 | You can isolate your application and dependencies from the software stack running in the Web App 100 | 101 | This is a great way to try out new programming frameworks prior to their typical availability 102 | 103 | This is also a great way to lock your application to a specific older framework 104 | 105 | ::: 106 | 107 | ## Demo: Deploying an App Service Web App from a container 108 | 109 | ::: notes 110 | 111 | 1. Use this link to generate a new GitHub repository using the [github.com/msusdev/example-next-web-app][] template: [github.com/msusdev/example-next-web-app/generate][]. 112 | 1. Use the [Azure Portal][azure-portal] to [open the "Create Web App" wizard][azure-create-web-app]. 113 | 1. In the **Basics** tab, perform the following actions: 114 | 1. Select any subscription, region, and resource group. 115 | 1. Give you web app an easily memorized unique name. 116 | 1. In the **Publish** section, select **Docker Container**. 117 | 1. In the **Operating System** section, select **Linux**. 118 | 1. Select a region that you will use for both demos in this presentation. 119 | 1. Leave the **App Service Plan** set to it's default option. 120 | 1. Select **Next: Docker**. 121 | 1. In the **Docker** tab, perform the following actions: 122 | 1. In the **Options** list, select **Single Container**. 123 | 1. In the **Image Source** list, select **Docker Hub**. 124 | 1. In the **Access Type** list, select **Public**. 125 | 1. In the **Image and tag** box, enter ``msusdev/webnext:20`` 126 | 1. Select **Review + create**. 127 | 1. In the **Review + create** tab, select **Create** to deploy the new Web App. 128 | 1. Wait for the deployment process to finish, then select **Go to resource**. 129 | 1. In the resource blade, select **Browse**. 130 | 1. Observe the deployed web application. 131 | 132 | ::: 133 | 134 | ## That's cool, how about the new Azure Static Web Apps❓ 135 | 136 | ### Azure Static Web Apps 137 | 138 | :::::::::::::: {.columns} 139 | ::: {.column width="50%"} 140 | 141 | _Build_ and _host_ static web applications 142 | 143 | - Uses Oryx (([github.com/microsoft/oryx][])) build engine 144 | - Built-in support for _authentication_ and _authorization_ 145 | - _Azure Functions_ ➡️ APIs 146 | - _GitHub Actions_ ➡️ CI/CD 147 | 148 | ::: 149 | ::: {.column width="50%"} 150 | 151 | ![ ][images-static_web_apps] 152 | 153 | ::: 154 | :::::::::::::: 155 | 156 | ::: notes 157 | 158 | New service focused on the specific needs of JavaScript-based static web applications 159 | 160 | Ideal for frameworks like Angular, React, Svelte, Vue, or Blazor 161 | 162 | Typically, these frameworks often required a server-side app to serve content 163 | 164 | Build process is powered by Oryx 165 | 166 | Integrated authentication with flexible roles 167 | 168 | API endpoints are serverless and powered by Azure Functions 169 | 170 | ::: 171 | 172 | ### Static Web App breakdown 173 | 174 | ![ ][images-static_web_apps_breakdown] 175 | 176 | ::: notes 177 | 178 | Workflow modeled after common daily workflow for developers 179 | 180 | Workflow focused on typical GitHub interactions 181 | 182 | Upon creation, Azure Static Web Apps creates a GitHub Actions workflow 183 | 184 | YAML file is added to ``.github/workflows`` folder 185 | 186 | Application is built and deployed to Azure on commits and pull requests to watched branches 187 | 188 | ::: 189 | 190 | ### Github Action 191 | 192 | :::::::::::::: {.columns} 193 | ::: {.column width="50%"} 194 | 195 | _Static Web Apps Deploy_ GitHub Action 196 | 197 | - Used by Azure Static Web Apps to automate deployment from GitHub 198 | - You can use directly in any of your own workflows 199 | - Open-source on GitHub ([github.com/azure/static-web-apps-deploy][]) 200 | 201 | ::: 202 | ::: {.column width="50%"} 203 | 204 | ![ ][images-github] 205 | 206 | ::: 207 | :::::::::::::: 208 | 209 | ### Example Github Actions workflow YAML 210 | 211 | ```yaml 212 | - uses: "Azure/static-web-apps-deploy@v0.0.1-preview" 213 | with: 214 | azure_static_web_apps_api_token: "${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}" 215 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 216 | action: "upload" 217 | app_location: "/" 218 | api_location: "api" 219 | app_artifact_location: "out" 220 | ``` 221 | 222 | ::: notes 223 | 224 | GitHub action is still in preview 225 | 226 | Action uses a token that's automatically saved to the repo to connect to Static Web Apps 227 | 228 | Action specifies the location of the build artifacts, application root, and API 229 | 230 | ::: 231 | 232 | ## Demo: Deploying an Azure Static Web App from code on GitHub 233 | 234 | ::: notes 235 | 236 | 1. Use the [Azure Portal][azure-portal] to [open the "Create Static Web App (Preview)" wizard][azure-create-static-web-app]. 237 | 1. In the **Basics** tab, perform the following actions: 238 | 1. Select any subscription. 239 | 1. Select the same resource group as you used for the previous demo. 240 | 1. Give you static web app an easily memorized unique name. 241 | 1. Select any region. 242 | 1. Sign in to GitHub using the same account that you use to generate your new repository. Authorize permission to access your account and organization\[s\]. 243 | 1. Select the **Organization** and **Repository** list options that match where you generated your new repo. 244 | 1. Select the **main** branch. 245 | 1. In the **Build Presets** list, select **Custom**. 246 | 1. In the **App location** box, enter **/**. 247 | 1. In the **Api location** box, enter **api**. 248 | 1. In the **App artifact location** box, enter **out**. 249 | 1. Select **Review + create**. 250 | 1. In the **Review + create** tab, select **Create** to deploy the new Web App. 251 | 1. Wait for the deployment process to finish, then select **Go to resource**. 252 | 1. In the resource blade, select **Browse**. 253 | 1. Observe the deployed web application. 254 | 255 | ::: 256 | 257 | ## Wrapping up 258 | 259 | ### Review 260 | 261 | App Service 262 | 263 | - Web Apps 264 | - Container-based 265 | - Code-based (Oryx) 266 | 267 | Static Web Apps 268 | 269 | - Site content, Function, static content 270 | - GitHub Actions 271 | 272 | ::: notes 273 | 274 | Emphasize the difference between Web Apps and Static Web Apps 275 | 276 | Talk about some of the things you saw in the demos 277 | 278 | ::: 279 | 280 | ### Links 281 | 282 | Deck 283 | 284 | - [github.com/azuretechcommunity/talks][] 285 | 286 | Links 287 | 288 | - [github.com/microsoft/oryx][] 289 | - [github.com/azure/static-web-apps-deploy][] 290 | 291 | ::: notes 292 | 293 | The deck is open-source and attendees are welcome to view the deck to get images, links, and other content they may have missed 294 | 295 | ::: 296 | 297 | [azure-portal]: https://portal.azure.com/ 298 | [azure-create-web-app]: https://portal.azure.com/#create/microsoft.webSite 299 | [azure-create-static-web-app]: https://portal.azure.com/#create/microsoft.staticapp 300 | [images-app_services]: media/app_services.png 301 | [images-docker]: media/docker.png 302 | [images-github]: media/github.png 303 | [images-oryx]: media/oryx.png 304 | [images-static_web_apps]: media/static_web_apps.png 305 | [images-static_web_apps_breakdown]: media/static_web_apps_breakdown.png 306 | [github.com/azuretechcommunity/talks]: https://github.com/azuretechcommunity/talks 307 | [github.com/azure/static-web-apps-deploy]: https://github.com/azure/static-web-apps-deploy 308 | [github.com/microsoft/oryx]: https://github.com/microsoft/oryx 309 | [github.com/msusdev/example-next-web-app]: https://github.com/msusdev/example-next-web-app 310 | [github.com/msusdev/example-next-web-app/generate]: https://github.com/msusdev/example-next-web-app/generate 311 | -------------------------------------------------------------------------------- /talks/azure_sdk_js.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The New Azure SDK for JavaScript 3 | author: Presenter Name 4 | --- 5 | 6 | ## What is Going On❓ 7 | 8 | ### Current State of Play 9 | 10 | :::::::::::::: {.columns} 11 | ::: {.column width="50%"} 12 | 13 | Originally, each Azure team built their own JavaScript SDKs resulting in: 14 | 15 | - Many GitHub Repos Across Different Organizations 16 | - Incosistent Operating System Support 17 | - Unique Continuous Integration Processes and Platforms 18 | - Varying Levels of Language/Framework Support 19 | - Inconsistent Package Manager\[s\] Used 20 | - Undiscoverable API Paradigms 21 | 22 | ::: 23 | ::: {.column width="50%"} 24 | 25 | ![ ][images-sdk_current_state] 26 | 27 | ::: 28 | :::::::::::::: 29 | 30 | ::: notes 31 | 32 | Each Azure team built their SDKs at different points in their product's maturity. 33 | 34 | Language, operating system, and package manager support can vary wildly between SDKs. 35 | 36 | It's also very difficult to discover new APIs as each API uses a different paradigm, naming scheme, GitHub repo structure, and even location on GitHub. 37 | 38 | ::: 39 | 40 | ### The New Azure SDK 41 | 42 | :::::::::::::: {.columns} 43 | ::: {.column width="50%"} 44 | 45 | ![ ][images-sdk_new_state] 46 | 47 | ::: 48 | ::: {.column width="50%"} 49 | 50 | The new Azure SDK introduces common guidelines that is designed to provide: 51 | 52 | - Equitable Operating System Support 53 | - Predictable Language Support 54 | - Consistent Authentication Support 55 | - Universal Continuous Integration Process 56 | - Packages Available in Popular Package Managers 57 | 58 | ::: 59 | :::::::::::::: 60 | 61 | ::: notes 62 | 63 | This is the first step towards applying a common set of standards to all Azure SDKs 64 | 65 | Having a common model, makes it easier for new Azure teams to create a discoverable and predictable SDK 66 | 67 | Having a core framework in place makes it easier to add support for new languages, operating systems, and package managers in the future 68 | 69 | ::: 70 | 71 | ### The Azure SDKs on GitHub 72 | 73 | :::::::::::::: {.columns} 74 | ::: {.column width="50%"} 75 | 76 | - [azure/azure-sdk][github.com/azure/azure-sdk] 77 | - Documentation on guidelines and policies 78 | - **➡️ [azure/azure-sdk-for-js][github.com/azure/azure-sdk-for-js]** 79 | - **➡️ SDK for JavaScript** 80 | - [azure/azure-sdk-for-net][github.com/azure/azure-sdk-for-net] 81 | - SDK for .NET 82 | - [azure/azure-sdk-for-python][github.com/azure/azure-sdk-for-python] 83 | - SDK for Python 84 | - [azure/azure-sdk-for-java][github.com/azure/azure-sdk-for-java] 85 | - SDK for Java 86 | 87 | ::: 88 | ::: {.column width="50%"} 89 | 90 | ![ ][images-github] 91 | 92 | ::: 93 | :::::::::::::: 94 | 95 | ::: notes 96 | 97 | The [github.com/azure/azure-sdk][github.com/azure/azure-sdk] repository contains releases, documentation, and guidelines for all of the other repositories 98 | 99 | The .NET, **JavaScript**, Python, and Java repositories contain source code, samples, and documentation relevant to that language 100 | 101 | Each language repository contains SDK source code to access multiple Azure services in a predictable and consistent manner 102 | 103 | ::: 104 | 105 | ### Even More Azure SDKs on GitHub 106 | 107 | :::::::::::::: {.columns} 108 | ::: {.column width="50%"} 109 | 110 | - [github.com/azure/azure-sdk-for-ios][github.com/azure/azure-sdk-for-ios] 111 | - Client SDK for iOS Apps 112 | - [github.com/azure/azure-sdk-for-android][github.com/azure/azure-sdk-for-android] 113 | - Client SDK for Android Apps 114 | - [github.com/azure/azure-sdk-for-go][github.com/azure/azure-sdk-for-go] 115 | - SDK for Go 116 | - [github.com/azure/azure-sdk-for-cpp][github.com/azure/azure-sdk-for-cpp] 117 | - SDK for C++ 118 | - [github.com/azure/azure-sdk-for-c][github.com/azure/azure-sdk-for-c] 119 | - SDK for Embedded C 120 | 121 | ::: 122 | ::: {.column width="50%"} 123 | 124 | ![ ][images-github] 125 | 126 | ::: 127 | :::::::::::::: 128 | 129 | ::: notes 130 | 131 | The underlying guidelines and processes made it easier to add new languages 132 | 133 | Each language supports a growing amount of Azure services 134 | 135 | ::: 136 | 137 | ## Demo: Exploring the Azure SDK for JavaScript Repository 138 | 139 | ::: notes 140 | 141 | 1. Use this link to visit the Azure SDK for JavaScript GitHub repository: [github.com/azure/azure-sdk-for-js][]. 142 | 1. Review the contents of the **readme.md** file. 143 | 1. Navigate to the **samples** folder of the source code: [github.com/azure/azure-sdk-for-js/~/samples][] 144 | 1. Navigate to the **API documentation** page for the Azure SDK for JavaScript: [github.io/azure/azure-sdk-for-js][]. 145 | 1. Navigate to the **latest releases** page for the Azure SDK: [github.io/azure/azure-sdk/~/#javascript][] 146 | 1. Walk through the various Azure services that currently have a **preview** or **generally available** client library. 147 | 1. Navigate to the **Gitter community** for the Azure SDK for JavaScript: [gitter.im/azure/azure-sdk-for-js][]. 148 | 149 | ::: 150 | 151 | ## Why Build a New SDK❓ 152 | 153 | ### Design Paradigms 154 | 155 | **Developer productivity** is the core objective. The overall guidelines and each individual SDK is built around these paradigms: 156 | 157 | - **Idiomatic** 158 | - Each SDK feels **natural and conventional** to the target language 159 | - **Consistent** 160 | - SDKs are **consistent** across various languages and Azure services 161 | - **Approachable** 162 | - SDKs are **well documented** with the goal of getting developers started quickly 163 | - **Diagnosable** 164 | - SDKs feature **logging** and **discoverability** as core-level features 165 | - **Dependable** 166 | - SDKs are **stable** with a focus on compatibility for seamless upgrades 167 | 168 | ::: notes 169 | 170 | Building SDKs that model these paradigms can help increase developer productivity across all of Azure. 171 | 172 | The paradigms are a core part of the underlying guidelines that are used to design each individual SDK. 173 | 174 | Many existing SDKs required some rework to implement all five paradigms. 175 | 176 | ::: 177 | 178 | ### Old JavaScript SDK Example 179 | 180 | ```js 181 | var azure = require('azure-storage'); 182 | 183 | const connectionString = "UseDevelopmentStorage=true"; 184 | 185 | var client = azure.createBlobService(connectionString); 186 | ``` 187 | 188 | ::: notes 189 | 190 | **NPM Package**: [azure-storage][npmjs.com/azure-storage] 191 | 192 | ::: 193 | 194 | ### Old JavaScript SDK Example (cont.) 195 | 196 | ```js 197 | client.createContainerIfNotExists("files", {}, (error, result) => { 198 | 199 | // next steps 200 | 201 | }); 202 | ``` 203 | 204 | ::: notes 205 | 206 | To get a client, you need to use the **azure** constant and the **createBlobService** method 207 | 208 | Documentation and quickstarts aren't very consistent, so it can be difficult to discover all the different ways you can create a client 209 | 210 | API calls inconsistently support synchronous and asynchronous operations 211 | 212 | ::: 213 | 214 | ### New JavaScript SDK Example 215 | 216 | ```js 217 | const { BlobServiceClient } = require("@azure/storage-blob"); 218 | 219 | const connectionString = "UseDevelopmentStorage=true"; 220 | 221 | const client = BlobServiceClient.fromConnectionString(connectionString); 222 | ``` 223 | 224 | ::: notes 225 | 226 | **NPM Package**: [\@azure/storage-blob][npmjs.com/azure/storage-blob] 227 | 228 | ::: 229 | 230 | ### New JavaScript SDK Example (cont.) 231 | 232 | ```js 233 | async function run() { 234 | 235 | const container = client.getContainerClient("files"); 236 | 237 | await container.createIfNotExists(); 238 | 239 | // next steps 240 | 241 | } 242 | 243 | run(); 244 | ``` 245 | 246 | ::: notes 247 | 248 | The new SDK supports both synchronous and asynchronous API calls consistently 249 | 250 | The new SDK uses the **promises** API for JavaScript 251 | 252 | The SDK also renames the classes to be consistent across languages while respecting each individual languages' idiomatic standards 253 | 254 | ::: 255 | 256 | ## Demo: Using the Azure SDK for JavaScript to Create a Container 257 | 258 | ::: notes 259 | 260 | > **Prerequisites**: *Ensure you have **Node.js v8.0.0** or higher installed.* 261 | 262 | 1. Open a new instance of **Visual Studio Code** in an empty folder. 263 | 1. If you have not already, install the [Azure Storage][visualstudio.com/ms-azuretools.vscode-azurestorage] extension for Visual Studio Code. 264 | 1. If you have not already, install the [Azurite][visualstudio.com/azurite.azurite] extension for Visual Studio Code. 265 | 1. Open a new **terminal** and perform the following actions: 266 | 1. Initialize a new **package.json** file: 267 | 268 | ```sh 269 | npm init --force 270 | ``` 271 | 272 | 1. Install the **[\@azure/storage-blob][npmjs.com/azure/storage-blob]** package from NPM: 273 | 274 | ```sh 275 | npm install @azure/storage-blob --save 276 | ``` 277 | 278 | 1. Create a new file named **index.js** and open it in the editor. 279 | 1. Import the **BlobServiceClient** type: 280 | 281 | ```js 282 | const { BlobServiceClient } = require("@azure/storage-blob"); 283 | ``` 284 | 285 | 1. Create and invoke a new asynchronous function named **run**: 286 | 287 | ```js 288 | async function run() { 289 | 290 | } 291 | 292 | run(); 293 | ``` 294 | 295 | 1. Within the **run** function, create a constant named **connectionString** with a value of **"UseDevelopmentStorage=true"**: 296 | 297 | ```js 298 | const connectionString = "UseDevelopmentStorage=true"; 299 | ``` 300 | 301 | 1. Still within the **run** function, create a constant named **client** that stores the result of invoking the **fromConnectionString** method of the **BlobServiceClient** constant passing in the **connectionString** constant as a constructor parameter: 302 | 303 | ```js 304 | const client = BlobServiceClient.fromConnectionString(connectionString); 305 | ``` 306 | 307 | 1. Still within the **run** function, create a constant named **container** that stores the result of invoking the **getContainerClient** method of the **client** constant passing in the value **"files"** constant as a parameter: 308 | 309 | ```js 310 | const container = client.getContainerClient("files"); 311 | ``` 312 | 313 | 1. Still within the **run** function, invoke the **createIfNotExists** method of the **container** constant: 314 | 315 | ```js 316 | await container.createIfNotExists(); 317 | ``` 318 | 319 | 1. **Save** your changes to the **index.js** file. 320 | 321 | 1. **Start** the Azurite emulator using either the option on the **status bar** or the ``Azurite: Start`` command in the **Command Palette**. 322 | 323 | 1. In the **Activity Bar**, navigate to the **Azure** option. 324 | 325 | 1. In the document tree within the **Azure** pane, expand the following nodes: **Storage** => **Attached Storage** => **Local Emulator** => **Blob Containers**. 326 | 327 | 1. Open a new **terminal** and run the Node.js application: 328 | 329 | ```sh 330 | node index.js 331 | ``` 332 | 333 | 1. Back in the **Azure** pane, open the context menu for the **Blob Containers** node and then select **Refresh**. 334 | 335 | 1. Observe the newly created **files** container in the document tree. 336 | 337 | ::: 338 | 339 | [images-github]: media/github.png 340 | [images-sdk_current_state]: media/sdk_current_state.png 341 | [images-sdk_new_state]: media/sdk_new_state.png 342 | [github.com/azure/azure-sdk]: https://github.com/azure/azure-sdk 343 | [github.com/azure/azure-sdk-for-android]: https://github.com/azure/azure-sdk-for-android 344 | [github.com/azure/azure-sdk-for-c]: https://github.com/azure/azure-sdk-for-c 345 | [github.com/azure/azure-sdk-for-cpp]: https://github.com/azure/azure-sdk-for-cpp 346 | [github.com/azure/azure-sdk-for-go]: https://github.com/azure/azure-sdk-for-go 347 | [github.com/azure/azure-sdk-for-ios]: https://github.com/azure/azure-sdk-for-ios 348 | [github.com/azure/azure-sdk-for-java]: https://github.com/azure/azure-sdk-for-java 349 | [github.com/azure/azure-sdk-for-js]: https://github.com/azure/azure-sdk-for-js 350 | [github.com/azure/azure-sdk-for-js/~/samples]: https://github.com/Azure/azure-sdk-for-js/tree/master/samples 351 | [github.com/azure/azure-sdk-for-net]: https://github.com/azure/azure-sdk-for-net 352 | [github.com/azure/azure-sdk-for-python]: https://github.com/azure/azure-sdk-for-python 353 | [github.io/azure/azure-sdk/~/#javascript]: https://azure.github.io/azure-sdk/#javascript 354 | [github.io/azure/azure-sdk-for-js]: https://azure.github.io/azure-sdk-for-js/ 355 | [gitter.im/azure/azure-sdk-for-js]: https://gitter.im/Azure/azure-sdk-for-js 356 | [npmjs.com/azure/storage-blob]: https://www.npmjs.com/package/@azure/storage-blob 357 | [npmjs.com/azure-storage]: https://www.npmjs.com/package/azure-storage 358 | [visualstudio.com/azurite.azurite]: https://marketplace.visualstudio.com/items?itemName=Azurite.azurite 359 | [visualstudio.com/ms-azuretools.vscode-azurestorage]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage 360 | -------------------------------------------------------------------------------- /talks/azure_sdk_net.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The New Azure SDK for .NET 3 | author: Presenter Name 4 | --- 5 | 6 | ## What is Going On❓ 7 | 8 | ### Current State of Play 9 | 10 | :::::::::::::: {.columns} 11 | ::: {.column width="50%"} 12 | 13 | Originally, each Azure team built their own .NET SDKs resulting in: 14 | 15 | - Many GitHub Repos Across Different Organizations 16 | - Incosistent Operating System Support 17 | - Unique Continuous Integration Processes and Platforms 18 | - Varying Levels of Language/Framework Support 19 | - Inconsistent Package Manager\[s\] Used 20 | - Undiscoverable API Paradigms 21 | 22 | ::: 23 | ::: {.column width="50%"} 24 | 25 | ![ ][images-sdk_current_state] 26 | 27 | ::: 28 | :::::::::::::: 29 | 30 | ::: notes 31 | 32 | Each Azure team built their SDKs at different points in their product's maturity 33 | 34 | Language, operating system, and package manager support can vary wildly between SDKs 35 | 36 | It's also very difficult to discover new APIs as each API uses a different paradigm, naming scheme, GitHub repo structure, and even location on GitHub 37 | 38 | ::: 39 | 40 | ### The New Azure SDK 41 | 42 | :::::::::::::: {.columns} 43 | ::: {.column width="50%"} 44 | 45 | ![ ][images-sdk_new_state] 46 | 47 | ::: 48 | ::: {.column width="50%"} 49 | 50 | The new Azure SDK introduces common guidelines that is designed to provide: 51 | 52 | - Equitable Operating System Support 53 | - Predictable Language Support 54 | - Consistent Authentication Support 55 | - Universal Continuous Integration Process 56 | - Packages Available in Popular Package Managers 57 | 58 | ::: 59 | :::::::::::::: 60 | 61 | ::: notes 62 | 63 | This is the first step towards applying a common set of standards to all Azure SDKs 64 | 65 | Having a common model, makes it easier for new Azure teams to create a discoverable and predictable SDK 66 | 67 | Having a core framework in place makes it easier to add support for new languages, operating systems, and package managers in the future 68 | 69 | ::: 70 | 71 | ### The Azure SDKs on GitHub 72 | 73 | :::::::::::::: {.columns} 74 | ::: {.column width="50%"} 75 | 76 | - [azure/azure-sdk][github.com/azure/azure-sdk] 77 | - Documentation on guidelines and policies 78 | - **➡️ [azure/azure-sdk-for-net][github.com/azure/azure-sdk-for-net]** 79 | - **➡️ SDK for .NET** 80 | - [azure/azure-sdk-for-js][github.com/azure/azure-sdk-for-js] 81 | - SDK for JavaScript 82 | - [azure/azure-sdk-for-python][github.com/azure/azure-sdk-for-python] 83 | - SDK for Python 84 | - [azure/azure-sdk-for-java][github.com/azure/azure-sdk-for-java] 85 | - SDK for Java 86 | 87 | ::: 88 | ::: {.column width="50%"} 89 | 90 | ![ ][images-github] 91 | 92 | ::: 93 | :::::::::::::: 94 | 95 | ::: notes 96 | 97 | The [github.com/azure/azure-sdk][github.com/azure/azure-sdk] repository contains releases, documentation, and guidelines for all of the other repositories 98 | 99 | The **.NET**, JavaScript, Python, and Java repositories contain source code, samples, and documentation relevant to that language 100 | 101 | Each language repository contains SDK source code to access multiple Azure services in a predictable and consistent manner 102 | 103 | ::: 104 | 105 | ### Even More Azure SDKs on GitHub 106 | 107 | :::::::::::::: {.columns} 108 | ::: {.column width="50%"} 109 | 110 | - [github.com/azure/azure-sdk-for-ios][github.com/azure/azure-sdk-for-ios] 111 | - Client SDK for iOS Apps 112 | - [github.com/azure/azure-sdk-for-android][github.com/azure/azure-sdk-for-android] 113 | - Client SDK for Android Apps 114 | - [github.com/azure/azure-sdk-for-go][github.com/azure/azure-sdk-for-go] 115 | - SDK for Go 116 | - [github.com/azure/azure-sdk-for-cpp][github.com/azure/azure-sdk-for-cpp] 117 | - SDK for C++ 118 | - [github.com/azure/azure-sdk-for-c][github.com/azure/azure-sdk-for-c] 119 | - SDK for Embedded C 120 | 121 | ::: 122 | ::: {.column width="50%"} 123 | 124 | ![ ][images-github] 125 | 126 | ::: 127 | :::::::::::::: 128 | 129 | ::: notes 130 | 131 | The underlying guidelines and processes made it easier to add new languages 132 | 133 | Each language supports a growing amount of Azure services 134 | 135 | ::: 136 | 137 | ## Demo: Exploring the Azure SDK for .NET Repository 138 | 139 | ::: notes 140 | 141 | 1. Use this link to visit the Azure SDK for .NET GitHub repository: [github.com/azure/azure-sdk-for-net][]. 142 | 1. Review the contents of the **readme.md** file. 143 | 1. Navigate to the **samples** folder of the source code: [github.com/azure/azure-sdk-for-net/~/samples][] 144 | 1. Navigate to the **API documentation** page for the Azure SDK for .NET: [github.io/azure/azure-sdk-for-net][]. 145 | 1. Navigate to the **latest releases** page for the Azure SDK: [github.io/azure/azure-sdk/~/#net][] 146 | 1. Walk through the various Azure services that currently have a **preview** or **generally available** client library. 147 | 1. Navigate to the **Gitter community** for the Azure SDK for .NET: [gitter.im/azure/azure-sdk-for-net][]. 148 | 149 | ::: 150 | 151 | ## Why Build a New SDK❓ 152 | 153 | ### Design Paradigms 154 | 155 | **Developer productivity** is the core objective. The overall guidelines and each individual SDK is built around these paradigms: 156 | 157 | - **Idiomatic** 158 | - Each SDK feels **natural and conventional** to the target language 159 | - **Consistent** 160 | - SDKs are **consistent** across various languages and Azure services 161 | - **Approachable** 162 | - SDKs are **well documented** with the goal of getting developers started quickly 163 | - **Diagnosable** 164 | - SDKs feature **logging** and **discoverability** as core-level features 165 | - **Dependable** 166 | - SDKs are **stable** with a focus on compatibility for seamless upgrades 167 | 168 | ::: notes 169 | 170 | Building SDKs that model these paradigms can help increase developer productivity across all of Azure. 171 | 172 | The paradigms are a core part of the underlying guidelines that are used to design each individual SDK. 173 | 174 | Many existing SDKs required some rework to implement all five paradigms. 175 | 176 | ::: 177 | 178 | ### Old .NET SDK Example 179 | 180 | ```csharp 181 | using Microsoft.Azure.Storage; 182 | using Microsoft.Azure.Storage.Blob; 183 | 184 | string connectionString = "UseDevelopmentStorage=true"; 185 | 186 | CloudStorageAccount account = CloudStorageAccount.Parse(connectionString); 187 | 188 | CloudBlobClient client = account.CreateCloudBlobClient(); 189 | ``` 190 | 191 | ::: notes 192 | 193 | **NuGet Package**: [Microsoft.Azure.Storage.Blob][nuget.org/microsoft.azure.storage.blob] 194 | 195 | ::: 196 | 197 | ### Old .NET SDK Example (cont.) 198 | 199 | ```csharp 200 | CloudBlobContainer container = client.GetContainerReference("files"); 201 | 202 | container.CreateIfNotExists(); 203 | ``` 204 | 205 | ::: notes 206 | 207 | To get a client, you need to create **CloudStorageAccount** and **CloudBlobClient** instances 208 | 209 | API calls inconsistently support synchronous and asynchronous operations 210 | 211 | ::: 212 | 213 | ### New .NET SDK Example 214 | 215 | ```csharp 216 | using Azure.Storage.Blobs; 217 | 218 | string connectionString = "UseDevelopmentStorage=true"; 219 | 220 | BlobServiceClient client = new BlobServiceClient(connectionString); 221 | ``` 222 | 223 | ::: notes 224 | 225 | **NuGet Package**: [Azure.Storage.Blobs][nuget.org/azure.storage.blobs] 226 | 227 | ::: 228 | 229 | ### New .NET SDK Example (cont.) 230 | 231 | ```csharp 232 | BlobContainerClient container = client.GetBlobContainerClient("files"); 233 | 234 | await container.CreateIfNotExistsAsync(); 235 | ``` 236 | 237 | ::: notes 238 | 239 | The new SDK supports both synchronous and asynchronous API calls consistently 240 | 241 | The SDK also renames the classes to be consistent across languages while respecting each individual languages' idiomatic standards 242 | 243 | ::: 244 | 245 | ## Demo: Using the Azure SDK for .NET to Create a Container 246 | 247 | ::: notes 248 | 249 | > **Prerequisites**: *Ensure you have **.NET 5** or higher installed.* 250 | 251 | 1. Open a new instance of **Visual Studio Code** in an empty folder. 252 | 1. If you have not already, install the [Azure Storage][visualstudio.com/ms-azuretools.vscode-azurestorage] extension for Visual Studio Code. 253 | 1. If you have not already, install the [Azurite][visualstudio.com/azurite.azurite] extension for Visual Studio Code. 254 | 1. Open a new **terminal** and perform the following actions: 255 | 1. Install the [Preview.CSharp.Templates][nuget.org/preview.csharp.templates] project template package from NuGet: 256 | 257 | ```sh 258 | dotnet new --install Preview.CSharp.Templates 259 | ``` 260 | 261 | 1. Initialize an empty **[top-level program][docs.com/dotnet/csharp/tutorials/exploration/top-level-statements]** using the **dotnet** CLI: 262 | 263 | ```sh 264 | dotnet new script-empty 265 | ``` 266 | 267 | 1. Install the **[Azure.Storage.Blobs][nuget.org/azure.storage.blobs]** package from NPM: 268 | 269 | ```sh 270 | dotnet add package Azure.Storage.Blobs 271 | ``` 272 | 273 | 1. Open the **Program.cs** file in the editor. 274 | 1. Create a using directive for the **Azure.Storage.Blobs** namespace: 275 | 276 | ```js 277 | using Azure.Storage.Blobs; 278 | ``` 279 | 280 | 1. Create a variable named **connectionString** of type **string** with a value of **"UseDevelopmentStorage=true"**: 281 | 282 | ```js 283 | string connectionString = "UseDevelopmentStorage=true"; 284 | ``` 285 | 286 | 1. Create a variable named **client** of type **BlobServiceClient** that stores the result of invoking the constructor of the **BlobServiceClient** class passing in the **connectionString** variable as a parameter: 287 | 288 | ```js 289 | BlobServiceClient client = new BlobServiceClient(connectionString); 290 | ``` 291 | 292 | 1. Create a variable named **container** of type **BlobContainerClient** that stores the result of invoking the **GetBlobContainerClient** method of the **client** variable passing in the value **"files"** as a parameter: 293 | 294 | ```js 295 | BlobContainerClient container = client.GetBlobContainerClient("files"); 296 | ``` 297 | 298 | 1. Asynchronously invoke the **CreateIfNotExistsAsync** method of the **container** variable: 299 | 300 | ```js 301 | await container.CreateIfNotExistsAsync(); 302 | ``` 303 | 304 | 1. **Save** your changes to the **Program.cs** file. 305 | 306 | 1. **Start** the Azurite emulator using either the option on the **status bar** or the ``Azurite: Start`` command in the **Command Palette**. 307 | 308 | 1. In the **Activity Bar**, navigate to the **Azure** option. 309 | 310 | 1. In the document tree within the **Azure** pane, expand the following nodes: **Storage** => **Attached Storage** => **Local Emulator** => **Blob Containers**. 311 | 312 | 1. Open a new **terminal** and run the .NET application: 313 | 314 | ```sh 315 | dotnet run 316 | ``` 317 | 318 | 1. Back in the **Azure** pane, open the context menu for the **Blob Containers** node and then select **Refresh**. 319 | 320 | 1. Observe the newly created **files** container in the document tree. 321 | 322 | ::: 323 | 324 | [images-github]: media/github.png 325 | [images-sdk_current_state]: media/sdk_current_state.png 326 | [images-sdk_new_state]: media/sdk_new_state.png 327 | [docs.com/dotnet/csharp/tutorials/exploration/top-level-statements]: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/exploration/top-level-statements 328 | [github.com/azure/azure-sdk]: https://github.com/azure/azure-sdk 329 | [github.com/azure/azure-sdk-for-android]: https://github.com/azure/azure-sdk-for-android 330 | [github.com/azure/azure-sdk-for-c]: https://github.com/azure/azure-sdk-for-c 331 | [github.com/azure/azure-sdk-for-cpp]: https://github.com/azure/azure-sdk-for-cpp 332 | [github.com/azure/azure-sdk-for-go]: https://github.com/azure/azure-sdk-for-go 333 | [github.com/azure/azure-sdk-for-ios]: https://github.com/azure/azure-sdk-for-ios 334 | [github.com/azure/azure-sdk-for-java]: https://github.com/azure/azure-sdk-for-java 335 | [github.com/azure/azure-sdk-for-js]: https://github.com/azure/azure-sdk-for-js 336 | [github.com/azure/azure-sdk-for-net]: https://github.com/azure/azure-sdk-for-net 337 | [github.com/azure/azure-sdk-for-net/~/samples]: https://github.com/Azure/azure-sdk-for-net/tree/master/samples 338 | [github.com/azure/azure-sdk-for-python]: https://github.com/azure/azure-sdk-for-python 339 | [github.io/azure/azure-sdk/~/#net]: https://azure.github.io/azure-sdk/#net 340 | [github.io/azure/azure-sdk-for-net]: https://azure.github.io/azure-sdk-for-net/ 341 | [gitter.im/azure/azure-sdk-for-net]: https://gitter.im/Azure/azure-sdk-for-net 342 | [nuget.org/microsoft.azure.storage.blob]: https://www.nuget.org/packages/Microsoft.Azure.Storage.Blob/ 343 | [nuget.org/azure.storage.blobs]: https://www.nuget.org/packages/Azure.Storage.Blobs/ 344 | [nuget.org/preview.csharp.templates]: https://www.nuget.org/packages/Preview.CSharp.Templates/ 345 | -------------------------------------------------------------------------------- /talks/media/app_services.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/app_services.png -------------------------------------------------------------------------------- /talks/media/docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/docker.png -------------------------------------------------------------------------------- /talks/media/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/github.png -------------------------------------------------------------------------------- /talks/media/oryx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/oryx.png -------------------------------------------------------------------------------- /talks/media/sdk_current_state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/sdk_current_state.png -------------------------------------------------------------------------------- /talks/media/sdk_new_state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/sdk_new_state.png -------------------------------------------------------------------------------- /talks/media/static_web_apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/static_web_apps.png -------------------------------------------------------------------------------- /talks/media/static_web_apps_breakdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzureTechCommunity/Lightning-Talks/e810e6232ca45ee2228b58c221a1c9b440f2076c/talks/media/static_web_apps_breakdown.png --------------------------------------------------------------------------------