| Class | ActiveMerchant::Billing::Integrations::Chronopay::Notification |
| In: |
lib/active_merchant/billing/integrations/chronopay/notification.rb
|
| Parent: | ActiveMerchant::Billing::Integrations::Notification |
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 149 149: def acknowledge 150: true 151: end
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 6 6: def complete? 7: status == 'Completed' 8: end
Additional parameter
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 126 126: def custom2 127: params['cs2'] 128: end
Additional parameter
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 131 131: def custom3 132: params['cs3'] 133: end
Unique ID of customer
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 42 42: def customer_id 43: params['customer_id'] 44: end
Date of transaction in MM/DD/YYYY format
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 66 66: def date 67: params['date'] 68: end
the money amount we received in X.2 decimal.
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 141 141: def gross 142: params['total'] 143: end
The item id passed in the first custom parameter
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 121 121: def item_id 122: params['cs1'] 123: end
Language
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 57 57: def language 58: params['language'] 59: end
ID of a product that was purchased
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 52 52: def product_id 53: params['product_id'] 54: end
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 61 61: def received_at 62: Time.parse("#{date} #{time}") unless date.blank? || time.blank? 63: end
Unique ID of Merchant’s web-site
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 47 47: def site_id 48: params['site_id'] 49: end
Status of transaction. List of possible values: onetime – one time payment has been made, no repayment required;:: initial – first payment has been made, repayment required in corresponding period;:: decline – charge request has been rejected;:: rebill – repayment has been made together with initial transaction;</ttt>:: <tt>cancel – repayments has been disabled;:: expire – customer’s access to restricted zone membership has been expired;:: refund – request to refund has been received;:: chargeback – request to chargeback has been received.::
This implementation of Chronopay does not support subscriptions. The status codes used are matched to the status codes that Paypal sends. See Paypal::Notification#status for more details
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 23 23: def status 24: case params['transaction_type'] 25: when 'onetime' 26: 'Completed' 27: when 'refund' 28: 'Refunded' 29: when 'chargeback' 30: 'Reversed' 31: else 32: 'Failed' 33: end 34: end
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 145 145: def test? 146: date.blank? && time.blank? && transaction_id.blank? 147: end
Time of transaction in HH:MM:SS format
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 71 71: def time 72: params['time'] 73: end
Unique ID of transaction
# File lib/active_merchant/billing/integrations/chronopay/notification.rb, line 37 37: def transaction_id 38: params['transaction_id'] 39: end


England will support Jofra Archer after racist taunts – Ashley Giles
England’s managing director says the abuse has no place in sport.
Ashley Giles has backed Jofra Archer’s England team-mates to rally round the paceman after the racist abuse he suffered during the first Test in New Zealand.
Archer took to Twitter shortly after the tourists were routed by an innings in Mount Maunganui to say he found it “a bit disturbing” to hear racial taunts during day five.
Giles has been liaising with an apologetic home board in his role as managing director of the England men’s team and is also checking in with the 24-year-old Archer.
“It was obviously emotional, it hurts,” said Giles.
“We fully support Jof, obviously, there is no place for racism in the game, in any game. Jof is part of our team but, whatever the abuse, we’d be absolutely right behind him. He’s a very important part of our team.
“You know what our team is like, they’ll rally round him pretty well I should imagine. But it’s a serious incident. He’s a young man making his way in the game and we just don’t need this sort of thing.”
The working theory is that a rogue individual is to blame, with New Zealand having otherwise been exemplary hosts throughout the trip, but Giles has left no doubt one racist heckler is one too many to abide.
“I’m hopeful they will find out who it is. There’s a lot of CCTV around the grounds, I’m hoping someone else who was there might also identify the person but they’re working very hard to find the culprit.
“It’s a problem in sport still, clearly. It’s terrible in this day and age that this sort of thing is still happening and when it does happen and that person isn’t identified much quicker, even by the people around them it’s really disappointing.”
England are heading inland for Thursday’s second Test at Hamilton, where New Zealand Cricket has promised increased security on the ground, with Giles revealing that White has also volunteered to step in personally to reassure the team.
“It is very kind of him. It isn’t a New Zealand Cricket problem, the relationship between us and them is very strong, but it’s a nice gesture in his part. One person shouldn’t ruin that but it’s a shame that sort of thing is still in our society.”


| Exported Interfaces - Details |
::com::sun::star::frame::XModel
- Description
- represents a component which is created from an URL and arguments
It is a representation of a resource in the sense that it was
created/loaded from the resource. The arguments are passed to the loader
to modify its behavior.
|
|
::com::sun::star::util::XModifiable
- Description
- a storable document should provide information about his modify state
With this interface it's possible too, to reset the modify state.
That can be neccessary to prevent code against problem during closing
of the document without saving any changes.
|
|
::com::sun::star::frame::XStorable
- Description
- offers a simple way to store a component to an URL
This interface supports functionality
- to make a copy of current component by saving it to another location
- to commit made changes
- to convert it by saving it by using suitable filter name.
|
|
::com::sun::star::view::XPrintable
- Description
- offers a way to print a component
It's possible to specify wich printer should be used and of course
print the document on it.
|
|
XEventBroadcaster
- Usage Restrictions
- deprecated
- optional
- Description
- is an old and deprecated version of the XDocumentEventBroadcaster interface
|
|
XDocumentEventBroadcaster
- Usage Restrictions
- optional
- Description
- makes it possible to register listeners which are called whenever
a document event occurs
|
|
XEventsSupplier
- Usage Restrictions
- optional
- Description
- access to bound event handlers
|
|
| XDocumentInfoSupplier
|
XViewDataSupplier
- Usage Restrictions
- optional
- Description
- access to some properties describing all open views to a document
|
|
::com::sun::star::view::XPrintJobBroadcaster
- Usage Restrictions
- optional
- Description
- allows for getting information about a print job
- Since
- OOo 1.1.2
|
|
XEmbeddedScripts
- Usage Restrictions
- optional
- Description
- is supported when the document can contain scripts and dialogs
- Since
- OOo 2.4
|
|
| XDocumentPropertiesSupplier
|
XUndoManagerSupplier
- Usage Restrictions
- optional
- Description
- provides access to the document's undo manager.
|
|
| Properties' Details |
AutomaticControlFocus
boolean AutomaticControlFocus;
- Usage Restrictions
- optional
- Description
- controls the focus behaviour of the form controls in the document
If this flag is set to true, any view belonging to the document
should focus the first control in the document. With this, you may
control if your document works primarily as a form document.
|
|
ApplyFormDesignMode
boolean ApplyFormDesignMode;
- Usage Restrictions
- optional
- Description
- controls the initial (on-load) behavior of the form controls in the document
If set to true, upon loading the document, the form controls will be in design mode.
If set to false, they will be alive, i.e. operational.
With this, you may control if your document works primarily as a form document.
|
|
RuntimeUID
[ readonly ] string RuntimeUID;
- Usage Restrictions
- optional
- Description
- contains a unique id for the document
Once calculated, the id must not change until the document has been
closed. Upon closing it will not be made persistent. Thus, the document
may get a different id every time it gets loaded.
|
|
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


Contact Address #146 8th Block 9th Cross Wilson Garden Shanthi Nagar Bangalore - 27
Contact Number<PHONE_NUMBER><PHONE_NUMBER>
Contact E-Mail contactus@pubdrivers.com


|
|
class | boost::serialization::access |
| | Serialization function.
|
| |
|
|
|
| StereoPoint2 () |
| | default constructor
|
| |
|
| StereoPoint2 (double uL, double uR, double v) |
| | constructor
|
| |
|
| StereoPoint2 (const Vector3 &v) |
| | construct from 3D vector
|
| |
|
|
void | print (const std::string &s="") const |
| | print
|
| |
|
bool | equals (const StereoPoint2 &q, double tol=1e-9) const |
| | equals
|
| |
|
|
bool | operator== (const StereoPoint2 &q) const |
| | equality
|
| |
|
double | uL () const |
| | get uL
|
| |
|
double | uR () const |
| | get uR
|
| |
|
double | v () const |
| | get v
|
| |
|
Vector3 | vector () const |
| | convert to vector
|
| |
|
Point2 | point2 () const |
| | convenient function to get a Point2 from the left image
|
| |
|
Point2 | right () const |
| | convenient function to get a Point2 from the right image
|
| |
|
|
GTSAM_EXPORT friend std::ostream & | operator<< (std::ostream &os, const StereoPoint2 &p) |
| | Streaming.
|
| |
The documentation for this class was generated from the following files:


Since 1999, we and our team has focused on how we can teach with passionately. We want our learners to be active instead of being passive. That's why, our courses have some sections according to the ability of students. They do not need to just listen a video and then take a quiz. They need to work with eachother, they should create some projects, and they are also expected to present their works to help them improve their social skills. In a nutshell, we have:


Résumé
— Aiming to reduce global warming through sustainable energy production and consumption, and reducing the risk of human extinction by making life multi-planetary and setting up a human colony on Mars.
Experience
Now
-
06/2005 – present
Chairman at SolarCity
Created a collaboration between SolarCity and Tesla to use electric vehicle batteries to smooth the impact of rooftop solar on the power grid.
Provided the initial concept and financial capital.
-
02/2004 – present
CEO and Product Architect at Tesla Motors
Currently oversee the company's product strategy -- including the design, engineering and manufacturing of more and more affordable electric vehicles for mainstream consumers.
Insisted on using carbon fiber composite materials in the hull to minimize weight, developed the battery module and even some elements of design, like the headlights.
Received Global Green 2006 product design award for Tesla Roadster design.
-
02/2002 – present
CEO and CTO at SpaceX
Plans to reduce space transportation costs to enable people to colonize Mars.
Oversee the development of rockets and spacecraft for missing to Earth orbit and ultimately to other planets.
Developed the Falcon 9 spacecraft which replaced the space shuttle when it retired in 2011.
Back then
-
03/1999 – 10/2002
CEO at X.com and PayPal
- Involved in the development of new business models, conducted a successful viral marketing campaign, which led to a rapid increase in the number of customers.
- Created a method of securely transferring money using a recipient's e-mail address.
-
01/1995 – 02/1999
Co-founder at Zip2
- Created a platform where newspapers — including credible ones as New York Times — could offer their customers some additional commercial services.
Achievements & Certificates
-
2015
IEEE Honorary Membership
Given to people who have rendered meritorious service to humanity in the IEEE's designated fields of interest.
-
2015
Businessperson of the Year by Fortune Magazine
Given to people who have rendered meritorious service to humanity in the IEEE's designated fields of interest.
-
2013
The Fortune Businessperson of the year for SpaceX, SolarCity, and Tesla.
-
2012
Royal Aeronautical Society's highest award: a Gold Medal
-
2011
Heinlein Prize for Advances in Space Commercialization
-
2010
FAI Gold Space Medal
The highest award in air and space. For designing the first privately developed rocket to reach orbit.
-
2007/2008
American Institute of Aeronautics and Astronautics George Low award
For design of the Falcon 1, the first privately developed liquid-fuel rocket to reach orbit.
Languages
Skills💪
Likes🙌
Dislikes👎
Wants💫
Education📚
-
09/1992 – 06/1995Bachelorr's degree of Science in Economics at Wharton School of the University of Pennsylvania
-
09/1992 – 06/1995Bachelorr's degree of Science in Physics at Penn's College of Arts and Sciences
Interesting about me🎭
-
Enthusiastic Learner
Got the full 6-month Commodore manual in 3 days, made a game, sold it for $500. At age 12
-
Excellent at Budget Management
Lived on $1/day during college, eating mostly hot dogs to learn money doesn't really matter
Publications and Books📝
- 2018. Making life multi-planetary. New Space, 2-11.
- 2017. Making humans a multi-planetary species. New Space, 5(2), 46-61.
- 2006. The secret Tesla Motors master plan (just between you and me). blog), August, 2.
- 2001. U.S. Patent No. 6,185,194. Washington, DC: U.S. Patent and Trademark Office.
- 1999. U.S. Patent No. 5,944,769. Washington, DC: U.S. Patent and Trademark Office.


This track is produced as part of the ENCODE Project. This track displays transcriptional fragments associated with RNA binding proteins in different cell lines using RIP-Chip (Ribonomic) profiling on Affymetrix GeneChip® Human Gene 1.0 ST Arrays. These sutracks show the genomic location of transcripts associated with the array probes. Data for this track was produced as part of the Encyclopedia of DNA Elements (ENCODE) Project.
In eukaryotic organisms, gene regulatory networks require an additional level of coordination that links transcriptional and post-transcriptional processes. Messenger RNAs have traditionally been viewed as passive molecules in the pathway from transcription to translation. However, it is now clear that RNA-binding proteins play a major role in regulating multiple mRNAs in order to facilitate gene expression patterns. These tracks show the associated mRNAs that co-precipitate with the targeted RNA-binding proteins using RIP-Chip profiling.
This track has multiple subtracks that display individually in the browser. The subtracks within this track correspond to different antibodies/target proteins tested in different cell lines. These subtracks show the genomic location of the mRNA transcripts associated with RNA Binding Proteins as determined by the Affymetrix GeneChip® Human Gene 1.0 ST Array probes. Items are shaded by p-value using the formula (maxPossibleScore-((maxPossibleScore/cutOffValue)*pValue)) so that items with more significant expression levels are shaded darker. The p-values are displayed in the browser convention as -log10(pValue).
RBP-mRNA complexes were purified from cells grown according to the approved ENCODE cell culture protocols. Antibodies specific to the RNA Binding Protein (RBP) in question were first coated onto protein A/G containing magnetic beads and then used to immunoprecipitate the targeted, endogenously-formed mRNP complexes. Antibody-coated beads were incubated/tumbled with cell lysate overnight in the cold followed by extensive rinsing and subsequent purification of associated RNA using Phenol/Chloroform extraction and ethanol precipitation. The associated transcripts were identified using GeneChip® Human Gene 1.0 ST Arrays. Arrays were analyzed using Agilent's GeneSpringGX software (version 11.0).
Arrays were analyzed a group at a time by applying the Iterative PLIER16 algorithm using quantile normalization. Probesets whose normalized expression levels (signal value) fell within the 18 to 98 percentile in at least two of the three replicates were retained for further analysis. A TTest (T7-Tag and RIP-Input) or a one-way ANOVA (samples and controls) was applied to these probesets and a p-value cutoff of .05 was applied. The Benjamini-Hochberg false discovery rate algorithm was then applied to generate corrected p-values, also known as q-values.
The RIP-Input was summarized first and selected probesets were retained for further analysis. Next, the arrays for T7Tag (background/negative control) RIPs were summarized with those retained RIP-input probesets. Probesets that fit the above criteria for either group (RIP-Input or T7Tag) were then filtered for those that showed a minimum 2 fold increase of expression in T7Tag versus RIP-Input. Finally, arrays for treatment RIP samples were summarized together with those for RIP-inputs and T7Tag RIPs. Probesets that fit the above criteria for any group (RIP-Input or T7Tag or samples) were then filtered for probesets that showed a minimum 2 fold increase of expression in treatment over total. A similar list was produced for probesets showing the same enrichment in the T7Tag RIP set. Probesets which appeared in both treatment and negative control at these cutoff stringencies were subtracted from the treatment results as background noise, yielding the final data track.
All experiments (including controls) were performed in and analyzed as triplicates.
Release 2 (September 2011) of this track corrects the scores and the calculated P and Q values. In this release, the calculated P and Q values are -log10(P) and -log10(Q), and the scores, and therefore the shading of items, reflect the p-values as described in the Display Conventions and Configuration section above.
These data were produced and analyzed by a collaboration between the Tenenbaum lab at the University at Albany-SUNY, College of Nanoscale Science and Engineering, the Luiz Penalva group at the Greehey Children's Cancer Research Institute, University of Texas Health Science Center and the Microarray Core Facility at the Center for Functional Genomics, Rensselaer, NY .
Contact:
Scott Tenenbaum
Baroni TE, Chittur SV, George AD, Tenenbaum SA. Advances in RIP-chip analysis : RNA-binding protein immunoprecipitation-microarray profiling. Methods Mol Biol. 2008;419:93-108.
George AD, Tenenbaum SA. MicroRNA modulation of RNA-binding protein regulatory elements. RNA Biol. 2006;3(2):57-9. Epub 2006 Apr 1.
Jain R, Devine T, George AD, Chittur SV, Baroni TE, Penalva LO, Tenenbaum SA. RNA-Binding Protein Immunoprecipitation-Microarray (Chip) Profiling. Methods Mol Biol. 2011;703:247-63
Jayaseelan S, Doyle F, Currenti S, Tenenbaum SA. RIP: An mRNA Localization Technique. Methods Mol Biol. 2011;714:407-422.
Keene JD, Tenenbaum SA. Eukaryotic mRNPs may represent posttranscriptional operons. Mol Cell. 2002;9(6):1161-7.
Penalva LO, Tenenbaum SA, Keene JD. Gene expression analysis of messenger RNP complexes. Methods Mol Biol. 2004;257:125-34.
Tenenbaum SA, Carson CC, Lager PJ, Keene JD. Identifying mRNA subsets in messenger ribonucleoprotein complexes by using cDNA arrays. Proc Natl Acad Sci U S A. 2000 Dec 19;97(26):14085-90.
Tenenbaum SA, Lager PJ, Carson CC, Keene JD. Ribonomics: identifying mRNA subsets in mRNP complexes using antibodies to RNA-binding proteins and genomic arrays. Methods. 2002 Feb;26(2):191-8.
Data users may freely use ENCODE data, but may not, without prior consent, submit publications that use an unpublished ENCODE dataset until nine months following the release of the dataset. This date is listed in the Restricted Until column, above. The full data release policy for ENCODE is available here.


| Interface | Description |
|---|---|
| ActivityFactory | |
| ActivityListener | |
| ActivityStateListener | |
| StateListener | |
| TaskFactory | |
| Transition |
| Class | Description |
|---|---|
| AbstractActivity<StateType> | |
| Activity |
An
Activity is some task that a peer is currently working one. |
| ActivityManager |
The
ActivityManager manages all activities currently in effect within
a given peer. |
| ActivityResult |
A simple bean to hold the outcome of an activity once it has finished execution.
|
| ActivityType |
Store meta information about a particular activity type.
|
| AffirmIdentity | |
| Conversation<StateType> |
Superclass for conversation activities.
|
| DefaultActivityFactory |
A
DefaultActivityFactory creates new activities through
reflection on their activityClass member variable. |
| FSMActivity |
An activity implementation based on a finite state machine defined through
method annotations.
|
| MethodCallTransition |
A transition that is implemented as a method in the concrete
Activity
class. |
| ProposalConversation | |
| QueryTaskClient | |
| QueryTaskServer | |
| RequestResponseActivity<Request,Response> |
An abstract activity implementing a simple, single round-trip, request
response activity where one peer acts as a client and another as a server.
|
| TaskActivity<StateType> |
Base class for tasks.
|
| TransitionMap |
Holds the definition of the FSM (Finite State Machine) associated with a
particular
Activity type. |
| WorkflowState |
Represents an activity's current state.
|
| WorkflowStateConstant |
| Enum | Description |
|---|---|
| ProposalConversation.State |
| Annotation Type | Description |
|---|---|
| AtActivity | |
| FromState | |
| OnActivityState | |
| OnMessage | |
| PossibleOutcome |


ArcGIS 10 for Economics Research
Term Paper Guideline
Masayuki Kudamatsu
30 May, 2016
Deadline
9 am, Monday 27 June
Send a PDF copy to<EMAIL_ADDRESS>Content
1. Research Question
-
Why interesting / important?
-
How original?
No lengthy literature review
Content (cont.)
2. Theory
-
Explain mechanisms for why your treatment variable affects the outcomes you're looking at
This will guide you through empirical analysis
Content (cont.)
3. Data
-
Unit of observations
-
Sample period
-
List of variables to be used
-
Sampling method: how representative your sample is
-
Summary statistics (+ mean comparison by treatment)
Content (cont.)
4. Empirical strategy
-
Equations to estimate
-
Estimation methods (OLS, Probit, etc.) including s.e. calculation (Conley 1999 or clustered at what level?)
-
Identifying assumption
Content (cont.)
5. Results
Even if you haven't got any result yet, produce regression tables
| Dependent Variable: xxx |
| |
(1) |
(2) |
(3) |
(4) |
(5) |
| Sample: |
all |
all |
all |
all |
not migrated |
| Treatment 1 |
x.xx |
|
x.xx |
x.xx |
x.xx |
| |
(x.xx) |
|
(x.xx) |
(x.xx) |
(x.xx) |
| Treatment 2 |
|
x.xx |
x.xx |
x.xx |
x.xx |
| |
|
(x.xx) |
(x.xx) |
(x.xx) |
(x.xx) |
| Control |
|
|
|
x.xx |
x.xx |
| |
|
|
|
(x.xx) |
(x.xx) |
| F-statistic |
|
|
|
xx.xx |
xx.xx |
| |
|
|
|
[0.xxx] |
[0.xxx] |
| Fixed Effects |
Y |
Y |
Y |
Y |
Y |
| # provinces |
xx |
xx |
xx |
xx |
xx |
| # observations |
xxx |
xxx |
xxx |
xxx |
xxx |
| Standard errors clustered at province level; * significant at 10%, ** 5%, *** 1%. |
Content (cont.)
5. Results (cont.)
Describe what each column aims to show
-
Why restricting the sample?
-
What identification concern is dealt with?


Hi there, this is my Dog,okay a picture of him i didn't mean it literally His name is Buck,
Read more about Buck's origin Buck's AdventuresHe loves to chase around people which is my african version of playing fetch and he has a blue blanket that he likes alot


{% extends 'base.html' %} {% block title %}Lending Library -- About This Site{% endblock %} {% block body %}
LendingLibrary is a site developed using Flask as part of my work toward a Nanodegree in Full Stack Web Development offered by Udacity. The site enables a team or other group of people to share books they own for others in the group to borrow. The site offers pretty comprehensive functionality, including:
This is a working app and is open source, so feel free to use!
This site was developed using the following third party add-ons in addition to Flask and some Flask extensions:
Bootstrap, FontAwesome and jQuery were also used, but doesn't that kinda go without saying these days?


Weed first walked to the fountain and filled his canteen with water, and then he headed for the sculpture shop. It was Weed’s first trip down the street, and it was crammed with users and NPCs.
“We need a cleric at level 17 or above”
“Hey, guy! We’re going to raid on Cave Lasok. Anyone want to join us?”
Plenty of users were on the street, but none of them gave a passing glance at Weed. He didn’t mind it though. Wandering around in a traveler’s outfit, deprived of even a breastplate, revealed that he has yet to meet the minimum requirement of four week’ game play before he could leave the Citadel.
Among the innumerable stores that operate in the capital of Rosenheim Kingdom, the sculpture shop holds a special position.
Most ordinary adventurers can barely recall where the sculpture shop is located because if was meaningless to them. Only an extremely small number of users who learned the Sculpture Art visit periodically. But the sculpture shop stands right next to the jewelry store on Central Avenue, and is one of the few frequently visited shops by the noblewomen.
Chime
Weed entered the sculpture shop.
“Welcome to—what brings you here, stranger?”
The shopkeeper was receiving a new customer with a gentle smile, until he saw Weed’s outfit at that point, he suddenly changed the tone of his voice.
Weed looked around the shop, only to find that there was no other customer except for him. A blacksmith’s workshop or a grocery store is always full to the limit of occupancy, but the sculpture shop only entertains a few customers a day, if any.
If comparing daily revenues, however, the sculpture shop does lag behind the blacksmith’s workshop. In other words, the sculpture shop sells pretty expensive merchandises.
Weed adjusted his collar and asked politely,
“I have come here to find an answer to the question which troubles me so dearly, sir.”
“So you want to ask me a question, stranger?”
“Yes, sir. If you could spare me a second”
“I am busy right now, please leave”
The shopkeeper rejected him right away, sounding very annoyed. As Weed’s fame was zero, and they were unacquainted, the shopkeeper had every right to chase him out of the shop.
“Yes, sir. I will see you later”
“Goodbye” said the shopkeeper.
Weed was taking his time to retreat to the doorway. Then, he casually shot a glance at the statues that were on display.
“How grand!”
Weed exclaimed
“The grandeur of this statue fascinates my soul. Do you supply this to the Rosenheim Court?”
The shopkeeper could not help but lend an ear to Weed.
“Which one are you talking about, stranger?”
“This two-headed eagle made of pure gold. I dare not guess which master carved this, but I can sense the excellence of his workmanship. It is dignified beyond dispute.  This store deserves this class of item. They have opened my humble eyes to a heavenly beauty descended to Earth”
Whether or not the shopkeeper realizes, his mouth was forming a horizontal crescent. “Are you interested in sculptural art, traveler?”
“I daresay I am—I am only wishing to feel peace of mind at the sight of outstanding statues, and my soul craves to be even a small part of the magnificent spirit embodied in them”
“Come over and sit down. You may be good company to arouse me from boredom”
“Thank you, sir”
“Would you like a cup of tea?”
“Only if you’re kind enough of offer me cold honeyed water. I will be satisfied with a cup of cold water”
“Sure! Of course I have it”
Weed drank the honeyed water blended by the shopkeeper, which soothed the exhaustion that he had accumulated over the last three weeks.
“Now tell me what has been troubling you so much.” The shopkeeper said.
“Yes, sir. But can you please forgive me for asking for a brief tour of these statues on display before everything else? I have business that demands your guidance, yet it is less urgent that comforting my poor soul that wants to have a good look at these masterpieces of art” Weed said.
“You may look at them for as long as you wish. Isn’t it the raison d’être of fine statues to please those who appreciate their value?” The shopkeeper consented with a content smile.
Weed felt that it had won his goodwill, one scarcely disturbed by visitors and away from public attention. Suppose that you asked to look at various items in a grocery store—the next second you would be kicked out.
Weed relished the statues on display at leisure. But he had his own agenda. “I doubt sculpture mastery will make a pile of money.” The most expensive statue that is currently present is worth 30 silvers. The quality statues are made of stones or rare wood, and in spite of the impressive workmanship, the materials themselves were not costly in the first place. They were nothing more than wooden carvings, or engraved stones.
Weed knew that there would be money if he could create a gigantic lion statue or bronze status, but he wasn’t fooled by the possibility that was so far off. What kind of nobleman with so much money would order a new statue every year? He needed to reach the top of the ladder in order to do really well as a sculptor. Little competition guaranteed that it wouldn’t need too much effort to become the best in the industry.
Still, it was a niche market, too small to count on. The guaranteed way to make a fortune was to target other users as potential consumers. They were always leveling up and demanding better equipment, so on and so forth.
Fire weapons, strong equipment enchanted bracelets and rings were popular among users, but statues were valueless to them except in rare instances.
“Waste of time, waste of money”
Weed’s primary purpose for starting this game was to make money, with a capital M. He looked around the display for the last time and passed his verdict on sculpture mastery.
“The skill is worth a dime in a dozen” Weed sat down across from the shopkeeper.
“Now, what are you looking for?” The shopkeeper asked
“I am interested in a past event. I was told that someone had carved the moonlight in the Royal Palace fifty years ago. I would like to know if there’s any truth of that event” Weed said.
“Oh that event! It is legendary tale that has been passed down among the sculptors. I also heard it from some trustworthy patrons from the Royal Court”
Weed had thought that carving the moonlight was impossible, another urban legend, but the owner of the sculptor shop also knew the rumor that the instructor at the Training Hall had claimed to have heard.
|
Quest Complete! A Mystery Sculptor who is rumored to have visited the Royal Palace. The rumor that had reached the instructor’s ear really took place. A sculptor carved the moonlight, and it was widely, yet secretly, known amongst the Serebourgians, though it remained an enigma how he carved the moonlight. Reward: Return to the instructor to claim it. |
Weed grinned broadly. This was, after all, a simple quest with the lowest difficulty level E. At the same time, unless he had succeeded in making friends with the shopkeeper, it could have turned out tricky.
How that he was done with the quest, the next move was to return to the Training Hall and earn a reward from the instructor. As Weed was looking for the right moment to say his farewells and leave, the shopkeeper, absorbed in thought, finally spoke out.
“I have not heard how he carved the moonlight”
“Did the patrons from the Royal Court not tell you about it?”
“Hmm, they always omitted it in their tale. They refused to tell me about it. They said Queen Evane of Rosenheim, O may her soul rest in peace, was involve in the event. Can you do me a favor and look into this, so that my curiosity shall be gratified?”
|
The Sculptor’s Past The rumor has it that Queen Evane was involved in the event when the sculptor presented himself in the Royal Palace and carved the moonlight. The shopkeeper of the sculpture shop wondered what link existed between the two of them. Difficulty Level: E |
Weed’s clenched fists were shaking in excitement. “This, it’s a serial quest”
Even when the difficulty level of a quest is awfully low, the level of rewards shoots up in case of serial quests. The more stages you complete, the more difficult the quest becomes, and so most serial quests are likely to make it highly difficult for Weed at his current level to solve.
The only quests that Weed could complete are the ones that are inside the Citadel, asking around and gathering information from people.
“I am still incompetent. I am afraid I may not be worthy of your request” Weed said.
“I am certain you are up to this task. You prudence shall lead the way to safety” The shopkeeper replied
“If you say so, I will take it willingly” Weed said.
|
You have accepted the quest. |
“Thank you traveler. A bard with knowledge in ancient tales and street gossip is the one whom you should ask about Queen Evane. Beware! This matter is very sensitive, so you should not cause trouble that might lead to any defamation of the Royal Family”
* * *
Keeping down a sudden impulse to hum a tune, Weed headed straight to a pub across the street.
“Good afternoon” Returning the greeting from a waitress, Weed looked around in search of a bard. There were a few conditions to meet. First, he counted the bard users out when he looked for the right man. It was a long shot that any user had ever heard of an event that had happened in the Royal Palace half a century before. Weed would be better off to find a Serabourgian native, possibly an elderly.
Whether he could sing ballads favorably or not, an old bard was reliable when it comes to worldly gossip. Weed stopped by several pubs until he found a bard who lived up to his expectations. It was a middle-aged bard in his forties, experience buy with both charm and youth. Clapping both hands, Weed approached the bard.
“Thank you for a fine ballad, sir. Forgive me for interrupting you, but I want to ask you a few questions… Do you know what happened fifty years ago in the Royal Court of Rosenheim?”
The bard’s thrust his palm out and Weed could not miss what this gesture implied. He frowned immediately, his mouth twitching with a grave sense of responsibility that he would not waste a penny.
“You sure have a charming voice. I appreciate your talent in writing both the lyrics and the music for that ballad. Also your skills in the instrument were more than impressive…”
“…”
“I bet you broke the hearts of many Serabourgian ladies back when you were a young ray of sunshine at the peak of your career. Of course, I do not doubt that you are still stealing ladies’ hearts… For a bard, adventure and romance is everything. I also love romance”
The palm didn’t go away, and the bard snapped, “I’m sick and tired of cheap compliments from the likes of you, foreigner. Show me the money, or get lost”
Weed was momentarily lost.
“Do I just give up the quest in the middle? Anyway, the quest doesn’t penalize me even if I decide to drop out. But maybe it would give me sweet rewards later, and I would hate to miss out on them”
Weed’s hand slipped into his pocket and fished out a coin before he realized his mistake. Two silvers! There were two silver coins in his pocket. That was everything that the instructor had given him as a retaining fee for the previous quest.
The bard seized the silver coin from Weed’s palm.
It was a basic mistake that he had forgotten to exchange his money into smaller coins in advance.
“I can’t believe I made such a silly mistake!” Weed’s body shook in distress and grief.
“Hmph, this is a secret, so you must keep it to yourself” The bard said under his breath “Queen Evan and the sculptor had been on intimate terms since they were children”
“What do you mean by intimate terms…?” Weed asked
“You fool! I know nothing else for intimate terms between a man and a woman—they loved each other”
“Point taken” Weed now realized why poking his nose into the rumor had to remain a secret from the Royal Court.
Given that the former Queen’s sacred name was mentioned in that scandalous matter. Royal Knights would be willing to silence anyone at any cost to keep her honor intact.
The bard glanced around the pub and added cautiously “They were born in the same village, and grew up bearing each other dearly in mind. They boy’s name was Zahab. The girl was always carrying ornaments carved and given by him when she was a child, with a dream that she would become his wife someday. But Destiny played tricks on them! The girl was chosen to be the Royal Maid and the boy left her. But in the end, there was a promise between them”
“What promise, if I may ask?” Weed asked, now curious.
“Zahab promised to show the girl the most beautiful statue under heaven”
“I guess it was not kept, then. The Queen must have a great number of beautiful, magnificent statues in her place”
“No, he kept it. Many years later, Zahab presented himself as a quest to the Royal Court. It was said that, at the sight of his work, she was most touched, saying it was the most beautiful creature under heaven”
“Then, what statue, for Freya’s sake, did he present to Queen Evane? A Queen doesn’t easily cherish an ordinary piece”
“True.  This is as far as I can tell you because I also heard it from someone else”
“Is she still alive?”
“Yes” The bard told Weed the way to the house of the lady’s maid.
Weed went to visit her. She had retired, and when he mentioned Queen Evane and the sculptor, she gave him a joyous welcome.
“Her Highness was very virtuous and gracious lady. So do you want to hear about what happened back then?
“Yes, ma’am”
“You have found the right person to ask. I personally served Her Highness. She first resented Zahab-nim when he visited the palace.
“Why so, if I may ask?”
“It was his promise. When they were young, they made a promise, a promise that Zahab-nim would present Her Highness with the most beautiful statue under heaven. But when he appeared in the palace, he was carrying a sword, not an engraving knife. To the eyes of everyone, he looked like a fine swordsman who was proficient in the sword. You should have seen how heartbroken Her Highness was. It was indescribable! Her Highness so believed in Zahab-nim that even if the world turned upside down, he would be the same eternally, and likewise, the promise between them was divine”
“…”
“On that day, Brent Kingdom, which bordered on Rosenheim, dispatched a band of assassins. They revealed a treacherous ambition to seize our Kingdom, and Freya only knows how shocked I was when assassins stormed in and assaulted Her and His Highness in the garden”
“Those wicked scoundrels!”
“Yes, young traveler, you can say that again. A couple of Royal Knights were trapped, thus incapable of holding them in check—and we were left to face death. At that very moment, Zahab-nim walked into the garden. As you can see, right in the middle of fighting, Her Highness warned him and ordered him to leave. But Zahab-nim only smiled—”
“He smiled in the middle of such a dangerous situation?”
“—and he said he would show her the most beautiful statue that he had ever carved under heaven. To everyone’s surprise, the moonlight shattered into pieces at Zahab-nim’s sword. Its beauty was really striking. He was singing a song while he carved the moonlight. I cannot remember the lyrics word by word, but the title was A Sculptor’s Heart. Listening to the song, Her Highness was overflowing with tears. It was really the most beautiful statue Milady had ever seen. Had Zahab-nim only inscribed his name on a crude plank, but Her Highness would have taken it for the most beautiful sculpture in the world, but I tell you, the sight he was carving with the moonlight was literally heavenly. The assassins scattered at the inconceivable sight, and Zahab-nim kept his promised. Many years since gone, but I still cherish that moving memory.”

Soon the boy hands her the complete statue. It looks so much like the girl.
“For now, all I can do is carve a piece of wood. But someday, I will give you the most beautiful statue in the world”
“Thank you Zahab. I’m looking forward to that day”
The boy and girl make a promise with each other, hand in hand.
* * *
As the girl grows up, she blossoms in beauty.
She caught the eyes of the King. She eventually became Queen. But the girl is not happy at all.
Her Highness is still unhappy the day Zahab comes back to see her.
Zahab carried a sword, not the engraving knife.
Talking a walk alone in the garden, Her Highness gives way to fit of passion and clutches a thorny rose. Her palm bleeds with ruby red blood.
“Why did you forget our promise? Your promise was everything to me…”
Her Highness grieved over the broken promise.
That evening, the assassins raid the palace.
Brent Kingdom, a hostile neighbor as always, has sent assassins.
Knights of Rosenheim Kingdom collapse one after another.
She and His Highness are fearful of their imminent and inevitable death.
Zahab clutches his sword, and the moonlight begins to dance.
|
Quest Complete! The Sculptor’s Past The promise between the boy and the girl was honored. The bluish moonlight shattered into pieces, which in turn defeated the assassins. Moonlight Sculptor Zahab—His Sculpture mastery has reached the stage of a Master. Presenting the most beautiful statue to his childhood friend. You have leveled up! |
To Weed’ surprise, two levels went up for a single quest, and that wasn’t the end of it.  To his surprise once again, it was a class conversion window.
|
Class Change! You can convert to a secret class Moonlight Sculptor. If you accept it, you can learn exclusive skills for the class that are withheld from the primary classes. Do you want to convert to Moonlight Sculptor? |
An infinite number of users are bustling about to discover secret classes in Royal Road, but fewer than one out of a thousand actually discovers one.
Weed answered, “I refuse”
|
Please confirm your decision. You can convert to a secret class Moonlight Sculptor. Do you want to convert to Moonlight Sculptor? |
“I refuse”
To Weed, being stuck in the corner of a closet and making unwanted statues wasn’t considerable. He had to admit that being a sculptor could make quite an amusing class if properly trained. But he needed a financially lucrative class for his personal gain. When Weed came to his senses, the old lady’s maid was watching.
“It was a wonderful story. Thank you very much, ma’am”
“You’re welcome. It’s my pleasure to tell you their story like this. So, young adventurer, I want to give you a small present. Will you please take it?”
Wouldn’t it be unkind to reject a present out of goodwill? Weed was not so cruel as to decline anything offered to him. A man should accept any present with gratitude.
“I will gladly take it, ma’am”
The old lady’s maid took something bundled up from deep inside a drawer. It resembled an ancient scalpel.
“This engraving knife used to belong to Zahab-nim. He left it to Her Highness, and I happened to keep it now. And this wooden statue is carved by Zahab-nim. Please take these” The lady’s maid said.
“I shall long treasure your present” Weed said.
He received two items from her.
|
You have received Engraving Knife. |
|
You have received Zahab’s Legacy. |
Weed thought that these items were uncommon as they were left by one of the Masters of Sculptural Art. Even the wooden statue looked classy at a casual glance.
“Please keep Zahab-nim’s engraving knife with great care”
“Yes, ma’am”
Weed calculated that this might sell and make good profit.
“The wooden statue will show you where Zahab-nim’s resting place is located. I hope his sculpture mastery will not be buried forever”
“I hope so too, ma’am”
“If only I could hear the song of that day again… Everything about sculpture mastery is concealed in that engraving knife”
“Excuse me?”
“In Zahab-nim’s engraving knife”
That moment Weed looked at the engraving knife. He had a gut feeling that an irresistible destiny was drawing near.
|
Follow Zahab’s Last Wish Zahab did not die that day. He left for a faraway continent to test his Sculpture Mastery. Once you graduate in Sculpture Master, you should find Zahab to learn the song A Sculpture’s Heart from him. Then, you should come back here and sing it to this old lady’s maid. The tradition runs that Zahab’s was last seen heading for the Gray Pass Region. Difficulty: A Quest Requirement: Reward: |
A serial quest with a difficulty level of A, rewarding four skills. Weed couldn’t tell if he’s lucky or not.
For one thing, he knew that it was extremely difficult to acquire skills unrelated to his own class. Those skills, such as Item Identification and Repair Skill, which he had learned without converting to the sculpture class, could come in handy in numerous ways, but an A level quest was far beyond his ability for a long time, possibly many years.
The average level for Royal Road users is currently a hundred or so. The highest ladder is in the low 300s. The difficulty of a quest that requires a balanced party of power rankers a level 300 to finish is known to be B-level.
That means Weed had just accepted a quest that requires him to be above level 400 to be able to cope with the quest, let alone finish it.
As if it were not bad enough, the Gray Pass region is the most perilous of the perilous areas, inhabited by the most forceful monsters. It is one of the top Ten Forbidden Areas on the continent, where you are absolutely guaranteed to be chopped to pieces the moment you stepped in the area.
“Dammit”
The number of quest that a user can store at a time is only three. Now that one of them was taken by the quest Zahab’s Last Wish, Weed was left with only two spaces for new quests.
But in case of serial quest, it is unpredictable what rewards await the user in the end. This serial quest introduced a secret class at the second stage. Even after he refused to convert to the class, he was given four practical skills. Imagine what rewards in the final stage would be like.
 Yet, it remained unknown when and how this would work out.
He bid farewell to the old lady’s maid, and went back to the sculpture stop.
“O Weed-nim, I appreciate your hard work to bring me results so soon. I am once again assured that it was the right decision to entrust you with this quest” The shopkeeper said.
The shopkeeper paid Weed as a reward for the request.
Weed received 2 silver coins, recovering the silver coin that had been virtually robbed by the bard.
When he returned to the Training Hall, he received another silver coin, along with a word of commendation from the instructor. Therefore, it was a total of 5 silvers that Weed had earned so far.
He also leveled up twice, to level 3. He distributed those earned stat bonus points equally to AGI and STR.
“Why aren’t you taking on another quest?” he asked himself.
Weed wrestled with a sudden temptation, but picked up the wooden sword again. A quest that was undisclosed to the public similar to the quest he just undertook, was rare. That was why Weed earned generous rewards for his level.


hours in the central area - horizontal lines one to six, vertical lines seven to twelve; minutes - the tiny solid rectangule circles around the outer frame and changes position every minute, while each gap corresponds to clock position one to twelve.


heart attack
(noun) - an episode of heart disease often brought on by factors such as hypertension and atherosclerosis, characterised by loss of blood flow and damage to the heart muscle or surrounding tissue.
(noun) - an episode of heart disease often brought on by factors such as hypertension and atherosclerosis, characterised by loss of blood flow and damage to the heart muscle or surrounding tissue.
Heart attacks have many causes, and the risk can be increased due to certain lifestyle descisions. Obesity and poor diet can profilerate into fatty buildup on the walls of arteries - causing loss or reduction of blood flow. Type 2 diabetes and smoking can also cause heart attacks due to chemical changes in blood partially blocking the coronary arteries. The risk of a heart attack can be reduced, see Treatments.
Heart attacks have huge impacts on your health. If the heart is stopped or its function is compromised, vital oxygen does not get distributed throughout the body. This will cause death of cell tissue in a short time. Arguably the most critical of these organs is the brain.  If this goes on for too long (approx 3 minutes), it will cause brain death which is irreversible.
There are many signs and symptoms that can signal an incoming or in-progress heart attack. Firstly, pain could be experienced in the jaw, left arm, chest and sometimes back. Patients could feel dizzy, light-headed and in a cold sweat. Even if pain is not occurring, there may be tightness in the chest, jaw arm and neck. An unusual but common symptom is a feeling of impending doom. For female patients, gastrointestinal distress can also be an indictor of a heart attack.
Treatment for heart attacks is usually carried out in a hospital.
There are home and commercial-use defibrillators that can restart the heart in the event of ventricular fibrillation but they are usually for emergency use.
If a heart attack is suspected, a patient should be transferred to a hospital as quickly as possible.
When there, a variety of surgical and medical procedures can be employed to protect the heart.
For example, oxygen therapy can help after a heart attack to quickly diffuse oxygen into the blood.
Medicines like anticoagulants and beta blockers (blood pressure reduction) can be used to prevent another or for post-attack care.
Surgical procedures like the insertion of a coronary stent are common but they depend on the severity of the attack.
Preventative care is widely available and usually easy to accomplish at home. This includes excercise, healthy diet and limitation of recreational drugs (e.g alcohol and caffeine)
The information on this page hasn't been reviewed by a medical professional. Always seek the advice of a doctor if you are unsure.
If you suspect you're having a heart attack, call local emergency services (e.g triple zero).
Scroll down if you want to see how I made this site.
This website displays text by prioritising more important phrases. Click the button in the bottom-right to disable it. Created using HTML, CSS and vibrant.js. Hosted on GitHub Pages. Copyright © Shaunak Gadkari, 2020. Here's the source code.


AWAKENINGS A film review by Jim Pellmann Copyright 1991 Jim Pellmann
Set in 1969, this is the story of a neurologist (Robin Williams) who attempts to "awaken" a group of patients in a mental hospital who have been in a catatonic state for 30 years or more due to having had encephalitis when younger. The doctor believes that the new drug L-Dopa, which is being used to treat Parkinson's disease patients might help them as well.
Robert De Niro plays Leonard, the first patient to try the treatment. Leonard becomes a fully functional person again and the doctor expands the treatment to other patients. Their joy at becoming "normal" again is short-lived when Leonard starts regressing to his former state.
This movie plays fast and loose with your emotions, but is not manipulative. It is based on a true story, but I don't know how much (if any) has been altered to make for a better story. Although basically a drama, there are many hilarious moments.
As Leonard, De Niro gives a highly effective performance along the lines of Dustin Hoffman in RAIN MAN and Daniel Day Lewis in MY LEFT FOOT, and he will no doubt be nominated for a Best Actor Oscar. His joy at getting his life back is as compelling as his rage when he realizes he is losing it again.
As Robin Williams learns to tone down his manic comedic style, he is becoming a better and better actor. I think this is probably his best work since THE WORLD ACCORDING TO GARP.
Julie Kavner is the sympathetic nurse who believes in the doctor and becomes his biggest supporter among the otherwise doubting staff at the hospital. There are lots of other well-known character actors playing smaller roles too.
Director Penny Marshall (who also did BIG) demonstrates that she can do drama every bit as well as comedy. Could be the first female Best Director Oscar nominee.
Highly recommended, but bring a Kleenex or two.
-- Jim Pellmann<EMAIL_ADDRESS>.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Title
by
Author
Rewind
Share
Delicious
Facebook
StumbleUpon
Twitter
Restart
This story was created with
Twee
and is powered by
TiddlyWiki
"STORY"


THE FUGITIVE A film review by Chad Polenz Copyright 1997 Chad Polenz
**** (out of 4 = excellent) 1993, PG-13, 133 minutes [2 hours, 13 minutes] [thriller] starring: Harrison Ford (Dr. Richard Kimble), Tommy Lee Jones (Deputy Sam Gerard, U.S. Marshall), Joe Pantoliano (Cosmo Renfo), Daniel Roebuck (Biggs), written by Jeb Stuart, David Twohy, produced by Arnold Kopelson, directed by Andrew Davis.
"The Fugitive" is probably one of the greatest thrillers ever made. It takes realistic, believable characters and tells an exciting story that's totally believable throughout. This isn't an over-the-top action flick for the sake of action, this is an intelligent adventure story with a real sense of mystery to it and it works perfectly.
Harrison Ford stars as Dr. Richard Kimble, a man who is wrongly accused and convicted of murdering his wife. The entire premise of the story revolves around this murder, but is not told in a straightforward manner. We constantly see flashbacks to the murder from Kimble's perspective. Hints are dropped from various times of the night Kimble's wife, Helen (Sela Ward) was murdered. We don't get to see who the killer is until much further into the story. In fact, we might even have a little doubt about Kimble's innocence ourselves.
The film doesn't spend much time on the details of Kimble's trial and conviction as it is not the point of the story. One of the greatest action scenes ensues as we get a botched escape attempt by his fellow inmates which leads to a fantastic train wreck. But it does not at all seem gratuitous or formulated, it is actually suspenseful to watch. This movie is so incredible because it's able to take elements like these and make them wholly original and believable.
Tommy Lee Jones almost steals the show as Deputy Sam Gerard, a U.S. Marshall who is an expert in hunting fugitives. From the moment he appears we know a huge game of cat and mouse is about to occur. Kimble and Gerard are equally matched as there is no way to tell how one is going to outsmart the other.
Most of the film deals with Richard's complex investigation as he tries to find the one-armed man who killed his wife. Ford does not have a lot of lines here, so it is Stuart and Twohy's script and Davis's outstanding direction that make the film as great as it is. Just watching Richard use his keen intelligence and wits, disguising himself, and doing his own detective work is very interesting. We know just as little as he does as to why his wife was killed, so as he learns more so do we.
Meanwhile Gerard and his staff are using all their skills to hunt him down. At one point they run into each other and a great chase ensues, but Richard is just too smart for them. He leaves clues for Gerard to show his innocence and to help him solve the mystery.
One of the greatest charms to the film is its sense of humor. There is a great sense of comradeship between Gerard and his two closest deputies Cosmo Renfo (Pantoliano) and Biggs (Roebuck). They are trying to catch what they believe to be a dangerous murderer, yet they constantly start up small talk with each other, making funny wisecracks and one-liners, but not in any kind of distracting manner.
The final act concludes with another terrific chase. Richard figures out who the killer is and confronts him, and although we get a typical fight scene, the case is far from solved. The man who ordered the murder has been under our nose all along, and we don't realize this until the end when both Richard and Gerard put the pieces together. Maybe the finally scene is a bit much, but it still has a believable atmosphere to it. We're so relieved when justice is served.
It's not the plot is that makes "The Fugitive" great, it's all the motions the characters go through to make for an intriguing story. Watching a seemingly average man go through as much as this is what makes the movie so adventurous. If only Hollywood could produce more movies like this.
(10/31/96) (1/29/97) (6/13/97) [see also: "Nick Of Time"]
please visit Chad'z Movie Page @ http://members.aol.com/ChadPolenz/index.html
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


@* * This template takes a two arguments, a String containing a * message to display and an AssetsFinder to locate static assets. *@ @(imp : ProfileImp)(implicit assetsFinder: AssetsFinder) @* * Call the `main` template with two arguments. The first * argument is a `String` with the title of the page, the second * argument is an `Html` object containing the body of the page. *@
@* *@ @*Channel Title : @imp.getTitle
*@ @*Channel Description :
@imp.getDescription
Total Views Number : @imp.getTotalViews
*@ @*Total Subscribers Number : @imp.getTotalSubscribers
*@ @*Total Video Number : @imp.getTotVideos
*@ @*@imp.getTitle


synchronized
statement lock expressions
that consist of a non-final
field reference.
Such statements are unlikely to have useful semantics, as different
threads may acquire different locks even when operating on the same object.
Example:
private Object o;
public void foo() {
synchronized (o) // synchronization on a non-final field
{ }
}


Typography
Here's what you need to write and style your documents.
Headings
All HTML headings,

through

, are available. .h1
through .h6
classes are also available, for when you want to match the font styling of a heading but still want your text to be displayed inline.
h1. theDocs heading
h2. theDocs heading
h3. theDocs heading
h4. theDocs heading
h5. theDocs heading
h6. theDocs heading

h1. theDocs heading

h2. theDocs heading

h3. theDocs heading

h4. theDocs heading

h5. theDocs heading

h6. theDocs heading

Create lighter, secondary text in any heading with a generic
tag or the .small
class.
h1. theDocs heading Secondary text
h2. theDocs heading Secondary text
h3. theDocs heading Secondary text
h4. theDocs heading Secondary text
h5. theDocs heading Secondary text
h6. theDocs heading Secondary text

h1. theDocs heading Secondary text

h2. theDocs heading Secondary text

h3. theDocs heading Secondary text

h4. theDocs heading Secondary text

h5. theDocs heading Secondary text

h6. theDocs heading Secondary text

Anchor titles
Add an id
attribute to a heading, if you want to make the accessible through a link.
h1. theDocs heading
h2. theDocs heading
h3. theDocs heading
h4. theDocs heading
h5. theDocs heading
h6. theDocs heading

h1. theDocs heading

h2. theDocs heading

h3. theDocs heading

h4. theDocs heading

h5. theDocs heading

h6. theDocs heading

Text colors
Use follwoing contextual classes to change color of text.
This is a normal paragraph without any contectual classes.
A paragraph with .text-primary class.
A paragraph with .text-success class.
A paragraph with .text-info class.
A paragraph with .text-warning class.
A paragraph with .text-danger class.
A paragraph with .text-purple class.
A paragraph with .text-teal class.
A paragraph with .text-gray class.
A paragraph with .text-dark class.
A paragraph with .text-white class.

This is a normal paragraph without any contectual classes.

A paragraph with .text-primary class.

A paragraph with .text-success class.

A paragraph with .text-info class.

A paragraph with .text-warning class.

A paragraph with .text-danger class.

A paragraph with .text-purple class.

A paragraph with .text-teal class.

A paragraph with .text-gray class.

A paragraph with .text-dark class.

A paragraph with .text-white class.


JavaScript Memory Profiling
A memory leak is a gradual loss of available computer memory. It occurs when a program repeatedly fails to return memory it has obtained for temporary use. JavaScript web apps can often suffer from similar memory related issues that native applications do, such as leaks and bloat but they also have to deal with garbage collection pauses.
Although JavaScript uses garbage collection for automatic memory management, effective memory management is still important. In this guide we will walk through profiling memory issues in JavaScript web apps. Be sure to try the supporting demos when learning about features to improve your awareness of how the tools work in practice.
Note: Some of these features we will be using are currently only available in Chrome Canary. We recommend using this version to get the best memory profiling tooling for your applications.
Questions to ask yourself
In general, there are three questions you will want to answer when you think you have a memory leak:
-
Is my page using too much memory? - the Timeline memory view and Chrome task manager can help you identify if you’re using too much memory. Memory view can track the number of live DOM nodes, documents and JS event listeners in the inspected render process. As a rule of thumb: avoid holding references to DOM elements you no longer need to use, unbind unneeded event listeners and take care when storing large chunks of date you aren't going to use.
-
Is my page free of memory leaks? - the Object allocation tracker can help you narrow down leaks by looking at JS object allocation in real-time. You can also use the heap profiler to take JS heap snapshots, analyze memory graphs and compare snapshots to discover what objects are not being cleaned up by garbage collection.
-
How frequently is my page forcing garbage collection? - if you are GCing frequently, you may be allocating too frequently. The Timeline memory view can help you identify pauses of interest.
Table of contents
Terminology and Fundamentals
This section describes common terms used in memory analysis, and is applicable to a variety of memory profiling tools for different languages. The terms and notions described here are used in the Heap Profiler UI and the corresponding documentation.
It helps to become familiar with these to use the tool effectively. If you have ever worked with either the Java, .NET, or some other memory profiler then this may be a refresher.
Object sizes
Think of memory as a graph with primitive types (like numbers and strings) and objects (associative arrays). It might visually be represented as a graph with a number of interconnected points as follows:
An object can hold memory in two ways:
-
Directly by the object itself
-
Implicitly by holding references to other objects, and therefore preventing those objects from being automatically disposed by a garbage collector (GC for short).
When working with the Heap Profiler in DevTools (a tool for investigating memory issues found under "Profiles"), you will likely find yourself looking at a few different columns of information. Two that stand out are Shallow Size and Retained Size, but what do these represent?
Shallow size
This is the size of memory that is held by the object itself.
Typical JavaScript objects have some memory reserved for their description and for storing immediate values. Usually, only arrays and strings can have a significant shallow size. However, strings and external arrays often have their main storage in renderer memory, exposing only a small wrapper object on the JavaScript heap.
Renderer memory is all memory of the process where an inspected page is rendered: native memory + JS heap memory of the page + JS heap memory of all dedicated workers started by the page. Nevertheless, even a small object can hold a large amount of memory indirectly, by preventing other objects from being disposed of by the automatic garbage collection process.
Retained size
This is the size of memory that is freed once the object itself is deleted along with its dependent objects that were made unreachable from GC roots.
GC roots are made up of handles that are created (either local or global) when making a reference from native code to a JavaScript object outside of V8. All such handles can be found within a heap snapshot under GC roots > Handle scope and GC roots > Global handles. Describing the handles in this documentation without diving into details of the browser implementation may be confusing. Both GC roots and the handles are not something you need to worry about.
There are lots of internal GC roots most of which are not interesting for the users. From the applications standpoint there are following kinds of roots:
-
Window global object (in each iframe). There is a distance field in the heap snapshots which is the number of property references on the shortest retaining path from the window.
-
Document DOM tree consisting of all native DOM nodes reachable by traversing the document. Not all of them may have JS wrappers but if they have the wrappers will be alive while the document is alive.
-
Sometimes objects may be retained by debugger context and DevTools console (e.g. after console evaluation).
Note: We recommend users to do heap snapshots with clear console and no active breakpoints in the debugger.
The memory graph starts with a root, which may be the window
object of the browser or the Global
object of a Node.js module. You don't control how this root object is GC'd.
Whatever is not reachable from the root gets GC.
Object's Retaining Tree
As we introduced earlier, the heap is a network of interconnected objects. In the mathematical world, this structure is called a graph or memory graph. A graph is constructed from nodes connected by means of edges, both of which are given labels.
-
Nodes (or objects) are labelled using the name of the constructor function that was used to build them
-
Edges are labelled using the names of properties.
Later in this guide you will learn how to record a profile using the Heap Profiler. Some of the eye-catching things we can see in the Heap Profiler recording below include distance: the distance from the GC root. If almost all the objects of the same type are at the same distance, and a few are at a bigger distance, that's something worth investigating.
Dominators
Dominator objects are comprised of a tree structure because each object has exactly one dominator. A dominator of an object may lack direct references to an object it dominates, that is, the dominators tree is not a spanning tree of the graph.
In the diagram above:
- Node 1 dominates node 2
- Node 2 dominates nodes 3, 4 and 6
- Node 3 dominates node 5
- Node 5 dominates node 8
- Node 6 dominates node 7
In the example below, node #3
is the dominator of #10
, but #7
also exists in every simple path from GC to #10
. Therefore, an object B is a dominator of an object A if B exists in every simple path from the root to the object A.
V8 Specifics
In this section we describe some memory-related topics that correspond specifically to the V8 JavaScript virtual machine (V8 VM or VM). When profiling memory, it is helpful to understand why heap snapshots look this way.
JavaScript Object Representation
There are three primitive types:
- Numbers (e.g 3.14159..)
- Booleans (true or false)
- Strings (e.g 'Werner Heisenberg')
They cannot reference other values and are always leafs or terminating nodes.
Numbers can be stored as either:
-
an immediate 31-bit integer values called small integers (SMIs), or
-
heap objects, referred to as heap numbers. Heap numbers are used for storing values that do not fit into the SMI form, such as doubles, or when a value needs to be boxed, such as setting properties on it.
Strings can be stored in either:
-
the VM heap, or
-
externally in the renderer’s memory. A wrapper object is created and used for accessing external storage where, for example, script sources and other content that is received from the Web is stored, rather than copied onto the VM heap.
Memory for new JavaScript objects is allocated from a dedicated JavaScript heap (or VM heap).These objects are managed by V8's garbage collector and therefore, will stay alive as long as there is at least one strong reference to them.
Native objects are everything else which is not in the JavaScript heap. Native object, in contrast to heap object, is not managed by the V8 garbage collector throughout it’s lifetime, and can only be accessed from JavaScript using its JavaScript wrapper object.
Cons string is an object that consists of pairs of strings stored then joined, and is a result of concatenation. The joining of the cons string contents occurs only as needed. An example would be when a substring of a joined string needs to be constructed.
For example, if you concatenate a and b, you get a string (a, b) which represents the result of concatenation. If you later concatenated d with that result, you get another cons string ((a, b), d).
Arrays - An Array is an Objectwith numeric keys. They are used extensively in the V8 VM for storing large amounts of data. Sets of key-value pairs used like dictionaries are backed up by arrays.
A typical JavaScript object can be one of two array types used for storing:
-
named properties, and
-
numeric elements
In cases where there is a very small number of properties, they can be stored internally in the JavaScript object itself.
Map - an object that describes the kind of object and its layout. For example, maps are used to describe implicit object hierarchies for fast property access.
Object Groups
Each native objects group is made up from objects that hold mutual references to each other. Consider for example a DOM subtree, where every node has a link to its parent and links to the next child and next sibling, thus forming a connected graph. Note that native objects are not represented in the JavaScript heap — that's why they have zero size. Instead, wrapper objects are created.
Each wrapper object holds a reference to the corresponding native object, for redirecting commands to it. In its own turn, an object group holds wrapper objects. However, this doesn't create an uncollectable cycle, as GC is smart enough to release object groups whose wrappers are no longer referenced. But forgetting to release a single wrapper will hold the whole group and associated wrappers.
Prerequisites and helpful tips
Chrome Task Manager
Note: When profiling memory issues in Chrome, it is a good idea to setup a clean-room testing environment.
Using the Chrome Task Manager you can quickly see if a page is consuming a lot of memory by monitoring the memory columns while performing actions that may be causing this to happen. The Task Manager is accessed from the Chrome menu > Tools or by pressing Shift + Esc.
Once open, right-click on the heading area of the columns and enable the JavaScript memory column.
Identifying a Memory Problem with the DevTools Timeline
The first step in solving any performance problem is having the ability to show proof that the problem exists. This means being able to create a reproducible test that can be used to take a baseline measurement of the problem. Without a reproducible program, you cannot reliably measure the problem. Further, without a baseline measurement, there is no way of knowing that any changes made are improving performance.
The Timeline panel is helpful for determining when a problem exists. It gives a complete overview of where time is spent when loading and interacting with your web app or page. All events, from loading resources to parsing JavaScript, calculating styles, garbage collection pauses, and repainting are plotted on a timeline.
When investigating memory issues, the Timeline panel’s Memory view can be used for tracking:
-
total allocated memory - is memory usage growing?
-
number of DOM nodes
-
number of documents and
-
the number of event listeners allocated.
To read more about how to isolate problems that might be causing leaks during your memory profiling sessions, see Memory profiling with the Chrome DevTools by Zack Grossbart.
Proving a Problem Exists
The first thing to do is identify a sequence of actions you suspect is leaking memory. This could be anything from navigating around a site, hovering, clicking, or otherwise somehow interacting with page in a way that seems to negatively impact performance more over time.
On the Timeline panel start recording (Ctrl + E or Cmd + E) and perform the sequence of actions you want to test. To force a full garbage collection click the trash icon () at the bottom.
Below we see a memory leak pattern, where some nodes are not being collected:
If after a few iterations you see a sawtooth shaped graph (in the memory pane at the top), you are allocating lots of shortly lived objects. But if the sequence of actions is not expected to result in any retained memory, and the DOM node count does not drop down back to the baseline where you began, you have good reason to suspect there is a leak.
Once you’ve confirmed that the problem exists, you can get help identifying the source of the problem using the heap profiler on the Profiles panel.
Example: Try out this example of memory growth where you can practice how to effectively use Timeline memory mode.
Garbage Collection
A garbage collector (such as the one in V8) needs to be able to locate objects in your application which are live, as well as, those which are considered dead (garbage) and are unreachable.
If garbage collection (GC) misses any dead objects due to logical errors in your JavaScript then the memory consumed by these objects cannot be reclaimed. Situations like this can end up slowing down your application over time.
This often happens when you’ve written your code in such a way that variables and event listeners you don’t require are still referenced by some code. While these references are maintained, the objects cannot be correctly cleaned up by GC.
Remember to check and nullify variables that contain references to DOM elements which may be getting updated/destroyed during the lifecycle of your app. Check object properties which may reference other objects (or other DOM elements). Be sure to keep an eye on variable caches which may accumulate over time.
Heap Profiler
Taking a snapshot
On the Profiles panel, choose Take Heap Snapshot , then click Start or press Cmd + E or Ctrl + E:
Snapshots are initially stored in the renderer process memory. They are transferred to the DevTools on demand, when you click on the snapshot icon to view it. After the snapshot has been loaded into DevTools and has been parsed, the number below the snapshot title appears and shows the total size of the reachable JavaScript objects:
Example: Try out this example of garbage collection in action and monitor memory usage in the Timeline.
Clearing snapshots
Snapshots can be removed (both from DevTools and renderers memory) by pressing the Clear all profiles icon ():
Note: Closing the DevTools window will not delete collected profiles from the renderers memory. When reopening DevTools, all previously taken snapshots will reappear in the list of snapshots.
Remember that we mentioned earlier you can force GC from the DevTools as part of your snapshot workflow. When taking a Heap Snapshot, it is automatically forced. In Timeline it can be very convenient to force a GC by clicking on the trash can (Collect Garbage) button ().
Example: Try out this example of scattered objects and profile it using the Heap Profiler. You should see a number of (object) item allocations.
Switching between snapshot views
A snapshot can be viewed from different perspectives for different tasks. To switch between views, use the selector at the bottom of the view:
There are three default views:
-
Summary — shows objects grouped by the constructor name;
-
Comparison — displays difference between two snapshots;
-
Containment — allows exploration of heap contents;
The Dominators view, which can be enabled via the Settings panel — shows the dominators tree. and can be useful to find accumulation points.
Looking up color coding
Properties and property values of objects have different types and are colored accordingly. Each property has one of four types:
-
a: property — a regular property with a name, accessed via the . (dot) operator, or via [ ] (brackets) notation, e.g. ["foo bar"];
-
0: element — a regular property with a numeric index, accessed via [ ] (brackets) notation;
-
a: context var — a variable in a function context, accessible by its name from inside a function closure;
-
a: system prop — property added by the JavaScript VM, not accessible from JavaScript code.
Objects designated as System
do not have a corresponding JavaScript type. They are part of JavaScript VM's object system implementation. V8 allocates most of its internal objects in the same heap as the user's JS objects. So these are just v8 internals.
Views in detail
Summary view
Initially, a snapshot opens in the Summary view, displaying object totals, which can be expanded to show instances:
Top-level entries are "total" lines. They display:
-
the Constructor represents all objects created using this constructor
-
the number of object instances is displayed in the # column
-
the Shallow size column displays the sum of shallow sizes of all objects created by a certain constructor function
-
the Retained size column displays the maximum retained size among the same set of objects
-
the Distance displays the distance to the root using the shortest simple path of nodes.
After expanding a total line in the upper view, all of its instances are displayed. For each instance, its shallow and retained sizes are displayed in the corresponding columns. The number after the @ character is the objects’ unique ID, allowing you to compare heap snapshots on per-object basis.
Example: Try this demo page (opens in a new tab) to understand how the Summary view can be used.
Remember that yellow objects have JavaScript references on them and red objects are detached nodes which are referenced from one with a yellow background.
Comparison view
This view is used to compare multiple snapshots to each other so that you can see what the difference between them are in order to find leaked objects. To verify that a certain application operation doesn't create leaks (e.g. usually a pair of direct and reverse operations, like opening a document, and then closing it, should not leave any garbage), you may follow the scenario below:
-
Take a heap snapshot before performing an operation;
-
Perform an operation (interact with a page in some way that you believe to be causing a leak);
-
Perform a reverse operation (do the opposite interaction and repeat it a few times);
-
Take a second heap snapshot and change the view of this one to Comparison, comparing it to snapshot 1.
In the Comparison view, the difference between two snapshots is displayed. When expanding a total entry, added and deleted object instances are shown:
Example: Try this demo page (opens in a new tab) to get an idea how to use snapshot comparison for detecting leaks.
Containment view
The Containment view is essentially a "bird's eye view" of your application's objects structure. It allows you to peek inside function closures, to observe VM internal objects that together make up your JavaScript objects, and to understand how much memory your application uses at a very low level.
The view provides several entry points:
-
DOMWindow objects — these are objects considered as "global" objects for JavaScript code;
-
GC roots — actual GC roots used by VM's garbage collector;
-
Native objects — browser objects that are "pushed" inside the JavaScript virtual machine to allow automation, e.g. DOM nodes, CSS rules (see the next section for more details.)
Below is the example of a populated Containment view:
Example: Try this demo page (opens in a new tab) for finding out how to explore closures and event handlers using the view.
A tip about closures
It helps a lot to name the functions so you can easily distinguish between closures in the snapshot. For example, this example does not use named functions:
function createLargeClosure() { var largeStr = new Array(1000000).join('x'); var lC = function() { // this is NOT a named function return largeStr; }; return lC; }
Whilst this example does:
function createLargeClosure() { var largeStr = new Array(1000000).join('x'); var lC = function lC() { // this IS a named function return largeStr; }; return lC; }
Examples: Try out this example of why eval is evil to analyze the impact of closures on memory. You may also be interested in following it up with this example that takes you through recording heap allocations.
Uncovering DOM leaks
A unique ability of the tool is to reflect bidirectional dependencies between browser native objects (DOM nodes, CSS rules) and JavaScript objects. This helps to discover otherwise invisible leaks happening due to forgotten detached DOM subtrees floating around.
DOM leaks can be bigger than you think. Consider the following sample - when is the #tree GC?
var select = document.querySelector; var treeRef = select("#tree"); var leafRef = select("#leaf"); var body = select("body"); body.removeChild(treeRef); //#tree can't be GC yet due to treeRef treeRef = null; //#tree can't be GC yet due to indirect //reference from leafRef leafRef = null; //#NOW can be #tree GC
#leaf
maintains a reference to it's parent (parentNode) and recursively up to #tree
, so only when leafRef is nullified is the WHOLE tree under #tree
a candidate for GC.
Examples: Try out this example of leaking DOM nodes to understand where DOM nodes can leak and how to detect them. You can follow it up by also looking at this example of DOM leaks being bigger than expected.
To read more about DOM leaks and memory analysis fundamentals checkout Finding and debugging memory leaks with the Chrome DevTools by Gonzalo Ruiz de Villa.
Native objects are most easily accessible from Summary and Containment views — there are dedicated entry nodes for them:
Example: Try this demo (opens in a new tab) to play with detached DOM trees.
Dominators view
The Dominators view shows the dominators tree for the heap graph. The Dominators view looks similar to the Containment view, but lacks property names. This is because a dominator of an object may lack direct references to it, that is, the dominators tree is not a spanning tree of the graph. But this only serves for good, as helps us to identify memory accumulation points quickly.
Note: In Chrome Canary, Dominators view can be enabled by going to Settings > Show advanced heap snapshot properties and restarting the DevTools.
Examples: Try this demo (opens in a new tab) to train yourself in finding accumulation points. Follow it up with this example of running into retaining paths and dominators.
Object allocation tracker
The object tracker combines the detailed snapshot information of the heap profiler with the incremental updating and tracking of the Timeline panel. Similar to these tools, tracking objects’ heap allocation involves starting a recording, performing a sequence of actions, then stop the recording for analysis.
The object tracker takes heap snapshots periodically throughout the recording (as frequently as every 50 ms!) and one final snapshot at the end of the recording. The heap allocation profile shows where objects are being created and identifies the retaining path.
Enabling and using the Object Tracker
To begin using the Object Tracker:
-
Make sure you have the latest Chrome Canary.
-
Open the Developer Tools and click on the gear icon in the lower right.
-
Now, open the Profiler panel, you should see a profile called "Record Heap Allocations"
The bars at the top indicate when new objects are found in the heap. The height of each bar corresponds to the size of the recently allocated objects, and the color of the bars indicate whether or not those objects are still live in the final heap snapshot: blue bars indicate objects that are still live at the end of the timeline, gray bars indicate objects that were allocated during the timeline, but have since been garbage collected.
In the example above, an action was performed 10 times. The sample program caches five objects, so the last five blue bars are expected. But the leftmost blue bar indicates a potential problem. You can then use the sliders in the timeline above to zoom in on that particular snapshot and see the objects that were recently allocated at that point.
Clicking on a specific object in the heap will show its retaining tree in the bottom portion of the heap snapshot. Examining the retaining path to the object should give you enough information to understand why the object was not collected, and you can make the necessary code changes to remove the unnecessary reference.
Memory Profiling FAQ
Q: I don't see all the properties of objects, I don't see non-string values for them! Why?
Not all properties are actually stored on the JavaScript heap. Some of them are implemented using getters that execute native code. Such properties are not captured in heap snapshots in order to avoid the cost of calling getters and to avoid possible program state changes if getters are not "pure" functions. Also, non-string values such as numbers are not captured in an attempt to reduce snapshot size.
Q: What does the number after the *@* char mean — is this an address or an ID? Is the ID value really unique?
This is an object ID. Displaying an object's address makes no sense, as objects are moved during garbage collections. Those object IDs are real IDs — that means, they persist among multiple snapshots taken and are unique. This allows precise comparison between heap states. Maintaining those IDs adds an overhead to GC cycles, but it is only initiated after the first heap snapshot was taken — no overhead if heap profiles aren't used.
Q: Are "dead" (unreachable) objects included in snapshots?
No. Only reachable objects are included in snapshots. Also, taking a snapshot always starts with doing a GC.
Note:At the time of writing, we are planning on avoiding this GC to reduce the drop in used heap size when taking heap snapshots. This has yet to be implemented but garbage would still be out of the snapshot.
Q: What comprises GC roots?
Many things:
-
built-in object maps;
-
symbol table;
-
stacks of VM threads;
-
compilation cache;
-
handle scopes;
-
global handles.
Q: I’ve been told to use the Heap Profiler and Timeline Memory view for detecting memory leaks. What tool should be used first?
The Timeline. Use it to diagnose excessive memory usage when you first notice your page has slowed down after extended use. Slowdown was once a classic symptom of a memory leak but it could also be something else – maybe you have a paint or network bottleneck in your page, so make sure to fix the real issue in your page.
To diagnose whether memory is the issue, go to the Timeline panel and Memory view. Hit the record button and interact with your application, repeating any steps you feel may be causing a leak. Stop the recording. The graph you see will display the memory allocated to your application. If it happens to be consuming an increasing amount of this over time (without ever dropping), it’s an indication you may have a memory leak.
The profile for a healthy application should look more like a sawtooth curve as memory is allocated then freed when the garbage collector comes in. There’s nothing to worry about here – there’s always going to be a cost of doing business in JavaScript and even an empty requestAnimationFrame
will cause this type of sawtooth, you can’t avoid it. Just ensure it’s not sharp as that’s an indication a lot of allocations are being made, which can equate to a lot of garbage on the other side.
It's the rate of increase in the steepness of this curve that you need to keep an eye on.There is also a DOM node counter, Document counter and Event listener count in the Memory view which can be useful during diagnosis. DOM nodes use native memory and do not directly affect the JavaScript memory graph.
Once you suspect you have a memory leak, the Heap profiler can be used to discover the source of the leak.
Q: I noticed a number of DOM nodes in the heap snapshot where some are highlighted in red and indicated as a "Detached DOM tree" whilst others are yellow. What does this mean?
You'll notice nodes of a few different colors. Red nodes (which have a darker background) do not have direct references from JavaScript to them, but are alive because they’re part of a detached DOM tree. There may be a node in the tree referenced from JavaScript (maybe as a closure or variable) but is coincidentally preventing the entire DOM tree from being garbage collected.
Yellow nodes (with a yellow background) however do have direct references from JavaScript. Look for yellow nodes in the same detached DOM tree to locate references from your JavaScript. There should be a chain of properties leading from the DOM window to the element (e.g window.foo.bar[2].baz
).
An animation of where detached nodes fit into the overall picture can be seen below:
Example: Try out this example of detached nodes where you can watch node evolution in the Timeline then take heap snapshots to find detached nodes.
Q: What do the Shallow and Retained Size columns represent and what are the differences between them?
So, objects can be kept in memory (be alive) in two different ways – either directly by another alive object (window and document are always alive objects) or implicitly by holding references from native part of the renderer (like DOM objects). The latter is what ends up preventing these objects from being disposed by GC automatically, causing leaks. The size of memory held by an object itself is known as the shallow size (generally, arrays and strings have larger shallow sizes).
An object of any size can hold a ton of memory if it prevents other objects from being disposed. The size of memory that can be freed once an object is deleted (and this its dependents made no longer reachable) is called the retained size.
Q: There's a lot of data in the constructor and retained views. Where should I start digging into to discover if I have a leak?
It's generally a good idea to begin investigation from the first object retained in your tree as retainers are sorted by distance (well, distance to the window).
The object retained with the shortest distance is usually your first candidate for causing a memory leak.
Q: What's the difference between the different Summary, Comparison, Dominators and Containment views?
You may get some mileage by switching between the different data views available at the bottom of the screen.
-
Summary view helps you hunt down objects (and their memory use) based on type grouped by constructor name. This view is particularly helpful for tracking down DOM leaks.
-
Comparison view helps you track down memory leaks, by displaying which objects have been correctly cleaned up by the garbage collector. Generally used to record and compare two (or more) memory snapshots of before and after an operation. The idea is that inspecting the delta in freed memory and reference count lets you confirm the presence and cause of a memory leak.
-
Containment view provides a better view of object structure, helping us analyse objects referenced in the global namespace (i.e. window) to find out what is keeping them around. It lets you analyse closures and dive into your objects at a low level.
-
Dominators view helps confirm that no unexpected references to objects are still hanging around (i.e that they are well contained) and that deletion/garbage collection is actually working.
Q: What do the various constructor (group) entries in the Heap profiler correspond to?
-
(global property) – intermediate objects between a global object (like 'window') and an object referenced by it. If an object is created using a constructor Person and is held by a global object, the retaining path would look like [global] > (global property) > Person. This contrasts with the norm, where objects directly reference each other. We have intermediate objects for performance reasons. Globals are modified regularly and property access optimisations do a good job for non-global objects aren't applicable for globals.
-
(roots) – The root entries in the retaining tree view are the entities that have references to the selected object. These can also be references created by the engine for its own purposes. The engine has caches which reference objects, but all such references are weak and won't prevent an object from being collected given that there are no truly strong references.
-
(closure) – a count of references to a group of objects through function closures
-
(array, string, number, regexp) – a list of object types with properties which reference an Array, String, Number or regular expression
-
(compiled code) – simply, everything related to compiled code. Script is similar to a function but corresponds to a <script> body. SharedFunctionInfos (SFI) are objects standing between functions and compiled code. Functions are usually have a context, while SFIs do not.
-
HTMLDivElement, HTMLAnchorElement, DocumentFragment etc – references to elements or document objects of a particular type referenced by your code.
Many of the other objects you may see were likely generated during the lifecycle of your code and can include event listeners as well as custom objects, like the controllers below:
Q: Is there anything I should be turning off in Chrome that might be influencing my figures?
When performing any type of profiling using the Chrome DevTools, it is recommended that you either run in incognito mode with all extensions disabled or start Chrome with a custom user data directory (--user-data-dir=""
).
Apps, extensions and even console logging can have an implicit impact on your figures and you want to keep them as reliable as possible.
Closing remarks
The JavaScript engines of today are highly capable of automatically cleaning garbage generated by our code in a number of situations. That said, they can only go so far and our applications are still prone to memory leaks caused by logical errors. Use the tools available to find out your bottlenecks and remember, don't guess it - test it.
Supporting Demos
Debugging Memory Leaks
Although we've mentioned them throughout this guide, a good set of end-to-end examples for testing various memory issues, ranging from growing memory leaking DOM nodes can be found summarized below. You may wish to experiment with them before attempting to use the tooling on your own more complex page or application.
- Example 1: Growing memory
- Example 2: Garbage collection in action
- Example 3: Scattered objects
- Example 4: Detached nodes
- Example 5: Memory and hidden classes
- Example 6: Leaking DOM nodes
- Example 7: Eval is evil (almost always)
- Example 8: Recording heap allocations
- Example 9: DOM leaks bigger than expected
- Example 10: Retaining path
- Example 11: Last exercise
Additional demos are available for:
Community Resources
There are a number of excellent resources written by the community on finding and fixing memory issues in web apps using the Chrome DevTools. Below are a selection of some you may find useful: