Behind the Scenes: The Tech Stack of the WordPress.com Growth Summit

Recently, we hosted our second annual WordPress.com Growth Summit and welcomed over 1,300 attendees at the event. The summit was fully online, and it built on the momentum of our inaugural Growth Summit in 2020 after hearing from you, our community, that another conference would be a great learning and networking opportunity for people looking to grow their WordPress.com sites. Based on the positive feedback from last year, this year’s programming continued to be customer-focused by highlighting people — just like you! — who started sites and businesses on WordPress.com and have seen them flourish.

We also changed up the tech stack we used, which allowed us to offer a better user experience and to improve the process of selling tickets and, later, access to recorded videos from the event. If you enjoy building sites with WordPress, tinkering around with design and functionality, I’m pleased to share a behind-the-scenes look at how we got our Growth Summit site to work for us. This explanation might be especially helpful if you’re trying to sell registrations on your site and/or restrict access to content behind a paywall.

Selling Tickets

At WordPress.com, we love to use plugins when building sites, and installing a number of them on the Growth Summit site made ticket sales a breeze for customers.

First, we installed the WooCommerce plugin on our WordPress.com site and created a ticket as a simple product in the store catalog. Nothing fancy, just a title and a price. From a design perspective, we determined that it wasn’t ideal to have potential conference attendees visit the product page, so we configured the call-to-action button on the homepage to automatically add a ticket to a visitor’s cart and send them straight to the checkout page. Then, using Zapier and its WooCommerce extension, we configured a “zap” that was triggered whenever a customer bought a ticket, which in turn alerted Hopin — the virtual event software platform we chose to host the Growth Summit — to create a new attendee registration. In an effort to simplify the checkout process, and hopefully increase conversion rates, we used the WooCommerce Checkout Field Editor plugin to remove a number of default fields, such as billing street address, phone number, and order comments. We were also able to customize the field layout so that it took up less “real estate” on the checkout page.The MailPoet plugin allowed us to customize the content of the default WooCommerce emails for completed order confirmations. Sure, we could have installed a child theme and then used custom templates to put the text we wanted in the message, but the MailPoet plugin was free for our purposes. Plus we can use it for email marketing campaigns in the future, should we choose.

On-Demand Video Access

Leading up to the Growth Summit, our focus was on driving attendance to the live event. Once the conference wrapped up, we shifted focus to providing access to recordings of Growth Summit sessions for attendees who wanted to watch on demand, and for people who missed the event but wanted to experience it firsthand. With the WooCommerce Memberships extension, we put the videos behind a paywall — in other words, you have to have a membership to view them. To sell memberships, we’re using the same WooCommerce product we used to sell tickets. We just changed its configuration so that buying the product adds the customer to a membership plan that grants access to video content from all the sessions in 2020 and 2021. Additionally, we ensured that anyone who bought a ticket to the live event would get a year of on-demand access automatically. 

Site Design

Aesthetics are as important as functionality. We built the Growth Summit site with the Twenty Twenty-One theme. The homepage uses Gutenberg blocks. Some of the common blocks are Cover, Layout Grid, and Columns. We also used some custom CSS code to tweak the design to suit our needs. 

That’s pretty much it. Did you miss the Growth Summit? Use the coupon code behindthescenes to get 25% off on-demand access to all the video recordings from 2020 and 2021, now through August 2022!
Quelle: RedHat Stack

Table Stakes: Using public standards for software supply chain security

For organizations operating at scale, the application supply chain provides malefactors with a troubling range of opportunities for attack. The recent revelation of the “OMIGOD” exploit is only the latest in a long line of reminders that security must be tailored for a cloud-native world, and we need to account for vulnerabilities at every stage … Continued
Quelle: Mirantis

Debugging Vertex AI training jobs with the interactive shell

Training a machine learning model successfully can be a challenging and time consuming task. Unlike typical software development, the results of training depend on both the training code and the input data. This can make debugging a training job a complex process, even when you’re running it on your local machine. Running code on remote infrastructure can make this task even more difficult. Debugging code that runs in a managed cloud environment can be a tedious and error-prone process since the standard tools used to debug programs locally aren’t available in a managed environment. Also, training jobs can get stuck and stop making progress without visible logs or metrics. Interactive access to the job has the potential to make the entire debugging process significantly easier.In this article, we introduce the interactive shell, a new tool available to users of Vertex AI custom training jobs. This feature gives you direct shell-like access to the VM that’s running your code, giving you the ability to run arbitrary commands to profile or debug issues that can’t be resolved through logs or monitoring metrics. You can also run commands using the same credentials as your training code, letting you investigate permissions issues or other problems that are not locally reproducible. Access to the interactive shell is authenticated using the same set of IAM permissions used for regular custom training jobs, providing a secure interface to the Vertex AI training environment.Example: TensorFlow distributed trainingLet’s take a look at one example where using the interactive shell in Vertex AI can be useful to debug a training program. In this case, we’ll intentionally submit a job to Vertex AI training that deadlocks and stops making progress. We’ll use py-spy in the interactive shell to understand the root cause of the issue. Vertex AI is a managed ML platform that provides a useful way to scale up your training jobs to take advantage of additional compute resources. To run your TensorFlow trainer across multiple nodes or accelerators, you can use TensorFlow’s distribution strategy API, the TensorFlow module for running distributed computation. To use multiple workers, each with one or more GPUs, we’ll use tf.distribute.MultiWorkerMirroredStrategy, which uses an all-reduce algorithm to synchronize gradient updates across multiple devices.Setting up your codeWe’ll use the example from the Vertex AI Multi-Worker Training codelab. In this codelab, we train an image classification model on the Tensorflow Cassava dataset using a ResNet50 model pre-trained on Imagenet. We’ll run the training job on multiple nodes using tf.distribute.MultiWorkerMirroredStrategy. In the codelab, we create a custom container for the training code and push it to Google Container Registry (GCR) in our GCP project.Submitting a jobBecause tf.distribute.MultiWorkerMirroredStrategy is a synchronous data parallel algorithm, all workers must have the same number of GPUs. This is from the MultiWorkerMirroredStrategy docs, which say that “All workers need to use the same number of devices, otherwise the behavior is undefined”. We can trigger the example deadlock behavior by submitting a training job with different numbers of GPUs in two of our worker pools, and see that this will cause the job to hang indefinitely. Since logs aren’t printed out while the job is stuck, and the utilization metrics won’t show any usage either, we’ll use the interactive shell to investigate. We can get the exact call stack of where the job is stuck, which can be helpful for further analysis. You can use the Cloud Console, REST API, Python SDK, or gcloud to submit Vertex AI Training Jobs. Simply set the customJobSpec.enableWebAccess API field to true in your job request. We’ll use the Cloud Console to submit a job with the interactive shell enabled. If you use the Cloud Console:In Training method, select No managed dataset and Custom training. In Model details, expand the Advanced options dropdown and select Enable training debugging. This will enable the interactive shell for your training job. 3. In Training container, select Custom container and select the container that was pushed to GCR in the codelab (gcr.io/$PROJECT_ID/multiworker:cassava).4. In Compute and pricing, create 2 worker pools. Worker pool 0 has a single chief node with 1 GPU, and worker pool 1 has 2 workers, each with 2 GPUs. This deviates from the config used in the codelab and is what will trigger the deadlock behavior, as the different worker pools have different numbers of GPUs.Hit the Start training button and wait for the job to be provisioned. Once the job is running, we can take a look at the logs and metrics and see that it’s deadlocked. The CPU utilization metrics are stuck at 0% and nothing is printed to the logs.Accessing the interactive shellThe interactive shell is created along with your job, so it’s only available while the job is in the RUNNING state. Once the job is completed or cancelled, the shell won’t be accessible. For our example job, it should take about 5-10 mins for the job to be provisioned and start. Once the job is running, you’ll see links to the interactive shell on the job details page. One web terminal link will be created for each node in the job:Clicking one of the web terminal links opens a new tab, with a shell session running on the live VM of the training job.Using py-spy for debuggingpy-spy is a sampling profiler for Python programs and is useful for investigating issues in your training application without having to modify your code. It also supports profiling Python programs in separate processes, which is useful since the interactive shell runs as a separate process.We run pip install py-spy to install py-spy. This can either be done at container build or runtime. Since we didn’t modify our container when we enabled the interactive shell, we’ll install py-spy at runtime to investigate the stuck job. py-spy has a number of useful commands for debugging and profiling Python processes. Since the job is deadlocked, we’ll use py-spy dump to print out the current call stack of each running Python thread.Running this command on node workerpool0-0 (the chief node) gives the following result:There are a couple of useful entries in the above call stack, which are listed below:create_mirrored_variable (tensorflow/python/distribute/distribute_utils.py:306)_create_variable (tensorflow/python/distribute/mirrored_strategy.py:538)ResNet50 (tensorflow/python/keras/applications/resnet.py:458)create_model (task.py:41)From these, we can see that the code is stuck at the create_mirrored_variable method in our code’s create model function. This is the point where TensorFlow initializes the MultiWorkerMirroredStrategy and replicates the model’s variables across all the provided devices. As specified in the MultiWorkerMirroredStrategy docs, when there’s a mismatch between the number of GPUs on each machine, the behavior is undefined. In this case, this replication step hangs forever.py-spy has additional useful commands for debugging training jobs, such as py-spy top and py-spy record.  py-spy top provides a live-updating view of your program’s execution. py-spy record periodically samples the Python process and creates a flame graph showing the time spent in each function. The flame graph is written locally on the training node, so you can use gsutil to copy it to Cloud Storage for further analysis.CleanupEven though the job was stuck, we’ll still be charged for the infrastructure used while the job is running, so we should manually cancel it to avoid excess charges. We can use gcloud to cancel the job:To avoid excess charges in general, you can configure Vertex AI to automatically cancel your job once it reaches a given timeout value. Set the CustomJobSpec.Scheduling.timeout field to the desired value, after which the job will be automatically cancelled.What’s nextIn this post, we showed how to use the Vertex AI interactive shell to debug a live custom training job. We installed the py-spy profiler at runtime and used it to get a live call stack of the running process. This helped us pinpoint the root cause of the issue in the TensorFlow distribution strategy initialization code.You can also use the interactive shell for additional monitoring and debugging use cases, such as:Analyzing local or temporary files written to the node’s persistent disk.Investigating permissions issues: the interactive shell is authenticated using the same service account that Vertex AI uses to run your training code.Profiling your running training job with perf or nvprof (for GPU jobs).For more information, check out the following resources:Documentation on monitoring and debugging training with an interactive shell.Documentation on containerizing and running training code locally before submitting it to Vertex AI.Samples using Vertex AI in our Github repository.Related ArticleYour guide to all things AI & ML at Google Cloud NextA comprehensive guide to all things AI & ML at Next 2021. The list covers AI topics from Conversational AI to Document Understanding to D…Read Article
Quelle: Google Cloud Platform

Google Cloud joins forces with EDM Council to build a more secure and governed data cloud

Google Cloud joins the EDM Council to announce the release of the CDMC framework v1.1.1. This has been an industry wide effort which started in the summer of 2020, where leading cloud providers, data governance vendors and experts worked together to define the best practices for data management in the cloud. The CDMC Framework captures expertise from the group and defines clear criteria to manage, govern, secure and ensure privacy of data in the cloud. Google Cloud implements most of the mission critical controls and automations in Dataplex – Google Cloud’s own first party solution to organize, manage and ensure data governance for data across Google Clouds’ native data storage systems. Leveraging Dataplex, and working with the best practices in the CDMC framework, can ensure adequate control over sensitive data, and sensitive data workloads. Additionally, Google Clouds’ data services allow a high degree of configurability which, together with the integration with specialised data management software provided by our partners like Collibra, provide a rich eco-system for customers to implement solutions which adhere to the CDMC best practices.The CDMC framework is a joint venture between hundreds of organizations across the globe, including major Cloud Service Providers, technology service organizations, privacy firms and major consultancy and advisory firms who have come together to define best practices. The framework spans governance and accountability, cataloging and classification, accessibility and usage, protection and privacy and data lifecycle management. The framework represents a milestone in adoption of industry best practices for data management and we believe that it will contribute to build trust, confidence and accountability for the adoption of cloud, particularly for sensitive data. Capitalising on this, Google Cloud is going to make publicly available Dataplex, which will implement cataloging, lifecycle management, governance and most of the other controls in the framework (others are available on a per product basis).“Google Cloud customers, who include financial services, regulated entities, and privacy minded organizations continue to benefit from Google’s competency in handling sensitive data. The CDMC framework ensures that Google’s best practices are shared and augmented from feedback across the industry” Said Evren Eryurek, Google’s Director of Product Management at Google Cloud, a Key leader for Big Data in Google Cloud. אאThe organizing body of which Google Cloud is a member of, the EDM Council, is a global non-profit trade association, with over 250 member organizations from the US, Canada, UK, Europe, South Africa, Japan, Asia, Singapore and Australia, and over 10,000 data management professionals as members. The EDM Council provides a venue for data professionals to interact, communicate, and collaborate on the challenges and advances in data management as a critical organizational function. The Council provides research, education and exposure to how data, as an asset, is being curated today, and vision of how it must be managed in the future.For more about DataplexFor more information about CDMC Framework, and a downloadable docFor more about the EDM Council
Quelle: Google Cloud Platform

Artifact Registry for language packages now generally available

Using a centralized, private repository to host your internal code as a package not only enables code reuse, but also simplifies and secures your existing software delivery pipeline. By using the same formats and tools as you would in the open-source ecosystem, you can leverage the same advantages, simplify your build, and keep your business logic and applications secure.Language repository formats, now generally availableAs of today, support for language repositories in Artifact Registry is now generally available, allowing you to store all your language-specific artifacts in one place. Supported package types include:Java packages  (using the Maven repository format)Node.js packages (using the npm repository format)Python packages (using the PyPI repository format)OS repository formats in previewAdditionally, support for new repository formats for Linux distributions is in public preview, allowing developers to create private internal-only packages and securely use them across multiple applications deployed to Linux environments. New supported artifact formats include:Debian packages (using the Apt repository format)RPM packages (using the Yum repository format)This is in addition to existing container images and Helm charts (using the Docker repository format). Your own secure supply chainStoring your packages in Artifact Registry not only enables code reuse, but also simplifies and secures your existing build pipeline. In addition to bringing your internal packages to a managed repository, using Artifact Registry also allows you to take additional steps to improve the security of your software delivery pipeline:Use Container Analysis to scan containers that use your private packages for vulnerabilitiesInclude your repositories in a Virtual Private Cloud to control accessMonitor repository usage with Cloud Audit LogsUse the binauthz-attestation builder with Cloud Build to create attestations that Binary Authorization verifies before allowing container deploymentUse  Cloud Identity and Access Management (IAM) for repository access controlSeamless authenticationWith credential helpers to authenticate access for installers based on Cloud Identity and Access Management (IAM) permissions, using Artifact Registry to host your packages makes authentication to private repositories easy. By managing IAM groups, administrators can control access to repositories via the same tools used across Google Cloud.Regional repositories lower cost and enable data complianceArtifact Registry provides regional support, enabling you to manage and host artifacts in the regions where your deployments occur, reducing latency and cost. By implementing regional repositories, you can also comply with your local data sovereignty and security requirements.Get started todayThese repository formats are now generally available to all Artifact Registry customers. Pricing for language repositories is the same as container pricing; see the pricing documentation for details. To get started using language and OS repositories, try the quickstarts in the Artifact Registry documentation.Node.js Quickstart GuidePython Quickstart GuideJava Quickstart GuideApt Quickstart GuideRPM Quickstart GuideRelated ArticleNode, Python and Java repositories now available in Artifact RegistryExpanded language support lets you store Java, Node and Python artifacts in Artifact Registry, for a more secure software supply chain.Read Article
Quelle: Google Cloud Platform

LOVOO’s love affair with Spanner

Editor’s note: In this blog, we look at how German dating app LOVOO broke up with its monolith system for a microservices architecture, powered in part by the fully managed, scalable Cloud Spanner. Founded in 2011, LOVOO is one of Europe’s leading dating apps, available in 15 languages. We currently employ approximately 170 employees from more than 25 nations, with offices in Dresden and Berlin. LOVOO changes people’s lives by changing how they meet. We do this through innovative location-based algorithms, an app radar feature, and live streaming that helps people find successful matches through chat and real-time video. Three years ago, we started to encounter growing pains. Our user base was growing at a steady clip, and their activity within the app was growing as well. We had built the app on an on-premises monolith architecture. As we grew, the old system was unable to keep up with the speed and scale we needed to serve our users. After assessing the options available to us in 2018, Google’s open source driven approach and cutting edge technology were key drivers for our decision to migrate to Google Cloud and its managed services, including Cloud Spanner. Spanner now hosts more than 20 databases for us, powers 40 microservices and integrates perfectly with our other Google Cloud services. With Spanner’s open source auto-scaler, we can seamlessly scale from 14 to 16 nodes during busier hours in which we perform 20,000 queries per second. One of our databases handles 25 million queries per day and collects 100GB of new data every month. We feel confident in the platform’s ability to scale for our future needs and address our growing customer base while supporting new services and capabilities.Breaking up with the monolithBefore migrating to Google Cloud, our infrastructure lived on-premises and used open-source PostgreSQL as a database. However, we encountered challenges with bottlenecks in performance, difficulty scaling during peak times, and constantly needing to add new hardware. The cloud promised to give our engineers and product teams a faster, smoother development process, which was a big selling point for us. We performed a lift-and-shift migration of our architecture, but used the migration as a catalyst to modernize and make important changes. We separated some responsibilities from the monolith into microservices, moving them directly onto Google Kubernetes Engine (GKE). We started out by converting about a dozen functions from the monolith into microservices, and we’re now up to over 40 microservices that we’ve separated from the prior monolith.We performed the migration smoothly within a six month timeline, as we wanted to finish within the time remaining on our on-premises contracts. We have plans to eventually move entirely to a microservices-based architecture, but we are taking it one step at a time. Our billing database and logic is complex, and was built on PostgreSQL, our original database solution. In this specific case,  we chose to lift and shift the workload to Cloud SQL for PostgreSQL, Google’s fully managed database service. Falling in love with SpannerSpanner was our first level of support on Google Cloud, and our preferred solution for large distributed databases. Spanner is a fully managed relational database service with unlimited scale and up to 99.999% availability, which means our prior scale and speed problems are effectively solved. Our developers love managed services like Spanner because routine headaches like infrastructure management, updates, and maintenance are taken care of for us, and we can devote our energy to building new features for LOVOO. We have roughly 20 databases in one Spanner instance, with a mix of production and development databases. It’s a kind of multi-tenancy architecture, and most of our services are connected one-to-one with a database. We have 20 TB and 14 nodes (16 at peak) on one regional deployment at the moment.Among our use cases for Spanner are a notifications database, which is our largest database. This database is where we save data needed to send out notifications to our app’s users when other users take an action on their profiles, such as a view or a match. So when you indicate you are interested in a person and they have already shown interest in you, that translates to a row in the notification table. When the other person logs in, we query the new notifications they have and they will see that they matched with you.We also have a database on Spanner for our user messaging. Users have conversations in our real-time chats, and messages within those conversations may include various media types they can send to each other, such as photos, audio, and gifs. The microservice that powers this real-time chat feature has a web socket connection to the clients, and it stores the text and contents in Spanner. We have a table for conversations and a table for individual messages (where each message has a conversation id).A third use case for Spanner is with our in-app credit transaction service, where users can gift each other credits. You can think about it almost like a virtual currency payments system. So that means that we have a table with all our users and for each one we have their credit balance. And when you send out a gift, we decrease the credit number in your row and increase theirs. We also have a “payments ” ledger table that has a row for every credit gifting ever made. This capability is where Spanner’s transactional consistency shines, because we can perform all these operations automatically in one transaction.Planning a future with Google CloudWe’ve also been pleased with the Spanner Emulator, which has made our development process a lot easier.  Without needing direct access to Spanner,  an engineer can debug their code on their machine by running the emulator locally. As part of our build process, we launch an emulator so we can have our software tests run against it. Our engineers also use it to run integration tests on-demand on their machines. This ensures that the same API calls we use when we build the code will work when we deploy the code.Our plans are to build all of our new features on top of Spanner, and to continue pulling services out of our monolith. We’re currently migrating our user device representation database, which tracks all of a user’s various devices. We also want to continue moving away from PHP for future use cases, and we’d like to use Google’s gRPC, an open source communication protocol, to directly connect the clients with the microservices, instead of via PHP. With Spanner and other Google Cloud-managed services saving us time and delivering on speed and scalability, we’ll be charting our future roadmap with them on our side. Google Cloud is the right match for us.Read more about LOVOO and Cloud Spanner. Or read out how Spanner helped Merpay, a fintech enterprise, scale to millions of users.Related ArticleHow ShareChat built scalable data-driven social media with Google CloudSee how India-based social media company ShareChat migrated to Google Cloud databases and more to serve 160 million monthly active users …Read Article
Quelle: Google Cloud Platform