Earlier today, Amazon Q Developer announced an enhanced CLI agent within the Amazon Q command line interface (CLI). With this announcement, Q Developer brings the latest agentic experience to the CLI that provide a more dynamic, interactive coding experience that works with you, and iteratively makes changes based on your feedback. Amazon Q Developer can now use the information in your CLI environment to help you read and write files locally, query AWS resources write code, or automatically debug issues.
Introduction
As a developer, I appreciate my Integrated Development Environment (IDE) along with the integrated linters and auto-completion features that help streamline my workflow. The addition of AI assistants, like Amazon Q Developer, have changed the way I work in profound ways. I can discuss best practices with Q Developer in chat, or ask it to refactor a complex method in seconds. I am increasingly using the Amazon Q Developer agents to develop new features, write documentation, generate unit tests, and automate code reviews. These powerful agent capabilities have further transformed how I approach my daily development tasks.
However, as a developer, I spend as much time at the command-line interface (CLI) as I do in the IDE, maybe even more. Tools like the Amazon Web Services (AWS) CLI, Git, package managers, and linters have revolutionized the way I manage infrastructure, automate repetitive tasks, and collaborate with my team. Tools like Docker and Kubernetes have transformed the way I develop and deploy my applications. Looking at the extensions tab in my IDE, I have extensions installed for Maven, Docker, and Vue, but I rarely use them, preferring the flexibility and power of the CLI.
Amazon Q Developer has been available in the CLI for over a year now, and it has become an indispensable part of my daily development routine. The assistant’s ability to provide intelligent command completions that can list my Git branches, Amazon S3 buckets, etc. has saved me countless hours. The chat feature allows me to engage in natural language conversations with Amazon Q Developer, asking it to help me learn how to accomplish specific tasks, while the translate capability seamlessly converts my plain-language prompts into the corresponding shell commands.
While Amazon Q Developer’s CLI capabilities are helpful, I miss the power of the agents I have access to in my IDE. Earlier today, Amazon Q Developer announced an enhanced CLI agent within the Amazon Q CLI. Amazon Q Developer, and the new agent is powered by Amazon Bedrock, as a result, the CLI has the power of Claude 3.7 Sonnet step-by-step reasoning. In addition, the new CLI agent can make use of tools installed on my system including compilers, package managers, and the AWS CLI. Finally, the enhanced CLI supports multi-turn conversations allowing dynamic, back-and-forth conversations with the agent. This enables me to get more work done, faster, without ever leaving the comfort of my preferred command-line environment.
Rather than being constrained by the features and workflows of an IDE, the CLI agent gives me direct access to the underlying tools and commands I need to get my work done. Let’s look at an example.
Walkthrough
To see how the CLI agent capabilities work, I’ll walk you through an example. I’m preparing for an internal developer community summit happening in April. I need an application to manage the call for content. The Call for Content application allows community members to propose topics for the summit. I’m going to use the Amazon Q Developer CLI to build the application.
I already have the CLI installed, so I’ll run q chat to begin a new conversation with the agent. Then I will ask Q Developer to “scaffold a new application named call-for-content using React and Vite, and then commit it to Git.” As you can see in the following video, the agent understands my intent, and carries out the work needed to build the application. In the past, the Q Developer CLI would provide instructions for me to execute. In this new enhanced version, the CLI agent uses the tools installed on my laptop to complete each step for me. I should note that I have disabled confirmations, but Q Developer can prompt me before each action so I can verify it.
The agent is working quickly in that video. So quickly that is hard to keep up. So I broke it down, step-by-step in the following image. The agent begins by calling npm create to create the new app, followed by npm install to add all the dependencies. It then runs a series of git commands to create a new repository, add my files, and commit the changes including a descriptive commit message.
Notice that agent is not simply generating files. It is running the same commands that I would have run on my own. However, the CLI agent is doing it much faster, and more accurately than I could have done. The enhanced Amazon Q Developer CLI can use tools, including other command line tools installed on my system, to complete its work. Once Q Developer is done, it provides me a summary of the work it has completed, and suggests next steps. In the following image, you can see that Q Developer is suggesting I run the development server to preview the changes. That is a great suggestion, so I ask Q Developer to start the server and confirm that everything is working.
With the application template running, I’m ready to start building the Call for Content application. The CLI agent supports multi-turn conversations, so I can pick up where we left off. I simply explain my requirements at the command line, and agent begins to generate code. This is what Amazon Q Developer does best. In this example, it needs to update the App.jsx and App.css files.
Notice that the agent can read and write files on my local system in addition to running commands as we saw in the prior example. So, as Q Developer generates code, the agent can put it in the correct place in my local file system. Once it is done, the agent starts the development server using npm run dev. I asked it to start the server last time, so it correctly guesses that I will want to check the progress. Just like last time, the agent provides another summary of the changes it made. Personally, I appreciate these periodic summaries. They help me build confidence in the work that Q Developer is doing. I’m not happy with the color of the title. I could ask Q Developer to update it, but I will simply update the file myself. Note that I can edit files on my own while using the CLI. the agent will read files before editing them to check if I have made any changes manually.
The application is looking great! However, it is currently writing it’s output to the console. I never told the agent what to do with the data. I would like the application to write to a DynamoDB table. In fact, I created one already. However, I cannot remember which region the table is in. In the following image, I ask the agent to figure it out for me. Let’s see how it responds.
As you can see in the prior image, the agent is able to think about my vague request, and figure out what to do. It starts by looking in us-east-1. When it can not find the table, it moves to us-west-2 and tries again. The table was in us-west-2, but if it were not, the agent would have continued searching. Q Developer understands how to list and describe AWS resources. Once the agent found the table, it uses npm to install the DynamoDB SDK, and then updates the application files. Note that the agent actually updated multiple files, but I kept the image simple.
With just a few simple prompts, I was able to use the enhanced CLI agent to collaborate with Q Developer throughout the entire development process. I’ll keep working on the application to add authentication, etc. However, I assume you have a good understanding of how the Q Developer CLI works and are eager to get started. So, let’s stop here.
Conclusion
Amazon Q Developer’s new CLI agent has completely transformed the way I approach software development. By bringing the power of an advanced AI assistant directly into my preferred command-line environment, I can now accomplish complex tasks faster than ever before. Q Developer’s natural language understanding and contextual awareness, combined with the CLI agent’s ability to reason and use a wide range of development tools, make it an indispensable part of my daily workflow. Finally, support for multi-turn conversations, enable me to collaborate with, and work along side the agent to get more work done, faster.
If you’re a developer who spends a significant amount of time in the CLI, I highly recommend trying out the Amazon Q Developer’s CLI agent. You can follow the Amazon Q Developer User Guide to install the CLI and start leveraging the new agent capabilities right away, for free. I’m confident it will change the way you work, just as it has for me. Give it a try and let me know what you think!
The kernel project has usually been willing to make fundamental internal
changes if they lead to a better kernel in the end. The project also,
though, goes out of its way to avoid breaking interfaces that have been
exposed to user space, even if programs come to rely on behavior that was
never documented. Sometimes, those two principles come into conflict,
leading to a situation where fixing problems within the kernel is either
difficult or impossible. This sort of situation has been impeding
performance improvements in the kernel’s POSIX timers implementation for
some time, but it appears that a solution has been found.
Security updates have been issued by Debian (firefox-esr), Fedora (firefox and vim), Red Hat (firefox), Slackware (mozilla), SUSE (firefox, firefox-esr, kernel, and podman), and Ubuntu (gpac, kernel, linux, linux-aws, linux-gcp, linux-gcp-5.15, linux-gke, linux-hwe-5.15, and redis).
Generative AI (GenAI) tools like GitHub Copilot and ChatGPT are rapidly changing how programming is taught and learnt. These tools can solve assignments with remarkable accuracy. GPT-4, for example, scored an impressive 99.5% on an undergraduate computer science exam, compared to Codex’s 78% just two years earlier. With such capabilities, researchers are shifting from asking, “Should we teach with AI?” to “How do we teach with AI?”
Leo Porter from UC San Diego
Daniel Zingaro from the University of Toronto
Leo Porter and Daniel Zingaro have spearheaded this transformation through their groundbreaking undergraduate programming course. Their innovative curriculum integrates GenAI tools to help students tackle complex programming tasks while developing critical thinking and problem-solving skills.
Leo and Daniel presented their work at the Raspberry Pi Foundation research seminar in December 2024. During the seminar, it became clear that much could be learnt from their work, with their insights having particular relevance for teachers in secondary education thinking about using GenAI in their programming classes
Practical applications in the classroom
In 2023, Leo and Daniel introduced GitHub Copilot in their introductory programming CS1-LLM course at UC San Diego with 550 students. The course included creative, open-ended projects that allowed students to explore their interests while applying the skills they’d learnt. The projects covered the following areas:
Data science: Students used Kaggle datasets to explore questions related to their fields of study — for example, neuroscience majors analysed stroke data. The projects encouraged interdisciplinary thinking and practical applications of programming.
Image manipulation: Students worked with the Python Imaging Library (PIL) to create collages and apply filters to images, showcasing their creativity and technical skills.
Game development: A project focused on designing text-based games encouraged students to break down problems into manageable components while using AI tools to generate and debug code.
Students consistently reported that these projects were not only enjoyable but also responsible for deepening their understanding of programming concepts. A majority (74%) found the projects helpful or extremely helpful for their learning. One student noted that.
“Programming projects were fun and the amount of freedom that was given added to that. The projects also helped me understand how to put everything that we have learned so far into a project that I could be proud of.“
Core skills for programming with Generative AI
Leo and Daniel emphasised that teaching programming with GenAI involves fostering a mix of traditional and AI-specific skills.
Writing software with GenAI applications, such as Copilot, needs to be approached differently to traditional programming tasks
Their approach centres on six core competencies:
Prompting and function design: Students learn to articulate precise prompts for AI tools, honing their ability to describe a function’s purpose, inputs, and outputs, for instance. This clarity improves the output from the AI tool and reinforces students’ understanding of task requirements.
Code reading and selection: AI tools can produce any number of solutions, and each will be different, requiring students to evaluate the options critically. Students are taught to identify which solution is most likely to solve their problem effectively.
Code testing and debugging: Students practise open- and closed-box testing, learning to identify edge cases and debug code using tools like doctest and the VS Code debugger.
Problem decomposition: Breaking down large projects into smaller functions is essential. For instance, when designing a text-based game, students might separate tasks into input handling, game state updates, and rendering functions.
Leveraging modules: Students explore new programming domains and identify useful libraries through interactions with Copilot. This prepares them to solve problems efficiently and creatively.
Ethical and metacognitive skills: Students engage in discussions about responsible AI use and reflect on the decisions they make when collaborating with AI tools.
Adapting assessments for the AI era
The rise of GenAI has prompted educators to rethink how they assess programming skills. In the CS1-LLM course, traditional take-home assignments were de-emphasised in favour of assessments that focused on process and understanding.
Leo and Daniel chose several types of assessments — some involved having to complete programming tasks with the help of GenAI tools, while others had to be completed without.
Quizzes and exams: Students were evaluated on their ability to read, test, and debug code — skills critical for working effectively with AI tools. Final exams included both tasks that required independent coding and tasks that required use of Copilot.
Creative projects: Students submitted projects alongside a video explanation of their process, emphasising problem decomposition and testing. This approach highlighted the importance of critical thinking over rote memorisation.
Challenges and lessons learnt
While Leo and Daniel reported that the integration of AI tools into their course has been largely successful, it has also introduced challenges. Surveys revealed that some students felt overly dependent on AI tools, expressing concerns about their ability to code independently. Addressing this will require striking a balance between leveraging AI tools and reinforcing foundational skills.
Additionally, ethical concerns around AI use, such as plagiarism and intellectual property, must be addressed. Leo and Daniel incorporated discussions about these issues into their curriculum to ensure students understand the broader implications of working with AI technologies.
A future-oriented approach
Leo and Daniel’s work demonstrates that GenAI can transform programming education, making it more inclusive, engaging, and relevant. Their course attracted a diverse cohort of students, as well as students traditionally underrepresented in computer science — 52% of the students were female and 66% were not majoring in computer science — highlighting the potential of AI-powered learning to broaden participation in computer science.
By embracing this shift, educators can prepare students not just to write code but to also think critically, solve real-world problems, and effectively harness the AI innovations shaping the future of technology.
If you’re an educator interested in using GenAI in your teaching, we recommend checking out Leo and Daniel’s book, Learn AI-Assisted Python Programming, as well as their course resources on GitHub. You may also be interested in our own Experience AI resources, which are designed to help educators navigate the fast-moving world of AI and machine learning technologies.
Join us at our next online seminar on 11 March
Our 2025 seminar series is exploring how we can teach young people about AI technologies and data science. At our next seminar on Tuesday, 11 March at 17:00–18:00 GMT, we’ll hear from Lukas Höper and Carsten Schulte from Paderborn University. They’ll be discussing how to teach school students about data-driven technologies and how to increase students’ awareness of how data is used in their daily lives.
To sign up and take part in the seminar, click the button below — we’ll then send you information about joining. We hope to see you there.
Близо половин милион лева за пропуснати ползи трябва да плати семейство Цанкови на строителна фирма, за това, че същата фирма не е успяла да завърши строежа на жилищни сгради върху…
превод от руски Здравка Петрова, Пловдив: изд. „Жанет 45“, 2022
Свободата може да е спектакъл. Преки свидетели сме на това по света и у нас – от Вашингтон до Владивосток. Демокрацията може и да е добре или зле режисиран театър.„Всички са свободни“ на Михаил Зигар е текст, който играе на границата между
журналистическо разследване, исторически анализ и почти романизирана реконструкция на едно от най-важните събития в постсъветската политика – президентските избори в Русия през 1996 г.
Тези избори, които на повърхността изглеждат като триумф на демокрацията срещу комунистическото минало, всъщност се оказват лабораторен експеримент за симулацията на политическа свобода, която в крайна сметка завършва с идването на Путин на власт.
Тази книга може да се разглежда като своеобразен руски вариант на „Фермата на животните“ на Оруел, но с (истински) хора. Иронията тук е по-горчива, защото участниците не осъзнават ролите си до последния момент. Документалната форма, съчетана с литературни алюзии, превръща текста в нещо повече от хроника. Той е свидетелство за естеството на политическата манипулация не само в Русия, но и навсякъде, където властта е достатъчно хитра, за да контролира демокрацията отвътре.
В предговора Зигар недвусмислено дава да се разбере, че изборите от 1996 г. са фарс с предизвестен край, разигран с патос, интриги и политическа акробатика, достойни за Шекспирова трагедия. Борис Елцин, старият и болен владетел, отказва да се оттегли, подобно на крал Лир, но вместо да разпределя кралството между дъщерите, той трябва да се пребори със собствените си демони – алкохолизъм, сринат рейтинг и съветници, които играят сложна игра, често без неговото знание.
Това сравнение с „Крал Лир“ не е литературна игра – в същността си Елцин е фигура, която вече няма пълен контрол над реалността, но която същевременно отказва да се откаже от трона. Ала вместо екзистенциалната трагедия на Лир Зигар предпочита да представи събитията в духа на „Тримата мускетари“. Като приключенски роман с предателства, съзаклятия и герои, които изглеждат благородни, но защитават една изгнила система.
В този контекст Елцин може да се разглежда като Луи XIII – символично слаб владетел, около когото се въртят реалните играчи:
Александър Коржаков, неговият телохранител и „сив кардинал“, е своеобразен Ришельо – човекът, който дърпа конците в сянка; Анатолий Чубайс и останалите технократи в екипа му са като мускетарите, които на думи защитават демокрацията, но в действителност си служат с корупция и насилие, за да осигурят желаната победа; Генадий Зюганов, комунистическият опонент на Елцин, играе ролята на Бъкингамския дук – официалния враг, който така и не получава реален шанс за победа.
Този наративен подход прави книгата далеч по-завладяваща от сухата последователност на събитията. Той кара читателя да види политическите фигури като персонажи в предопределен сюжет, където финалът е ясен преди първото действие.
Основната теза на Зигар е, че изборите през 1996 г. не са борба между две идеи, а между две версии на една и съща илюзия.
Елцин представя своята победа като победа на демокрацията, но използваните методи – цензура, лъжи, финансов натиск – доказват точно обратното.
Това напомня на политическия механизъм в „1984“ на Оруел (отново, уви), където контролът върху истината е по-важен от самата истина. „Войната е мир“ се превръща в „Свободните избори са контролирани избори“.
Връзката с „Ние“ на Евгений Замятин също е очевидна. Както в антиутопията на Замятин, където хората доброволно се подчиняват на системата и вярват, че тя е в техен интерес, така и в Русия през 1996 г. общественото мнение е управлявано чрез медийна пропаганда, страх и купуване на лоялност.
Книгата помага да се направи и мощен паралел със съвременния западен свят – където изборите се печелят не толкова чрез идеи, колкото чрез контрол над разказа.
В този смисъл историята на Елцин е не само руски феномен – тя е модел на демократична ерозия, който може да наблюдаваме в много други държави.
Зигар показва, че елитите създават политическа реалност по същия начин, по който един автор пише роман – чрез внимателен подбор на събития, цитати и митове. Историята на 1996 година в Русия не е просто история на избори – тя е история за това как демокрацията може да бъде компрометирана и доведена до имплозия.
Подобен разказ откриваме и в „Живот и съдба“ на Василий Гросман, където комунизмът и нацизмът са представени като огледални идеологии. В случая с Русия през 1996 г. борбата между „демократи“ и „комунисти“ е илюзорна – реалните механизми на властта остават същите.
„Всички са свободни“ не е книга за миналото – тя е предупреждение за бъдещето, което е тук и засега не мисли да ходи никъде. Тя показва, че демокрацията може да бъде съхранена като ритуал, но изгубена като съдържание. В този смисъл Зигар прави особено журналистическо разследване – той разказва притча за начина, по който политиката се превръща в спектакъл, а спектакълът – в съдба.
В глобален план днешната политическа реалност показва, че демократичните институции в много държави не са гаранция за свобода, а по-скоро инструмент за легитимиране на нови (или добре забравени стари) форми на автокрация.
След повече от две десетилетия на власт Путин напомня на Елцин в края на мандата му – възрастен лидер, около когото се водят сложни вътрешни борби за наследяване на властта. Ако изборите през 1996 г. бяха критичният момент, в който демокрацията в Русия бе компрометирана, то следващите президентски избори (2030) ще определят дали Русия ще остане хибридна автокрация, или ще мине към открита диктатура.
Америка също преминава през криза на доверието в изборния процес – резултат от години на политическа поляризация, корпоративен контрол върху медийните потоци и нарастващо недоверие към елитите.
Дебатите около Байдън/Харис и Тръмп са подобни на тези между Елцин и Зюганов – изборът е не между две противоположности, а между две вариации на една и съща система, която не функционира по начина, по който се предполага.
Все повече страни в ЕС се сблъскват с популистки лидери, които използват инструментите на демокрацията, за да я подкопават. Орбан в Унгария, Ердоган в Турция и тенденциите в Италия, Франция и Германия показват, че демократичните системи са още по-уязвими на машинации.
В България също можем да проследим подобен политически сценарий. Ако изборите през 1996 г. в Русия бележат началото на демократичната ерозия, то България премина през своите собствени моменти на разочарование – първо с прехода от комунизъм, после с нарастващото влияние на олигархията и с хроничната нестабилност на управлението през последните години.
Както Кремъл организира изборите през 1996 г., за да гарантира, че Елцин ще остане на власт, така и в България изборите често служат за легитимиране на съществуващи политически кръгове. Коалициите, съставяни на принципа „по-малкото зло“, също напомнят на руската логика: „Да подкрепим Елцин, защото иначе комунистите ще се върнат“. Медийната среда често работи по същия начин – създава се усещане, че няма алтернатива на определени политически фигури, а независимите гласове се заглушават или маргинализират.
Ако изборите се свеждат до избор между две злини, значи демокрацията е загубила съдържанието си.
Реалният контрол върху властта изисква работещи институции, свободни медии и гражданска ангажираност. Русия премина от хаотична олигархия при Елцин към централизиран авторитаризъм при Путин. В България политическата власт също се преразпределя между различни обръчи, но реалната промяна остава илюзорна. В страни като България и Русия гражданите често очакват „силна ръка“, която да реши проблемите им. Тази пасивност е основният фактор, който позволява на такива (анти)елити да се възпроизвеждат.
Книгата „Всички са свободни“ ни учи, че демокрацията може да бъде подменена, без дори да го осъзнаем. Днес, когато политическите системи в България, Русия и по света започват да приличат на управляеми спектакли, въпросът е: ще останем ли пасивни зрители, или ще решим да пренапишем сценария?
Истинската демокрация е не в ритуалите, а в реалния контрол на обществото над властта. А това изисква не само избори, но и активна, будна и информирана гражданска позиция. Преди да е умряла, както
през 1996 година кралските мускетари бойко и цинично са постигнали целта си. Те са се стремили към победа. Като в старите романи, когато трябва да победиш на всяка цена и целта оправдава средствата. Но средствата, използвани от мускетарите, са унищожили тяхната цел. Само че в края на този роман умира не Констанс, а Конституцията.
Конституцията умря, да живее Конституцията!
Активните дарители на „Тоест“ получават постоянна отстъпка в размер нa 20% от коричната цена на всички заглавия от каталога на издателство „Жанет 45“, както и на няколко други български издателства в рамките на партньорската програма Читателски клуб „Тоест“. За повече информация прочетете на toest.bg/club.
Никой от нас не чете единствено най-новите книги. Тогава защо само за тях се пише? „На второ четене“ е рубрика, в която отваряме списъците с книги, публикувани преди поне година, четем ги и препоръчваме любимите си от тях. Рубриката е част от партньорската програма Читателски клуб „Тоест“. Изборът на заглавия обаче е единствено на авторите – Стефан Иванов и Антония Апостолова, които биха ви препоръчали тези книги и ако имаше как веднъж на две седмици да се разходите с тях в книжарницата.
At Grab, we’ve been working to perfect our Spark observability tools. Our initial solution, Iris, was developed to provide a custom, in-depth observability tool for Spark jobs. As described in our previous blog post, Iris collects and analyses metrics and metadata at the job level, providing insights into resource usage, performance, and query patterns across our Spark clusters.
Iris addresses a critical gap in Spark observability by providing real-time performance metrics at the Spark application level. Unlike traditional monitoring tools that typically provide metrics only at the EC2 instance level, Iris dives deeper into the Spark ecosystem. It bridges the observability gap by making Spark metrics accessible through a tabular dataset, enabling real-time monitoring and historical analysis. This approach eliminates the need to parse complex Spark event log JSON files, which users are often unable to access when they need immediate insights. Iris empowers users with on-demand access to comprehensive Spark performance data, facilitating quicker decision-making and more efficient resource management.
Iris served us well, offering basic dashboards and charts that helped our teams understand trends, discover issues, and debug their Spark jobs. However, as our needs evolved and usage grew, we began to encounter limitations:
Fragmented user experience and access control: Observability data is split between Grafana (real-time) and Superset (historical), forcing users to switch platforms for a complete view. The complex Grafana dashboards, while powerful, were challenging for non-technical users. The lack of granular permissions hindered wider adoption. We needed a unified, user-friendly interface with role-based access to serve all Grabbers effectively.
Operational overhead: Our data pipeline for offline analytics includes multiple hops and complex transformations.
Data management: We faced challenges managing real-time data in InfluxDB alongside offline data in our data lake, particularly with string-type metadata.
These challenges and the need for a centralised, user-friendly web application prompted us to seek a more robust solution. Enter StarRocks – a modern analytical database that addresses many of our pain points:
Pain points with InfluxDB
StarRocks solution
Limited SQL compatibility: Requires use of Flux query language instead of full SQL
Full MySQL-compatible SQL support, enabling seamless integration with existing tools and skills
Complex data ingestion pipeline: Requires external agents like Telegraf to consume Kafka and insert into InfluxDB
Direct Kafka ingestion, eliminating the need for intermediate agents and simplifying the data pipeline
Limited pre-aggregation capabilities: Aggregation is limited to time windows and indexed columns, not string columns
Flexible materialised views supporting complex aggregations on any column type, improving query performance
Poor support for metadata and joins: Designed primarily for numerical time series data, with slow performance on string data and joins
Efficient handling of both time-series and string-type metadata in a single system, with optimised join performance
Difficult integration with data lake: There is no official way to backup or stream data directly to the datalake, requiring separate pipelines
Native S3 integration for easy backup and direct data lake accessibility, eliminating the need for separate ingestion pipelines
Performance issues with high cardinality data: Indexing unique identifiers (like app\_id) causes huge indexes and slow queries
Optimised for high cardinality data, allowing efficient querying on unique identifiers without performance degradation
In this blog post, we will dive into leveraging StarRocks to build the next generation of the Spark observability platform. We will explore the architecture, data model, and key features that are helping us overcome previous limitations and provide more value to Spark users at Grab.
System architecture overview
In the journey to enhance user experience, we’ve made substantial changes to the architecture, moving from the Telegraf/InfluxDB/Grafana (TIG) stack to a more streamlined and powerful setup centered around StarRocks. This new architecture addresses the previous challenges and provides a more unified, flexible, and efficient solution.
Figure 1. New Iris architecture with StarRocks integration
Key Components of the new architecture:
1. StarRocks database
Replaces InfluxDB for both real-time and historical data storage
Supports complex queries on metrics and metadata tables
2. Direct Kafka ingestion
StarRocks ingests data directly from Kafka, eliminating Telegraf
3. Custom web application (Iris UI)
Replaces Grafana dashboards
Centralised, flexible interface with custom API
4. Superset integration
Maintained and now connected directly to StarRocks
Provides real-time data access, consistent with the custom web app
5. Simplified offline data process
Scheduled backups from StarRocks to S3 directly
Replaces previous complex data lake pipelines
Key improvements:
1. Unified data store: Single source for real-time and historical data
2. Streamlined data flow: A simplified pipeline reduces latency and failure points
3. Flexible visualisation: Custom web app with intuitive, role-specific interfaces
4. Consistent real-time access: Across both custom app and Superset
5. Simplified backup and data lake integration: Direct S3 backups
Data model and ingestion
The Iris observability system is designed to monitor both job executions and ad-hoc cluster usage, encompassing what we call “cluster observation”. This model accounts for two scenarios:
Adhoc use: Pre-created clusters shared among team users
Job execution: New clusters are created for each job submission
Key design points
For each cluster, we capture both metadata and metrics:
Key point
Description
Linkage
We use worker\_uuid to link metadata with worker metrics app\_id to link metadata with Spark event metrics.
Granularity
Worker metrics are captured every 5 seconds, linked by worker\_uuid. Spark events are captured as they occur, linked by app\_id. Metadata can be captured multiple times.
Flexibility
This schema allows for queries at various levels: Individual worker level, job level, cluster level.
Historical analysis
The design enables insights from historical runs, such as: Auto-scaling behaviour, maximum worker count per job, maximum or average memory usage over time.
We use StarRocks’ routine load feature to ingest data directly from Kafka into our tables. Refer to the StarRocks documentation: Load data using routine load.
Here is a simple example of creating a routine load job for cluster worker metrics:
This configuration sets up continuous data ingestion from the specified Kafka topic into our cluster_worker_metrics table, with JSON parsing.
For monitoring the routine, StarRocks provides built-in tools to monitor the status/error log of routine load jobs. Example query to check load:
C/C++
SHOW ROUTINE LOAD WHERE NAME = "iris.routetine_cluster_worker_metrics_raw";
Handle both real-time and historical data in the unified system
The new Iris system uses StarRocks to efficiently manage both real-time and historical data. We have implemented three key features to achieve this:
StarRocks’ routine load enables near real-time data ingestion from Kafka. Multiple load tasks concurrently consume messages from different topic partitions, resulting in data appearing in Iris tables within seconds of collection. This quick ingestion keeps our monitoring capabilities current, providing users with up-to-date information about their Spark jobs.
For historical analysis, StarRocks serves as a persistent dataset, storing metadata and job metrics with a time-to-live of over 30 days. This allows us to perform analysis based on the last 30 days of job runs directly in StarRocks, which is significantly faster than using offline data in our data lake.
We’ve also implemented materialised views in StarRocks to pre-calculate and aggregate data for each job run. These views combine information from metadata, worker metrics, and Spark metrics, creating ready-to-use summary data. This approach eliminates the need for complex join operations when users access the job run summary screen in the UI, improving response times for both SQL queries and API access.
This setup offers substantial improvements over our previous InfluxDB-based system. As a time-series database, InfluxDB makes complex queries and joins challenging. It also lacked support for materialised views, making it difficult to create pre-built job-run summaries. Previously, we had to query our data lake using Spark and Presto to view historical runs for a particular job over the last 30 days, which was slower than directly querying in StarRocks.
By combining real-time ingestion, persistent storage, and materialised views, Iris now provides a unified, efficient platform for both immediate monitoring and in-depth historical analysis of Spark jobs.
Query performance and optimisation
StarRocks has significantly improved our query performance for Spark observability. Here are some key aspects of our optimisation strategy.
Materialised views
As mentioned, we leverage StarRocks’ materialised views to pre-aggregate job run summaries. This approach significantly reduces query complexity and improves response times for common UI operations. Materialised views combine data from metadata, worker metrics, and Spark metrics tables, thus eliminating the need for complex joins during query execution. This is particularly beneficial for our job-run summary screen, where pre-calculated aggregations can be retrieved instantly, improving both speed and user experience.
Here’s an example
C/C++
CREATE MATERIALIZED VIEW job_runs_001
PARTITION BY (`report_date`)
DISTRIBUTED BY HASH(`report_date`,`platform`)
REFRESH ASYNC
PROPERTIES (
"auto_refresh_partitions_limit" = "3",
"partition_ttl" = "33 DAY"
)
AS
select m.report_date as report_date,
m.platform,
m.job_id,
m.run_id,
m.app_id,
m.app_attempt_id,
ANY_VALUE(COALESCE(m.cluster_id, m.cluster_name)) as cluster_id,
ANY_VALUE(m.cluster_name) as cluster_name,
ANY_VALUE(m.job_name) as job_name,
ANY_VALUE(m.job_owner) as job_owner,
ANY_VALUE(m.job_client) as job_client,
ANY_VALUE(CASE WHEN m.worker_role = 'driver' THEN m.spark_ui_url END) as spark_ui_url,
ANY_VALUE(CASE WHEN m.worker_role = 'driver' THEN m.spark_history_url END) as spark_history_url,
ANY_VALUE(CASE WHEN m.worker_role = 'driver' THEN m.driver_log_location END) as driver_log_location,
COUNT(d.worker_uuid) as total_instances,
from_unixtime(MIN(d.start_time) / 1000, 'yyyy-MM-dd HH:mm:ss') as start_time,
from_unixtime(MAX(d.end_time) / 1000, 'yyyy-MM-dd HH:mm:ss') as end_time,
COALESCE((((MAX(d.end_time) - MIN(d.start_time)) + 120000) / (1000 * 3600)), 0) as job_hour,
SUM(COALESCE(d.machine_hour, 0)) as machine_hour,
SUM(COALESCE(d.cpu_hour, 0)) as cpu_hour,
MAX(COALESCE(CASE WHEN d.worker_role = 'driver' THEN d.cpu_utilization END, 0)) as driver_cpu_utilization,
MAX(COALESCE(CASE WHEN d.worker_role = 'driver' THEN d.memory_utilization END,
0)) as driver_memory_utilization,
MAX(COALESCE(CASE WHEN d.worker_role = 'executor' THEN d.cpu_utilization END, 0)) as worker_cpu_utilization,
MAX(COALESCE(CASE WHEN d.worker_role = 'executor' THEN d.memory_utilization END,
0)) as worker_memory_utilization,
-- other relevant metrics fields
from iris.cluster_worker_metadata_view_001 m
left join iris.cluster_worker_metrics_view_006 d
on d.report_date >= m.report_date and d.platform = m.platform and d.worker_uuid = m.worker_uuid and
d.worker_role = m.worker_role
where m.job_id is not null
group by m.report_date,
m.platform,
m.job_id,
m.run_id,
m.app_id,
m.app_attempt_id;
StarRocks offers powerful and flexible materialised view capabilities that significantly enhance our query performance and data management in Iris. Here are three key features we leverage:
SYNC and ASYNC
StarRocks supports both SYNC and ASYNC materialised views. We primarily use ASYNC views as they allow us to join multiple underlying tables, which is crucial for our job-run summaries. We can configure these views to refresh:
Immediately when downstream tables are updated.
At set intervals (e.g., every 1 minute). This flexibility allows us to balance data freshness with system performance.
Example setting:
C/C++
REFRESH ASYNC START('2022-09-01 10:00:00') EVERY (interval 1 day)
For more details on supported features and settings, refer to the StarRocks documentation: Materialised view.
Partition TTL
We utilise the partition Time To Live (TTL) feature for materialised views. This allows us to control the amount of historical data stored in the views, typically setting it to 33 days. This ensures that the views remain performant and do not consume excessive storage while still providing quick access to recent historical data.
C/C++
PROPERTIES (
"partition_ttl" = "33 DAY"
)
Selective partition refresh
StarRocks allows us to refresh only specific partitions of a materialised view instead of the entire dataset. We take advantage of this by configuring our views to refresh only the most recent partitions (e.g., the last few days) where new data is typically added. This approach significantly reduces the computational overhead of keeping our materialised views up-to-date, especially for large historical datasets.
Our tables are partitioned by date, allowing for efficient pruning of historical data. This partitioning strategy is crucial for queries that focus on recent job runs or specific time ranges. By quickly eliminating irrelevant partitions, we significantly reduce the amount of data scanned for each query, leading to faster execution times.
C/C++
PARTITION BY RANGE(`report_date`)()
DISTRIBUTED BY HASH(`report_date`,`platform`)
Dynamic partitioning
We utilise StarRocks’ dynamic partitioning feature to automatically manage our partitions. This ensures that new partitions are created as fresh data arrives and old partitions are dropped when data expires. Dynamic partitioning helps maintain optimal query performance over time without manual intervention, which is especially important for our continuous data ingestion process.
Here’s an example of how we configure dynamic partitioning for a 33-day retention period:
To verify that dynamic partitioning is working correctly and to monitor the state of your partitions, you can use the following SQL command:
C/C++
SHOW PARTITIONS FROM iris.cluster_worker_metrics_raw;
This command provides a summary of all partitions for the specified table (in this case, iris.cluster_worker_metrics_raw). The output includes valuable information such as:
The total number of partitions
The date range covered by each partition
Row count per partition
Size of each partition
While dynamic partitioning keeps the most recent 33 days of data readily available in StarRocks for fast querying, we’ve implemented a strategy to retain older data for long-term analysis.
We use a daily cron job to back up data older than 30 days to Amazon S3. This ensures we maintain historical data without impacting the performance of our primary StarRocks cluster.
Here’s an example of the backup query we use:
Python
INSERT INTO
FILES(
"path" = "{s3backUpPath}/{table_name}/",
"format" = "parquet",
"compression" = "zstd",
"partition_by" = "report_date",
"aws.s3.region" = "ap-southeast-1"
)
SELECT * FROM iris.{table_name} WHERE report_date between '{start_date}' and '{end_date}';
After backing up to S3, we map this data to a data lake table, enabling us to query historical data beyond the 33-day window in StarRocks when needed, without affecting the performance of our primary observability system.
Python
df_snapshot = spark.read.parquet(f"{s3backUpPath}/{table_name}")
# do the transformation if needed here
df_snapshot.write.format("delta").mode("overwrite").option("partitionOverwriteMode", "dynamic").option("mergeSchema", "true").partitionBy("report_date").save(f"{s3SinkPath}/{table_name}")
%sql
CREATE TABLE IF NOT EXISTS iris.{table_name}
USING DELTA
LOCATION '{s3SinkPath}/{table_name}'
Data replication
StarRocks uses data replication across multiple nodes, which is crucial for both fault tolerance and query performance. This strategy allows parallel query execution speeding up data retrieval. It’s particularly beneficial for our front-end queries, where low latency is crucial for user experience. This approach aligns with best practices seen in other distributed database systems like Cassandra, DynamoDB, and MySQL’s master-slave architecture.
C/C++
PROPERTIES (
"replication_num" = "3",
);
Unified web application
We’ve developed a comprehensive web application for Iris, consisting of both backend and frontend components. This unified interface offers users a seamless experience for monitoring and analysing Spark jobs.
Backend
Built using Golang, our backend service connects directly to the StarRocks database.
It queries data from both raw tables and materialised views, leveraging the optimised data structures we’ve set up in StarRocks.
The backend handles authentication and authorisation, ensuring that users have appropriate access to job data.
Frontend
The frontend offers several key screens to show:
List of job runs
Job status
Job metadata
Driver log
Spark UI
Statistics on resource usage and cost
Here is an example of the job overview screen, which displays key summary information: total number of runs, job owner details, performance trends, and cost analysis charts. This comprehensive view provides users with a quick snapshot of their Spark job’s overall health and resource utilisation.
Figure 2: Example of job overview screen
Advanced analytics and insights
One of the key features we’ve implemented in Iris is the ability to perform analytics on historical job runs to capture trends. This feature leverages the power of StarRocks and our data model to provide users with valuable insights and recommendations. Here’s how we’ve implemented it:
Historical run analysis
We’ve created a materialised view that aggregates job run data over the last 30 days. This view likely includes metrics such as count of runs, p95 values for various resource utilisation, etc.
C/C++
CREATE MATERIALIZED VIEW job_run_summaries_001
REFRESH ASYNC EVERY(INTERVAL 1 DAY)
AS
select platform,
job_id,
count(distinct run_id) as count_run,
ceil(percentile_approx(total_instances, 0.95)) as p95_total_instances,
ceil(percentile_approx(worker_instances, 0.95)) as p95_worker_instances,
percentile_approx(job_hour, 0.95) as p95_job_hour,
percentile_approx(machine_hour, 0.95) as p95_machine_hour,
percentile_approx(cpu_hour, 0.95) as p95_cpu_hour,
percentile_approx(worker_gc_hour, 0.95) as p95_worker_gc_hour,
ceil(percentile_approx(driver_cpus, 0.95)) as p95_driver_cpus,
ceil(percentile_approx(worker_cpus, 0.95)) as p95_worker_cpus,
ceil(percentile_approx(driver_memory_gb, 0.95)) as p95_driver_memory_gb,
ceil(percentile_approx(worker_memory_gb, 0.95)) as p95_worker_memory_gb,
percentile_approx(driver_cpu_utilization, 0.95) as p95_driver_cpu_utilization,
percentile_approx(worker_cpu_utilization, 0.95) as p95_worker_cpu_utilization,
percentile_approx(driver_memory_utilization, 0.95) as p95_driver_memory_utilization,
percentile_approx(worker_memory_utilization, 0.95) as p95_worker_memory_utilization,
percentile_approx(total_gb_read, 0.95) as p95_gb_read,
percentile_approx(total_gb_written, 0.95) as p95_gb_written,
percentile_approx(total_memory_gb_spilled, 0.95) as p95_memory_gb_spilled,
percentile_approx(disk_spilled_rate, 0.95) as p95_disk_spilled_rate
from iris.job_runs
where report_date >= current_date - interval 30 day
group by platform, job_id;
Using this aggregated data, we can identify trends in job performance and resource usage over time, such as increasing run times or spikes in resource consumption.
Recommendation API
Based on trend analysis insights, we’ve built a recommendation API that suggests optimizations, such as adjusting resource allocations, identifying potential bottlenecks, or proposing schedule changes to optimise cost and performance.
Frontend integration
The recommendations generated by our API are integrated into the Iris front end. Users can view these recommendations directly in the job overview or details screens, offering actionable insights to improve Spark jobs.
Here is an example: in a job with consistently low resource utilisation (less than 25% over time), our system suggests reducing the worker size by half to optimise costs.
Figure 3. Example of job with low resource utilisation.
Slackbot integration
To make these insights more accessible, we’ve integrated the recommendation system with a SpellVault app (a GenAI platform at Grab). This allows users to interact with the recommendation system directly from Slack, allowing them to stay informed about job performance and potential optimisations without constantly checking the Iris web interface.
Figure 4. Example of integration with SpellVault.
Migration and adoption
Migration strategy
Fully migrating real-time CPU/Memory charts from Grafana to the new Iris UI
Will deprecate the Grafana dashboard after migration
Retaining Superset for platform metrics and specific BI needs
User onboarding and feedback
Iris deployed within the One DE app, centralising access to data engineering tools. The feedback button in the UI allows users to submit comments easily.
Lessons learned and future roadmap
Lessons learned
Unified data store: Using StarRocks as a single source for both real-time and historical data has significantly improved query performance and streamlined our architecture.
Materialised views: Leveraging StarRocks’ materialised views for pre-aggregations has significantly enhanced query response times, especially for common UI operations.
Dynamic partitioning: Implementing dynamic partitioning has helped in maintaining optimal performance as data volumes grow, automatically managing data retention.
Direct Kafka ingestion: StarRocks’ ability to ingest data directly from Kafka has streamlined our data pipeline, reducing latency and complexity.
Flexible data model: Compared to the previous time-series-focused InfluxDB, the StarRocks relational model enables more complex queries and simplifies metadata handling.
Future roadmap
Enhanced recommendations: Expand the recommendation system to include more in-depth suggestions, such as identifying potential bottlenecks and recommending Spark configurations to add or remove from jobs. These recommendations, aimed at improving runtime and cost performance, will leverage the detailed Spark metrics and event data we’re already collecting.
Advanced analytics: Leverage the comprehensive Spark metrics data to provide deeper insights into job performance and resource utilisation.
Integration expansion: Enhance Iris integration with other internal tools and platforms to increase adoption and ensure a seamless experience across the data engineering ecosystem.
Machine learning integration: Explore the possibility of incorporating machine learning models for predictive analytics on Spark performance.
Scalability improvements: Continue to optimise the system to handle increasing data volumes and user loads as adoption grows.
User experience enhancements: Continuously improve the Iris application’s UI/UX based on user feedback to make it more intuitive and informative.
Conclusion
The journey of building the Iris web application, powered by StarRocks, has been transformative for our Spark observability capabilities at Grab. This evolution was driven by the need for a user-friendly, centralised platform for Spark monitoring and logging.
By leveraging StarRocks’ capabilities, we’ve created a unified interface that seamlessly handles both real-time and historical data. This has allowed us to consolidate previously fragmented tools like Grafana and Superset into a single, cohesive platform. The ability to capture and analyse job metadata and metrics in one place has been crucial, enabling us to implement effective showback/chargeback mechanisms at the job level.
Looking ahead, we’re excited about the potential for more advanced analytics and machine learning-driven insights. The lessons learned from this project will guide our approach to building robust, scalable, and user-friendly data tools at Grab.
Join us
Grab is a leading superapp in Southeast Asia, operating across the deliveries, mobility and digital financial services sectors. Serving over 800 cities in eight Southeast Asian countries, Grab enables millions of people everyday to order food or groceries, send packages, hail a ride or taxi, pay for online purchases or access services such as lending and insurance, all through a single app. Grab was founded in 2012 with the mission to drive Southeast Asia forward by creating economic empowerment for everyone. Grab strives to serve a triple bottom line – we aim to simultaneously deliver financial performance for our shareholders and have a positive social impact, which includes economic empowerment for millions of people in the region, while mitigating our environmental footprint.
Powered by technology and driven by heart, our mission is to drive Southeast Asia forward by creating economic empowerment for everyone. If this mission speaks to you, join our team today!
The Google Bug Hunters blog has a
detailed description of how a vulnerability in AMD’s microcode-patching
functionality was discovered and exploited; the authors have also released
a set of tools to assist with this kind of research in the future.
Secure hash functions are designed in such a way that there is no
secret key, and there is no way to use knowledge of the
intermediate state in order to generate a collision. However, CMAC
was not designed as a hash function, and therefore it is a weak
hash function against an adversary who has the key. Remember that
every AMD Zen CPU has to have the same AES-CMAC key in order to
successfully calculate the hash of the AMD public key and the
microcode patch contents. Therefore, the key only needs to be
revealed from a single CPU in order to compromise all other CPUs
using the same key. This opens up the potential for hardware
attacks (e.g., reading the key from ROM with a scanning electron
microscope), side-channel attacks (e.g., using Correlation Power
Analysis to leak the key during validation), or other software or
hardware attacks that can somehow reveal the key. In summary, it is
a safe assumption that such a key will not remain secret forever.
Всеки, който някога е гледал спор или дебат с участието на Доналд Тръмп, може да потвърди, че в такива случаи настоящият президент на САЩ прави всичко възможно, за да размаже събеседника си, независимо кой стои пред него. Този скандален шоу стил на Тръмп не е случаен, защото именно в него се крие стратегията, която върна милиардера в Белия дом. За разлика от европейската традиция, която е прокарала ясни червени линии за реториката на политиците, в САЩ нещата не стоят точно така.
От друга страна, да сведем случилото се преди броени дни в Белия дом до някаква обикновена политическа свада, в която са се сблъскали герой и злодей, е наивна стратегия, която няма да ни каже какво всъщност стана на срещата между Доналд Тръмп и Володимир Зеленски. Много идеалисти и идеолози виждат нещата по този начин, защото стават жертва на т.нар. пожелателно мислене, при което нагласите и представите на индивида се формират на базата на неговите желания, а не на обективната реалност. Същевременно отговорът трябва да се търси не на ниво геополитика и даже не на ниво лидерство, а на ниво възприятия или дори на липсата на такива.
Ролята на възприятията и нагласите във външната политика
Всеки експерт в сферата на международните отношения би трябвало да е чел поне веднъж в живота си книгата Perceptions and Misperceptions in International Politics, дело на един от най-великите американски учени Робърт Джървис.
След Кубинската ракетна криза от 1962 г. младият Джървис лесно попада в полезрението на ЦРУ с разработките си и започва работа по няколко научни труда, посветени на ядреното сдържане, на съветската стратегическа култура и на начина, по който политиците вземат решения. Всъщност, ако отворите тази книга, ще си отговорите не просто на въпроса защо Тръмп и Зеленски се скараха, но и защо изобщо се стигна до войната в Украйна. И не, това не са дежурните драсканици на хора, които се опитват да ни убедят колко добър или лош е някой от двата отбора, а е огромен, емпирично аргументиран труд, в който Джървис обяснява как може да предвидим или анализираме ходовете на лидерите.
Важно е да кажем, че теорията за възприятията няма общо с политическата психология, която се старае да покаже как мислят политиците. За разлика от нея, теорията за възприятията в политиката директно отговаря на въпросите как и защо политиците вземат решения. Според нея основните фактори, на базата на които се формират представите на лидерите, са три:
вярванията им;
ценностната система, в която са възпитани;
способността им да опознават околната среда.
Въз основа на тези променливи се различават два типа лидери: рационални политици, които имат ясни вярвания и развита ценностна система и възприемат прагматично околната среда; и други, без ясни вярвания и ценности, което им пречи да бъдат рационални. Много важно уточнение тук е, че един рационален лидер може да се превърне в напълно нерационален, в случай че изгуби реална представа за случващото се около него. Основна причина за това е страхът, който не само Джървис, но и много други изследователи посочват като източник на конфликти и разделение. Съгласно теорията за възприятията този страх може да бъде преодолян, но лекарството в такива случаи е по-лошо от болестта – нужно е въпросният лидер да се постави на мястото на опонента си. А практиката сочи, че това почти никога не се случва, поради което конфликтът е неизбежен.
Казано с други думи, оръжията, санкциите, политиката, идеологията са само едната страна на монетата. Всичко може да се промени, ако нагласите на лидерите се обърнат и те започнат да възприемат другия не като враг, а като партньор. Това обръщане на нагласите като че ли повече ни доближава до случващото се в последните няколко месеца, откакто Доналд Тръмп отново е в Белия дом. Доказателство за съждението, че всичко може да се промени, е неуспехът на много европейски политици и анализатори да предвидят какво ще се случи след спечелването на изборите от Тръмп, както и че той може да стигне до крайности, които завинаги да оставят диря в трансатлантическата солидарност.
Някои си казваха, че „не може да стане по-зле“, а други ни уверяваха, че „ще стане още по-добре“. В крайна сметка това не са прагматични оценки, а ориентири, които, макар и достоверни в някои случаи, не успяват адекватно да подготвят обществото за бурята, която се задава.
Ето защо преди всичко в един такъв анализ е необходимо да се дистанцираме от случващото се в глобалната политика днес. То е нелогично, хаотично, безнадеждно… Всъщност съвсем не – просто така изглежда.
Защо – можем да разберем само ако пренесем анализа си на индивидуално ниво.
От какво се страхува Доналд Тръмп?
Първият и най-важен въпрос е какво е в състояние да уплаши президента на САЩ до такава степен, че той да насочи цялата си съзнателна критика срещу Украйна и срещу нейния лидер. Тук няма да помогнат изводи от рода на „Тръмп е мародер и рекетьор, а Зеленски е нашият герой“ или пък „Тръмп иска траен мир, а Зеленски – безкрайна война“. Подобни твърдения, макар и частично аргументирани, имат не емпиричен, а политико-идеологически характер.
Отговорът е много прост: Тръмп се страхува за три неща и би дал мило и драго да не ги загуби – властта си, сигурността си и парите си. За първото и последното на този етап няма опасност, но ефектът от заплахата срещу тях беше видим след съдебните процеси срещу Тръмп, които го превърнаха в мъченик за избирателите му.
За пръв път обаче от края на Студената война националната сигурност на САЩ е под непосредствена заплаха. И не просто от една трансгранична терористична мрежа, а от две ядрени сили – Русия и Китай. Съюз, който е способен да сложи край на американското глобално лидерство.
Тази заплаха не може да бъде неутрализирана с изпращане на войски зад граница, защото това може да доведе до ядрена война. В нея няма да има победители и тогава Тръмп ще загуби и властта, и парите си. Тук може да се даде един прост пример – думите на Зеленски:
Г-н Президент, ние усещаме това от години. Но ако паднем, и вие ще го усетите.
На тях Тръмп реагира с гневното:
Не знаете това! Не ни казвайте какво ще усетим и какво – не!
Оттук насетне разговорът рязко завива в посока, за която британският премиер заяви, че „никой не би искал да вижда“. Същевременно едва ли има политик в американската история с по-голямо его от Тръмп. Този факт, съчетан със страха от ядрена война и с възхода на Китай, е прекрасна илюстрация на политическата метафора за меда и жилото, чийто автор е Драган Цанков. В този случай Зеленски усети както меда, така и жилото на САЩ.
От какво се страхува Зеленски?
Най-елементарното твърдение, което може да приемем, е, че Зеленски се страхува за живота и властта си. Всъщност, ако беше така, отдавна трябваше да е напуснал Украйна и да живее като един от най-богатите политици в Европа. Същото важи и за аргументите, които правят от Зеленски абсолютен герой или абсолютен злодей.
Да вярваме, че един политик е доброто или лошото момче, е много наивно и такива нагласи неведнъж са изигравали лоша шега на политиците в най-новата ни история.
Затова е най-трудно да дефинираме от какво толкова се страхува Зеленски, че беше готов да спори с президента и вицепрезидента на САЩ. Слухове за подобни спорове между украинския лидер и Байдън се появиха и през 2022 г., когато в телефонен разговор благият демократ изтървава нервите си и призовава Зеленски да бъде малко по-благодарен за оръжията, които получава. Изглежда, че Байдън се е страхувал също толкова, колкото и Тръмп, конфликтът да не ескалира.
За да си отговорим на въпроса какво плаши Зеленски, е добре да се върнем назад и да видим кое е най-силното обещание, с което той печели изборите в Украйна със смазваща преднина пред Петро Порошенко през 2019 г. Тогава Зеленски обещава на украинците две неща: че ще смаже олигархията в страната и че ще промени драстично външнополитическия ѝ курс.
Част от опасенията на украинския лидер включват да не се разочарова от САЩ, защото това би означавало, че предава доверието на избирателите си, тъй като обещаната смяна на външнополитическия курс няма как да се изпълни без САЩ.
Зеленски възприема Америка като великия герой, който ще удари по масата и ще вкара Украйна в НАТО, разгромявайки Русия веднъж завинаги. Тези внушения се засилват с времето под влиянието на много европейски политици, които виждат във войната възможност да ревизират връзките си с Москва. Но нито Зеленски, нито Европа отчетоха, че Великите сили имат само вечни интереси, не и вечни приятели. Студеният прагматизъм на Тръмп сбъдва и най-големия страх на Зеленски – че Америка ще изостави Украйна така, както изостави Афганистан, Виетнам и големи части от Африка. Страх, който все повече започва да се усеща в Европа.
От какво се страхуват европейските политици?
Макар Европа да не е пряк участник в словесната престрелка между Тръмп и Зеленски, тя по всяка вероятност ще бъде пряко потърпевша от нея. Най-объркана от всички, разбира се, е Германия, която, подплатена с мрачните спомени от Втората световна война, години наред се страхува, че ще трябва да воюва отново. Ето че сега ще ѝ се наложи да направи точно това, ако Общността започне да гради своя армия.
Макрон, който на пръв поглед изглежда уверен заради френското ядрено оръжие, си дава ясна сметка, че ядрените триади на Париж и Лондон са ликвидирани след разпада на СССР, което няма да им позволи да опънат ядрен чадър над Стария континент в случай на нужда, а постигането на ядрен паритет с Русия е дълъг и сложен процес, който ще погребе завинаги спокойния живот на французите.
Останалата част от Западна Европа се страхува, че старата архитектура за сигурност вече я няма, а испанци, португалци и скандинавци ще трябва да се вдъхновяват от културното наследство на рицарите и викингите, за да градят армиите си наново.
Най-уплашени обаче са Централна и Източна Европа, тъй като много държави в региона смятат, че те са следващите, ако Украйна падне.
А Британия е уплашена, че Голямата война ще почне отново и Лондон ще трябва да защитава… Европейския съюз, който напусна. За британците в крайна сметка Първата световна война е много по-болезнен спомен, отколкото битката с Хитлер, защото тогава империята губи почти всичките си колонии.
И нека все пак не забравяме, че за част от европейските политици кризата на глобалния либерален ред е шок, а за други – неизбежна реалност. Но най-големият страх на европейските лидери е, че в Овалния кабинет може да ги сполети същото, което сполетя и Зеленски. И то не за друго, а защото един дребен знак на неуважение към Тръмп може да коства на съответната държава всичко в отношенията ѝ със САЩ.
От какво се страхуват Путин и Си Дзинпин?
Всъщност в тази графа могат да бъдат поместени не само Русия и Китай, но и много съюзници на САЩ, които искат да избегнат глобален военен конфликт. Големите страхове на Русия всъщност са свързани с престъпването на червените линии, отвъд които тя би употребила ядрено оръжие срещу Украйна – ако властта на руския президент бъде застрашена или ако самото съществуване на Русия бъде поставено на карта. За администрацията на Путин съществуването ѝ е равносилно на съществуването на руската държава. Последните промени в руската ядрена доктрина го доказват, а нагласите са ясни: ако Русия види, че губи войната, ще използва всички средства, за да го предотврати.
Някой би възразил, че завоюването на територии, чиято инфраструктура е напълно разрушена и обезлюдена, не е никаква победа, но в руското съзнание е точно обратното – достатъчно е тези територии да са руски и е без значение, че гражданите може да бъдат изложени на радиация. Началото на войната в Украйна, в което мнозина се съмняваха, и инцидентът в Чернобил от 1986 г. са историческото доказателство за тези нагласи.
И точно тук идва изходът от уравнението – оказва се, че Тръмп и Путин се страхуват от едно и също. Затова и ходовете им са толкова идентични. Затова и искат едно и също – край на войната на каквато и да е цена.
По аналогичен начин стоят нещата и със страховете на Китай. Си Дзинпин очевидно иска да се запише в китайската история като най-силния лидер от Мао Дзъдун насам. Това може да стане само по два начина – чрез обединение с Тайван или ако Китай успее да задмине САЩ. Една война между големите ще унищожи всякакви перспективи и за двете. Неговите страхове са общи с тези на Путин и Тръмп и затова той е склонен да се договори с тях, но все повече се отдалечава от европейците. Китайската карта на Кисинджър беше позорно проиграна от Европейския съюз, който влоши отношенията си с Китай заради САЩ и сега това започва да се обръща срещу него, като остава сам срещу САЩ, Русия и Китай.
Равносметката
Разгорещеният разговор между Тръмп и Зеленски от 28 февруари на практика доказва, че страховете на САЩ и Европа вече са много различни, за да ги обединяват. Вашингтон, който десетилетия наред беше критикуван от европейците, че се меси в делата им и им пречи, най-сетне реши да намали ангажимента си към Европа. Но това създаде много повече проблеми, отколкото реши. По време на Студената война Ричард Никсън на няколко пъти заплашва европейците, че САЩ няма да воюват с СССР заради тях, а Джими Картър до последно вярва, че мирното съжителство с Москва е възможно и че държавите от Съветския блок следва да са в нейната зона на влияние, за да може суперсилите да живеят в мир.
Парадоксално, тогава страховете на Вашингтон, Москва и Брюксел са общи – да не би в един момент балансът на силите да се наруши така, че да се стигне до Трета световна война. Ето защо автори като Робърт Джървис твърдят, че двуполюсният свят съвсем не е дилема на сигурността, а сблъсък на две системи – социализъм и капитализъм.
Днес обаче страховете на лидерите силно се разминават. Голяма част от европейските елити все още не си дават сметка за реалната опасност от ядрена война, а Русия умишлено използва ядрен шантаж, за да манипулира липсата на рационални възприятия какво може да се случи. Някой би казал, че при Тръмп шантажът работи, а при Европа – не. Трудно можем да отречем обаче, че кризата на политическото представителство е дотолкова повсеместна и дълбока, че кара избирателите в демократични държави да гласуват за лидери, които после проклинат, или пък да се възхищават на авторитарни вождове, които виждат като новите господари на света.
Разговорът между Тръмп и Зеленски в този смисъл е завършеният продукт от кризата на либералната демокрация, в която се сблъскват един от най-богатите президенти на САЩ и лидер, който с помощта на проамериканската оръжейна индустрия се опитва да унищожи проруската олигархия в Украйна и да защитава нападнатата си страна.
В това уравнение не е включена средната класа, а политиците от миналото, които се стремяха да я запазят, вече ги няма, за да формират приемлив за всички консенсус и диалог.
Остава въпросът трябва ли наистина да тестваме готовността на ядрените сили да воюват и до каква степен. Рационалният отговор е, че това не бива да се случва, защото днес във Вашингтон и Москва не стоят Кенеди и Хрушчов, а Тръмп и Путин.
This alignment with DESC requirements demonstrates our continued commitment to adhere to the heightened expectations for CSPs. Government customers of AWS can run their applications in AWS Cloud-certified Regions with confidence.
The independent third-party auditor (BSI) issued the Certificate of Compliance to AWS on behalf of DESC on January 23, 2025. The Certificate of Compliance that illustrates the compliance status of AWS is available through AWS Artifact. AWS Artifact is a self-service portal for on-demand access to AWS compliance reports. Sign in to AWS Artifact in the AWS Management Console, or learn more at Getting Started with AWS Artifact.
The certification includes 11 additional services in scope, for a total of 98 services. This is a 13% year-on-year increase in the number of services in the Middle East (UAE) Region that are in scope of the DESC CSP certification. For up-to-date information, including when additional services are added, see the AWS Services in Scope by Compliance Program webpage and choose DESC CSP.
AWS strives to continuously bring services into the scope of its compliance programs to help you adhere to your architectural and regulatory needs. If you have questions or feedback about DESC compliance, reach out to your AWS account team.
To learn more about our compliance and security programs, see AWS Compliance Programs. As always, we value your feedback and questions; reach out to the AWS Compliance team through the Contact Us page.
If you have feedback about this post, submit comments in the Comments section below.
Functional programming languages have a long association with graphs. In the
1990s, it was even thought that parallel graph-reduction
architectures could make functional programming languages much faster than their
imperative counterparts. Alas, that prediction mostly failed to materialize.
Even though graphs are still used as a theoretical formalism in order to define
and optimize functional languages (such as Haskell’s
spineless tagless graph-machine), they are still mostly compiled down to the same old
non-parallel assembly code that every other language uses. Now, two
projects —
Bend and
Vine — have sprung up attempting to change that, and prove that
parallel graph reduction can be a useful technique for real programs.
The collective thoughts of the interwebz
Manage Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.