|
Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com |
php-general-digest-help
lists.php.net
Date: Thu Apr 24 2008 - 21:06:12 CDT
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
php-general Digest 25 Apr 2008 02:06:12 -0000 Issue 5423
Topics (messages 273531 through 273551):
Re: the most amazing php code i have ever seen so far
273531 by: Eric Butera
273534 by: paragasu
273535 by: tedd
273536 by: paragasu
273537 by: Eric Butera
273538 by: Jason Pruim
273546 by: Shawn McKenzie
273547 by: Shawn McKenzie
273548 by: Nathan Nobbe
Re: how to use passthru ()
273532 by: David Giragosian
273533 by: J. Manuel Velasco - UBILIBET
273539 by: Eric Butera
273540 by: David Giragosian
French character string encoding
273541 by: Angelo Zanetti
273542 by: Per Jessen
273543 by: Angelo Zanetti
273545 by: Per Jessen
Re: php framework vs just php?
273544 by: Jay Blanchard
mbstring vs iconv - Any existing benchmark?
273549 by: Yannick Warnier
open_basedir restriction in effect
273550 by: Richard Kurth
273551 by: Yannick Warnier
Administrivia:
To subscribe to the digest, e-mail:
php-general-digest-subscribe
lists.php.net
To unsubscribe from the digest, e-mail:
php-general-digest-unsubscribe
lists.php.net
To post to the list, e-mail:
php-general
lists.php.net
----------------------------------------------------------------------
attached mail follows:
On Wed, Apr 23, 2008 at 3:14 PM, paragasu <paragasu
gmail.com> wrote:
> Personally, i vote for www.eyeos.org project for the best php code. Anyone
> know better?
>
You want to see something cool?
http://stubbles.net/browser/trunk/src/main/php/net/stubbles/events
I don't actually use that specific code because I don't want that base
object/serializable stuff. I wrote something very similar that allows
me to pre-define a mapping of classes that bind to events. So when an
event is fired, it will search to see if any classes have been
registered to handle it. Then it will lazy load them and handle the
event. This allows me to define a ton of classes for events and there
isn't any overhead other than one array.
That is pretty powerful to me.
attached mail follows:
On Thu, Apr 24, 2008 at 9:50 PM, Eric Butera <eric.butera
gmail.com> wrote:
> On Wed, Apr 23, 2008 at 3:14 PM, paragasu <paragasu
gmail.com> wrote:
> > Personally, i vote for www.eyeos.org project for the best php code.
> Anyone
> > know better?
> >
>
> You want to see something cool?
>
> http://stubbles.net/browser/trunk/src/main/php/net/stubbles/events
>
> I don't actually use that specific code because I don't want that base
> object/serializable stuff. I wrote something very similar that allows
> me to pre-define a mapping of classes that bind to events. So when an
> event is fired, it will search to see if any classes have been
> registered to handle it. Then it will lazy load them and handle the
> event. This allows me to define a ton of classes for events and there
> isn't any overhead other than one array.
>
> That is pretty powerful to me.
>
wow.. this is the response i expected to see for all php expert programmer.
honestly, i don't know yet how it works. But, it seem so interesting to me.
do you have any live project making use of this one?
attached mail follows:
The most amazing code I have ever seen?
That's easy -- just about anything that Stut, Rob or Daniel provides.
I have a whole library of their routines. Good stuff!
Cheers,
tedd
PS: And no, don't ask for it.
--
-------
http://sperling.com http://ancientstones.com http://earthstones.com
attached mail follows:
On Thu, Apr 24, 2008 at 10:31 PM, tedd <tedd.sperling
gmail.com> wrote:
> The most amazing code I have ever seen?
>
> That's easy -- just about anything that Stut, Rob or Daniel provides.
>
> I have a whole library of their routines. Good stuff!
>
> Cheers,
>
> tedd
>
>
can you please give a link? i wan't to keep one too :)
attached mail follows:
On Thu, Apr 24, 2008 at 10:19 AM, paragasu <paragasu
gmail.com> wrote:
> wow.. this is the response i expected to see for all php expert programmer.
> honestly, i don't know yet how it works. But, it seem so interesting to me.
> do you have any live project making use of this one?
I can't show you the code because I wrote it on company time therefore
I don't own it.
A very generalized example.
Register events:
$events = array(
array('event'=>'onSave', 'class'=>'localEvents', 'method'=>'handleOnSave')
);
$dispatcher = namespace_registry::get('dispatcher');
$dispatcher->lazyRegister($events);
Sample save page:
$record = new record;
$record->name = 'Eric Butera'
$isSuccess = $record->save();
$dispatcher->trigger('onSave', $record, array('isSuccess'=>$isSuccess));
Upon firing, the dispatcher would check to see if any lazy registrants
exist for the onSave event. If some exist, then it will then use the
configured settings to somehow load & call the defined class/method
and inject it with an event notification object.
Sample event handler:
class localEvents {
public function handleOnSave(namespace_Event $event) {
echo "An onsave event is being handled, triggered in subject
class ". get_class($event->getSubject()) ."\n";
$info = $event->getInfo();
if ($info['isSuccess'] === true) {
// do something else!
}
}
}
Why is this useful? Because you can add functionality to your save
page without touching it. This is very powerful when you have a
shared code base and need to add some parts to it without breaking
other sites. Since it is expected that events will be registered it
is okay to rely on this functionality always being there rather than
the internals of your app changing and creating nightmares.
attached mail follows:
On Apr 24, 2008, at 10:38 AM, paragasu wrote:
> On Thu, Apr 24, 2008 at 10:31 PM, tedd <tedd.sperling
gmail.com>
> wrote:
>
>> The most amazing code I have ever seen?
>>
>> That's easy -- just about anything that Stut, Rob or Daniel provides.
>>
>> I have a whole library of their routines. Good stuff!
>>
>> Cheers,
>>
>> tedd
>>
>>
> can you please give a link? i wan't to keep one too :)
Search the archives :)
--
Jason Pruim
Raoset Inc.
Technology Manager
MQC Specialist
3251 132nd ave
Holland, MI, 49424-9337
www.raoset.com
japruim
raoset.com
attached mail follows:
paragasu wrote:
> i have seen many php code. i learn php on my own, and during early days with
> php,
> i download many open source php project and try to learn the coding on my
> own.
> i did see many code (ugly, spaghetti code etc). Some even take me few
> hours to figure out
> how it works.
>
> But one project using php in a very clean way. The codeis look so simple.
> yet do so much thing.
> Personally, i vote for www.eyeos.org project for the best php code. Anyone
> know better?
>
Here is the amazing part, sweeeeeet:
/*
____ _____
/ __ \ / ____|
___ _ _ ___| | | | (___
/ _ \ | | |/ _ \ | | |\___ \
| __/ |_| | __/ |__| |____) |
\___|\__, |\___|\____/|_____/
__/ |
|___/ 1.5
Web Operating System
eyeOS.org
eyeOS Engineering Team - eyeOS.org/whoarewe
eyeOS is released under the GNU Affero General Public License
Version 3 (AGPL3)
provided with this release in license.txt
or via web at gnu.org/licenses/agpl-3.0.txt
Copyright 2005-2008 eyeOS Team (team
eyeos.org)
*/
attached mail follows:
paragasu wrote:
> i have seen many php code. i learn php on my own, and during early days with
> php,
> i download many open source php project and try to learn the coding on my
> own.
> i did see many code (ugly, spaghetti code etc). Some even take me few
> hours to figure out
> how it works.
>
> But one project using php in a very clean way. The codeis look so simple.
> yet do so much thing.
> Personally, i vote for www.eyeos.org project for the best php code. Anyone
> know better?
>
First thing, after the sweeeet header comment that I saw was this:
call_user_func('lib_eyeString_start');
I thought, why wouldn't you just do this:
lib_eyeString_start();
Or maybe I'm missing something. call_user_func() only seems to be
useful if you have a variable function name that could be different for
any call of the call_user_func():
call_user_func($funcNameAssignedEarlier);
But still, this would be the same yes?
$funcNameAssignedEarlier();
-Shawn
attached mail follows:
On Thu, Apr 24, 2008 at 1:22 PM, Shawn McKenzie <nospam
mckenzies.net>
wrote:
> paragasu wrote:
>
>> i have seen many php code. i learn php on my own, and during early days
>> with
>> php,
>> i download many open source php project and try to learn the coding on my
>> own.
>> i did see many code (ugly, spaghetti code etc). Some even take me few
>> hours to figure out
>> how it works.
>>
>> But one project using php in a very clean way. The codeis look so simple.
>> yet do so much thing.
>> Personally, i vote for www.eyeos.org project for the best php code.
>> Anyone
>> know better?
>>
>>
> First thing, after the sweeeet header comment that I saw was this:
>
> call_user_func('lib_eyeString_start');
>
> I thought, why wouldn't you just do this:
>
> lib_eyeString_start();
>
> Or maybe I'm missing something. call_user_func() only seems to be useful
> if you have a variable function name that could be different for any call of
> the call_user_func():
>
> call_user_func($funcNameAssignedEarlier);
>
> But still, this would be the same yes?
>
> $funcNameAssignedEarlier();
i think your assessment is valid. variable functions are great, there is
less overhead. the benefit of call_user_func() is that it accepts the php
psuedo type 'callback' which allows client code to determine what 'type' of
function is used; a global function, a class instance function, or a class
static function. in this case cycles are being thrown down the drain for
nothing :O
-nathan
attached mail follows:
On 4/24/08, M. Sokolewicz <tularis
php.net> wrote:
> J. Manuel Velasco - UBILIBET wrote:
> > Hello,
> >
> > I have two perl scripts that runs fine in the shell. But when I build a
> page with them, only in one case the results are shown in the other case i
> see a blank page.
> >
> > I have done different test and I don't understand this issue. I don't know
> what i am doing wrong.
> >
> > Follows the link to the code:
> > EURID script: http://pastebin.com/m3d6cbffe
> > ESNIC script: http://pastebin.com/m40755f40
> > PAGINA: http://pastebin.com/m5f8e1043
> >
> > Thanks in advance to help me with this.
> >
>
>
> So you're basically asking for help with your perl scripts on a PHP-only
> mailinglist?! Well... flame away...
>
> - Tul
The subject line "suggests" he's trying to call a perl script from
within a PHP page.
Maybe something in here will be of help:
http://www.google.com/search?sourceid=gmail&q=passthru%20perl%20function
David
attached mail follows:
No friend,
I said, the perl scripts work fine. The problem is to show the result in
the site.
One of them the result is shown and in the other one, not.
What is strange to me is that both scripts are almost the same, only
changes the query, in one case is to Eurid and the other case is to
Eurid. But I repeat, execute the scripts from command line show the
right result in both cases.
So I was asking if I was doing something wrong that i couldn't see in my
passthru() function use.
Please, read, think and them if you can say something to help, do it. In
this case you just make grow your EGO.
M. Sokolewicz escribió:
> J. Manuel Velasco - UBILIBET wrote:
>> Hello,
>>
>> I have two perl scripts that runs fine in the shell. But when I build
>> a page with them, only in one case the results are shown in the other
>> case i see a blank page.
>>
>> I have done different test and I don't understand this issue. I don't
>> know what i am doing wrong.
>>
>> Follows the link to the code:
>> EURID script: http://pastebin.com/m3d6cbffe
>> ESNIC script: http://pastebin.com/m40755f40
>> PAGINA: http://pastebin.com/m5f8e1043
>>
>> Thanks in advance to help me with this.
>
>
> So you're basically asking for help with your perl scripts on a
> PHP-only mailinglist?! Well... flame away...
>
> - Tul
>
--
attached mail follows:
On Thu, Apr 24, 2008 at 9:14 AM, J. Manuel Velasco - UBILIBET
<tech
ubilibet.com> wrote:
>
> No friend,
>
> I said, the perl scripts work fine. The problem is to show the result in
> the site.
>
> One of them the result is shown and in the other one, not.
>
> What is strange to me is that both scripts are almost the same, only
> changes the query, in one case is to Eurid and the other case is to Eurid.
> But I repeat, execute the scripts from command line show the right result in
> both cases.
>
> So I was asking if I was doing something wrong that i couldn't see in my
> passthru() function use.
>
> Please, read, think and them if you can say something to help, do it. In
> this case you just make grow your EGO.
>
> M. Sokolewicz escribió:
> J. Manuel Velasco - UBILIBET wrote:
>
> Hello,
>
> I have two perl scripts that runs fine in the shell. But when I build a
> page with them, only in one case the results are shown in the other case i
> see a blank page.
>
> I have done different test and I don't understand this issue. I don't know
> what i am doing wrong.
>
> Follows the link to the code:
> EURID script: http://pastebin.com/m3d6cbffe
> ESNIC script: http://pastebin.com/m40755f40
> PAGINA: http://pastebin.com/m5f8e1043
>
> Thanks in advance to help me with this.
>
>
> So you're basically asking for help with your perl scripts on a PHP-only
> mailinglist?! Well... flame away...
>
> - Tul
>
>
>
> --
>
Could be something to do with your ENV setup. When you run passthru
it is going to play with Apache's rules (big assumption there). I
know that I've had scripts in the past have weird issues between what
environment variables existed where. It's also going to be running as
a different user, maybe that has something to do with it also?
attached mail follows:
On 4/24/08, Eric Butera <eric.butera
gmail.com> wrote:
> On Thu, Apr 24, 2008 at 9:14 AM, J. Manuel Velasco - UBILIBET
> <tech
ubilibet.com> wrote:
> >
> > No friend,
> >
> > I said, the perl scripts work fine. The problem is to show the result in
> > the site.
> >
> > One of them the result is shown and in the other one, not.
> >
> > What is strange to me is that both scripts are almost the same, only
> > changes the query, in one case is to Eurid and the other case is to Eurid.
> > But I repeat, execute the scripts from command line show the right result in
> > both cases.
> >
> > So I was asking if I was doing something wrong that i couldn't see in my
> > passthru() function use.
> >
> > Please, read, think and them if you can say something to help, do it. In
> > this case you just make grow your EGO.
> >
> > M. Sokolewicz escribió:
> > J. Manuel Velasco - UBILIBET wrote:
> >
> > Hello,
> >
> > I have two perl scripts that runs fine in the shell. But when I build a
> > page with them, only in one case the results are shown in the other case i
> > see a blank page.
> >
> > I have done different test and I don't understand this issue. I don't know
> > what i am doing wrong.
> >
> > Follows the link to the code:
> > EURID script: http://pastebin.com/m3d6cbffe
> > ESNIC script: http://pastebin.com/m40755f40
> > PAGINA: http://pastebin.com/m5f8e1043
> >
> > Thanks in advance to help me with this.
> >
> >
> > So you're basically asking for help with your perl scripts on a PHP-only
> > mailinglist?! Well... flame away...
> >
> > - Tul
> >
> >
> >
> > --
> >
>
> Could be something to do with your ENV setup.
>It's also going to be running as
> a different user, maybe that has something to do with it also?
Maybe add the second parameter to the passthru call to catch the
return status of the call to the perl script. If it fails because it
is running as 'nobody', you should have some feedback in there.
David
attached mail follows:
Hi all,
If I have the following French character : �
And I want to display it properly, IE: how it is meant to be displayed as
the proper french character, which encoding do I need to use?
Or is there a string function which can convert this to the correct
character?
Thanks in advance.
Angelo Zanetti
Application Developer
________________________________
:
Telephone: +27 (021) 552 9799
Mobile: +27 (0) 72 441 3355
Fax: +27 (0) 86 681 5885
Web: http://www.elemental.co.za
attached mail follows:
Angelo Zanetti wrote:
> Hi all,
>
> If I have the following French character : �
>
> And I want to display it properly, IE: how it is meant to be displayed
> as the proper french character, which encoding do I need to use?
>
> Or is there a string function which can convert this to the correct
> character?
Your � didn't display properly at all - I tried ISO-8859-1 and
UTF8.
/Per Jessen, Zürich
attached mail follows:
-----Original Message-----
From: Per Jessen [mailto:per
computer.org]
Sent: 24 April 2008 18:26
To: php-general
lists.php.net
Subject: Re: [PHP] French character string encoding
Angelo Zanetti wrote:
> Hi all,
>
> If I have the following French character : �
>
> And I want to display it properly, IE: how it is meant to be displayed
> as the proper french character, which encoding do I need to use?
>
> Or is there a string function which can convert this to the correct
> character?
Your � didn't display properly at all - I tried ISO-8859-1 and
UTF8.
/Per Jessen, Zürich
Hi Per that’s the problem I am having, this is how data from a project I
inherited is saved in the DB and I cant get it to show.
However I get normal data eg: ème est très haute. To show if its saved like
that in the DB, I just do:
echo utf8_encode("ème est très haute.");
and it works well. Is there anyway you think I can get the data in the DB to
format correctly perhaps using some sort of string command?
Thanks for your help again.
attached mail follows:
Angelo Zanetti wrote:
> Your � didn't display properly at all - I tried ISO-8859-1 and
> UTF8.
>
> /Per Jessen, Zürich
>
>
> Hi Per thatÂ’s the problem I am having, this is how data from a project
> I inherited is saved in the DB and I cant get it to show.
Hi Angelo
what's the charset of your database table? Do e.g. "SHOW CREATE TABLE
xxxxx" in mysql to see what the table is stored as.
> However I get normal data eg: ème est très haute. To show if its saved
> like that in the DB, I just do:
>
> echo utf8_encode("ème est très haute.");
OK, all of that came through fine in ISO-8859-1 as quoted-printable.
And yes, if you to put that in a UTF-8 page, utf8_encode() would be the
right thing.
> and it works well. Is there anyway you think I can get the data in the
> DB to format correctly perhaps using some sort of string command?
Find out what charset the database is stored in - if it's ISO-8859-1 or
a close relative (which I suspect), you need to either serve your pages
as ISO-8859-1 or convert to UTF-8 using e.g. utf8_encode() and serve
the pages as UTF-8.
Have you got a sample I can look at? (feel free to send me URLs
off-line).
/Per Jessen, Zürich
attached mail follows:
[snip]
...laugh...
[/snip]
I did a quick and dirty of just one of those functions. This function
takes a table and creates a form based on the table. It needs quite a
bit of refining, but I am willing to share and let you guys and gals
throw suggestions;
function formCreate($database, $table, $action, $excludeCols,
$recordID){
/*
* This function is used to create forms on the fly based on
tables within
* the database. The minimal arguments are database name and
table name.
* Additional arguements may be supplied to indicate columns to
be excluded
* from form and an action (CRUD) to be performed once the form
* is filled out. If wanting to do an update, read or delete you
can specify
* a record to retrieve to populate the form. Default values
will be provided
* for arguements not included.
*/
/* database connection in global variable */
global $dc;
/* number of arguements sent to function */
$numArgs = func_num_args();
/* test to make sure that you have the minial two arguements */
if(2 > $numArgs){
/* not enough arguments */
$errMsg = "not enough arguements supplied, please supply
database and table name";
return($errMsg);
} else {
/*
* Supply default values for optional arguements if they
are not set.
* An interesting note here: the action can be anything
that the user
* specifies, it is not strictly limited to CRUD and it
will be output
* in a hidden form field;
* <input type="hidden" name="action" value="whatever
action is called">
* That way when the user clicks 'Submit' the programmer
can have a
* switch action in his or her processing script to
handle this form.
*/
if(!isset($action)) { $action = 'read'; }
if(!isset($recordID)) { $recordID = ''; }
if(!isset($excludeCols)){
$excludeCols = '';
} else {
/* create an array of excluded columns */
$arrExcludeCols = explode(",", $excludeCols);
}
/* describe the table */
$sqlDesc = "DESCRIBE `".$database."`.`".$table."` ";
if(!($dbInfo = mysql_query($sqlDesc, $dc))){
return mysql_error();
} else {
while($tableInfo = mysql_fetch_array($dbInfo)){
/*
* regular expression - we need the data
that exists between the
* parentheses in the Type column of the
database being described
* so that we can use for length values
of form fields
*/
if(!(in_array($tableInfo['Field'],
$arrExcludeCols))){
if(preg_match (
"/\((\d{1,}.*?)\)/", $tableInfo[1], $regs )){
/* handle numerical
values in parentheses to create form element lengths */
echo
"<label>".$tableInfo['Field']."</label>";
echo "<input
type=\"text\" name=\"".$tableInfo['Field']."\" size=\"".$regs[1]."\"
maxlength=\"".$regs[1]."\"><br />\n";
} elseif("text" ==
$tableInfo[1]) {
/* handle text columns
*/
echo
"<label>".$tableInfo['Field']."</label>";
echo "<textarea
name=\"".$tableInfo['Field']."\" cols=\"80\" rows=\"10\"></textarea><br
/>\n";
} elseif("enum" ==
substr($tableInfo[1], 0, 4)){
/* handle enumerated
columns and creat drop downs */
echo
"<label>".$tableInfo['Field']."</label> ";
/*
* regular expression -
we need the data that
* exists between the
single quotes in the Type column of the
* database being
described so that we can use for option
* values in a drop-down
on the form
*/
preg_match_all(
"/'(.*)'/U", $tableInfo[1], $matches);
echo "<select
name=\"".$tableInfo['Field']."\">\n";
echo
"<option></option>\n";
for($i = 0; $i <
count($matches[1]); $i++){
echo
"<option>".$matches[1][$i]."</option>\n";
}
echo "</select><br
/>\n";
}//end if preg
}//end if in_array
}//end while tableInfo
/* set up the hidden action field */
echo "<input type=\"hidden\" name=\"action\"
value=\"".$action."\">\n";
/* provide a submit and reset button */
echo "<input type=\"submit\" name=\"submit\"
value=\"Submit\"> ";
echo "<input type=\"reset\" name=\"reset\"
value=\"Clear\"><br />\n";
return;
}// end if dbInfo
}// end if numArgs
}//end function formCreate
With this I need one function call to create the form on the page. I can
exclude columns and set an action to be taken once the form is filled
out.
There are several other functions and what I end up with is a set of
functions that do make up a form handling framework. This can also be
done in the context of OOP, I just want to show some procedural code.
This assumes MySQL as the database.
attached mail follows:
Hi all,
Out of curiosity, I'm trying to find information about how well mbstring
and iconv behave and possibly a comparison between the two.
The basic functions offered by both extensions seem to be providing
*about* the same features, and I read a ppt presentation from Carlos
Hoyos [1] just saying this:
"
PHP supports multi byte in two extensions: iconv and mbstring
* iconv uses an external library (supports more encodings but less
portable)
* mbstring has the library bundled with PHP (less encodings but more
portable)
"
Is this really all there is to having two extensions providing character
encoding features?
Is there any kind of strong difference in efficiency?
Information is pretty difficult to find on the topic (and judging by
hits on my blog, my article is about the only quick and easy to find
reference to such comparison, so I'd like to extend that).
I also hear that Zend framework is mostly heading in the iconv
direction. What about what's included in PHP6? (ok, I can do that last
bit of research by myself).
It's out of curiosity, so not urgent, but I'd like to be sure I do the
right choice next time around.
Thanks,
Yannick
[1]
http://www.nyphp.org/content/presentations/smallworld/April2006-nyphp-Presentation.ppt
attached mail follows:
*I keep getting this warning when I try run my script that I what to
look at the data in the mailbox for bounced email
Warning*: opendir() [function.opendir
<http://easycontactpro.com/function.opendir>]: open_basedir restriction
in effect.
File(/var/qmail/mailnames/easycontactpro.com/bounce/Maildir/new) is not
within the allowed path(s):
(/var/www/vhosts/easycontactpro.com/httpdocs:/tmp)
I have set open_basedir
="/var/qmail/mailnames/easycontactpro.com/bounce/Maildir/new" in the
php.ini file and restarted apache.
How can I look at the files in this directory
attached mail follows:
Le jeudi 24 avril 2008 à 15:35 -0700, Richard Kurth a écrit :
> *I keep getting this warning when I try run my script that I what to
> look at the data in the mailbox for bounced email
>
> Warning*: opendir() [function.opendir
> <http://easycontactpro.com/function.opendir>]: open_basedir restriction
> in effect.
> File(/var/qmail/mailnames/easycontactpro.com/bounce/Maildir/new) is not
> within the allowed path(s):
> (/var/www/vhosts/easycontactpro.com/httpdocs:/tmp)
>
>
> I have set open_basedir
> ="/var/qmail/mailnames/easycontactpro.com/bounce/Maildir/new" in the
> php.ini file and restarted apache.
>
> How can I look at the files in this directory
Hi Richard,
Any chance you would have a virtual host configuration or some part of
your scripts that redefine the open_basedir?
I would put some logging in the middle with ini_get('open_basedir'); and
see if it changes sometime between the first line of your script and the
location where the error above appears.
Yannick
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]