{"product_id":"110255","title":"How to read Java well ","description":"\u003ccenter\u003e\u003cdiv style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/tmgdisk01.cafe24.com\/images\/vs\/4172\/sv\/3jYEEOLkh6GjmDhHKMEF3LC7sReJKx.png?v=1765097993\" style=\"max-width:100%;max-height:10px\"\u003e\u003c\/div\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\n\n\u003cdiv style=\"width:95%\"\u003e\n\n\u003cdiv style=\"text-align:center;font-size:30px;font-weight:bolder;line-height:1.6em\"\u003e How to read Java well \u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"border-bottom:1px;border-bottom-style:dotted;border-color:;padding-bottom:20px\"\u003e\u003ccenter\u003e\u003ctable align=\"center\" width=\"100%\"\u003e\u003ctbody style=\"border:0px\"\u003e\n\n\u003ctr\u003e\u003ctd align=\"center\" style=\"line-height:1.2em;text-align:center;font-size:18px;color:black;font-weight:bold;padding-bottom:20px;\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\u003ctr\u003e\u003ctd style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/image.yes24.com\/goods\/126016473\/XL\" style=\"max-width:100%;height:auto\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/center\u003e\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;{split_style6}padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e Description \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;word-break:break-all;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eBook Introduction\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e\u003cdiv\u003e \u003cb\u003eProfiling, debugging, and logging techniques to find Java bugs and performance issues.\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e In practice, developers spend most of their time reading and understanding existing code.\u003cbr\u003e This book introduces practical techniques that will reduce the time it takes to understand unfamiliar Java code. \u003cbr\u003eBy profiling and debugging, and ultimately understanding how your JVM applications actually work, you can find the root causes of dependencies or crashes and interpret unexpected results.\u003cbr\u003e From the basics of debugging to advanced methods for finding problems in microservice architectures, this book teaches you how to \"read\" Java code with informal illustrations and engaging real-world examples.\u003cbr\u003e\n\u003c\/div\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cul\u003e\u003cli\u003e You can preview some of the book's contents.\u003cbr\u003e \u003cspan\u003ePreview\u003c\/span\u003e\n\n\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eindex\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e Translator's Preface x\u003cbr\u003e Beta Reader Review xi\u003cbr\u003e Beginning xiv\u003cbr\u003e Acknowledgments xvi\u003cbr\u003e About this book xviii\u003cbr\u003e About the cover xxi\u003cbr\u003e\u003cbr\u003e \u003cb\u003ePART I: Basic Troubleshooting Techniques\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 1 Clarifying Ambiguous Parts of the App 3\u003c\/b\u003e\u003cbr\u003e 1.1 How to understand the app more easily 4\u003cbr\u003e 1.2 Common Code Investigation Scenarios 8\u003cbr\u003e __1.2.1 Identify the cause of unexpected output 9\u003cbr\u003e __1.2.2 Acquire specific skills 14 \u003cbr\u003e__1.2.3 Find out why the speed is slowing down 15\u003cbr\u003e __1.2.4 Understanding Why Apps Crash 16\u003cbr\u003e 1.3 What You Will Learn in This Book 19\u003cbr\u003e Summary 20\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 2 Understanding App Logic with Debugging Techniques 21\u003c\/b\u003e\u003cbr\u003e 2.1 When Code Analysis Alone Is Insufficient 23\u003cbr\u003e 2.2 Examining Code Using a Debugger 26\u003cbr\u003e __2.2.1 What is an execution stack trace and how should I use it? 31\u003cbr\u003e __2.2.2 Navigating Code with the Debugger 36\u003cbr\u003e 2.3 If the debugger isn't enough, try 43\u003cbr\u003e Summary 45\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 3 Finding the Root Cause of Problems with Advanced Debugging Techniques 47\u003c\/b\u003e\u003cbr\u003e 3.1 Minimizing investigation time with conditional breakpoints 48\u003cbr\u003e 3.2 How to use breakpoints without stopping execution 52\u003cbr\u003e 3.3 Dynamically Changing the Investigation Scenario 55\u003cbr\u003e 3.4 Rewind the investigation case 58\u003cbr\u003e Summary 64\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 4: Debugging Remote Apps 65\u003c\/b\u003e\u003cbr\u003e 4.1 What is remote debugging? 66\u003cbr\u003e 4.2 Investigating in a Remote Environment 69\u003cbr\u003e __4.2.1 Scenario 70\u003cbr\u003e __4.2.2 Investigating Problems in a Remote Environment 71\u003cbr\u003e Summary 81\u003cbr\u003e \u003cbr\u003e\u003cb\u003eCHAPTER 5 Monitoring App Behavior Using Logs 83\u003c\/b\u003e\u003cbr\u003e 5.1 Investigating Using Logs 87\u003cbr\u003e __5.1.1 Identifying Exceptions Recorded in Logs 88\u003cbr\u003e __5.1.2 Identifying where a method was called with an exception stack trace 89\u003cbr\u003e __5.1.3 Measuring Command Execution Time in a Multithreaded Architecture 91\u003cbr\u003e __5.1.4 Investigating Command Execution Issues in Multithreaded Architectures 92\u003cbr\u003e 5.2 How to implement logging 94\u003cbr\u003e __5.2.1 Saving Log Messages 94\u003cbr\u003e __5.2.2 How to define logging levels and use the logging framework 95\u003cbr\u003e __5.2.3 Problems and Precautions Caused by Logging 102\u003cbr\u003e 5.3 Logs and Remote Debugging 107\u003cbr\u003e Summary 108\u003cbr\u003e\u003cbr\u003e \u003cb\u003ePART II Advanced Troubleshooting Techniques\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 6 Identifying Resource Usage Problems with Profiling Techniques 111\u003c\/b\u003e\u003cbr\u003e 6.1 When is a profiler useful? 112\u003cbr\u003e __6.1.1 Identifying Abnormal Resource Usage 112\u003cbr\u003e __6.1.2 Finding the code that is running 113\u003cbr\u003e __6.1.3 Identifying the cause of slow app launch speed 114 \u003cbr\u003e6.2 How to Use the Profiler 114\u003cbr\u003e __6.2.1 Installing and Configuring VisualVM 115\u003cbr\u003e __6.2.2 Observing CPU and Memory Usage 117\u003cbr\u003e __6.2.3 Identifying Memory Leaks 127\u003cbr\u003e Summary 132\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 7: Finding Hidden Issues with Profiling Techniques 133\u003c\/b\u003e\u003cbr\u003e 7.1 Observing Code Executed with Sampling 134\u003cbr\u003e 7.2 Determining the number of times a method is executed using profiling 142\u003cbr\u003e 7.3 Using the Profiler to Determine Which SQL Queries Your App Actually Executes 144\u003cbr\u003e __7.3.1 Identifying Non-Framework-Generated SQL Queries with the Profiler 144\u003cbr\u003e __7.3.2 Identifying Framework-Generated SQL Queries with a Profiler 150\u003cbr\u003e __7.3.3 Identifying SQL Queries Generated by Programs with a Profiler 153\u003cbr\u003e Summary 157\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 8 Applying Advanced Visualization Tools to Profiled Data 159\u003c\/b\u003e\u003cbr\u003e 8.1 Detecting JDBC Connection Problems 160\u003cbr\u003e 8.2 Understanding the app's code design by looking at the call graph 173\u003cbr\u003e 8.3 Drawing Flame Graphs to Identify Performance Issues 175\u003cbr\u003e 8.4 Query Analysis in NoSQL DBs 179\u003cbr\u003e Summary 180\u003cbr\u003e \u003cbr\u003e\u003cb\u003eCHAPTER 9 Investigating Locking Problems in Multithreaded Architectures 183\u003c\/b\u003e\u003cbr\u003e 9.1 Thread Lock Monitoring 184\u003cbr\u003e 9.2 Thread Lock Analysis 189\u003cbr\u003e 9.3 Analyzing Waiting Threads 198\u003cbr\u003e Summary 205\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 10 Investigating Deadlock Problems with Thread Dumps 207\u003c\/b\u003e\u003cbr\u003e 10.1 Collecting Thread Dumps 208\u003cbr\u003e __10.1.1 Collecting Thread Dumps with Profiler 210\u003cbr\u003e __10.1.2 Collecting thread dumps from the command line 212\u003cbr\u003e 10.2 How to Read a Thread Dump 215\u003cbr\u003e __10.2.1 Plain Text Thread Dump 216\u003cbr\u003e __10.2.2 Reading Thread Dumps Using Tools 222\u003cbr\u003e Summary 225\u003cbr\u003e\u003cbr\u003e \u003cb\u003eCHAPTER 11 Finding Memory-Related Issues While Running an App 227\u003c\/b\u003e\u003cbr\u003e 11.1 Diagnosing Memory Issues with Sampling and Profiling 228\u003cbr\u003e 11.2 Collecting Heap Dumps to Find Memory Leaks 235\u003cbr\u003e __11.2.1 Collecting Heap Dumps 236\u003cbr\u003e __11.2.2 How to read a heap dump 240\u003cbr\u003e __11.2.3 Heap Dump Query in OQL Console 245\u003cbr\u003e Summary 251\u003cbr\u003e\u003cbr\u003e \u003cb\u003ePART III TROUBLESHOOTING LARGE-SCALE SYSTEMS\u003c\/b\u003e\u003cbr\u003e \u003cbr\u003e\u003cb\u003eCHAPTER 12 Investigating the Behavior of Apps Deployed on Large-Scale Systems 255\u003c\/b\u003e\u003cbr\u003e 12.1 Investigating Inter-Service Communication Issues 256\u003cbr\u003e __12.1.1 Observing HTTP Requests with HTTP Server Probe 257\u003cbr\u003e __12.1.2 Observing HTTP requests sent by your app with the HTTP client probe 259\u003cbr\u003e __12.1.3 Investigating Socket Low-Level Events 261\u003cbr\u003e 12.2 The Importance of Integrated Log Monitoring 263\u003cbr\u003e 12.3 How to Use Distribution Tools for Research 270\u003cbr\u003e __12.3.1 Simulating Problems Difficult to Reproduce with Fault Injection 272\u003cbr\u003e __12.3.2 Using Mirroring Techniques for Testing and Error Detection 273\u003cbr\u003e Summary 274\u003cbr\u003e\u003cbr\u003e \u003cb\u003eAPPENDIX A Tools Used in This Book 275\u003cbr\u003e\u003cbr\u003e APPENDIX B Opening a Project 277\u003cbr\u003e\u003cbr\u003e APPENDIX C Other References 279\u003cbr\u003e\u003cbr\u003e APPENDIX D Understanding Java Threads 281\u003c\/b\u003e\u003cbr\u003e D.1 What is a Thread? 282\u003cbr\u003e D.2 Thread Life Cycle 284\u003cbr\u003e D.3 Thread Synchronization 286\u003cbr\u003e __D.3.1 Synchronization Block 286\u003cbr\u003e __D.3.2 Using wait(), notify(), and notifyAll() 289\u003cbr\u003e __D.3.3 Thread Join 290\u003cbr\u003e __D.3.4 Blocking a thread for a fixed period of time 291 \u003cbr\u003e__D.3.5 Synchronizing Threads and Blocking Objects 292\u003cbr\u003e D.4 Common Problems with Multithreaded Architectures 293\u003cbr\u003e __D.4.1 Race Conditions 293\u003cbr\u003e __D.4.2 Deadlock 294\u003cbr\u003e __D.4.3 Ribrak 295\u003cbr\u003e __D.4.4 Kia ​​296\u003cbr\u003e D.5 Additional Material 297\u003cbr\u003e\u003cbr\u003e \u003cb\u003eAPPENDIX E Java Memory Management Framework 299\u003c\/b\u003e\u003cbr\u003e E.1 How the JVM Organizes Your App's Memory 300\u003cbr\u003e E.2 Stack 302 used by threads to store local data\u003cbr\u003e E.3 Heap 308 used by the app to store object instances\u003cbr\u003e E.4 Metaspace memory locations for storing data types 311\u003cbr\u003e\u003cbr\u003e Search 313\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eDetailed image\u003c\/b\u003e \u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cdiv\u003e\u003cimg src=\"https:\/\/image.yes24.com\/momo\/TopCate4470\/MidCate006\/446952888.jpg\" border=\"0\" alt=\"Detailed Image 1\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eInto the book\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e A debugger is a software program that helps developers read and understand source code more easily by executing the code step by step while briefly pausing execution at desired commands. \u003cbr\u003eAlthough debuggers are a common means of investigating software behavior (and often the first thing developers learn), they are not the only debugging technique, nor are they useful in all scenarios (basic debugger usage and advanced techniques are covered in Chapters 2 and 3).\u003cbr\u003e The various research techniques you will learn throughout this book are illustrated in Figure 1.3.\u003cbr\u003e\u003cbr\u003e --- P.6\u003cbr\u003e\u003cbr\u003e As with any investigative technique, there are times when logs are appropriate to use and times when they are not.\u003cbr\u003e In this section, we'll explore several scenarios where using logs can make it easier to understand your app's behavior.\u003cbr\u003e First, we'll discuss some key points about log messages, and then we'll explore how these characteristics can help developers investigate issues in their apps.\u003cbr\u003e\u003cbr\u003e --- P.87\u003cbr\u003e \u003cbr\u003eThe simplest thing you can do with a profiler is to observe how your app uses system resources.\u003cbr\u003e Just by looking at it this way, you can discover problems such as memory leaks or zombie threads in your app.\u003cbr\u003e \/ By looking into a running app with a profiler, you can easily discover abnormal app behavior.\u003cbr\u003e For example, zombie threads that remain running and occupy the app's resources even after the app has finished running are immediately exposed in VisualVM.\u003cbr\u003e Now, let's look at how VisualVM can be used to detect and observe signs of an abnormal resource consumption in an app.\u003cbr\u003e\u003cbr\u003e --- P.117\u003cbr\u003e\u003cbr\u003e Profile the JDBC driver to intercept queries the app sends to the DB.\u003cbr\u003e As a result of the verification (Figure 7.14), the product table is doing a self-join with itself. \u003cbr\u003eThis is a serious problem! This example might seem trivial since the table only has 10 records, but in a real-world app, the table would likely have a huge number of records. Cross-joining like this would inevitably result in significant latency and ultimately incorrect output (duplicate rows).\u003cbr\u003e By intercepting the query with VisualVM and looking into it, you can immediately see where the problem is.\u003cbr\u003e\u003cbr\u003e --- P.154\u003cbr\u003e\u003cbr\u003e Select the Sampler tab in VisualVM and then click the Memory button to start a memory usage sampling session.\u003cbr\u003e After calling the endpoint and waiting for it to complete, you will see the objects allocated by your app appear on the VisualVM screen after a short while.\u003cbr\u003e (…) I understand that a large number of instances can fill up memory, but is it possible that a small number of large instances, like the latter, can take up most of the memory? Think of an app that processes large video files. \u003cbr\u003eLoad 2-3 files at a time, but video files are so large that they can fill up memory.\u003cbr\u003e In these cases, it's worth exploring whether the app can be optimized by not loading the entire file into memory at once, but rather loading only portions of it at a time.\u003cbr\u003e\u003cbr\u003e --- P.231\u003cbr\u003e\u003cbr\u003e Since this app is developed based on Spring Boot, the DSN value is specified in the sentry.dsn attribute in the application.properties file as shown in the following code snippet.\u003cbr\u003e This is optional in Sentry, but it is recommended to specify the environment in which your app runs if possible.\u003cbr\u003e This is because later on, you can filter the events to extract only the ones you are interested in.\u003cbr\u003e\n\n\u003c\/div\u003e\n\u003cdiv\u003e --- P.267\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003ePublisher's Review\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e \u003cb\u003eTips for understanding, debugging, and optimizing JVM code to improve code readability.\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e As you progress in your career, you'll find yourself spending far more time reading code than writing it. \u003cbr\u003eThis book covers code investigation techniques to use that long time efficiently.\u003cbr\u003e A major advantage is that it explains troubleshooting in a developer-friendly, scenario-oriented manner, from the basics of debugging and logging to advanced profiling techniques and how JVM applications work.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e Part 1 covers the basics of investigative techniques for understanding a codebase.\u003cbr\u003e Chapters 2-4 focus on debugging, from simple breakpoints to remote debugging, while Chapter 5 looks at how to use logs to investigate essential details related to code implementation.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e Part 2 demonstrates how useful profiling can be in today's framework-heavy development environment. \u003cbr\u003eChapter 6 covers how to analyze CPU and memory usage using profiling tools such as VisualVM and JProfiler, and Chapter 7 covers how to investigate latency issues.\u003cbr\u003e Chapters 8 and 9 delve into multithreaded architecture, Chapter 10 looks at thread dumps, and Chapter 11 looks at how to diagnose memory problems by generating heap dumps.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e Part 3, Chapter 12, explains how to investigate problems in large enterprise systems consisting of multiple apps, rather than just a single app.\u003cbr\u003e We'll look at how each app \"talks\" to each other, the impact of the environment in which the app is deployed, and implementation considerations.\u003cbr\u003e Finally, the appendix provides a detailed explanation of Java's thread and memory management system, which will be of practical help to Java developers.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e Understanding how JVM applications actually work can help you pinpoint the root cause of problems. \u003cbr\u003eThis is a rare book that comprehensively covers not only debugging and logging, but also advanced techniques for finding problems in microservice architectures.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e \u003cb\u003eKey Contents\u003c\/b\u003e\u003cbr\u003e ㆍUnderstand what the code you see for the first time does\u003cbr\u003e ㆍExposing code logic problems\u003cbr\u003e ㆍFind memory leaks by evaluating heap dumps\u003cbr\u003e ㆍMonitor CPU usage to optimize execution.\u003cbr\u003e Finding and resolving deadlocks using thread dumps\u003cbr\u003e Understanding Service-Oriented\/Microservice Systems\u003cbr\u003e ㆍUse logging properly to deeply understand Java app execution.\u003cbr\u003e ㆍUsing the Java Debugger Efficiently \u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e GOODS SPECIFICS \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eDate of issue:\u003c\/strong\u003e May 9, 2024\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003ePage count, weight, size:\u003c\/strong\u003e 340 pages | 188*245*17mm\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN13:\u003c\/strong\u003e 9791193926208\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN10:\u003c\/strong\u003e 1193926203 \u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cspan\u003e\u003c\/span\u003e\n\n\u003c\/center\u003e\n\n\n\u003c\/center\u003e","brand":"LIBRAIRIE COREENNE","offers":[{"title":"Default Title","offer_id":43893707538474,"sku":"110255","price":38.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0683\/2750\/5962\/files\/55936b10b585139fffafca5b51ee715e.jpg?v=1765412995","url":"https:\/\/librairie.coreenne.fr\/en\/products\/110255","provider":"LIBRAIRIE COREENNE","version":"1.0","type":"link"}