Thursday, April 28, 2011

JCL FAQs Series 03: IF and Conditions

JCL IF Statement Revisited

The condition portion of above statement is somewhat under documented. It can consist of an expression which evaluates to 'TRUE' or 'FALSE' or a comparison of two values. The two values being compared must be of the same type:
• a numeric value 0-4095 (something which looks like a return code). This includes the RC operator.
• values of the form Udddd where dddd is a decimal number 0001-4095 or Sxxx where xxx is a hexadecimal value in the range 001-FFF (something which looks like an abend code). This includes the ABENDCC operator.
• values 'TRUE' or 'FALSE'. This includes the RUN or ABEND operator.
The operators can:
• be specific to a step, e.g. ABEND.STEP1 which is set depending on whether or not STEP1 abended OR
• apply to the whole job: ABEND - did any step abend?


Here is an example of what can be done:
// SET ABCLEAN='TRUE'
//COPY EXEC PGM=MYPGM
....
// IF (ABEND = &ABCLEAN | COPY.RC 8) THEN
//FINAL EXEC PGM=CLEANUP
....
// ELSE
//CLEAN EXEC PGM=LASTPGM
....
// ENDIF
//

As it stands, the cleanup program runs if any step abends or the return code from the COPY step is greater than 8. However, if the setting for ABCLEAN is changed to FALSE, then the cleanup program will not run if any step abends.

Another possibility is:
....
// SET RUNFIN='FALSE'
// IF &RUNFIN THEN
//FINAL EXEC PGM=CLEANUP
....
// ENDIF

In this example, the final step will not execute. The setting for RUNFIN could be altered to TRUE to change this behaviour. Note that an IF statement or COND parameter test does not prevent the first step in a job from running.

Bypassing Selected Job Steps

One or more job steps can be bypassed by adding the following parameter to the EXEC statement for any job to be bypassed:
COND=(0,LE)
This specifies that the step will be bypassed if any return code value is greater than or equal to zero.

A job step or group of job steps can also be bypassed by adding the following statement before the first job step to be bypassed:
// IF RC <= 0 THEN and terminating the block with // ENDIF First step in a job is to be bypassed
Execute an IEFBR14 step:
// EXEC PGM=IEFBR14 as the first step in the job to provide an initial return code value.

Beginning with a Specific Job Step
The RESTART JOB parameter can be used to cause job execution to start with a specified job step. For example:
//MYJOB JOB .... ,RESTART=STEP10.COPY ....
//STEP10 EXEC IEBCOPY ....
Execution will begin with STEP10. The procedure step is COPY in this example.

The COND JOB parameter COND=(0,LE) could be specified to only execute the step specified on the RESTART parameter.

Condition Code Checking
The objective is to define when a program should run based on what the results were from earlier JCL steps. Of course, some people are still attached to the JCL COND parameter which actually specifies when you don't want the program to run. However, in most cases, IF THEN,ELSE,ENDIF JCL statements are easier to code correctly and let you do things which would be difficult to achieve with the old COND parameter.
Here is a sample JCL fragment: //COPY EXEC PGM=MYPGM .... // IF (COPY.RC = 0) THEN //NEXT EXEC PGM=NEXTPGM .... // IF (ABEND | NEXT.RC 8) THEN //FINAL EXEC PGM=CLEANUP .... // ELSE //CLEAN EXEC PGM=LASTPGM .... // ENDIF // ENDIF // If the first program runs with return code zero, then program NEXTPGM is run. If that program issues a return code greater than 8 or an earlier step has abended, then program CLEANUP is run. Otherwise, LASTPGM is run.
You can also test what the abend code value was or whether a specific job step executed.

JCL FAQs : Series 02 : Procedures and Symbolics

Procedures

Syntax for Executing procedure

Catalogued:
IBM supplies a utility program called IEBUPDTE; this program places cataloged procedures into partitioned data sets. These procedures are placed inside a system library called SYS1.PROCLIB.

//PRODPR1 JOB ZAq00000,
// 'CC2 NXD',
// MSGCLASS=O,
// RD=R,
// PRTY=14,
// TIME=1440,
// REGION=0M,
// CLASS=P,
// LINES=(50,WARNING)
//PROCS JCLLIB ORDER=(
// MDRPR.NDR.PROCLIB,
// MDRPR.NDR.VSAMINCL,
// ISDPR.ISD.PROCLIB)
//*
//LOADLIB INCLUDE MEMBER=KLIBNDR
//JS05 EXEC [PROC=]PRODPR1,
// MLM1=PR

When you executing CATALOGED PROCEDURE, If you have not specified where it is with JCLLIB statement , it will serach for this procedure in system procedure library SYS1.PROCLIB - There many IBM-supplied procedures that compile, link, and run programs
The following statements cannot be included within the procedure
JOB
DD * or DD DATA
JES2 or JES3 control statements


Instream:
//myproc PROC
//pg01 exec pgm=vvcmrbx
// ..
// ..
// pend
//pg01 exec pgm=vvcmrby
//instrm01 dd MYPROC

Instead of exec, instream called using DD.


MODIFY STATEMENTS IN A PROCEDURE:Overrides in Procedure:
We can add/modify contents of procedure. There are two types of modification we can do ,
1. on EXEC statement
2. on DD statement on EXEC statement


1. On EXEC statement
We can do following functions on EXEC statement in a procedure -

1.1Modify parameter on EXEC statements
PROCEDURE STATEMENT - //STEP10 EXEC PGM=COBPROG,TIME=30
PARAMETER OVERRIDE - //MYSTEP EXEC PROC=MYPROC,TIME.STEP10=40
Now Resultant TIME value for that step (in proc) is 40

1.2Adding parameter to an EXEC statement / all EXEC statement
PROCEDURE STATEMENT - //STEP10 EXEC PGM=COBPROG,TIME=30
PARAMETER ADDING -//MYSTEP EXEC PROC=MYPROC,REGION.STEP10=56K
(for single step)
REGION will be added to the STEP10 in MYPROC procedure
PARAMETER ADDING - //MYSTEP EXEC PROC=MYPROC,REGION=56K (for single step)
If REGION is not available for any step in that procedure. REGION will be added to all steps in procedure. If REGION is available for any step in procedure, REGION value will be override existing value on that step.

1.3Nullifying the parameter value
PROCEDURE STATEMENT - //STEP10 EXEC PGM=COBPROG,TIME=30
PARAMETER ADDING - //MYSTEP EXEC PROC=MYPROC,TIME.STEP10=
Dont give any value for that parameter, it will nullifying that parameter value in procedure on DD statement.

2. Syntax for add/modify DD statements in a procedure
//name EXEC [PROC=]procedure-name
//[procstepname].ddname DD parameter=value
//

We can do following functions on EXEC statement in a procedure
using above syntax:
- Modify existing parameter on DD statements within a procedure
- Add parameter to existing DD statement within a procedure
- Add DD statement to a job step
- Nullify the effect of parameter on DD statement in a procedure

SYMBOLIC PARAMETERS:
Usaually, the same JCL can be used by different programmers to implement common tasks, such as the opening, reading, and writing of data sets. In those cases , we can use symbolic parameters. Using symbolic parameters we can pass value to a parameter which is used in procedure.

A symbolic parameter on a DD statement is coded the parameter preceded by an ampersand. Syntax for assigning values to symbolic parameters in a procedure
//[name] EXEC [PROC=]procedure-name,symbolic-parameter=value

EXAMPLE JCL -> Procedure which is using symbolic parameter
//MYPROC PROC
//MYSTEP EXEC PGM=COBPROG
//INFILE DD DSN=&DOC..TEST.LIB,DISP=SHR
//OUTFILE DD DSN=&DOC..TEST.OUT,
// DISP=(NEW,KEEP,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(&SPACE))

The invoking EXEC statement
//STEPA1 EXEC MYPROC,DOC=MYLIB,SPACE='10,5'

The effective JCL
//MYPROC PROC
//MYSTEP EXEC PGM=COBPROG
//INFILE DD DSN=MYLIB.TEST.LIB,DISP=SHR
//OUTFILE DD DSN=MYLIB.TEST.OUT,
// DISP=(NEW,KEEP,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,('10,5'))

EXPLANATION -
In above example, &DOC,&SPACE are symbolic parameters in MYPROC procedure
We are passing values from invoking JCL,these value will be override the
&DOC and &SPACE where ever they find in the procedure

Quotes & Blanks in JCL Symbolic Variables
Symbolic substitution in JCL can be a minefield when embedded blanks or quotes are involved. The JCL conversion process
• will not substitute symbolics inside quotes
• will stop subsitution when it hits a blank outside of quotes
• requires two quotes within a quoted string to represent a single quote.

Here is a relatively straight-forward example of how to deal with this situation. Say that you want to run SDSF in batch and limit the jobs selected to only those associated with the user who owns the batch job.

Here is some JCL that you could use:
// SET QT=''''
// SET CMD='OWNER '
// SET PRM=&QT.&CMD.&SYSUID.&QT
//GETMSGS EXEC PGM=SDSF,DYNAMNBR=32,REGION=1024K,TIME=5,
// PARM=&QT.&PRM.&QT
//REPORT DD DISP=(,CATLG),DSN=&SYSUID..ABC.LIST,
// SPACE=(CYL,(1,1)),RECFM=FB,LRECL=80,BLKSIZE=0
//ISFOUT DD SYSOUT=*
//ISFIN DD *
PRINT FILE REPORT
...
more SDSF control statements
...

&SYSUID is a standard JCL symbolic which contains the userid associated with the executing job.
Refer to an earlier stupid trick for more information.
The PARM string 'OWNER userid' tells SDSF to only look at jobs belonging to userid.
We construct the parm by combining constant strings (which may contain blanks) with symbolic variables and frame the resulting string using the symbolic variable &QT (one single quote) to glue it all together.
The symbolic variable PRM contains 'OWNER userid';
however, if you don't put the &QTs around it as in the sample above, you wind up with just PARM=OWNER being passed to SDSF.

Here is a more complex example.
Caution-overexposure to this topic may cause discomfort:
//NESTED PROC LS=132,
// PS=60
// SET QT=''''
//SAUS EXEC SAUS,
// OPTIONS='SYSPARM='''&QT.&LS-&PS.&QT''''
//SYSIN DD DISP=(OLD,DELETE),DSN=&&SASIN
// PEND
//RUNJCL EXEC NESTED

The instream procedure NESTED invokes a catalogued procedure SAUS. The intent is to assign the value 'SYSPARM=''132-60''' to symbolic parameter OPTIONS. OPTIONS is appended to the execution parm in the invoked catalogued procedure, (which is contained within quotes), resulting in the value SYSPARM='132-60' being included in the run-time parms for program SAUS, once all the extra quotes have been stripped away. The values 132 and 60 are being used as default line size and page size values by the application. They can be modified in the JCL which makes use of the instream procedure.

Wednesday, April 27, 2011

JCL FAQs & Answers Series 01

1. What is primary allocation for a dataset?
The space allocated when the dataset is first created.
Secondary allocation is done when more space is required than what has already been allocated.

2.How many extents are possible for a sequential file ? For a VSAM file ?
16 extents on a volume for a sequential file and 123 for a VSAM file.

3. What does a disposition of (NEW,CATLG,KEEP) mean?
That this is a new dataset and needs to be allocated, to CATLG the dataset if the step is successful and to KEEP but not CATLG the dataset if the step abends. Thus if the step abends, the dataset would not be catalogued and we would need to supply the vol. ser the next time we refer to it.

4. How do you access a file that had a disposition of KEEP?
Need to supply volume serial no. VOL=SER=xxxx.

5. How do you create a temporary dataset? Where will you use them?
Temporary datasets can be created either by not specifying any DSNAME or by specifying the temporary file indicator as in DSN=&&TEMP.
We use them to carry the output of one step to another step in the same job. The dataset will not be retained once the job completes.

6. How do you restart a proc from a particular step?
In job card, specify RESTART=procstep.stepname
where procstep = name of the jcl step that invoked the proc
and stepname = name of the proc step where you want execution to start

7. A PROC has five steps. Step 3 has a condition code. How can you override/nullify this condition code?
Provide the override on the EXEC stmt in the JCL as follows:
//STEP001 EXEC procname,COND.stepname=value
All parameters on an EXEC stmt in the proc such as COND, PARM have to be overridden like this.

8. How do you override a specific DDNAME/SYSIN in PROC from a JCL?
// DSN=...

9. What is NOTCAT 2 ?
This is an MVS message indicating that a duplicate catalog entry exists. E.g., if you already have a dataset with dsn = ‘xxxx.yyyy’ and u try to create one with disp new,catlg, you would get this error. the program open and write would go through and at the end of the step the system would try to put it in the system catalog. at this point since an entry already exists the catlg would fail and give this message. you can fix the problem by deleting/uncataloging the first data set and going to the volume where the new dataset exists(this info is in the msglog of the job) and cataloging it.

10. What is a S0C4 error ?
Storage violation error - can be due to various reasons. e.g.: READING a file that is not open, invalid address referenced due to subscript error.

11. What are SD37, SB37, SE37 abends?
All indicate dataset out of space. SD37 - no secondary allocation was specified. SB37 - end of vol. and no further volumes specified. SE37 - Max. of 16 extents already allocated.

12. What is S322 abend ?
Indicates a time out abend. Your program has taken more CPU time than the default limit for the job class. Could indicate an infinite loop.

13. Why do you want to specify the REGION parameter in a JCL step?
To override the REGION defined at the JOB card level.
REGION specifies the max region size. REGION=0K or 0M or omitting REGION means no limit will be applied.

14. What does the TIME parameter signify ? What does TIME=1440 mean ?
TIME parameter can be used to overcome S322 abends for programs that genuinely need more CPU time. TIME=1440 means no CPU time limit is to be applied to this step.

15. What is COND=EVEN ?
Means execute this step even if any of the previous steps, terminated abnormally.

16. What is COND=ONLY ?
Means execute this step only if any of the previous steps, terminated abnormally.

17. How do you check the syntax of a JCL without running it?
TYPERUN=SCAN on the JOB card or use JSCAN.

18. What does IEBGENER do?
Used to copy one QSAM file to another. Source dataset should be described using SYSUT1 ddname. Destination dataset should be decribed using SYSUT2. IEBGENR can also do some reformatting of data by supplying control cards via SYSIN.

19. How do you send the output of a COBOL program to a member of a PDS?
Code the DSN as pds(member) with a DISP of SHR. The disp applies to the pds and not to a specific member.

20. I have multiple jobs ( JCLs with several JOB cards ) in a member. What happens if I submit it?
Multiple jobs are submitted (as many jobs as the number of JOB cards).

21. I have a COBOL program that ACCEPTs some input data. How do you code the JCL statment for this? ( How do you code instream data in a JCL? )

//SYSIN DD*
input data
input data
/*

22. Can you code instream data in a PROC ?
No.

23. How do you overcome this limitation ?
One way is to code SYSIN DD DUMMY in the PROC, and then override this from the JCL with instream data.

24. How do you run a COBOL batch program from a JCL? How do you run a COBOL/DB2 program?
To run a non DB2 program,

//STEP001 EXEC PGM=MYPROG
To run a DB2 program,
//STEP001 EXEC PGM=IKJEFT01

//SYSTSIN DD *
DSN SYSTEM(....)
RUN PROGRAM(MYPROG)
PLAN(.....) LIB(....) PARMS(...)
/*

25. What is STEPLIB, JOBLIB? What is it used for?
Specifies that the private library (or libraries) specified should be searched before the default system libraries in order to locate a program to be executed.
STEPLIB applies only to the particular step, JOBLIB to all steps in the job.

26. What is order of searching of the libraries in a JCL?
First any private libraries as specified in the STEPLIB or JOBLIB, then the system libraries such as SYS1.LINKLIB. The system libraries are specified in the linklist.

27. What happens if both JOBLIB & STEPLIB is specified ?
JOBLIB is ignored.

28. When you specify mutiple datasets in a JOBLIB or STEPLIB, what factor determines the order?
The library with the largest block size should be the first one.

29. How to change default proclib ?
//ABCD JCLLIB ORDER=(ME.MYPROCLIB,SYS1.PROCLIB)

30. What are the differences between JES2 & JES3 ?
JES3 allocates datasets for all the steps before the job is scheduled. In JES2, allocation of datasets required by a step are done only just before the step executes.

MQ Series : Overview in brief

MQSeries implements a store-and-forward protocol to ensure the safe
delivery of messages between applications.
As with electronic mail, the individual messages that may be part of a
transaction, travel through a network on a store-and-forward basis. If a
link between nodes fails, the message is kept until the link is restored, or
the operator or program redirects the message.
An MQSeries message consists of control information and application data.


Message descriptor :
The control information is defined in a message descriptor structure (MQMD).
MQMD contains such things as:
The type of the message
An identifier for the message
The priority for delivery of the message
If you are asking a question, you may include in the message descriptor, the
name of the queue on which you want to receive the reply.


Queue manager
A queue manager is a system program that provides queuing services to
applications.To an application, each
queue manager is identified by a connection handle (Hconn).

Correlation identifier
To help the requester to associate the message replies with its original request,an application can set a correlation identifier field in the descriptor of each message.Programs should copy the message identifier of the request message into the correlation identifier field of their reply messages.

Request-Reply message Linking
If you want to link your reply message with your request message, there are two options:
You can give your application the responsibility of ensuring that it puts
information into the reply message that relates to the request message.
You can use the report field in the message descriptor of your request
message to specify the content of the MsgId and CorrelId fields of the
reply message.
You can request that either the MsgId or the CorrelId of the original message
is to be copied into the CorrelId field of the reply message (the default
action is to copy MsgId).
You can request that either a new MsgId is generated for the reply message,
or that the MsgId of the original message is to be copied into the MsgId
field of the reply message (the default action is to generate a new message
identifier).

Types of message
There are four types of message defined by MQSeries:
Datagram
Request
Reply
Report
Each type of message is identified by an MQMT_* value.


MsgDeliverySequence and Message Priority
The MsgDeliverySequence attribute of the queue determines whether messages on
the queue are stored in FIFO (first in, first out) sequence, or in FIFO within priority sequence. If this attribute is set to MQMDS_PRIORITY, messages are enqueued with the priority specified in the Priority field of their message descriptors; but if it is set to MQMDS_FIFO, messages are enqueued with the default priority of the queue.

Group identifier
The group identifier is usually generated by the queue manager when the first
message of a group is put onto a queue. The MsgSeqNumber field identifies the position of the message within the group and the Offset field identifies the segments within the message.

Cluster
A cluster is a network of queue managers that are logically associated in some way.
In a traditional MQSeries network using distributed queuing, every queue
manager is independent. If one queue manager needs to send messages to another
it must have defined
a transmission queue,
a channel to the remote queue manager, and
a remote queue definition for every queue to which it wants to send messages.

Client
An MQSeries client is an independently installable component of an MQSeries
product. It allows you to run MQSeries applications, by means of a
communications protocol, to interact with one or more Message Queue Interface
(MQI) servers on other platforms and to connect to their queue managers.

Shared queues
MQSeries allows local queues to be shared by a group of queue
managers, giving improved throughput and availability. Such queues are called
shared queues, and the queue managers form a queue-sharing group, which can
process messages on the same shared queues.

Syncpointing
You can use the syncpointing facilities provided by MQSeries or your operating system to ensure that your data remains consistent with other resources.

Persistence
You can use the persistence feature of MQSeries messages to
assure the delivery of important messages.
The queue manager preserves all persistent messages, recovering them
when necessary from the MQSeries log files, when it is restarted.
Note that messages on shared queues cannot be made persistent.

Synchronous request and reply messages
This implies that you set a timeout period for the reply to answer your request, and if you do not receive the reply within that period, it is treated as an error.

Messages Waiting
A program that is serving a queue can await messages by:
Polling: Making periodic calls on the queue to see whether a message has
arrived.
Waiting until either a message arrives, or a specified time interval expires
Setting a signal so that the program is informed when a message arrives.

Context information
Context information is used for associating messages with the user who generated them, and for identifying the application that generated the message. Such information is useful for security, accounting, auditing, and problem determination.

Message triggering
MQSeries triggering enables a program to be started automatically when messages arrive on a queue.
You can set trigger conditions on a queue so that a program is
started to process that queue:
Every time a message arrives on the queue
When the first message arrives on the queue
When the number of messages on the queue reaches a predefined number

MaxMsgLength
In MQSeries, the MaxMsgLength attribute of the queue manager is fixed
at 100 MB and the MaxMsgLength attribute of the queue defaults to 4 MB
(4 194 304 bytes) which you can amend up to 100 MB if required. However, the limit is 63 KB when using shared queues accessed by queue managers in a queue-sharing group.

Tuesday, April 5, 2011

Ardh Satya : The Existential Crisis

This poetry has been one of my favourites along with the film which I saw
aged 14 then.

Theme poem Ardh Satya by Dilip Chitre (Hindi)

Chakravyuh mein ghusne se pehle,
kaun tha mein aur kaisa tha,
yeh mujhe yaad hi na rahega.
Chakravyuh mein ghusne ke baad,
mere aur chakravyuh ke beech,
sirf ek jaanleva nikat’ta thi,
iska mujhe pata hi na chalega.
Chakravyuh se nikalne ke baad,
main mukt ho jaoon bhale hi,
phir bhi chakravyuh ki rachna mein
farq hi na padega.
Marun ya maarun,
maara jaoon ya jaan se maardun.
iska faisla kabhi na ho paayega.
Soya hua aadmi jab
neend se uthkar chalna shuru karta hai,
tab sapnon ka sansar use,
dobara dikh hi na paayega.
Us roshni mein jo nirnay ki roshni hai
sab kuchh s’maan hoga kya?
Ek palde mein napunsakta,
ek palde mein paurush,
aur theek taraazu ke kaante par
ardh satya.

English translation
Before entering the circle of deceit,
who I was, and what I was,
I would not remember.
After entering the circle of deceit,
(there was) between me and the circle,
only a deathly intimacy
that I never realised.
After leaving the circle of deceit,
even if I am set free,
the design of the circle of deceit,
will hardly be different.
Whether I kill, or die,
Am killed, or kill (the other)
these questions will never be decided.
When a sleeping man
awakes and steps forth,
then the world of dreams
may never be seen again (by him).
In that, the light of Decision,
will everything be level ?
On one tray (of a balance) is Impotence,
and on the other is Manhood,
and exactly at the needle point,
a half-truth.

Sunscreen Wisdom

I go through this wisdom quite often these days.
I find it always ahead of its time.
Here it goes:

Ladies and Gentlemen of the class of ’11
If I could offer you only one tip for the future, sunscreen would be it.
The long term benefits of sunscreen have been proved by scientists
whereas the rest of my advice has no basis more reliable
than my own meandering experience…


I will dispense this advice now.


Enjoy the power and beauty of your youth;

oh nevermind; you will not understand the power and beauty
of your youth until they have faded.
But trust me, in 20 years you’ll look back at photos of yourself
and recall in a way you can’t grasp now how much possibility
lay before you and how fabulous you really looked….

You’re not as fat as you imagine.

Don’t worry about the future; or worry,

but know that worrying is as effective as trying to solve an algebra
equation by chewing bubblegum. The real troubles in your life are
apt to be things that never crossed your worried mind;
the kind that blindside you at 4pm on some idle Tuesday.

Do one thing everyday that scares you

Sing

Don’t be reckless with other people’s hearts, don’t put up with
people who are reckless with yours.

Floss

Don’t waste your time on jealousy;
sometimes you’re ahead, sometimes you’re behind…
the race is long, and in the end, it’s only with
yourself.

Remember the compliments you receive, forget the insults;
if you succeed in doing this, tell me how.


Keep your old love letters, throw away your old bank statements.

Stretch


Don’t feel guilty if you don’t know what you want to do with your life…
the most interesting people I know didn’t know at 22 what they
wanted to do with their lives, some of the most interesting
40 year olds I know still don’t.


Get plenty of calcium.

Be kind to your knees, you’ll miss them when they’re gone.

Maybe you’ll marry, maybe you won’t,
maybe you’ll have children,maybe you won’t,
maybe you’ll divorce at 40, maybe you’ll dance the funky chicken on
your 75th wedding anniversary…

what ever you do, don’t congratulate yourself too much
or berate yourself either – your choices are half chance,
so are everybody else’s.

Enjoy your body,
use it every way you can…don’t be afraid of it,
or what other people think of it, it’s the greatest instrument
you’ll ever own..


Dance…
even if you have nowhere to do it but in your own living room.


Read the directions, even if you don’t follow them.
Do NOT read beauty magazines, they will only make you feel ugly.


Get to know your parents, you never know when they’ll be gone for good.
Be nice to your siblings; they are the best link to your past and the
people most likely to stick with you in the future.


Understand that friends come and go,but for the precious few you
should hold on.

Work hard to bridge the gaps in geography and lifestyle because
the older you get, the more you need the people you
knew when you were young.


Live in New York City once, but leave before it makes you hard;
live in Northern California once, but leave before it makes you soft.


Travel.


Accept certain inalienable truths,
prices will rise,
politicians will philander,
you too will get old,
and when you do you’ll fantasize that when you were young
prices were reasonable,
politicians were noble and
children respected their elders.


Respect your elders.


Don’t expect anyone else to support you. Maybe you have a trust fund,
maybe you have a wealthy spouse; but you never know when either one
might run out.


Don’t mess too much with your hair, or by the time you're 40,
it will look 85.



Be careful whose advice you buy, but, be patient with those who
supply it. Advice is a form of nostalgia, dispensing it is a way of
fishing the past from the disposal, wiping it off, painting over the
ugly parts and recycling it for more than it’s worth.



But trust me on the sunscreen…


< Taken/adapted from Baz Luhrmann's iconic words>