dynamic Quantum Noora Dynamics By www.24-7pressrelease.com Published On :: Tue, 11 Jun 2024 08:00:00 GMT A Revolutionary Insight into the World of Physics by Dr R.A. Sarkar Full Article
dynamic Midland Development Corporation Launches Dynamic Redesigned Website Reflecting the Heart of West Texas By www.24-7pressrelease.com Published On :: Wed, 11 Sep 2024 08:00:00 GMT A Fresh Look and Enhanced Features Offer a Seamless User Experience for New and Existing Businesses Full Article
dynamic California-based software start-up Rexalto Inc., has announced the launch of an AI dynamic pricing engine for the US automotive and rental market By www.24-7pressrelease.com Published On :: Fri, 14 Apr 2023 08:00:00 GMT Rexalto Inc., has announced the launch of an AI dynamic pricing engine for the US automotive and rental market Full Article
dynamic Item by Item (IBI) Expands Microsoft Dynamics 365 Online Training with Comprehensive Asset Management Module By www.24-7pressrelease.com Published On :: Mon, 21 Oct 2024 08:00:00 GMT 90 Micro-Courses and 6 Tailored Learning Paths Now Available to Enhance D365 Expertise Full Article
dynamic Easy Dynamics and Beruku Identity Forge Partnership to Enhance U.S. Government Identity Proofing By www.24-7pressrelease.com Published On :: Thu, 06 Jun 2024 08:00:00 GMT Easy Dynamics and Beruku Identity have teamed up to help U.S. federal agencies on identity proofing for international users. Full Article
dynamic How Understanding Your Family Dynamics Can Improve Work By hbr.org Published On :: Tue, 19 Apr 2022 09:00:47 -0500 Deborah Ancona, a professor at MIT Sloan School of Management, and Dennis Perkins, CEO of The Syncretics Group, have researched how family dynamics play out in the workplace. They say people often revert to childhood patterns at work. By applying a concept from psychology known as family systems theory, managers and leaders can come to understand how their past influences their behavior and thus can grow professionally. Ancona and Perkins wrote the HBR article "Family Ghosts in the Executive Suite." Full Article
dynamic How the Unionization Trend is Changing Workplace Dynamics By hbr.org Published On :: Tue, 19 Jul 2022 09:00:14 -0500 For years, union membership has been shrinking in the United States and many other countries. But recently we've seen a resurgence, with employees in sectors like retail, hospitality, and media organizing to collectively bargain for better pay, benefits, and job flexibility. Thomas Kochan, a professor at the MIT Sloan School of Management, has long studied how unions affect individual, team, and corporate performance. He explains why some fears about them are overblown, how workers form successful ones, and how leaders can partner with these groups to ensure the best outcomes for everyone. Full Article
dynamic SCCMPod-447 eSIMPLER: A Dynamic, Electronic Health Record-Integrated Checklist By sccm-audio.s3.amazonaws.com Published On :: Thu, 28 Oct 2021 17:49:39 UTC The increasing use of electronic health records (EHRs) has inspired the need for a more dynamic checklist. Geva et al conducted a before-after quality improvement study by replacing a static checklist with an updated dynamic checklist. Full Article Medicine
dynamic GitHub x BUCK: Crafting a Dynamic Visual Identity for Universe ’24 By abduzeedo.com Published On :: Thu, 07 Nov 2024 13:44:34 +0000 GitHub x BUCK: Crafting a Dynamic Visual Identity for Universe ’24 abduzeedo1107—24 Learn how BUCK redefined branding and visual identity for GitHub Universe ’24 with monumental design inspired by code. The annual GitHub Universe event is a celebration of innovation, bringing together some of the brightest minds in software development. This year, GitHub partnered with BUCK, a renowned global creative company, to reimagine the event’s visual identity. Inspired by the theme “The World’s Fair of Software,” BUCK transformed GitHub Universe ’24 into a visually immersive experience that blended the past and future of software culture. Here’s a look at how this collaboration pushed the boundaries of branding and visual identity. The Creative Vision: Merging Tradition and Progress GitHub Universe ‘24 marked a milestone as the event’s tenth edition. This special occasion called for a branding overhaul that both paid homage to GitHub’s legacy and celebrated the event’s ongoing evolution. BUCK’s approach was rooted in capturing the spirit of World’s Fairs, where innovation and collaboration take center stage. Ward Graumans, BUCK’s Creative Director, emphasized their intent: “We aimed to create a look that celebrates this milestone while pushing the brand forward.” The visual system developed by BUCK didn’t just rehash previous designs. Instead, it evolved into a toolkit that incorporated new elements while staying true to GitHub’s core identity. Central to the branding were what BUCK called “Monuments of Progress.” These unique structures were a reinterpretation of their prior 2D shape library, elevated to represent key GitHub values. Each monument carried icons, mascots, and insider references from the developer community, merging playful aesthetics with thoughtful design. Key Elements of the Visual Identity BUCK crafted a comprehensive design system that tied together various aspects of GitHub’s event branding. The system integrated fresh color palettes, new typography, and updated logos, all influenced by the visual language of coding. The Monuments of Progress became the standout feature, serving both as iconic standalone pieces and as the basis for hero visuals. This creative concept was not just about aesthetics; it reinforced the event’s narrative, with each visual element acting as a beacon of innovation. Beyond static design, BUCK brought these monuments to life through animations and dynamic visuals. They created a suite of digital assets, from social media content to an introductory film that illuminated the event stages. This multimedia approach ensured that GitHub Universe ’24 had a cohesive yet lively visual identity, both online and in person. Collaboration and Execution The development of this branding system was a collaborative effort between BUCK, GitHub’s in-house design studio, event producers, and external partners. The process involved tight communication and shared creative insights. According to Adam Walden, VP of Brand and Corporate Marketing at GitHub, “BUCK continues to bring taste, craft, story, and incredible attention to detail to everything we do together.” This close-knit collaboration resulted in a unified event experience that resonated across different platforms. The team at BUCK didn’t just stop at creating a one-off design for the event. Instead, they developed a branding system with longevity, allowing GitHub to use these assets beyond Universe ’24. This evergreen toolkit ensures a lasting impact on GitHub’s branding efforts, providing flexibility for future campaigns and event rollouts. Impact and Legacy GitHub Universe ’24’s branding is more than a visual facelift; it’s an invitation to engage and explore. By drawing from coding elements and honoring the developer community, BUCK and GitHub have created a design system that feels both cutting-edge and familiar. The Monuments of Progress symbolize GitHub’s role as a hub of innovation, while the refined color schemes and typography elevate the brand’s visual language. This collaboration sets a new standard for event branding in the tech industry. BUCK’s creative solutions not only reflect GitHub’s ethos but also celebrate the people and projects that make the developer ecosystem thrive. It’s a testament to the power of thoughtful design and the impact of a strong, cohesive visual identity. The reimagined visual identity for GitHub Universe ’24 exemplifies how branding can serve as a narrative tool. BUCK’s designs invite viewers to think of software development not just as code, but as a world full of creativity and progress. As GitHub continues to grow, this branding system will be a cornerstone of its visual storytelling, inspiring developers and designers alike. GitHub Universe ’24, with its bold and vibrant identity, proves that a well-crafted brand can amplify the spirit of an event. BUCK’s collaboration with GitHub has set a high bar, showing how design, when rooted in community and culture, can make an event feel like a true celebration of innovation. Branding and visual identity artifacts About GitHub GitHub is the most widely adopted Copilot-powered developer platform to build, scale, and deliver secure software. Over 100 million developers, including more than 90% of the Fortune 100 companies, use GitHub to collaborate and more than 77,000 organizations have adopted GitHub Copilot. About BUCK BUCK is a global creative company that combines design, technology, and storytelling to create compelling experiences for brands. Founded in 2004, BUCK has built a reputation for outstanding craftsmanship and innovation through collaboration with a wide range of clients across the cultural and technology spheres, including Nike, Apple, Netflix, IBM, Airbnb, and Google. Recognized as an industry leader, BUCK’s trophy case includes two Emmys, multiple gold Cannes Lions, Clios, pencils, cubes, and over 200 other awards from the most prestigious competitions in the world. BUCK is in Residence, a collective of beautifully curated companies with the shared goal of empowering creative potential. Full Article
dynamic Bulletin on food price dynamics, inflation and the food security situation in Sudan: November-December 2022 [in Arabic] By www.ifpri.org Published On :: Tue, 07 Feb 2023 5:05:01 EST موجز: Full Article
dynamic Quarterly bulletin on food price dynamics, inflation, and the food security situation in Sudan: 2021Q1- 2022Q4 [in Arabic] By www.ifpri.org Published On :: Fri, 14 Apr 2023 12:29:04 EDT وجز : Full Article
dynamic Is dynamic pricing coming to a supermarket near you? By www.npr.org Published On :: Wed, 06 Mar 2024 23:16:30 +0000 Dynamic pricing is an increasingly common phenomenon: You can see it when Uber prices surge during rainy weather, or when you're booking a flight at the last minute or buying tickets to your favorite superstar's concert. On an earnings call last week, Wendy's ignited a minor controversy by suggesting it would introduce dynamic pricing in its restaurants, but the company quickly clarified that it wasn't planning on using it for "surge pricing."One place you hardly ever see dynamic pricing? American supermarkets. Why is that? Why shouldn't the prices for meat or bread or produce go down as they get older? Why does all the milk in the store cost the same, even when the "sell by" dates are weeks apart? Wouldn't a little more flexibility around prices be better for customers and help reduce waste?Professors Robert Evan Sanders and Ioannis (Yannis) Stamatopoulus had similar questions. So they set out to discover what was keeping supermarkets from employing a more dynamic approach, and what might convince them it was time for a change ... in pricing.This episode was hosted by Amanda Aronczyk and Nick Fountain. It was produced by Willa Rubin and edited by Keith Romer. It was engineered by Valentina Rodríguez Sánchez and fact-checked by Sierra Juarez.Learn more about sponsor message choices: podcastchoices.com/adchoicesNPR Privacy Policy Full Article
dynamic Dynamic Systems Inc.'s SIMBA Mobile Is Designed for Distributors By www.achrnews.com Published On :: Wed, 17 Oct 2018 07:00:00 -0400 Dynamic Systems Inc.’s l Stand-alone Mobile Inventory Application (SMIBA) uses barcodes to manage inventory and upload the information to any accounting system. Full Article
dynamic Episode 49: Dynamic Languages for Static Minds By feedproxy.google.com Published On :: Sun, 18 Mar 2007 07:15:03 +0000 In this Episode we talk about dynamic languages for statically-typed minds, or in other words: which are the interesting features people should learn when they go from a langauge such as Java or C# to a language like Python or Ruby. We used Ruby as the concrete example language. We started the discussion about important features with the concept of dynamically changing an object's type and the idea of message passing. We then looked at the concepts of blocks and closures. Next in line is a discussion about functions that create functions as well as currying. This lead into a quick discussion about continuations. Open classes, aliasing and the relationship to AOP was next on our agenda. We then looked considered a somewhat more engineering-oriented view and looked at the importance of testing and what are the best steps of getting from static programming to dynamic programming. Finally, we discussed a bit about the current (as of October 2006) state of dynamic languages on mainstream platforms. Full Article
dynamic Episode-467-Kim-Carter-on-Dynamic-Application-Security-Testing By traffic.libsyn.com Published On :: Wed, 07 Jul 2021 00:19:26 +0000 Kim Carter of BinaryMist discusses Dynamic Application Security Testing (DAST) and how the OWASP purpleteam project can improve early defect detection. Host Justin spoke with Carter about how DAST can provide meaningful feedback loops to developers... Full Article
dynamic Episode 497: Richard L. Sites on Understanding Software Dynamics By se-radio.net Published On :: Tue, 01 Feb 2022 20:27:40 +0000 Richard L. Sites discusses his new book Understanding Software Dynamics, which offers expert methods and advanced tools for understanding complex, time-constrained software dynamics in order to improve reliability and performance. Philip Winston spoke with Sites about the five fundamental computing resources CPU, Memory, Disk, Network, and Locks, as well as methods for observing and reasoning when investigating performance problems using the open-source utility KUtrace. Full Article
dynamic SE Radio 568: Simon Bennetts on OWASP Dynamic Application Security Testing Tool ZAP By se-radio.net Published On :: Wed, 14 Jun 2023 20:29:00 +0000 Simon Bennetts, a distinguished engineer at Jit, discusses one of the flagship projects of OWASP: the Zed Attack Proxy (ZAP) open source security testing tool. As ZAP’s primary maintainer, Simon traces the tool's origins and shares some anecdotes with SE Radio host Priyanka Raghavan on why there was a need for it. They take a deep dive into ZAP’s features and its ability to integrate with CI/CD, as well as shift security left. Bennetts also considers what it takes to build a successful open source project before spending time on ZAP’s ability to script to provide richer results. Finally, the conversation ends with some questions on ZAP’s future in this AI-powered world of bots. Full Article
dynamic Understanding Water Dynamics in Frozen Pipe Damage By www.randrmagonline.com Published On :: Wed, 06 Nov 2024 12:00:00 -0500 Understanding how water behaves during freezing and thawing is essential for effective water damage restoration during the winter months. Full Article
dynamic Dynamic Conveyor to Showcase DynaClean S Series at PACK EXPO By www.packagingstrategies.com Published On :: Tue, 29 Oct 2024 12:35:36 -0400 Visitors to Dynamic Conveyor’s booth will be able to see the S Series in action during the event, taking place at McCormick Place in Chicago, IL. Full Article
dynamic Barclays on oil - current market dynamics relatively stable, doesn't foresee major shifts By www.forexlive.com Published On :: Tue, 12 Nov 2024 23:31:08 GMT Barclays has issued a note suggesting that the re-election of Trump is unlikely to significantly impact oil market fundamentals in the near term. The bank believes that current market dynamics are relatively stable and does not foresee major shifts tied to potential changes in U.S. leadership. Barclays is recommending a long position on December 2025 Brent call spreads. The bank notes that volatility has recently decreased, and it perceives market sentiment as overly focused on downside risks, or the "left tail." In contrast, Barclays believes the risks are more balanced, especially in light of recent improvements in oil market fundamentals and the possibility of a more confrontational geopolitical landscape. This article was written by Eamonn Sheridan at www.forexlive.com. Full Article News
dynamic [ Z.100 Annex F3 (10/19) ] - Specification and Description Language - Overview of SDL-2010 - SDL-2010 formal definition: Dynamic semantics By www.itu.int Published On :: Wed, 12 May 2021 15:29:00 GMT Specification and Description Language - Overview of SDL-2010 - SDL-2010 formal definition: Dynamic semantics Full Article
dynamic [ Z.100 Annex F3 (06/21) ] - Specification and Description Language - Overview of SDL-2010 - SDL formal definition: Dynamic semantics By www.itu.int Published On :: Tue, 27 Jul 2021 10:55:00 GMT Specification and Description Language - Overview of SDL-2010 - SDL formal definition: Dynamic semantics Full Article
dynamic Mindstamp: Easily create dynamic interactive videos By www.ilearntechnology.com Published On :: Fri, 08 Jan 2021 18:50:21 +0000 It’s been a minute (or thousands) since I’ve blogged new technology finds. This year has us utilizing technology in new ways and in need of tools that support learning in new ways. I thought I’d drop back into the tech-tool blogging world with some of the technology that has kept us sane this year, but... Full Article General
dynamic Pay tribunal ruling will drive even greater uptake of automated handling technology, say Rainbow Dynamics By www.logisticsit.com Published On :: According to UK-based robotic and automated materials handling solutions specialist Rainbow Dynamics, the economic case for automating the key processes within a typical warehouse or fulfilment centre has been made even more compelling following the recent ruling that high street retailer Next must pay its shop assistants the same rate as its warehouse workers. Full Article
dynamic The dynamics of sustainable supply chain planning By www.logisticsit.com Published On :: Supply chain planning has huge potential to reduce the environmental impact of production and transportation, and supply chain solutions play a pivotal role in making this happen. Carlijn Goedhart, Sustainability Lead at DELMIA take a closer look at the dynamics of sustainable supply chain planning and the impact it can have on the world. Full Article
dynamic Rainbow Dynamics launches RackBot for goods-to-person order picking By www.logisticsit.com Published On :: Lancashire-based Rainbow Dynamics has launched RackBot for intralogistics goods-to-person order picking. Due to its streamlined design and straightforward build process, RackBot can be installed and up and running in one-third of the time that it would take to construct a traditional tote-shuttle system. Full Article
dynamic Generate QR Code Dynamically using PHP By www.codexworld.com Published On :: Mon, 06 Nov 2023 05:04:48 +0000 QR Code or Quick-Response code is machine-readable code consisting of squares arranged in square grid format. QR code is typically used to store information that can be readable by an imaging device (such as camera). QR codes may be used for various purposes, like displaying info to users, opening web page URLs, downloading mobile apps, adding contacts, etc. The user needs to scan QR code by device camera to view the information associated with the code. QR code or 2-dimensional barcode can be created dynamically. You can generate QR code using PHP. In this tutorial, we will show you how The post Generate QR Code Dynamically using PHP appeared first on CodexWorld. Full Article PHP Library QR QR Code
dynamic Multibody Dynamics Computational Methods and Applications By search.lib.uiowa.edu Published On :: Location: Electronic Resource- Full Article
dynamic Town and Country in Medieval North Western Europe: Dynamic Interactions By search.lib.uiowa.edu Published On :: Location: Electronic Resource- Full Article
dynamic Computational electromagnetic-aerodynamics By search.lib.uiowa.edu Published On :: Location: Electronic Resource- Full Article
dynamic Nonlinear optical cavity dynamics : from microresonators to fiber lasers By search.lib.uiowa.edu Published On :: Location: Engineering Library- TA1522.N66 2016 Full Article
dynamic Thermohydrodynamic instability in fluid-film bearings By search.lib.uiowa.edu Published On :: Location: Engineering Library- TJ1073.5.W36 2015 Full Article
dynamic Numerical models for submerged breakwaters : coastal hydrodynamics and morphodynamics By search.lib.uiowa.edu Published On :: Location: Engineering Library- TC333.A36 2016 Full Article
dynamic Wakhri: “dynamic, exhilarating and important” By thebirminghampress.com Published On :: Mon, 01 Jul 2024 15:32:45 +0000 A Midland Arts Centre presentation for Birmingham Indian Film Festival. Jessica Harris watches. Full Article Festivals Film Birmingham International Film Festival Jessica Harris Midland Arts Centre Qandeel Balach
dynamic 409: ‘The Dynamic Paradox’, With Nilay Patel By daringfireball.net Published On :: Thu, 26 Sep 2024 15:53:57 EDT Nilay Patel returns to the show to consider the iPhones 16. Full Article
dynamic Arvada West’s dynamic duo — Saylor Swanson and Sara Walker — set torrid pace in flag football’s first official season By www.denverpost.com Published On :: Sun, 03 Nov 2024 01:52:51 +0000 Years from now, when records have been broken and re-broken, and high school dynasties are set in stone, Saylor Swanson and Sara Walker will be remembered. Full Article Latest Headlines Preps Sports football Prep football
dynamic Are The Kids Angry About Their Family Dynamic? By www.bet.com Published On :: Wed, 6 Sep 2017 16:15:53 EDT Awareness is just the first step. Full Article Being Mary Jane Erica Shelton Kodish Richard Brooks
dynamic Patti LaBelle: The Diva Dynamic By www.bet.com Published On :: Fri, 15 Jan 2016 17:19:00 EST See the A-list artists Patti's influenced over the years. Full Article BET Honors Patti Labelle
dynamic TurtleWare: Dynamic Vars - A New Hope By turtleware.eu Published On :: Tue, 22 Oct 2024 00:00:00 GMT Table of Contents Dynamic Bindings The problem The solution Dynamic slots The context Summary Dynamic Bindings Common Lisp has an important language feature called dynamic binding. It is possible to rebind a dynamic variable somewhere on the call stack and downstream functions will see that new value, and when the stack is unwound, the old value is brought back. While Common Lisp does not specify multi-threading, it seems to be a consensus among various implementations that dynamic bindings are thread-local, allowing for controlling the computing context in a safe way. Before we start experiments, let's define a package to isolate our namespace: (defpackage "EU.TURTLEWARE.BLOG/DLET" (:local-nicknames ("MOP" #+closer-mop "C2MOP" #+(and (not closer-mop) ecl) "MOP" #+(and (not closer-mop) ccl) "CCL" #+(and (not closer-mop) sbcl) "SB-MOP")) (:use "CL")) (in-package "EU.TURTLEWARE.BLOG/DLET") Dynamic binding of variables is transparent to the programmer, because the operator LET is used for both lexical and dynamic bindings. For example: (defvar *dynamic-variable* 42) (defun test () (let ((*dynamic-variable* 15) (lexical-variable 12)) (lambda () (print (cons *dynamic-variable* lexical-variable))))) (funcall (test)) ;;; (42 . 12) (let ((*dynamic-variable* 'xx)) (funcall (test))) ;;; (xx . 12) Additionally the language specifies a special operator PROGV that gives the programmer a control over the dynamic binding mechanism, by allowing passing the dynamic variable by value instead of its name. Dynamic variables are represented by symbols: (progv (list '*dynamic-variable*) (list 'zz) (funcall (test))) ;;; (zz . 12) The problem Nowadays it is common to encapsulate the state in the instance of a class. Sometimes that state is dynamic. It would be nice if we could use dynamic binding to control it. That said slots are not variables, and if there are many objects of the same class with different states, then using dynamic variables defined with DEFVAR is not feasible. Consider the following classes which we want to be thread-safe: (defgeneric call-with-ink (cont window ink)) (defclass window-1 () ((ink :initform 'red :accessor ink))) (defmethod call-with-ink (cont (win window-1) ink) (let ((old-ink (ink win))) (setf (ink win) ink) (unwind-protect (funcall cont) (setf (ink win) old-ink)))) (defclass window-2 () ()) (defvar *ink* 'blue) (defmethod ink ((window window-2)) *ink*) (defmethod call-with-ink (cont (win window-2) ink) (let ((*ink* ink)) (funcall cont))) The first example is clearly not thread safe. If we access the WINDOW-1 instance from multiple threads, then they will overwrite a value of the slot INK. The second example is not good either, because when we have many instances of WINDOW-2 then they share the binding. Nesting CALL-WITH-INK will overwrite the binding of another window. The solution The solution is to use PROGV: (defclass window-3 () ((ink :initform (gensym)))) (defmethod initialize-instance :after ((win window-3) &key) (setf (symbol-value (slot-value win 'ink)) 'red)) (defmethod call-with-ink (cont (win window-3) ink) (progv (list (slot-value win 'ink)) (list ink) (funcall cont))) This way each instance has its own dynamic variable that may be rebound with a designated operator CALL-WITH-INK. It is thread-safe and private. We may add some syntactic sugar so it is more similar to let: (defmacro dlet (bindings &body body) (loop for (var val) in bindings collect var into vars collect val into vals finally (return `(progv (list ,@vars) (list ,@vals) ,@body)))) (defmacro dset (&rest pairs) `(setf ,@(loop for (var val) on pairs by #'cddr collect `(symbol-value ,var) collect val))) (defmacro dref (variable) `(symbol-value ,variable)) Dynamic slots While meta-classes are not easily composable, it is worth noting that we can mold it better into the language by specifying that slot itself has a dynamic value. This way CLOS aficionados will have a new tool in their arsenal. The approach we'll take is that a fresh symbol is stored as the value of each instance-allocated slot, and then accessors for the slot value will use these symbols as a dynamic variable. Here are low-level accessors: ;;; Accessing and binding symbols behind the slot. We don't use SLOT-VALUE, ;;; because it will return the _value_ of the dynamic variable, and not the ;;; variable itself. (defun slot-dvar (object slotd) (mop:standard-instance-access object (mop:slot-definition-location slotd))) (defun slot-dvar* (object slot-name) (let* ((class (class-of object)) (slotd (find slot-name (mop:class-slots class) :key #'mop:slot-definition-name))) (slot-dvar object slotd))) (defmacro slot-dlet (bindings &body body) `(dlet ,(loop for ((object slot-name) val) in bindings collect `((slot-dvar* ,object ,slot-name) ,val)) ,@body)) Now we'll define the meta-class. We need that to specialize functions responsible for processing slot definitions and the instance allocation. Notice, that we make use of a kludge to communicate between COMPUTE-EFFECTIVE-SLOT-DEFINITION and EFFECTIVE-SLOT-DEFINITION-CLASS – this is because the latter has no access to the direct slot definitions. ;;; The metaclass CLASS-WITH-DYNAMIC-SLOTS specifies alternative effective slot ;;; definitions for slots with an initarg :dynamic. (defclass class-with-dynamic-slots (standard-class) ()) ;;; Class with dynamic slots may be subclasses of the standard class. (defmethod mop:validate-superclass ((class class-with-dynamic-slots) (super standard-class)) t) ;;; When allocating the instance we initialize all slots to a fresh symbol that ;;; represents the dynamic variable. (defmethod allocate-instance ((class class-with-dynamic-slots) &rest initargs) (declare (ignore initargs)) (let ((object (call-next-method))) (loop for slotd in (mop:class-slots class) when (typep slotd 'dynamic-effective-slot) do (setf (mop:standard-instance-access object (mop:slot-definition-location slotd)) (gensym (string (mop:slot-definition-name slotd))))) object)) ;;; To improve potential composability of CLASS-WITH-DYNAMIC-SLOTS with other ;;; metaclasses we treat specially only slots that has :DYNAMIC in initargs, ;;; otherwise we call the next method. (defmethod mop:direct-slot-definition-class ((class class-with-dynamic-slots) &rest initargs) (loop for (key val) on initargs by #'cddr when (eq key :dynamic) do (return-from mop:direct-slot-definition-class (find-class 'dynamic-direct-slot))) (call-next-method)) ;;; The metaobject protocol did not specify an elegant way to communicate ;;; between the direct slot definition and the effective slot definition. ;;; Luckily we have dynamic bindings! :-) (defvar *kludge/mop-deficiency/dynamic-slot-p* nil) (defmethod mop:compute-effective-slot-definition ((class class-with-dynamic-slots) name direct-slotds) (if (typep (first direct-slotds) 'dynamic-direct-slot) (let* ((*kludge/mop-deficiency/dynamic-slot-p* t)) (call-next-method)) (call-next-method))) (defmethod mop:effective-slot-definition-class ((class class-with-dynamic-slots) &rest initargs) (declare (ignore initargs)) (if *kludge/mop-deficiency/dynamic-slot-p* (find-class 'dynamic-effective-slot) (call-next-method))) Finally we define a direct and an effective slot classes, and specialize slot accessors that are invoked by the instance accessors. ;;; There is a considerable boilerplate involving customizing slots. ;;; ;;; - direct slot definition: local to a single defclass form ;;; ;;; - effective slot definition: combination of all direct slots with the same ;;; name in the class and its superclasses ;;; (defclass dynamic-direct-slot (mop:standard-direct-slot-definition) ((dynamic :initform nil :initarg :dynamic :reader dynamic-slot-p))) ;;; DYNAMIC-EFFECTIVE-SLOT is implemented to return as slot-value values of the ;;; dynamic variable that is stored with the instance. ;;; ;;; It would be nice if we could specify :ALLOCATION :DYNAMIC for the slot, but ;;; then STANDARD-INSTANCE-ACCESS would go belly up. We could make a clever ;;; workaround, but who cares? (defclass dynamic-effective-slot (mop:standard-effective-slot-definition) ()) (defmethod mop:slot-value-using-class ((class class-with-dynamic-slots) object (slotd dynamic-effective-slot)) (dref (slot-dvar object slotd))) (defmethod (setf mop:slot-value-using-class) (new-value (class class-with-dynamic-slots) object (slotd dynamic-effective-slot)) (dset (slot-dvar object slotd) new-value)) (defmethod mop:slot-boundp-using-class ((class class-with-dynamic-slots) object (slotd dynamic-effective-slot)) (boundp (slot-dvar object slotd))) (defmethod mop:slot-makunbound-using-class ((class class-with-dynamic-slots) object (slotd dynamic-effective-slot)) (makunbound (slot-dvar object slotd))) With this, we can finally define a class with slots that have dynamic values. What's more, we may bind them like dynamic variables. ;;; Let there be light. (defclass window-4 () ((ink :initform 'red :dynamic t :accessor ink) (normal :initform 'normal :accessor normal)) (:metaclass class-with-dynamic-slots)) (let ((object (make-instance 'window-4))) (slot-dlet (((object 'ink) 15)) (print (ink object))) (print (ink object))) ContextL provides a similar solution with dynamic slots, although it provides much more, like layered classes. This example is much more self-contained. The context Lately I'm working on the repaint queue for McCLIM. While doing so I've decided to make stream operations thread-safe, so it is possible to draw on the stream and write to it from arbitrary thread asynchronously. The access to the output record history needs to be clearly locked, so that may be solved by the mutex. Graphics state is another story, consider the following functions running from separate threads: (defun team-red () (with-drawing-options (stream :ink +dark-red+) (loop for i from 0 below 50000 do (write-string (format nil "XXX: ~5d~%" i) stream)))) (defun team-blue () (with-drawing-options (stream :ink +dark-blue+) (loop for i from 0 below 50000 do (write-string (format nil "YYY: ~5d~%" i) stream)))) (defun team-pink () (with-drawing-options (stream :ink +deep-pink+) (loop for i from 0 below 25000 do (case (random 2) (0 (draw-rectangle* stream 200 (* i 100) 250 (+ (* i 100) 50))) (1 (draw-circle* stream 225 (+ (* i 100) 25) 25)))))) (defun gonow (stream) (window-clear stream) (time (let ((a (clim-sys:make-process #'team-red)) (b (clim-sys:make-process #'team-blue)) (c (clim-sys:make-process #'team-grue))) (bt:join-thread a) (bt:join-thread b) (bt:join-thread c) (format stream "done!~%"))) ) Operations like WRITE-STRING and DRAW-RECTANGLE can be implemented by holding a lock over the shared resource without much disruption. The drawing color on the other hand is set outside of the loop, so if we had locked the graphics state with a lock, then these functions would be serialized despite being called from different processes. The solution to this problem is to make graphics context a dynamic slot that is accessed with WITH-DRAWING-OPTIONS. Summary I hope that I've convinced you that dynamic variables are cool (I'm sure that majority of readers here are already convinced), and that dynamic slots are even cooler :-). Watch forward to the upcoming McCLIM release! If you like technical writeups like this, please consider supporting me on Patreon. Full Article
dynamic TurtleWare: Dynamic Vars - The Empire Strikes Back By turtleware.eu Published On :: Mon, 28 Oct 2024 00:00:00 GMT Table of Contents Thread Local storage exhausted The layer of indirection I can fix her Let's write some tests! Summary Thread Local storage exhausted In the last post I've described a technique to use dynamic variables by value instead of the name by utilizing the operator PROGV. Apparently it works fine on all Common Lisp implementations I've tried except from SBCL, where the number of thread local variables is by default limited to something below 4000. To add salt to the injury, these variables are not garbage collected. Try the following code to crash into LDB: (defun foo () (loop for i from 0 below 4096 do (when (zerop (mod i 100)) (print i)) (progv (list (gensym)) (list 42) (values)))) (foo) This renders our new technique not very practical given SBCL popularity. We need to either abandon the idea or come up with a workaround. The layer of indirection Luckily for us we've already introduced a layer of indirection. Operators to access dynamic variables are called DLET, DSET and DREF. This means, that it is enough to provide a kludge implementation for SBCL with minimal changes to the remaining code. The old code works the same as previously except that instead of SYMBOL-VALUE we use the accessor DYNAMIC-VARIABLE-VALUE, and the old call to PROGV is now DYNAMIC-VARIABLE-PROGV. Moreover DYNAMIC-EFFECTIVE-SLOT used functions BOUNDP and MAKUNBOUND, so we replace these with DYNAMIC-VARIABLE-BOUND-P and DYNAMIC-VARIABLE-MAKUNBOUND. To abstract away things further we also introduce the constructor MAKE-DYNAMIC-VARIABLE (defpackage "EU.TURTLEWARE.BLOG/DLET" (:local-nicknames ("MOP" #+closer-mop "C2MOP" #+(and (not closer-mop) ecl) "MOP" #+(and (not closer-mop) ccl) "CCL" #+(and (not closer-mop) sbcl) "SB-MOP")) (:use "CL")) (in-package "EU.TURTLEWARE.BLOG/DLET") (eval-when (:compile-toplevel :execute :load-toplevel) (unless (member :bordeaux-threads *features*) (error "Please load BORDEAUX-THREADS.")) (when (member :sbcl *features*) (unless (member :fake-progv-kludge *features*) (format t "~&;; Using FAKE-PROGV-KLUDGE for SBCL.~%") (push :fake-progv-kludge *features*)))) (defmacro dlet (bindings &body body) (flet ((pred (binding) (and (listp binding) (= 2 (length binding))))) (unless (every #'pred bindings) (error "DLET: bindings must be lists of two values.~%~ Invalid bindings:~%~{ ~s~%~}" (remove-if #'pred bindings)))) (loop for (var val) in bindings collect var into vars collect val into vals finally (return `(dynamic-variable-progv (list ,@vars) (list ,@vals) ,@body)))) (defmacro dset (&rest pairs) `(setf ,@(loop for (var val) on pairs by #'cddr collect `(dref ,var) collect val))) (defmacro dref (variable) `(dynamic-variable-value ,variable)) ;;; ... (defmethod mop:slot-boundp-using-class ((class standard-class) object (slotd dynamic-effective-slot)) (dynamic-variable-bound-p (slot-dvar object slotd))) (defmethod mop:slot-makunbound-using-class ((class standard-class) object (slotd dynamic-effective-slot)) (dynamic-variable-makunbound (slot-dvar object slotd))) With these in place we can change the portable implementation to conform. #-fake-progv-kludge (progn (defun make-dynamic-variable () (gensym)) (defun dynamic-variable-value (variable) (symbol-value variable)) (defun (setf dynamic-variable-value) (value variable) (setf (symbol-value variable) value)) (defun dynamic-variable-bound-p (variable) (boundp variable)) (defun dynamic-variable-makunbound (variable) (makunbound variable)) (defmacro dynamic-variable-progv (vars vals &body body) `(progv ,vars ,vals ,@body))) I can fix her The implementation for SBCL will mediate access to the dynamic variable value with a synchronized hash table with weak keys. The current process is the key of the hash table and the list of bindings is the value of the hash table. For compatibility between implementations the top level value of the symbol will be shared. The variable +FAKE-UNBOUND+ is the marker that signifies, that the variable has no value. When the list of bindings is EQ to +CELL-UNBOUND+, then it means that we should use the global value. We add new bindings by pushing to it. #+fake-progv-kludge (progn (defvar +fake-unbound+ 'unbound) (defvar +cell-unbound+ '(no-binding)) (defclass dynamic-variable () ((tls-table :initform (make-hash-table :synchronized t :weakness :key) :reader dynamic-variable-tls-table) (top-value :initform +fake-unbound+ :accessor dynamic-variable-top-value))) (defun make-dynamic-variable () (make-instance 'dynamic-variable)) (defun dynamic-variable-bindings (dvar) (let ((process (bt:current-thread)) (tls-table (dynamic-variable-tls-table dvar))) (gethash process tls-table +cell-unbound+))) (defun (setf dynamic-variable-bindings) (value dvar) (let ((process (bt:current-thread)) (tls-table (dynamic-variable-tls-table dvar))) (setf (gethash process tls-table +cell-unbound+) value)))) We define two readers for the variable value - one that simply reads the value, and the other that signals an error if the variable is unbound. Writer for its value either replaces the current binding, or if the value cell is unbound, then we modify the top-level symbol value. We use the value +FAKE-UNBOUND+ to check whether the variable is bound and to make it unbound. #+fake-progv-kludge (progn (defun %dynamic-variable-value (dvar) (let ((tls-binds (dynamic-variable-bindings dvar))) (if (eq tls-binds +cell-unbound+) (dynamic-variable-top-value dvar) (car tls-binds)))) (defun dynamic-variable-value (dvar) (let ((tls-value (%dynamic-variable-value dvar))) (when (eq tls-value +fake-unbound+) (error 'unbound-variable :name "(unnamed)")) tls-value)) (defun (setf dynamic-variable-value) (value dvar) (let ((tls-binds (dynamic-variable-bindings dvar))) (if (eq tls-binds +cell-unbound+) (setf (dynamic-variable-top-value dvar) value) (setf (car tls-binds) value)))) (defun dynamic-variable-bound-p (dvar) (not (eq +fake-unbound+ (%dynamic-variable-value dvar)))) (defun dynamic-variable-makunbound (dvar) (setf (dynamic-variable-value dvar) +fake-unbound+))) Finally we define the operator to dynamically bind variables that behaves similar to PROGV. Note that we PUSH and POP from the thread-local hash table DYNAMIC-VARIABLE-BINDINGS, so no synchronization is necessary. #+fake-progv-kludge (defmacro dynamic-variable-progv (vars vals &body body) (let ((svars (gensym)) (svals (gensym)) (var (gensym)) (val (gensym))) `(let ((,svars ,vars)) (loop for ,svals = ,vals then (rest ,svals) for ,var in ,svars for ,val = (if ,svals (car ,svals) +fake-unbound+) do (push ,val (dynamic-variable-bindings ,var))) (unwind-protect (progn ,@body) (loop for ,var in ,svars do (pop (dynamic-variable-bindings ,var))))))) Let's write some tests! But of course, we are going to also write a test framework. It's short, I promise. As a bonus point the API is compatibile with fiveam, so it is possible to drop tests as is in the appropriate test suite. (defvar *all-tests* '()) (defun run-tests () (dolist (test (reverse *all-tests*)) (format *debug-io* "Test ~a... " test) (handler-case (funcall test) (serious-condition (c) (format *debug-io* "Failed: ~a~%" c)) (:no-error (&rest args) (declare (ignore args)) (format *debug-io* "Passed.~%"))))) (defmacro test (name &body body) `(progn (pushnew ',name *all-tests*) (defun ,name () ,@body))) (defmacro is (form) `(assert ,form)) (defmacro pass ()) (defmacro signals (condition form) `(is (block nil (handler-case ,form (,condition () (return t))) nil))) (defmacro finishes (form) `(is (handler-case ,form (serious-condition (c) (declare (ignore c)) nil) (:no-error (&rest args) (declare (ignore args)) t)))) Now let's get to tests. First we'll test our metaclass: (defclass dynamic-let.test-class () ((slot1 :initarg :slot1 :dynamic nil :accessor slot1) (slot2 :initarg :slot2 :dynamic t :accessor slot2) (slot3 :initarg :slot3 :accessor slot3)) (:metaclass class-with-dynamic-slots)) (defparameter *dynamic-let.test-instance-1* (make-instance 'dynamic-let.test-class :slot1 :a :slot2 :b :slot3 :c)) (defparameter *dynamic-let.test-instance-2* (make-instance 'dynamic-let.test-class :slot1 :x :slot2 :y :slot3 :z)) (test dynamic-let.1 (let ((o1 *dynamic-let.test-instance-1*) (o2 *dynamic-let.test-instance-2*)) (with-slots (slot1 slot2 slot3) o1 (is (eq :a slot1)) (is (eq :b slot2)) (is (eq :c slot3))) (with-slots (slot1 slot2 slot3) o2 (is (eq :x slot1)) (is (eq :y slot2)) (is (eq :z slot3))))) (test dynamic-let.2 (let ((o1 *dynamic-let.test-instance-1*) (o2 *dynamic-let.test-instance-2*)) (signals error (slot-dlet (((o1 'slot1) 1)) nil)) (slot-dlet (((o1 'slot2) :k)) (is (eq :k (slot-value o1 'slot2))) (is (eq :y (slot-value o2 'slot2)))))) (test dynamic-let.3 (let ((o1 *dynamic-let.test-instance-1*) (exit nil) (fail nil)) (flet ((make-runner (values) (lambda () (slot-dlet (((o1 'slot2) :start)) (let ((value (slot2 o1))) (unless (eq value :start) (setf fail value))) (loop until (eq exit t) do (setf (slot2 o1) (elt values (random (length values)))) (let ((value (slot2 o1))) (unless (member value values) (setf fail value) (setf exit t)))))))) (let ((r1 (bt:make-thread (make-runner '(:k1 :k2)))) (r2 (bt:make-thread (make-runner '(:k3 :k4)))) (r3 (bt:make-thread (make-runner '(:k5 :k6))))) (sleep .1) (setf exit t) (map nil #'bt:join-thread (list r1 r2 r3)) (is (eq (slot2 o1) :b)) (is (null fail)))))) Then let's test the dynamic variable itself: (test dynamic-let.4 "Test basic dvar operators." (let ((dvar (make-dynamic-variable))) (is (eql 42 (dset dvar 42))) (is (eql 42 (dref dvar))) (ignore-errors (dlet ((dvar :x)) (is (eql :x (dref dvar))) (error "foo"))) (is (eql 42 (dref dvar))))) (test dynamic-let.5 "Test bound-p operator." (let ((dvar (make-dynamic-variable))) (is (not (dynamic-variable-bound-p dvar))) (dset dvar 15) (is (dynamic-variable-bound-p dvar)) (dynamic-variable-makunbound dvar) (is (not (dynamic-variable-bound-p dvar))))) (test dynamic-let.6 "Test makunbound operator." (let ((dvar (make-dynamic-variable))) (dset dvar t) (is (dynamic-variable-bound-p dvar)) (finishes (dynamic-variable-makunbound dvar)) (is (not (dynamic-variable-bound-p dvar))))) (test dynamic-let.7 "Test locally bound-p operator." (let ((dvar (make-dynamic-variable))) (is (not (dynamic-variable-bound-p dvar))) (dlet ((dvar 15)) (is (dynamic-variable-bound-p dvar))) (is (not (dynamic-variable-bound-p dvar))))) (test dynamic-let.8 "Test locally unbound-p operator." (let ((dvar (make-dynamic-variable))) (dset dvar t) (is (dynamic-variable-bound-p dvar)) (dlet ((dvar nil)) (is (dynamic-variable-bound-p dvar)) (finishes (dynamic-variable-makunbound dvar)) (is (not (dynamic-variable-bound-p dvar)))) (is (dynamic-variable-bound-p dvar)))) (test dynamic-let.9 "Stress test the implementation (see :FAKE-PROGV-KLUDGE)." (finishes ; at the same time (let ((dvars (loop repeat 4096 collect (make-dynamic-variable)))) ;; ensure tls variable (loop for v in dvars do (dlet ((v 1)))) (loop for i from 0 below 4096 for r = (random 4096) for v1 in dvars for v2 = (elt dvars r) do (when (zerop (mod i 64)) (pass)) (dlet ((v1 42) (v2 43)) (values)))))) (test dynamic-let.0 "Stress test the implementation (see :FAKE-PROGV-KLUDGE)." (finishes ; can be gc-ed (loop for i from 0 below 4096 do (when (zerop (mod i 64)) (pass)) (dlet (((make-dynamic-variable) 42)) (values))))) All that is left is to test both dynamic variable implementations: BLOG/DLET> (lisp-implementation-type) "ECL" BLOG/DLET> (run-tests) Test DYNAMIC-LET.1... Passed. Test DYNAMIC-LET.2... Passed. Test DYNAMIC-LET.3... Passed. Test DYNAMIC-LET.4... Passed. Test DYNAMIC-LET.5... Passed. Test DYNAMIC-LET.6... Passed. Test DYNAMIC-LET.7... Passed. Test DYNAMIC-LET.8... Passed. Test DYNAMIC-LET.9... Passed. Test DYNAMIC-LET.0... Passed. NIL And with the kludge: BLOG/DLET> (lisp-implementation-type) "SBCL" BLOG/DLET> (run-tests) Test DYNAMIC-LET.1... Passed. Test DYNAMIC-LET.2... Passed. Test DYNAMIC-LET.3... Passed. Test DYNAMIC-LET.4... Passed. Test DYNAMIC-LET.5... Passed. Test DYNAMIC-LET.6... Passed. Test DYNAMIC-LET.7... Passed. Test DYNAMIC-LET.8... Passed. Test DYNAMIC-LET.9... Passed. Test DYNAMIC-LET.0... Passed. NIL Summary In this post we've made our implementation to work on SBCL even when there are more than a few thousand dynamic variables. We've also added a simple test suite that checks the basic behavior. As it often happens, after achieving some goal we get greedy and achieve more. That's the case here as well. In the next (and the last) post in this series I'll explore the idea of adding truly thread-local variables without a shared global value. This will be useful for lazily creating context on threads that are outside of our control. We'll also generalize the implementation so it is possible to subclass and implement ones own flavor of a dynamic variable. Full Article
dynamic TurtleWare: Dynamic Vars - Return of the Jedi By turtleware.eu Published On :: Mon, 04 Nov 2024 00:00:00 GMT Table of Contents The protocol Control operators Synchronized hash tables with weakness First-class dynamic variables STANDARD-DYNAMIC-VARIABLE SURROGATE-DYNAMIC-VARIABLE Thread-local variables The protocol The implementation Thread-local slots What can we use it for? In the previous two posts I've presented an implementation of first-class dynamic variables using PROGV and a surrogate implementation for SBCL. Now we will double down on this idea and make the protocol extensible. Finally we'll implement a specialized version of dynamic variables where even the top level value of the variable is thread-local. The protocol Previously we've defined operators as either macros or functions. Different implementations were protected by the feature flag and symbols collided. Now we will introduce the protocol composed of a common superclass and functions that are specialized by particular implementations. Most notably we will introduce a new operator CALL-WITH-DYNAMIC-VARIABLE that is responsible for establishing a single binding. Thanks to that it will be possible to mix dynamic variables of different types within a single DLET statement. (defclass dynamic-variable () ()) (defgeneric dynamic-variable-bindings (dvar)) (defgeneric dynamic-variable-value (dvar)) (defgeneric (setf dynamic-variable-value) (value dvar)) (defgeneric dynamic-variable-bound-p (dvar)) (defgeneric dynamic-variable-makunbound (dvar)) (defgeneric call-with-dynamic-variable (cont dvar &optional value)) Moreover we'll define a constructor that is specializable by a key. This design will allow us to refer to the dynamic variable class by using a shorter name. We will also define the standard class to be used and an matching constructor. (defparameter *default-dynamic-variable-class* #-fake-progv-kludge 'standard-dynamic-variable #+fake-progv-kludge 'surrogate-dynamic-variable) (defgeneric make-dynamic-variable-using-key (key &rest initargs) (:method (class &rest initargs) (apply #'make-instance class initargs)) (:method ((class (eql t)) &rest initargs) (apply #'make-instance *default-dynamic-variable-class* initargs)) (:method ((class null) &rest initargs) (declare (ignore class initargs)) (error "Making a dynamic variable that is not, huh?"))) (defun make-dynamic-variable (&rest initargs) (apply #'make-dynamic-variable-using-key t initargs)) Control operators Control operators are the same as previously, that is a set of four macros that consume the protocol specified above. Note that DYNAMIC-VARIABLE-PROGV expands to a recursive call where each binding is processed separately. (defmacro dlet (bindings &body body) (flet ((pred (binding) (and (listp binding) (= 2 (length binding))))) (unless (every #'pred bindings) (error "DLET: bindings must be lists of two values.~%~ Invalid bindings:~%~{ ~s~%~}" (remove-if #'pred bindings)))) (loop for (var val) in bindings collect var into vars collect val into vals finally (return `(dynamic-variable-progv (list ,@vars) (list ,@vals) ,@body)))) (defmacro dset (&rest pairs) `(setf ,@(loop for (var val) on pairs by #'cddr collect `(dref ,var) collect val))) (defmacro dref (variable) `(dynamic-variable-value ,variable)) (defun call-with-dynamic-variable-progv (cont vars vals) (flet ((thunk () (if vals (call-with-dynamic-variable cont (car vars) (car vals)) (call-with-dynamic-variable cont (car vars))))) (if vars (call-with-dynamic-variable-progv #'thunk (cdr vars) (cdr vals)) (funcall cont)))) (defmacro dynamic-variable-progv (vars vals &body body) (let ((cont (gensym))) `(flet ((,cont () ,@body)) (call-with-dynamic-variable-progv (function ,cont) ,vars ,vals)))) Synchronized hash tables with weakness Previously we've used SBCL-specific options to define a synchronized hash table with weak keys. This won't do anymore, because we will need a similar object to implement the thread-local storage for top level values. trivial-garbage is a portability layer that allows to define hash tables with a specified weakness, but it does not provide an argument that would abstract away synchronization. We will ensure thread-safety with locks instead. (defclass tls-table () ((table :initform (trivial-garbage:make-weak-hash-table :test #'eq :weakness :key)) (lock :initform (bt:make-lock)))) (defun make-tls-table () (make-instance 'tls-table)) (defmacro with-tls-table ((var self) &body body) (let ((obj (gensym))) `(let* ((,obj ,self) (,var (slot-value ,obj 'table))) (bt:with-lock-held ((slot-value ,obj 'lock)) ,@body)))) First-class dynamic variables STANDARD-DYNAMIC-VARIABLE Previously in the default implementation we've represented dynamic variables with a symbol. The new implementation is similar except that the symbol is read from a STANDARD-OBJECT that represents the variable. This also enables us to specialize the function CALL-WITH-DYNAMIC-VARIABLE: (defclass standard-dynamic-variable (dynamic-variable) ((symbol :initform (gensym) :accessor dynamic-variable-bindings))) (defmethod dynamic-variable-value ((dvar standard-dynamic-variable)) (symbol-value (dynamic-variable-bindings dvar))) (defmethod (setf dynamic-variable-value) (value (dvar standard-dynamic-variable)) (setf (symbol-value (dynamic-variable-bindings dvar)) value)) (defmethod dynamic-variable-bound-p ((dvar standard-dynamic-variable)) (boundp (dynamic-variable-bindings dvar))) (defmethod dynamic-variable-makunbound ((dvar standard-dynamic-variable)) (makunbound (dynamic-variable-bindings dvar))) (defmethod call-with-dynamic-variable (cont (dvar standard-dynamic-variable) &optional (val nil val-p)) (progv (list (dynamic-variable-bindings dvar)) (if val-p (list val) ()) (funcall cont))) SURROGATE-DYNAMIC-VARIABLE The implementation of the SURROGATE-DYNAMIC-VARIABLE is almost the same as previously. The only difference is that we use the previously defined indirection to safely work with hash tables. Also note, that we are not add the feature condition - both classes is always created. (defvar +fake-unbound+ 'unbound) (defvar +cell-unbound+ '(no-binding)) (defclass surrogate-dynamic-variable (dynamic-variable) ((tls-table :initform (make-tls-table) :reader dynamic-variable-tls-table) (top-value :initform +fake-unbound+ :accessor dynamic-variable-top-value))) (defmethod dynamic-variable-bindings ((dvar surrogate-dynamic-variable)) (let ((process (bt:current-thread))) (with-tls-table (tls-table (dynamic-variable-tls-table dvar)) (gethash process tls-table +cell-unbound+)))) (defmethod (setf dynamic-variable-bindings) (value (dvar surrogate-dynamic-variable)) (let ((process (bt:current-thread))) (with-tls-table (tls-table (dynamic-variable-tls-table dvar)) (setf (gethash process tls-table) value)))) (defun %dynamic-variable-value (dvar) (let ((tls-binds (dynamic-variable-bindings dvar))) (if (eq tls-binds +cell-unbound+) (dynamic-variable-top-value dvar) (car tls-binds)))) (defmethod dynamic-variable-value ((dvar surrogate-dynamic-variable)) (let ((tls-value (%dynamic-variable-value dvar))) (when (eq tls-value +fake-unbound+) (error 'unbound-variable :name "(unnamed)")) tls-value)) (defmethod (setf dynamic-variable-value) (value (dvar surrogate-dynamic-variable)) (let ((tls-binds (dynamic-variable-bindings dvar))) (if (eq tls-binds +cell-unbound+) (setf (dynamic-variable-top-value dvar) value) (setf (car tls-binds) value)))) (defmethod dynamic-variable-bound-p ((dvar surrogate-dynamic-variable)) (not (eq +fake-unbound+ (%dynamic-variable-value dvar)))) (defmethod dynamic-variable-makunbound ((dvar surrogate-dynamic-variable)) (setf (dynamic-variable-value dvar) +fake-unbound+)) ;;; Apparently CCL likes to drop^Helide some writes and that corrupts bindings ;;; table. Let's ensure that the value is volatile. #+ccl (defvar *ccl-ensure-volatile* nil) (defmethod call-with-dynamic-variable (cont (dvar surrogate-dynamic-variable) &optional (val +fake-unbound+)) (push val (dynamic-variable-bindings dvar)) (let (#+ccl (*ccl-ensure-volatile* (dynamic-variable-bindings dvar))) (unwind-protect (funcall cont) (pop (dynamic-variable-bindings dvar))))) Thread-local variables We've refactored the previous code to be extensible. Now we can use metaobjects from the previous post without change. We can also test both implementations in the same process interchangeably by customizing the default class parameter. It is the time now to have some fun and extend dynamic variables into variables with top value not shared between different threads. This will enable ultimate thread safety. With our new protocol the implementation is trivial! The protocol First we will define the protocol class. THREAD-LOCAL-VARIABLE is a variant of a DYNAMIC-VARIABLE with thread-local top values. We specify initialization arguments :INITVAL and :INITFUN that will be used to assign the top value of a binding. The difference is that INITVAL specifies a single value, while INITFUN can produce an unique object on each invocation. INITARG takes a precedence over INTIFUN, and if neither is supplied, then a variable is unbound. We include the constructor that builds on MAKE-DYNAMIC-VARIABLE-USING-KEY, and macros corresponding to DEFVAR and DEFPARAMETER. Note that they expand to :INITFUN - this assures that the initialization form is re-evaluated for each new thread where the variable is used. (defclass thread-local-variable (dynamic-variable) ()) (defmethod initialize-instance :after ((self thread-local-variable) &key initfun initval) (declare (ignore self initfun initval))) (defparameter *default-thread-local-variable-class* #-fake-progv-kludge 'standard-thread-local-variable #+fake-progv-kludge 'surrogate-thread-local-variable) (defun make-thread-local-variable (&rest initargs) (apply #'make-dynamic-variable-using-key *default-thread-local-variable-class* initargs)) (defmacro create-tls-variable (&optional (form nil fp) &rest initargs) `(make-thread-local-variable ,@(when fp `(:initfun (lambda () ,form))) ,@initargs)) (defmacro define-tls-variable (name &rest initform-and-initargs) `(defvar ,name (create-tls-variable ,@initform-and-initargs))) (defmacro define-tls-parameter (name &rest initform-and-initargs) `(defparameter ,name (create-tls-variable ,@initform-and-initargs))) Perhaps it is a good time to introduce a new convention for tls variable names. I think that surrounding names with the minus sign is a nice idea, because it signifies, that it is something less than a global value. For example: DYNAMIC-VARS> (define-tls-variable -context- (progn (print "Initializing context!") (list :context))) -CONTEXT- DYNAMIC-VARS> -context- #<a EU.TURTLEWARE.DYNAMIC-VARS::STANDARD-THREAD-LOCAL-VARIABLE 0x7f7636c08640> DYNAMIC-VARS> (dref -context-) "Initializing context!" (:CONTEXT) DYNAMIC-VARS> (dref -context-) (:CONTEXT) DYNAMIC-VARS> (dset -context- :the-new-value) :THE-NEW-VALUE DYNAMIC-VARS> (dref -context-) :THE-NEW-VALUE DYNAMIC-VARS> (bt:make-thread (lambda () (print "Let's read it!") (print (dref -context-)))) #<process "Anonymous thread" 0x7f7637a26cc0> "Let's read it!" "Initializing context!" (:CONTEXT) DYNAMIC-VARS> (dref -context-) :THE-NEW-VALUE The implementation You might have noticed the inconspicuous operator DYNAMIC-VARIABLE-BINDINGS that is part of the protocol. It returns an opaque object that represents values of the dynamic variable in the current context: for STANDARD-DYNAMIC-VARIABLE it is a symbol for SURROGATE-DYNAMIC-VARIABLE it is a thread-local list of bindings In any case all other operators first take this object and then use it to read, write or bind the value. The gist of the tls variables implementation is to always return an object that is local to the thread. To store these objects we will use the tls-table we've defined earlier. (defclass thread-local-variable-mixin (dynamic-variable) ((tls-table :initform (make-tls-table) :reader dynamic-variable-tls-table) (tls-initfun :initarg :initfun :initform nil :accessor thread-local-variable-initfun) (tls-initval :initarg :initval :initform +fake-unbound+ :accessor thread-local-variable-initval))) For the class STANDARD-THREAD-LOCAL-VARIABLE we will simply return a different symbol depending on the thread: (defclass standard-thread-local-variable (thread-local-variable-mixin thread-local-variable standard-dynamic-variable) ()) (defmethod dynamic-variable-bindings ((tvar standard-thread-local-variable)) (flet ((make-new-tls-bindings () (let ((symbol (gensym)) (initval (thread-local-variable-initval tvar)) (initfun (thread-local-variable-initfun tvar))) (cond ((not (eq +fake-unbound+ initval)) (setf (symbol-value symbol) initval)) ((not (null initfun)) (setf (symbol-value symbol) (funcall initfun)))) symbol))) (let ((key (bt:current-thread))) (with-tls-table (tls-table (dynamic-variable-tls-table tvar)) (or (gethash key tls-table) (setf (gethash key tls-table) (make-new-tls-bindings))))))) And for the class SURROGATE-THREAD-LOCAL-VARIABLE the only difference from the SURROGATE-DYNAMIC-VARIABLE implementation is to cons a new list as the initial value (even when it is unbound) to ensure it is not EQ to +CELL-UNBOUND+. (defclass surrogate-thread-local-variable (thread-local-variable-mixin thread-local-variable surrogate-dynamic-variable) ()) (defmethod dynamic-variable-bindings ((tvar surrogate-thread-local-variable)) (flet ((make-new-tls-bindings () (let ((initval (thread-local-variable-initval tvar)) (initfun (thread-local-variable-initfun tvar))) (cond ((not (eq +fake-unbound+ initval)) (list initval)) ((not (null initfun)) (list (funcall initfun))) (t (list +fake-unbound+)))))) (let ((key (bt:current-thread))) (with-tls-table (tls-table (dynamic-variable-tls-table tvar)) (or (gethash key tls-table) (setf (gethash key tls-table) (make-new-tls-bindings))))))) That's all, now we have two implementations of thread-local variables. Ramifications are similar as with "ordinary" dynamic variables - the standard implementation is not advised for SBCL, because it will crash in LDB. Thread-local slots First we are going to allow to defined dynamic variable types with an abbreviated names. This will enable us to specify in the slot definition that type, for example (MY-SLOT :DYNAMIC :TLS :INITFORM 34) ;;; Examples how to add shorthand type names for the dynamic slots: (defmethod make-dynamic-variable-using-key ((key (eql :tls)) &rest initargs) (apply #'make-dynamic-variable-using-key *default-thread-local-variable-class* initargs)) (defmethod make-dynamic-variable-using-key ((key (eql :normal-tls)) &rest initargs) (apply #'make-dynamic-variable-using-key 'standard-thread-local-variable initargs)) (defmethod make-dynamic-variable-using-key ((key (eql :kludge-tls)) &rest initargs) (apply #'make-dynamic-variable-using-key 'surrogate-thread-local-variable initargs)) ;;; For *DEFAULT-DYNAMIC-VARIABLE* specify :DYNAMIC T. (defmethod make-dynamic-variable-using-key ((key (eql :normal-dyn)) &rest initargs) (apply #'make-dynamic-variable-using-key 'standard-dynamic-variable initargs)) (defmethod make-dynamic-variable-using-key ((key (eql :kludge-dyn)) &rest initargs) (apply #'make-dynamic-variable-using-key 'surrogate-dynamic-variable initargs)) In order to do that, we need to remember he value of the argument :DYNAMIC. We will read it with DYNAMIC-VARIABLE-TYPE and that value will be available in both direct and the effective slot: ;;; Slot definitions ;;; There is a considerable boilerplate involving customizing slots. ;;; ;;; - direct slot definition: local to a single defclass form ;;; ;;; - effective slot definition: combination of all direct slots with the same ;;; name in the class and its superclasses ;;; (defclass dynamic-direct-slot (mop:standard-direct-slot-definition) ((dynamic :initform nil :initarg :dynamic :reader dynamic-variable-type))) ;;; The metaobject protocol did not specify an elegant way to communicate ;;; between the direct slot definition and the effective slot definition. ;;; Luckily we have dynamic bindings! :-) (defvar *kludge/mop-deficiency/dynamic-variable-type* nil) ;;; DYNAMIC-EFFECTIVE-SLOT is implemented to return as slot-value values of the ;;; dynamic variable that is stored with the instance. ;;; ;;; It would be nice if we could specify :ALLOCATION :DYNAMIC for the slot, but ;;; then STANDARD-INSTANCE-ACCESS would go belly up. We could make a clever ;;; workaround, but who cares? (defclass dynamic-effective-slot (mop:standard-effective-slot-definition) ((dynamic :initform *kludge/mop-deficiency/dynamic-variable-type* :reader dynamic-variable-type))) Moreover we specialize the function MAKE-DYNAMIC-VARIABLE-USING-KEY to the effective slot class. The initargs in this method are meant for the instance. When the dynamic variable is created, we check whether it is a thread-local variable and initialize its INITVAL and INITFUN to values derived from INITARGS, MOP:SLOT-DEFINITION-INITARGS and MOP:SLOT-DEFINITION-INITFUN: (defmethod make-dynamic-variable-using-key ((key dynamic-effective-slot) &rest initargs) (let* ((dvar-type (dynamic-variable-type key)) (dvar (make-dynamic-variable-using-key dvar-type))) (when (typep dvar 'thread-local-variable) (loop with slot-initargs = (mop:slot-definition-initargs key) for (key val) on initargs by #'cddr when (member key slot-initargs) do (setf (thread-local-variable-initval dvar) val)) (setf (thread-local-variable-initfun dvar) (mop:slot-definition-initfunction key))) dvar)) The rest of the implementation of DYNAMIC-EFFECTIVE-SLOT is unchanged: (defmethod mop:slot-value-using-class ((class standard-class) object (slotd dynamic-effective-slot)) (dref (slot-dvar object slotd))) (defmethod (setf mop:slot-value-using-class) (new-value (class standard-class) object (slotd dynamic-effective-slot)) (dset (slot-dvar object slotd) new-value)) (defmethod mop:slot-boundp-using-class ((class standard-class) object (slotd dynamic-effective-slot)) (dynamic-variable-bound-p (slot-dvar object slotd))) (defmethod mop:slot-makunbound-using-class ((class standard-class) object (slotd dynamic-effective-slot)) (dynamic-variable-makunbound (slot-dvar object slotd))) The implementation of CLASS-WITH-DYNAMIC-SLOTS is also very similar. The first difference in that ALLOCATE-INSTANCE calls MAKE-DYNAMIC-VARIABLE-USING-KEY instead of MAKE-DYNAMIC-VARIABLE and supplies the effective slot definition as the key, and the instance initargs as the remaining arguments. Note that at this point initargs are already validated by MAKE-INSTANCE. The second difference is that MOP:COMPUTE-EFFECTIVE-SLOT-DEFINITION binds the flag *KLUDGE/MOP-DEFICIENCY/DYNAMIC-VARIABLE-TYPE* to DYNAMIC-VARIABLE-TYPE. ;;; This is a metaclass that allows defining dynamic slots that are bound with ;;; the operator SLOT-DLET, and, depending on the type, may have thread-local ;;; top value. ;;; ;;; The metaclass CLASS-WITH-DYNAMIC-SLOTS specifies alternative effective slot ;;; definitions for slots with an initarg :dynamic. (defclass class-with-dynamic-slots (standard-class) ()) ;;; Class with dynamic slots may be subclasses of the standard class. (defmethod mop:validate-superclass ((class class-with-dynamic-slots) (super standard-class)) t) ;;; When allocating the instance we initialize all slots to a fresh symbol that ;;; represents the dynamic variable. (defmethod allocate-instance ((class class-with-dynamic-slots) &rest initargs) (let ((object (call-next-method))) (loop for slotd in (mop:class-slots class) when (typep slotd 'dynamic-effective-slot) do (setf (mop:standard-instance-access object (mop:slot-definition-location slotd)) (apply #'make-dynamic-variable-using-key slotd initargs))) object)) ;;; To improve potential composability of CLASS-WITH-DYNAMIC-SLOTS with other ;;; metaclasses we treat specially only slots that has :DYNAMIC in initargs, ;;; otherwise we call the next method. (defmethod mop:direct-slot-definition-class ((class class-with-dynamic-slots) &rest initargs) (loop for (key) on initargs by #'cddr when (eq key :dynamic) do (return-from mop:direct-slot-definition-class (find-class 'dynamic-direct-slot))) (call-next-method)) (defmethod mop:compute-effective-slot-definition ((class class-with-dynamic-slots) name direct-slotds) (declare (ignore name)) (let ((latest-slotd (first direct-slotds))) (if (typep latest-slotd 'dynamic-direct-slot) (let ((*kludge/mop-deficiency/dynamic-variable-type* (dynamic-variable-type latest-slotd))) (call-next-method)) (call-next-method)))) (defmethod mop:effective-slot-definition-class ((class class-with-dynamic-slots) &rest initargs) (declare (ignore initargs)) (if *kludge/mop-deficiency/dynamic-variable-type* (find-class 'dynamic-effective-slot) (call-next-method))) Finally the implementation of SLOT-DLET does not change: ;;; Accessing and binding symbols behind the slot. We don't use SLOT-VALUE, ;;; because it will return the _value_ of the dynamic variable, and not the ;;; variable itself. (defun slot-dvar (object slotd) (check-type slotd dynamic-effective-slot) (mop:standard-instance-access object (mop:slot-definition-location slotd))) (defun slot-dvar* (object slot-name) (let* ((class (class-of object)) (slotd (find slot-name (mop:class-slots class) :key #'mop:slot-definition-name))) (slot-dvar object slotd))) (defmacro slot-dlet (bindings &body body) `(dlet ,(loop for ((object slot-name) val) in bindings collect `((slot-dvar* ,object ,slot-name) ,val)) ,@body)) Finally we can define a class with slots that do not share the top value: DYNAMIC-VARS> (defclass c1 () ((slot1 :initarg :slot1 :dynamic nil :accessor slot1) (slot2 :initarg :slot2 :dynamic t :accessor slot2) (slot3 :initarg :slot3 :dynamic :tls :accessor slot3)) (:metaclass class-with-dynamic-slots)) #<The EU.TURTLEWARE.DYNAMIC-VARS::CLASS-WITH-DYNAMIC-SLOTS EU.TURTLEWARE.DYNAMIC-VARS::C1> DYNAMIC-VARS> (with-slots (slot1 slot2 slot3) *object* (setf slot1 :x slot2 :y slot3 :z) (list slot1 slot2 slot3)) (:X :Y :Z) DYNAMIC-VARS> (bt:make-thread (lambda () (with-slots (slot1 slot2 slot3) *object* (setf slot1 :i slot2 :j slot3 :k) (print (list slot1 slot2 slot3))))) #<process "Anonymous thread" 0x7f76424c0240> (:I :J :K) DYNAMIC-VARS> (with-slots (slot1 slot2 slot3) *object* (list slot1 slot2 slot3)) (:I :J :Z) What can we use it for? Now that we know how to define thread-local variables, we are left with a question what can we use it for. Consider having a line-buffering stream. One possible implementation could be sketched as: (defclass line-buffering-stream (fancy-stream) ((current-line :initform (make-adjustable-string) :accessor current-line) (current-ink :initform +black+ :accessor current-ink))) (defmethod stream-write-char ((stream line-buffering-stream) char) (if (char= char # ewline) (terpri stream) (vector-push-extend char (current-line stream)))) (defmethod stream-terpri ((stream line-buffering-stream)) (%put-line-on-screen (current-line stream) (current-ink stream)) (setf (fill-pointer (current-line stream)) 0)) If this stream is shared between multiple threads, then even if individual operations and %PUT-LINE-ON-SCREEN are thread-safe , we have a problem. For example FORMAT writes are not usually atomic and individual lines are easily corrupted. If we use custom colors, these are also a subject of race conditions. The solution is as easy as making both slots thread-local. In that case the buffered line is private to each thread and it is put on the screen atomically: (defclass line-buffering-stream (fancy-stream) ((current-line :initform (make-adjustable-string) :accessor current-line :dynamic :tls) (current-ink :initform +black+ :accessor current-ink :dynamic :tls)) (:metaclass class-with-dynamic-slots)) Technique is not limited to streams. It may benefit thread-safe drawing, request processing, resource management and more. By subclassing DYNAMIC-VARIABLE we could create also variables that are local to different objects than processes. I hope that you've enjoyed reading this post as much as I had writing it. If you are interested in a full standalone implementation, with tests and system definitions, you may get it here. Cheers! Full Article
dynamic Relativistic dynamics: force, mass, kinetic energy, gravitation and dark matter By blogs.scienceforums.net Published On :: Thu, 15 Jul 2021 18:25:57 +0000 Special relativity does not deal with acceleration, general relativity does not deal with non gravitational acceleration, which leave the theory of relativity imperfect. We will demonstrate some relativistic dynamical laws that specify relativistic acceleration, force and kinetic energy. Also, based on equivalence principle does gravitational mass vary with inertial mass? Newtonian kinematics defines motions of... Full Article SFN Blogs Uncategorized
dynamic Episode 806 - Change the dynamic By shows.acast.com Published On :: Thu, 07 Nov 2024 12:09:38 GMT In this episode I'm joined by Phil Costa to look back at our 1-0 defeat to Inter Milan in the Champions League. Another loss is frustrating, but were there signs of improvement from the Arsenal attack last night? We analyse that, taking into context the quality of the opposition, while acknowledging things aren't exactly fluent at this moment in time. We wonder how Mikel Arteta might change the dynamic, and chat about some of the key moments in the game, from second half chances to two penalty decisions in the first half that went a long way to deciding the result. There's also discussion of Mikel Merino, Ethan Nwaneri, Raheem Sterling, and lots more.Get extra bonus content and help support Arseblog by becoming an Arseblog Member on Patreon: https://www.patreon.com/arseblog Hosted on Acast. See acast.com/privacy for more information. Full Article
dynamic Time-resolved Mass Spectrometry of Tyrosine Phosphorylation Sites in the Epidermal Growth Factor Receptor Signaling Network Reveals Dynamic Modules By www.mcponline.org Published On :: 2005-09-01 Yi ZhangSep 1, 2005; 4:1240-1250Research Full Article
dynamic Coupled intra- and interdomain dynamics support domain cross-talk in Pin1 [Signal Transduction] By www.jbc.org Published On :: 2020-12-04T00:06:05-08:00 The functional mechanisms of multidomain proteins often exploit interdomain interactions, or “cross-talk.” An example is human Pin1, an essential mitotic regulator consisting of a Trp–Trp (WW) domain flexibly tethered to a peptidyl-prolyl isomerase (PPIase) domain, resulting in interdomain interactions important for Pin1 function. Substrate binding to the WW domain alters its transient contacts with the PPIase domain via means that are only partially understood. Accordingly, we have investigated Pin1 interdomain interactions using NMR paramagnetic relaxation enhancement (PRE) and molecular dynamics (MD) simulations. The PREs show that apo-Pin1 samples interdomain contacts beyond the range suggested by previous structural studies. They further show that substrate binding to the WW domain simultaneously alters interdomain separation and the internal conformation of the WW domain. A 4.5-μs all-atom MD simulation of apo-Pin1 suggests that the fluctuations of interdomain distances are correlated with fluctuations of WW domain interresidue contacts involved in substrate binding. Thus, the interdomain/WW domain conformations sampled by apo-Pin1 may already include a range of conformations appropriate for binding Pin1's numerous substrates. The proposed coupling between intra-/interdomain conformational fluctuations is a consequence of the dynamic modular architecture of Pin1. Such modular architecture is common among cell-cycle proteins; thus, the WW–PPIase domain cross-talk mechanisms of Pin1 may be relevant for their mechanisms as well. Full Article
dynamic Existence and uniqueness result for reaction-diffusion model of diffusive population dynamics By www.ams.org Published On :: Tue, 01 Oct 2024 14:21 EDT A. Kh. Khachatryan, Kh. A. Khachatryan and A. Zh. Narimanyan Trans. Moscow Math. Soc. 83 (), 183-200. Abstract, references and article information Full Article
dynamic Power Sector Transformation, New Market Dynamics and Geopolitical Implications By www.chathamhouse.org Published On :: Thu, 06 Dec 2018 13:45:01 +0000 Power Sector Transformation, New Market Dynamics and Geopolitical Implications 7 November 2018 — 8:00AM TO 9:30AM Anonymous (not verified) 6 December 2018 Chatham House | 10 St James's Square | London | SW1Y 4LE The global electricity sector is experiencing profound change due to a confluence of technological innovation, environmental policies and regulatory reform. The effect is most obvious in the EU28, Australia and parts of North America.However, this is just the beginning and the success of the next phase of electricity sector transformations hinges on enhancing system flexibility to facilitate unhindered low-cost deployment of renewables. It remains to be seen how utilities will seek to navigate this second phase of electricity transformations.This session starts with a presentation and discussion that focuses on:Public and private sector risks of the transformation of the power sector, changes in generation mix and their implications for supply chain, employments and investment patterns.The role of government and the regulatory framework in light of changing market structure, new entrants and big data.Wider geopolitical issues including the implication for fossil fuel producers and the rise in demand for new materials and changes in land use. The possible implications on the power sector on the electrification of heat and transport.The discussion then moves to the speed of transformation and what this means for existing and new market actors. Full Article
dynamic Climate finance and conflict dynamics on the road to COP27 By www.chathamhouse.org Published On :: Fri, 09 Sep 2022 07:37:13 +0000 Climate finance and conflict dynamics on the road to COP27 21 September 2022 — 1:00PM TO 2:00PM Anonymous (not verified) 9 September 2022 Online Stakeholders discuss the role of conflict and conflict sensitivity in climate finance and action. With climate change, fragility and conflict challenges worsening, the role of international climate finance is more urgent than ever. From the implementation of climate finance and who it reaches to the rush for renewable energy, the inclusion of conflict analysis and conflict sensitivity principles often remain absent from climate finance discussions and planning. With COP27 around the corner and for the occasion of International Peace Day, stakeholders ranging from government representatives to climate activists discuss their perspectives on the role of conflict and conflict sensitivity as part of climate finance and action. This event was organized in partnership with International Alert. Full Article
dynamic Exploring Thermodynamics with Billiards By www.ams.org Published On :: Mon, 14 Feb 2022 14:38:14 -0400 Tim Chumley explains the connections between random billiards and the science of heat and energy transfer. If you've ever played billiards or pool, you've used your intuition and some mental geometry to plan your shots. Mathematicians have gone a step further, using these games as inspiration for new mathematical problems. Starting from the simple theoretical setup of a single ball bouncing around in an enclosed region, the possibilities are endless. For instance, if the region is shaped like a stadium (a rectangle with semicircles on opposite sides), and several balls start moving with nearly the same velocity and position, their paths in the region soon differ wildly: chaos. Mathematical billiards even have connections to thermodynamics, the branch of physics dealing with heat, temperature, and energy transfer. Full Article
dynamic Recent Developments in Fractal Geometry and Dynamical Systems By www.ams.org Published On :: Wed, 10 Apr 2024 11:36 EDT Sangita Jha, Mrinal Kanti Roychowdhury and Saurabh Verma, editors. American Mathematical Society, 2024, CONM, volume 797, approx. 268 pp. ISBN: 978-1-4704-7216-0 (print), 978-1-4704-7610-6 (online). This volume contains the proceedings of the virtual AMS Special Session on Fractal Geometry and Dynamical Systems, held from May 14–15,... Full Article