mercredi 20 août 2008

Un ami véritable

Un ami ordinaire ne vous a jamais vu pleurer.
Un véritable ami a eu les épaules humides de vos pleurs.

Un ami ordinaire ne connaît pas le prénom de vos parents.
Un ami véritable a peut-être même leurs numéros de téléphone
dans son carnet d'adresse.

Un ami ordinaire amène une bouteille de vin à votre fête.
Un ami véritable vient avant pour vous donner un coup de main et
après - pour vous aider à ranger.

Un ami ordinaire est contrarié que vous l'appeliez quand il est
déjà au lit.
Un ami véritable vous demande avec inquiétude pourquoi vous n'avez
pas pu l'appeler avant.

Un ami ordinaire aime parler avec vous de vos problèmes.
Un ami véritable aime vous aider à les résoudre.

Un ami ordinaire, lorsqu'il vous rend visite, se comporte en invité.
Un ami véritable ouvre le frigo et se sert.

Un ami ordinaire pense que votre amitié est finie après que vous
vous soyez querellé.
Un ami véritable sait qu'une amitié se trempe dans une querelle
et en ressort plus forte.

Un ami ordinaire s'attend à ce que vous soyez toujours là pour lui.
Un ami véritable est toujours là pour vous.

Un ami véritable ? Celui qui reste à vos côtés lorsque tout le
monde vous a abandonné.


..................................................................

Un ami...



A ime que vous lui disiez ce que vous ressentez
B énit le jour où vous êtes rencontrés
C alme vos craintes
D onne sans attendre en retour
E st toujours prêt à donner un coup de main

F ait une différence dans votre vie
G arde ses amis dans son coeur
H armonise vos pensées quand elles se bousculent
I nvite ses amis à se connaître entre eux
J ubile quand vous réussissez

K laxonne devant pour que vous passiez
L it cette liste et pense à vous
M aximise vos qualités
N e juge jamais
O ffre son support

P arle si on vous cache quelque chose
Q uestionne vos certitudes
R emonte votre moral
S ait dire des choses sympas sur vous
T éléphone juste pour dire "Comment ça va?"

U tilise les mots justes au bon moment
V ous accepte tel que vous êtes
W eek-end ou pas, il ne vous abandonne jamais
X -trêmement indulgent, il pardonne vos erreurs
Y a-Qu'à, il ne connaît pas, il agit
Z éro problème, il vous aime!


................................................................

"Un ami est quelqu'un avec qui je peux être sincère, quelqu'un
devant qui je peux penser tout haut."
Ralph Waldo Emerson

"Alors qu'il marchait à l'aube sur la plage, le vieux vit devant
lui un jeune homme qui ramassait des étoiles de mer et les jetait
à l'eau. Il finit par le rejoindre et lui demanda pourquoi
il agissait ainsi. Le jeune homme lui répondit que les étoiles
de mer mourraient s'il les laissait là jusqu'au lever du soleil.
« Mais la plage s'étend sur des kilomètres et il y a des millions
d'étoiles de mer, répliqua-t-il. Quelle différence cela va-t-il
faire ? » Le jeune homme regarda l'étoile de mer qu'il tenait
dans sa main et la lança dans l'écume. Il répondit : « Cela fera
une différence pour celle-ci. »"
Conseil d'alphabétisation du Minnesota

mardi 15 juillet 2008

Oracle Tip: Create functions to join and split strings in SQL

Takeaway: Learn how to take a comma delimited list of values in a single string and use it as a table of values.
A common task when selecting data from a database is to take a set of values a query returns and format it as a comma delimited list. Another task that's almost as common is the need to do the reverse: Take a comma delimited list of values in a single string and use it as a table of values.

Many scripting languages, such as Perl and Python, provide functions that do this with their own language-specific list of values; so it's surprising that, as of yet, this functionality isn't a standard part of SQL functions. I've seen some pretty ugly looking code that involved complex declarations with MAX and DECODE, but that solution usually only returns a limited set of values. With some of the new Oracle9i and above features, it's possible to do this yourself.
I'd like to use a "join" functionality to specify a query that returns a single column and a delimiter, and then receive a simple string that contains a list of those values separated by my delimiter. The query part can be passed to the function as a REF CURSOR using the new SQL CURSOR function. The delimiter should default to a comma, since that is the most commonly used delimiter. So, the syntax should be:

SQL> select join(cursor(select ename from emp)) from dual;

SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,
JAMES,FORD,MILLER

The following code will perform this function:

create or replace function join
(
p_cursor sys_refcursor,
p_del varchar2 := ','
) return varchar2
is
l_value varchar2(32767);
l_result varchar2(32767);
begin
loop
fetch p_cursor into l_value;
exit when p_cursor%notfound;
if l_result is not null then
l_result := l_result || p_del;
end if;
l_result := l_result || l_value;
end loop;
return l_result;
end join;
/
show errors;

The PL/SQL User's Guide says you always have to declare a package that defines a ref cursor; however, the database already defines this as SYS_REFCURSOR in the STANDARD package. The PL/SQL code should be fairly straightforward. There is a limit of 32,767 characters on the output string and the input column.

Since all datatypes can be automatically converted to character strings, you can use any datatype in the cursor--as long as it's one column. For example:

SQL> select join(cursor(select trunc(hiredate,'month') from emp),'|') from
dual;

01-DEC-80|01-FEB-81|01-FEB-81|01-APR-81|01-SEP-81|01-MAY-81|01-JUN-81|01-APR-87|01-NOV-81|01-SEP-81|01-MAY-87|01-DEC-81|
01-DEC-81|01-JAN-82

There's another extra benefit. Since the cursor is part of the SQL statement, you can easily join the query inside the join with the outer query. Here is a query that returns each table and a list of the columns that make up its primary key:

SQL> select table_name,join(cursor(select column_name from user_cons_columns
where constraint_name = user_constraints.constraint_name
order by position)) columns
from user_constraints where constraint_type = 'P';


View the output in Table A.

You can also use this "join" function to compare two sets of ordered data. For example, the following query will check that an index has been created on a foreign key (which helps prevent locking the table and aids master-detail queries):

column status format a7
column table_name format a30
column columns format a40 word_wrapped

select decode(indexes.table_name,null,'missing','ok') status,
constraints.table_name,
constraints.columns
from
(select table_name,
constraint_name,
join(cursor
(
select column_name
from user_cons_columns
where constraint_name = user_constraints.constraint_name
)) columns
from user_constraints
where constraint_type = 'R'
) constraints,
(select table_name, index_name,
join(cursor
(
select column_name
from user_ind_columns
where index_name = user_indexes.index_name
)) columns
from user_indexes) indexes
where constraints.table_name = indexes.table_name (+)
and constraints.columns = indexes.columns (+);

This query works by executing two subqueries: one that queries foreign keys and another that queries indexes. The join between these two queries is on the table name and the list of columns used in creating the foreign key and the index, taken as an ordered list of values.

We'd also like the reverse functionality: to have the ability to take a single comma-delimited value and treat it as if it were a column in a table. We can take advantage of the TABLE SQL function and PL/SQL function tables to do this quite easily, but first, we must define the result type to be a TABLE type of the largest possible string.

create or replace type split_tbl as table of varchar2(32767);
/
show errors;

create or replace function split
(
p_list varchar2,
p_del varchar2 := ','
) return split_tbl pipelined
is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
AA
l_value varchar2(32767);
begin
loop
l_idx := instr(l_list,p_del);
if l_idx > 0 then
pipe row(substr(l_list,1,l_idx-1));
l_list := substr(l_list,l_idx+length(p_del));

else
pipe row(l_list);
exit;
end if;
end loop;
return;
end split;
/
show errors;

With this function, I can run a query like this:

SQL> select * from table(split('one,two,three'));

one
two
three

The PL/SQL procedure will parse its argument and return each part through a PIPELINE; the TABLE function allows it to be used in the FROM statement, so it appears to SQL as if it is a table with one column and three rows. (Remember that the column being returned is named COLUMN_VALUE if you want to use the value elsewhere.)

Here's an example query, which shows a dynamic IN condition in a query. The split function generates a table of values, which can be used on a row-by-row basis.

SQL> select ename from emp
where to_char(hiredate,'YY')
in (select column_value from table(split('81,82')));

View the output in Table B.

If you want, you can join a column and then split it, too:

SQL> select * from table(split(join(cursor(select ename from emp))));

And, you can use this method to merge sets of values:

create table t(a varchar2(200));
insert into t values('81,82');
insert into t values('84,85');

SQL> select * from table(split(join(cursor(select a from t))));

81
82
84
85

These are just simple example functions. You could extend join to enclose values in quotes and escape quotes inside the values. You could extend split to allow a REF CURSOR parameter instead of a single VARCHAR2, so it could split up sets of columns as well.

TechRepublic's Oracle newsletter covers automating Oracle utilities, generating database alerts, solving directed graph problems, and more. Automatically subscribe today!

Oracle Pipelined Table Functions

Zurück
Oracle Pipelined Table Functions

Overview

Basically, when you would like a PLSQL (or java or c) routine to be the «source»
of data -- instead of a table -- you would use a pipelined function.

PIPELINED functions will operate like a table.

A PL/SQL function may be used in a data warehouse database to transform large amounts of data. This might also involve massaging the data in a series of transformations, each performed by different functions. Prior to Oracle Database 9, large transformations required either significant memory overhead, or storing the data in intermediate tables between each stage of the transformation. The loading process caused immense performance degradations in both cases.

Using PL/SQL table functions can significantly lower the over-head of doing such transformations. PL/SQL table functions accept and return multiple rows, delivering them as they are ready rather than all at once, and can be made to execute as parallel operations.

Simple Example - Generating Some Random Data

How could you create six unique random numbers between 1 and 49 with one SQL statement?

We would generate the set of numbers to pick from (see the innermost query that follows); any table with 49 or more records would do it. First the quick-and-dirty solution without a pipelined function.

select r
from (select r
from (select rownum r
from all_objects
where rownum < 50)
order by dbms_random.value)
where rownum <= 6;

R
----------
10
2
19
34
12
21

That query works by generating the numbers 1 .. 49, using the inline view. We wrap that innermost query as an inline view and sort it by a random value, using DBMS_RANDOM.VALUE. We wrap that result set in yet another inline view and just take the first six rows. If we run that query over and over, we'll get a different set of six rows each time.

This sort of question comes up frequently—maybe not about how to generate a set of six random numbers but rather, "how can we get N rows?" For example, we'd like the inclusive set of all dates between 25-FEB-2004 and 10-MAR-2004. The question becomes how to do this without a "real" table, and the answer lies in Oracle9i/10g with its PIPELINED function capability. We can write a PL/SQL function that will operate like a table. We need to start with a SQL collection type; this describes what the PIPELINED function will return. In this case, we are choosing a table of numbers; the virtual table we are creating will simply return the numbers 1, 2, 3, ... N:

create type array
as table of number
/

Type created.

Next, we create the actual PIPELINED function. This function will accept an input to limit the number of rows returned. If no input is provided, this function will just keep generating rows for a very long time (so be careful and make sure to use ROWNUM or some other limit in the query itself!). The PIPELINED keyword on line 4 allows this function to work as if it were a table:

create function
gen_numbers(n in number default null)
return array
PIPELINED
as
begin
for i in 1 .. nvl(n,999999999)
loop
pipe row(i);
end loop;
return;
end;
/

Function created.

Suppose we needed three rows for something. We can now do that in one of two ways:

select * from TABLE(gen_numbers(3));

COLUMN_VALUE
------------
1
2
3

or

select * from TABLE(gen_numbers)
where rownum <= 3;

COLUMN_VALUE
------------
1
2
3

Now we are ready to re-answer the original question, using the following functionality:

select *
from (
select *
from (select * from table(gen_numbers(49)))
order by dbms_random.random
)
where rownum <= 6
/

COLUMN_VALUE
------------
47
42
40
15
48
23

We can use this virtual table functionality for many things, such as generating that range of dates:

select to_date('25-feb-2004')+
column_value-1
from TABLE(gen_numbers(15))
/

TO_DATE('
---------
25-FEB-04
26-FEB-04
27-FEB-04
28-FEB-04
29-FEB-04
01-MAR-04
02-MAR-04
03-MAR-04
04-MAR-04
05-MAR-04
06-MAR-04
07-MAR-04
08-MAR-04
09-MAR-04
10-MAR-04

Note the name of the column we used: COLUMN_VALUE. That is the default name for the column coming back from the PIPELINED function.

Typical Pipelined Example

This are the typical steps to perform when using PL/SQL Table Functions:

* The producer function must use the PIPELINED keyword in its declaration.

* The producer function must use an OUT parameter that is a record, corresponding to a row in the result set.

* Once each output record is completed, it is sent to the consumer function through the use of the PIPE ROW keyword.

* The producer function must end with a RETURN statement that does not specify any return value.

* The consumer function or SQL statement then must use the TABLE keyword to treat the resulting rows from the PIPELINE function like a regular table.

The first step is to define the format of the rows that are going to be returned. In this case here, we're going to return a INT, DATE followed by a VARCHAR2(25).

CREATE OR REPLACE TYPE myObjectFormat
AS OBJECT
(
A INT,
B DATE,
C VARCHAR2(25)
)
/

Next a collection type for the type previously defined must be created.

CREATE OR REPLACE TYPE myTableType
AS TABLE OF myObjectFormat
/

Finally, the producer function is packaged in a package. It is a pipelined function as indicated by the keyword pipelined.

CREATE OR REPLACE PACKAGE myDemoPack
AS
FUNCTION prodFunc RETURN myTableType PIPELINED;
END;
/

CREATE OR REPLACE PACKAGE BODY myDemoPack AS
FUNCTION prodFunc RETURN myTableType PIPELINED IS
BEGIN
FOR i in 1 .. 5
LOOP
PIPE ROW (myObjectFormat(i,SYSDATE+i,'Row '||i));
END LOOP;
RETURN;
END;
END;
/

Test It:

ALTER SESSION SET NLS_DATE_FORMAT='dd.mm.yyyy';
SELECT * FROM TABLE(myDemoPack.prodFunc());

A B C
---------- ---------- ---------
1 31.05.2004 Row 1
2 01.06.2004 Row 2
3 02.06.2004 Row 3
4 03.06.2004 Row 4
5 04.06.2004 Row 5

Conclusion

Pipelined functions are useful if there is a need for a data source other than a table in a select statement.

vendredi 4 juillet 2008

Les 3 Portes de la Sagesse

Un Roi avait pour fils unique un jeune Prince
courageux, habile et intelligent. Pour parfaire
son apprentissage de la Vie, il l'envoya auprès
d'un Vieux Sage.

"Eclaire-moi sur le Sentier de la Vie", demanda
le Prince.

"Mes paroles s'évanouiront comme les traces
de tes pas dans le sable, répondit le Sage. Cependant
je veux bien te donner quelques indications. Sur ta
route, tu trouveras 3 portes. Lis les préceptes
indiqués sur chacune d'entre elles. Un besoin
irrésistible te poussera à les suivre. Ne cherche
pas à t'en détourner, car tu serais condamné à
revivre sans cesse ce que tu aurais fui. Je ne puis
t'en dire plus. Tu dois éprouver tout cela dans
ton coeur et dans ta chair. Va, maintenant. Suis
cette route, droit devant toi."

Le Vieux Sage disparut et le Prince s'engagea
sur le Chemin de la Vie.

Il se trouva bientôt face à une grande porte sur
laquelle on pouvait lire "CHANGE LE MONDE".

"C'était bien là mon intention, pensa le Prince,
car si certaines choses me plaisent dans ce monde,
d'autres ne me conviennent pas." Et il entama son
premier combat. Son idéal, sa fougue et sa vigueur
le poussèrent à se confronter au monde, à entreprendre,
à conquérir, à modeler la réalité selon son désir.
Il y trouva le plaisir et l'ivresse du conquérant,
mais pas l'apaisement du coeur. Il réussit à changer
certaines choses mais beaucoup d'autres lui résistèrent.
Bien des années passèrent.

Un jour il rencontra le Vieux Sage qui lui demande :
"Qu'as-tu appris sur le chemin ?" "J'ai appris,
répondit le Prince, à discerner ce qui est en mon
pouvoir et ce qui m'échappe, ce qui dépend de moi
et ce qui n'en dépend pas". "C'est bien, dit le
Vieil Homme. Utilise tes forces pour agir sur ce
qui est en ton pouvoir. Oublie ce qui échappe à
ton emprise." Et il disparut.

Peu après, le Prince se trouva face à une seconde
porte. On pouvait y lire "CHANGE LES AUTRES".
"C'était bien là mon intention, pensa-t-il.
Les autres sont source de plaisir, de joie et
de satisfaction mais aussi de douleur, d'amertume
et de frustration." Et il s'insurgea contre tout
ce qui pouvait le déranger ou lui déplaire chez
ses semblables. Il chercha à infléchir leur
caractère et à extirper leurs défauts.
Ce fut là son deuxième combat.
Bien des années passèrent.

Un jour, alors qu'il méditait sur l'utilité
de ses tentatives de changer les autres, il croisa
le Vieux Sage qui lui demanda : "Qu'as-tu appris
sur le chemin ?" "J'ai appris, répondit le Prince,
que les autres ne sont pas la cause ou la source
de mes joies et de mes peines, de mes satisfactions
et de mes déboires. Ils n'en sont que le
révélateur ou l'occasion. C'est en moi que
prennent racine toutes ces choses." "Tu as raison,
dit le Sage. Par ce qu'ils réveillent en toi,
les autres te révèlent à toi-même. Soit
reconnaissant envers ceux qui font vibrer en
toi joie et plaisir. Mais sois-le aussi envers
ceux qui font naître en toi souffrance ou
frustration, car à travers eux la Vie t'enseigne
ce qui te reste à apprendre et le chemin que tu
dois encore parcourir." Et le Vieil Homme disparut.

Peu après, le Prince arriva devant une porte
où figuraient ces mots "CHANGE-TOI TOI-MEME".
"Si je suis moi-même la cause de mes problèmes,
c'est bien ce qui me reste à faire," se dit-il.
Et il entama son 3ème combat. Il chercha
à infléchir son caractère, à combattre ses
imperfections, à supprimer ses défauts, à changer
tout ce qui ne lui plaisait pas en lui, tout
ce qui ne correspondait pas à son idéal.
Après bien des années de ce combat où il connut
quelque succès mais aussi des échecs et des
résistances, le Prince rencontra le Sage qui lui
demanda :

Qu'as-tu appris sur le chemin ?"

"J'ai appris, répondit le Prince, qu'il y a en
nous des choses qu'on peut améliorer, d'autres
qui nous résistent et qu'on n'arrive pas à
briser."

"C'est bien," dit le Sage.

"Oui, poursuivit le Prince, mais je commence à
être las de ma battre contre tout, contre tous,
contre moi-même. Cela ne finira-t-il jamais ?
Quand trouverai-je le repos ? J'ai envie de
cesser le combat, de renoncer, de tout abandonner,
de lâcher prise." "C'est justement ton prochain
apprentissage, dit le Vieux Sage. Mais avant
d'aller plus loin, retourne-toi et contemple
le chemin parcouru." Et il disparut.

Regardant en arrière, le Prince vit dans le
lointain la 3ème porte et s'aperçut qu'elle
portait sur sa face arrière une inscription qui disait

"ACCEPTE-TOI TOI-MEME."

Le Prince s'étonna de ne point avoir vu cette
inscription lorsqu'il avait franchi la porte la
première fois, dans l'autre sens. "Quand on combat
on devient aveugle, se dit-il." Il vit aussi,
gisant sur le sol, éparpillé autour de lui,
tout ce qu'il avait rejeté et combattu en lui :
ses défauts, ses ombres, ses peurs, ses limites,
tous ses vieux démons. Il apprit alors à les
reconnaître, à les accepter, à les aimer.
Il apprit à s'aimer lui-même sans plus se comparer,
se juger, se blâmer.
Il rencontra le Vieux Sage qui lui demanda :

"Qu'as-tu appris sur le chemin ?"

"J'ai appris, répondit le Prince, que détester
ou refuser une partie de moi, c'est me condamner
à ne jamais être en accord avec moi-même.
J'ai appris à m'accepter moi-même, totalement,
inconditionnellement."

"C'est bien, dit le Vieil Homme, c'est la première
Sagesse. Maintenant tu peux repasser la 3ème
porte."

A peine arrivé de l'autre côté, le Prince
aperçut au loin la face arrière de la seconde
porte et y lut

"ACCEPTE LES AUTRES".

Tout autour de lui il reconnut les personnes
qu'il avait côtoyées dans sa vie ; celles qu'il
avait aimées comme celles qu'il avait détestées.
Celles qu'il avait soutenues et celles qu'il avait
combattues. Mais à sa grande surprise, il était
maintenant incapable de voir leurs imperfections,
leurs défauts, ce qui autrefois l'avait tellement
gêné et contre quoi il s'était battu.

Il rencontra à nouveau le Vieux Sage. "Qu'as-tu
appris sur le chemin ?" demanda ce dernier.
J'ai appris, répondit le Prince, qu'en étant en
accord avec moi-même, je n'avais plus rien à
reprocher aux autres, plus rien à craindre d'eux.
J'ai appris à accepter et à aimer les autres
totalement, inconditionnellement." "C'est bien,"
dit le Vieux Sage. C'est la seconde Sagesse.
Tu peux franchir à nouveau la deuxième porte.

Arrivé de l'autre côté, le Prince aperçut la
face arrière de la première porte et y lut

"ACCEPTE LE MONDE".

Curieux, se dit-il, que je n'aie pas vu cette
inscription la première fois. Il regarda autour
de lui et reconnut ce monde qu'il avait cherché à
conquérir, à transformer, à changer. Il fut frappé
par l'éclat et la beauté de toute chose. Par leur
perfection. C'était pourtant le même monde
qu'autrefois. Etait-ce le monde qui avait changé
ou son regard ?
Il croisa le Vieux Sage qui lui demanda.

"Qu'as-tu appris sur le chemin ?"

"J'ai appris, dit le Prince, que le monde
est le miroir de mon âme. Que mon âme ne voit
pas le monde, elle se voit dans le monde.
Quand elle est enjouée, le monde lui semble gai.
Quand elle est accablée, le monde lui semble
triste. Le monde, lui, n'est ni triste ni gai.
Il est là ; il existe ; c'est tout. Ce n'était
pas le monde qui me troublait, mais l'idée que
je m'en faisais. J'ai appris à accepter sans
le juger, totalement, inconditionnellement."

C'est la 3ème Sagesse, dit le Vieil Homme.
Te voilà à présent en accord avec toi-même, avec
les autres et avec le Monde." Un profond sentiment
de paix, de sérénité, de plénitude envahit le
Prince. Le Silence l'habita. "Tu es prêt,
maintenant, à franchir le dernier Seuil, dit
le Vieux Sage, celui du passage du silence de
la plénitude à la Plénitude du Silence".

Et le Vieil Homme disparut.


(Texte proposé par Françoise Laurent)

Qui peut dire si vous avez de la chance ou non ?

Il y avait, dans un village, un homme très pauvre qui avait un
très beau cheval. Le cheval était si beau que les seigneurs du chateau
voulaient le lui acheter, mais il refusait toujours.

"Pour moi ce cheval n'est pas un animal, c'est un ami. Comment
voulez-vous vendre un ami ?" demandait-il.

Un matin, il se rend à l'étable et le cheval n'est plus là.

Tous les villageois lui disent : "On te l'avait bien dit ! Tu
aurais mieux de le vendre. Maintenant, on te l'a volé... quel
malchance !"

Le vieil homme répond "Chance, malchance, qui peut le dire ?"

Tout le monde se moque de lui. Mais 15 jours plus tard, le cheval
revient, avec tout une horde de chevaux sauvages. Il s'était échappé,
avait séduit une belle jument et rentrait avec le reste de la horde.

"Quelle chance !" disent les villageois.

Le vieil homme et son fils se mettent au dressage des chevaux
sauvages. Mais une semaine plus tard, son fils se casse une jambe à
l'entraînement.

"Quelle malchance !" disent ses amis. "Comment vas-tu faire, toi
qui est déjà si pauvre, si ton fils, ton seul support, ne peut
plus t'aider !"

Le vieil homme répond "Chance, malchance, qui peut le dire ?"

Quelques temps plus tard, l'armée du seigneur du pays arrive
dans le village, et enrôle de force tous les jeunes gens disponibles.

Tous... sauf le fils du vieil homme, qui a sa jambe cassée.

"Quelle chance tu as, tous nos enfants sont partis à la guerre, et toi
tu es le seul à garder avec toi ton fils. Les nôtres vont peut-être se
faire tuer..."

Le vieil homme répond "Chance, malchance, qui peut le dire ?"


Le futur nous est livré par fragments. Nous ne savons jamais ce
qu'il nous réserve. Mais une expectation positive permanente nous
ouvre les portes de la chance, de la créativité, et nous rend
plus heureux.


--------------------------------------------------------------

"Souvenez-vous que le bonheur dépend non pas de ce que vous êtes
ou de ce que vous possédez, mais uniquement de votre façon de penser."
Dale Carnegie

jeudi 5 juin 2008

lundi 26 mai 2008

la fête des mères

Le 25 mai, c'est la fête des mères : une journée pour mettre ma Maman à l'honneur et la remercier d'être là, tout simplement.

vendredi 23 mai 2008

صلوات في هيكل الحب - لأبي القاسم الشابي



عذبةٌ أنتِ كالطفولة كالأحلام كاللحنِ كالصباحِ الجديدِ
كالسماء الضحوكِ كالليلةِ القمراءِ كالوردِ كابتسامِ الوليدِ
يا لها من وداعـةٍ وجَمالٍ وشبابٍ منعّمٍ أملودِ
يا لَهَا من طهارةٍ تبعثُ التقديسَ في مهجة الشقيّ العنيد

يا لها من رقّةٍ تكاد يرفّ الوردُ منها في الصخرة الجلمود
أيّ شيء تراك هل أنت فينيس تَهادت بين الورى من جديد
لتعيد الشبابَ والفرحَ المعسـولَ للعالَمِ التعيس العميـد
أم ملاك الفردوس جاء إلى الأرضِ ليحيي روح السلام العهيد

أنتِ .. ما أنتِ ؟ رسمٌ جَميلٌ عبقريٌّ من فنّ هذا الوجود
فيك ما فيه من غموضٍ وعمقٍ وجمالٍ مقدّسٍ معبود
أنتِ ما أنتِ؟ أنت فجرٌ من السحر تَجلّى لقلبِي المعمود
فأراه الحياةَ في مونق الحُسن وجلّى له خفايا الخلود

أنت روح الربيع تختال في الدنيا فتهتز رائعاتُ الورود
تهب الحياة سكرى من العطر ويدوّي الوجود بالتغريد
كلما أبصرتك عيناي تَمشين بخطو موقّع كالنشيد
خفق القلبُ للحياة ورفّ الزهرُ في حقل عمري الْمجرود

وانتشت روحي الكئيبة بالحبّ وغنّت كالبلبلِ الغرّيد
أنت تحيين في فؤادي ما قد مات في أمسي السعيد الفقيد
وتشيدين في خرائب روحي ما تلاشى في عهدي الْمجدود
من طموحٍ إلى الجمالِ إلى الفنِّ إلى ذلك الفضاءِ البعيد

وتبثين رقّة الأشواق والأحلام والشدو والهوى في نشيدي
بعد أن عانقت كآبة أيامي فؤادي وألْجمت تغريدي
أنت أنشودة الأناشيد غنّاك إلهُ الغناء ربّ القصيد
فيك شبّ الشباب وشّحَهُ السحرُ وشدو الهوى وعطر الورود

وتبثين رقّة الأشواق والأحلام والشدو والهوى في نشيدي
بعد أن عانقت كآبة أيامي فؤادي وألجمت تغريدي
أنت أنشودة الأناشيد غنّاك إلهُ الغناء ربّ القصيد
فيك شبّ الشباب وشّحَهُ السحرُ وشدو الهوى وعطر الورود

وقوام يكاد ينطق بالألحان في كل وقفة وقعود
كل شيء موقع فيك حتى لفتة الجيد واهتزاز النهود
أنت..أنت الحياة في قدسها السامي وفي سحرها الشجيّ الفريد
أنت.. أنت الحياة في رقة الفجرِ وفي رونق الربيع الوليد

أنت .. أنت الحياة كل أوان في رواء من الشباب جديد
أنت.. أنت الحياة فيكِ وفي عينيك آيات سحرها الممدود
أنت دنيا الأناشيد والأحلام والسحر والخيال المديد
أنت فوق الخيال والشعر والفن وفوق النهى وفوق الحدود

أنت قدسي ومعبدي وصباحي وربيعي ونشوتي وخلودي
يا ابنة النور إنني أنا وحدي من رأى فيك روعك المعبود
فدعيني أعيش في ظلك العذب وفي قرب حُسنك المشهود
عيشة للجمال والفن والإلهام والطهر والسنَى والسجود

عيشة الناسك البتول يناجي الرب في نشوة الذهول الشديد
وامنحيني السلام والفرح الروحي يا ضوء فجري المنشود
وارحميني فقد تَهدمت في كون من اليأس والظلام مشيد
أنقذيني من الأسى فلقد أمسيت لا أستطيع حَمل وجودي

في شعب الزمان والموت أمشي تحت عبء الحياة جم القيود
وأماشي الورى ونفسي كالقبر وقلبي كالعالم المهدود
ظلمة ما لَها ختام وهول شائع في سكونِها الممدود
وإذا ما استخفى عبث الناس تبسمت في أسى وجُمود

بسمة مرة كأني أستلّ من الشوك ذابلات الورود
وانفخي في مشاعري مرح الدنيا وشدّي من عزمي المجهود
وابعثي في دمي الحرارة علّي أتغنى مع المنَى من جديد
وأبثّ الوجود أنغام قلب بلبليّ مكبلٍ بالحديد

فالصباح الجميل ينعش بالدفء حياة المحطم المكدود
أنقذيني فقد سئمت ظلامي أنقذيني فقد مللت ركودي
آه يا زهرتي الجميلة لو تدرين ما جدّ في فؤادي الموحود
في فؤادي الغريب تُخلق أكوانٌ من السحر ذات حسن فريد

وشُمُوس وضاءة ونجوم تنثر النـور في فضاء مديد
وربيع كأنه حلم الشاعر في سكرة الشباب السعيد
ورياض لا تعرف الحلك الداجي ولا ثورة الخريف العتيد
وطيـور سحرية تتناغى بأناشيد حلـوة التغريد

وقصور كأنها الشفق المخضوب أو طلعة الصباح الوليد
وغيوم رقيقة تتهادى كأباديد من نُثـار الورود
وحياة شعرية هي عندي صورة من حياة أهل الخلود
كل هذا يشيده سحر عينيك وإلهام حسنك المعبود

وحرام عليك أن تهدمي ما شاده الحسن في الفؤاد العميد
وحرام عليك أن تسحقي آمال نفس تصبو لعيش رغيد
منك ترجو سعادة لم تجدها في حياة الورى وسحر الوجود
فالإله العظيم لا يرجم العبد إذا كان في جلال السجود

2la la5dher


mardi 20 mai 2008

Pensez-y à deux fois

Une vielle légende indienne raconte qu'un brave trouva un jour un oeuf d'aigle et le déposa dans le nid d'une « poule de prairie ». L'aiglon vit le jour au milieu d'une portée de poussins de prairie et grandit avec eux. Toute sa vie l'aigle fit ce qu'une poule de prairie fait normalement. Il chercha dans la terre des insectes et de la nourriture. Il caqueta de la même façon qu'une poule de prairie. Et lorsqu'il volait, c'était dans un nuage de plumes et sur quelques mètres à peine. Après tout, c'est ainsi que les poules de prairie sont censées voler. Les années passèrent. Et l'aigle devint très vieux. Un jour, il vit un oiseau magnifique planer dans un ciel sans nuage. S'élevant avec grâce, il profitait des courants ascendants, faisant à peine bouger ses magnifiques ailes dorées. "Quel oiseau splendide !" dit notre aigle à ses voisins. "Qu'est-ce que c'est ?" "C'est un Aigle, le roi des oiseaux," cacqueta sa voisine. "Mais il ne sert à rien d'y penser à deux fois. Tu ne sera jamais un aigle." Ainsi l'aigle n'y pensa jamais à deux fois. Il mourut en pensant qu'il était une poule de prairie. Vous est-il arrivé de penser, que vous étiez une poule de prairie ? Pensez-y à deux fois... Avec mes sentiments amicaux,