Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

今すぐ始めるCloud Foundry #hackt #hackt_k

6.383 Aufrufe

Veröffentlicht am

今すぐ始めるCloud Foundry
Hacker Tackle

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

今すぐ始めるCloud Foundry #hackt #hackt_k

  1. 1. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry Toshiaki Maki (@making) 2016-09-10 Hacker Tackle #hackt #hackt_k
  2. 2. © 2016 Pivotal Software, Inc. All rights reserved. Who am I ? • Toshiaki Maki (@making) http://blog.ik.am • Sr. Solutions Architect @Pivotal • Spring Framework enthusiast bit.ly/hajiboot2
  3. 3. © 2016 Pivotal Software, Inc. All rights reserved. Who am I ? • Toshiaki Maki (@making) http://blog.ik.am • Sr. Solutions Architect @Pivotal • Spring Framework enthusiast bit.ly/hajiboot2
  4. 4. © 2016 Pivotal Software, Inc. All rights reserved. •Cloud Foundry •Cloud Foundry •Cloud Foundry •Cloud Foundry •Cloud Foundry https://github.com/making/hacker-tackle-demo
  5. 5. © 2016 Pivotal Software, Inc. All rights reserved. •Cloud Foundry •Cloud Foundry •Cloud Foundry •Cloud Foundry •Cloud Foundry Cloud Foundry https://github.com/making/hacker-tackle-demo
  6. 6. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry
  7. 7. © 2016 Pivotal Software, Inc. All rights reserved. • PaaS •Cloud Foundry Foundation • / https://github.com/cloudfoundry
  8. 8. © 2016 Pivotal Software, Inc. All rights reserved. • PaaS •Cloud Foundry Foundation • / https://github.com/cloudfoundry Cloud Native Platform
  9. 9. © 2016 Pivotal Software, Inc. All rights reserved. • • • • / • •
  10. 10. © 2016 Pivotal Software, Inc. All rights reserved. • • • • / • •
  11. 11. © 2016 Pivotal Software, Inc. All rights reserved. • • • • / • • !!!!
  12. 12. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry • (DNS) • • • • • •
  13. 13. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry everywhere Cloud Foundry Cloud Foundry OSS Pivotal Cloud Foundry on Private Cloud on Public Cloud
  14. 14. Structure Spring Cloud Spring Boot Cloud Foundry BOSH AWSVMWareOpenStack Application Framework Runtime Platform Infrastructure Automation Infrastructure Azure Contract: Cloud Provider Interface Contract: 12 Factor App Contract: BOSH Release Java EE GCP
  15. 15. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry
  16. 16. © 2016 Pivotal Software, Inc. All rights reserved. $ cf login -a https://api.local.pcfdev.io --skip-ssl-validation $ cf login -a https://api.run.pivotal.io $ cf login -a https://api.system.your-cf.example.com PCF Dev Pivotal Web Services Pivotal Cloud Foundry https://github.com/cloudfoundry/cli/releases
  17. 17. © 2016 Pivotal Software, Inc. All rights reserved. cf push
  18. 18. © 2016 Pivotal Software, Inc. All rights reserved. cf push
  19. 19. © 2016 Pivotal Software, Inc. All rights reserved. $ cf push hello -p hello.jar $ cf push hello glide godep app nameSpring Boot
  20. 20. © 2016 Pivotal Software, Inc. All rights reserved. $ cf push hello -p hello.jar $ cf push hello glide godep app nameSpring Boot func main() { http.HandleFunc("/", func(w http.ResponseWriter , r *http.Request) { fmt.Fprint(w, "Hello World!") }) http.ListenAndServe(":"+os.Getenv("PORT"), nil); }
  21. 21. © 2016 Pivotal Software, Inc. All rights reserved. Hello World Host name (subdomain) =app name domain name -n
  22. 22. © 2016 Pivotal Software, Inc. All rights reserved. cf scale
  23. 23. © 2016 Pivotal Software, Inc. All rights reserved. cf scale
  24. 24. © 2016 Pivotal Software, Inc. All rights reserved. $ cf scale app-name -i 4 $ cf scale app-name -m 2g
  25. 25. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Demo https://www.youtube.com/watch?v=_TpvipmGisc
  26. 26. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Deploying an Application IaaS Cloud Foundry Configure Firewall Configure Service Connectivity Configure SSL Configure Load Balancer Deploy Application Install Application Runtime Provision a VM cf push
  27. 27. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Scaling an Application IaaS Cloud Foundry Configure Firewall Configure Service Connectivity Configure SSL Configure Load Balancer Deploy Application Install Application Runtime Provision a VM cf scale
  28. 28. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Scaling an Application IaaS Cloud Foundry Configure Firewall Configure Service Connectivity Configure SSL Configure Load Balancer Deploy Application Install Application Runtime Provision a VM cf scale !!
  29. 29. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry
  30. 30. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry http://docs.cloudfoundry.org/concepts/diego/diego-architecture.html
  31. 31. © 2016 Pivotal Software, Inc. All rights reserved. Architecture (Super Simplified) Cloud Controller Blobstore DB Cell cf push http://... CC API Containers Router
  32. 32. © 2016 Pivotal Software, Inc. All rights reserved. Architecture (Super Simplified) Cloud Controller Blobstore DB Cell cf push http://... CC API Containers Router RunC
  33. 33. © 2016 Pivotal Software, Inc. All rights reserved. ! Upload Cloud Controller Blobstore DB Cell cf push CC API Router App
  34. 34. © 2016 Pivotal Software, Inc. All rights reserved. ! Upload Cloud Controller Blobstore DB Cell cf push CC API Router App
  35. 35. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router
  36. 36. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router
  37. 37. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router Runtime App JRE, App Server etc..
  38. 38. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router Runtime App
  39. 39. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router Runtime App Droplet
  40. 40. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router Upload
  41. 41. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router Upload
  42. 42. © 2016 Pivotal Software, Inc. All rights reserved. " Stage Cloud Controller Blobstore DB Cell cf push CC API Router
  43. 43. © 2016 Pivotal Software, Inc. All rights reserved. # Start Cloud Controller Blobstore DB Cell cf push CC API Router
  44. 44. © 2016 Pivotal Software, Inc. All rights reserved. # Start Cloud Controller Blobstore DB Cell cf push CC API Router
  45. 45. © 2016 Pivotal Software, Inc. All rights reserved. # Start Cloud Controller Blobstore DB Cell cf push CC API Router
  46. 46. © 2016 Pivotal Software, Inc. All rights reserved. # Start Cloud Controller Blobstore DB Cell cf push CC API Router
  47. 47. © 2016 Pivotal Software, Inc. All rights reserved. # Start Cloud Controller Blobstore DB Cell http://… CC API Router
  48. 48. © 2016 Pivotal Software, Inc. All rights reserved. Scale out Cloud Controller Blobstore DB Cell http://… CC API Router cf scale
  49. 49. © 2016 Pivotal Software, Inc. All rights reserved. Scale out Cloud Controller Blobstore DB Cell http://… CC API Router cf scale
  50. 50. © 2016 Pivotal Software, Inc. All rights reserved. Scale out Cloud Controller Blobstore DB Cell http://… CC API Router cf scale
  51. 51. © 2016 Pivotal Software, Inc. All rights reserved. Scale out Cloud Controller Blobstore DB Cell http://… CC API Router cf scale
  52. 52. © 2016 Pivotal Software, Inc. All rights reserved. Scale out Cloud Controller Blobstore DB Cell http://… CC API Router cf scale
  53. 53. © 2016 Pivotal Software, Inc. All rights reserved. Buildpack $ cf push $ cf push -b https://github.com/<you>/java-buildpack.git Auto Detect Custom Buildpack Runtime App buildpack https://github.com/cloudfoundry-community/cf-docs-contrib/wiki/Buildpacks $ cf push -b java_buildpack Manual
  54. 54. © 2016 Pivotal Software, Inc. All rights reserved. Cell Docker
  55. 55. © 2016 Pivotal Software, Inc. All rights reserved. Cell Docker
  56. 56. © 2016 Pivotal Software, Inc. All rights reserved. Docker $ cf push demo-docker --docker-image cloudfoundry/lattice-app
  57. 57. © 2016 Pivotal Software, Inc. All rights reserved. Docker $ cf push demo-docker --docker-image cloudfoundry/lattice-app CF 👇 !! bit.ly/cf-container
  58. 58. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry
  59. 59. © 2016 Pivotal Software, Inc. All rights reserved. • • • • Blue / Green • Zero Downtime Update
  60. 60. © 2016 Pivotal Software, Inc. All rights reserved. http://12factor.net/backing-services
  61. 61. © 2016 Pivotal Software, Inc. All rights reserved. $ cf marketplace
  62. 62. © 2016 Pivotal Software, Inc. All rights reserved. $ cf marketplace Pivotal Web Services
  63. 63. © 2016 Pivotal Software, Inc. All rights reserved. Create & Bind Service $ cf create-service cleardb spark mydb $ cf bind-service hello mydb <Service Name> <Plan Name> <Service Instance Name> <Service Instance Name><App Name> MySQL
  64. 64. © 2016 Pivotal Software, Inc. All rights reserved. VCAP_SERVICES {"cleardb": [{"credentials": { "hostname": "us-cdbr-iron-east-03.cleardb.net", "jdbcUrl": "jdbc:mysql://us-cdbr-iron-east-03.cleardb.net/ad_1191b396cc81848", "name": "ad_1191b396cc81848", "password": "67674107", "port": "3306", "uri": "mysql://b6f7c089a1680f:67674107@...", "username": "b6f7c089a1680f"}, "label": "cleardb", "tags": ["mysql", ...], "name": "mydb", ...}]}
  65. 65. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Go (go-simplejson) import "github.com/bitly/go-simplejson" json, _ := simplejson.NewJson([]byte(os.Getenv("VCAP_SERVICES"))) credentials := json.Get("cleardb").GetIndex(0) .Get("credentials").MustMap() uri, _ := credentials["uri"].(string) u, _ := url.Parse(uri) url := fmt.Sprintf("%s@tcp(%s)%s", u.User.String(), u.Host, u.Path)
  66. 66. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Go (go-cfenv) import cfenv "github.com/cloudfoundry-community/go-cfenv" appEnv, err := cfenv.Current() mydb, err := appEnv.Services.WithName("mydb") uri, _ := mydb.Credentials["uri"].(string) u, _ := url.Parse(uri) url := fmt.Sprintf("%s@tcp(%s)%s", u.User.String(), u.Host, u.Path)
  67. 67. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Java (Jackson) JsonNode credentials = objectMapper .readTree(System.getenv("VCAP_SERVICES")) .get("cleardb").get(0).get("credentials"); String url = credentials.get("jdbcUrl").asText();
  68. 68. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Java (Spring) @Configuration public class CloudConfig extends AbstractCloudConfig { @Bean DataSource dataSource() { return connectionFactory().dataSource(); } } http://cloud.spring.io/spring-cloud-connectors/ Spring Cloud Connectors
  69. 69. © 2016 Pivotal Software, Inc. All rights reserved. Service Broker / User Provided Application Service Broker Service Instance User Provided Service Managed Services MySQL Redis RabbitMQ Oracle DB create-user-provided-servicecreate-service bind-service marketplace
  70. 70. © 2016 Pivotal Software, Inc. All rights reserved. User Provided Service $ cf create-user-provided-service mydb -p '{"username" : "xxx", "password" : "xxx", "port" : "xxx", " jdbcUrl" : "xxx"}' $ cf bind-service hello mydb (Oracle DB )
  71. 71. © 2016 Pivotal Software, Inc. All rights reserved. Log $ cf logs hello
  72. 72. © 2016 Pivotal Software, Inc. All rights reserved. 3rd Party Log Managers $ cf create-user-provided-service mylog -l syslog://xxxxxxxx-logit.io:36129 $ cf bind-service hello mylog
  73. 73. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. PCF Metrics https://metrics.run.pivotal.io/ for Pivotal Web Services
  74. 74. © 2016 Pivotal Software, Inc. All rights reserved. 4 Layers HA PCF 3. Resurrector restarts failed VMs App Fail Platform Fail VM Fail Rack Fail PCF A B C B 1. 2. PCF VM PCF A B C Process PCF A B C VM1 VM2 OS, Mware VM PCF VM kill 3. VM3 OS, Mware OS, Mware PCF Zone Distribution 4. Zone 2Zone 1 VM1 VM2
  75. 75. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Demo ` https://www.youtube.com/watch?v=26RrBiBymeA
  76. 76. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment • 0 V1 Router $ cf push v1 -n app app.example.com
  77. 77. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com $ cf push v2 -n app-g
  78. 78. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com app.example.com $ cf map-route v2 example.com -n app
  79. 79. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com $ cf unmap-route v1 example.com -n app
  80. 80. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com 😊 $ cf unmap-route v1 example.com -n app
  81. 81. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com
  82. 82. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router app-g.example.com app.example.com 😱
  83. 83. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com 😱 🔥 app.example.com $ cf map-route v1 example.com -n app
  84. 84. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com 😱 🔥 app.example.com $ cf unmap-route v2 example.com -n app
  85. 85. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment V1 Router V2 app-g.example.com app.example.com 😊 $ cf delete v1
  86. 86. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment Router V2 app-g.example.com app.example.com 😊 $ cf delete v1
  87. 87. © 2016 Pivotal Software, Inc. All rights reserved. Blue/Green Deployment Router V2 app.example.com $ cf unmap-route v2 example.com -n app-g
  88. 88. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Demo https://www.youtube.com/watch?v=2LtsURDvMF0
  89. 89. © 2016 Pivotal Software, Inc. All rights reserved. Zero Downtime Update • ) JVM https://github.com/concourse/autopilot $ cf zero-downtime-push app-name -f manifest.yml
  90. 90. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Demo https://www.youtube.com/watch?v=mbvg8wijs4Y
  91. 91. © Copyright 2016 Pivotal. All rights reserved. 66 Upgrade and patch with rolling “canary” deploys X YM NA B A,B,M,N,X,Y - Application instances - VM prior to update
  92. 92. © Copyright 2016 Pivotal. All rights reserved. 67 Upgrade and patch with rolling “canary” deploys X YM NA B Apps redeployed to clear VMs X YM NA B
  93. 93. © Copyright 2016 Pivotal. All rights reserved. 68 Upgrade and patch with rolling “canary” deploys X YM NA B X YM NA B Update introduced. If the tests pass, keep going X YM NA B
  94. 94. © Copyright 2016 Pivotal. All rights reserved. 69 Upgrade and patch with rolling “canary” deploys X YM NA B X YM NA B X YM NA B Apps redeployed to updated VMs X YM NA B
  95. 95. © Copyright 2016 Pivotal. All rights reserved. 70 Upgrade and patch with rolling “canary” deploys X YM NA B X YM NA B X YM NA B X YM NA B Remaining VMs updated same way X YM NA B
  96. 96. © Copyright 2016 Pivotal. All rights reserved. 71 Upgrade and patch with rolling “canary” deploys X YM NA B X YM NA B X YM NA B X YM NA B X YM NA B Automated, No downtime Atomic rolling update X YM NA B
  97. 97. © Copyright 2016 Pivotal. All rights reserved. 72 Upgrade and patch with rolling “canary” deploys
  98. 98. © 2016 Pivotal Software, Inc. All rights reserved. New Features •Routing Service •TCP Routing •Persistent Volume
  99. 99. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry
  100. 100. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS)
  101. 101. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS)
  102. 102. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes
  103. 103. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes
  104. 104. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes
  105. 105. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes
  106. 106. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( )
  107. 107. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( )
  108. 108. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( )
  109. 109. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( )
  110. 110. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( )
  111. 111. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( )
  112. 112. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes
  113. 113. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes
  114. 114. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes Yes
  115. 115. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes Yes
  116. 116. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes Yes No (OSS)
  117. 117. © 2016 Pivotal Software, Inc. All rights reserved. CF PCF Dev Pivotal Web Services Pivotal Cloud Foundry Cloud Foundry (OSS) Yes Yes No ( ) No ( ) No ( ) Yes Yes No (OSS)
  118. 118. © 2016 Pivotal Software, Inc. All rights reserved. PCF Dev • Cloud Foundry (on VirtualBox) • http://pcfdev.io https://docs.pivotal.io/pcf-dev • cf dev start / stop • • Redis • RabbitMQ • MySQL • Spring Cloud Services
  119. 119. © 2016 Pivotal Software, Inc. All rights reserved. Pivotal Web Services • https://run.pivotal.io/ • AWS Pivotal Cloud Foundry • 1GB $0.03/ • 1: Java 1GB ➡ 2200 / • 2: Go 64MB ➡ 135 / , 8MB➡ 17 / • $87 (2GB 2 , 1 ) • • PCF Metrics, Auto Scaler (Docker )
  120. 120. © 2016 Pivotal Software, Inc. All rights reserved. Pivotal Cloud Foundry • https://pivotal.io/platform • Cloud Foundry • AppsManager • vSphere, AWS, OpenStack CF (OpsManager) Azure GCP • OSS All in One
  121. 121. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot [ ] • http://bit.ly/hajiboot2 • Java Spring Boot 1.4 • Pivotal Web Services Blue/Green
  122. 122. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot [ ] • http://bit.ly/hajiboot2 • Java Spring Boot 1.4 • Pivotal Web Services Blue/Green Cloud Foundry!!!!
  123. 123. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot [ ] • http://bit.ly/hajiboot2 • Java Spring Boot 1.4 • Pivotal Web Services Blue/Green Cloud Foundry!!!! !!

×