  The media could not get enough of the randy pseudo-scandal atmosphere they themselves had created. But the American viewer did not get to see any of the sex: 65 seconds worth of "graphic content" - this wonderful neutral term for anything inappropriate - was hid from view by digitally added human figurines. Kubrick himself, who had died four days after completing the movie, could not be asked for his opnion anymore. Still, the alterations appear to have taken place with his consent. He knew, no doubt, that depicting so-called penetration scenes would irrevocably earn the movie the much dreaded NC-17 rating.
Unfortunately, Kubrick's compromise did not have the desired effect. Thanks to the hullabaloo - Roger Ebert, too, said he couldn't approve of the changes - and also thanks to the many interviews with "Hollywood's hottest couple", Cruise and Kidman, about the ins and outs of extramarital sex, sex in front of a camera, sex for sex's sake, etc., the general public was slowly, but surely, prejudiced into thinking that Kubrick must have been a semi- or even a full blown director of pornography. The irony is that this observation is less distant from the truth than one would think. For years, Kubrick was attracted by the thought of making a porn movie under studio conditions and Terry Southern, co-scenarist of Dr. Strangelove who also signed for the script of Blue Movie, almost persuaded Kubrick at that time into directing this porn classic. And indeed, why not? Kubrick's own Lolita and A Clockwork Orange show that sex was not an alien theme in his world. Besides, there is no conceivable reason why Kubrick, who tried so many different genres in his small oeuvre, would shrink from pornography (or what then would be his version of it).
Considering this variety of genres, one wonders what the common factor of Kubrick's works might be, that is to say, the core, that which necessarily comes out in each expression. To do justice to his movies, one cannot view them as mere contributions to the respective genres. The Shining is a 'horror movie', like Barry Lyndon is a 'costume movie' and Full Metal Jacket is a 'Vietnam movie', but before all of this, they are made by Stanley Kubrick. At best, what could be said is that this variety of his work shows that he was conscious of the fact that there are innumerable alternatives to any approach to reality. The question of what motivated Kubrick is all the more interesting since his personality seems to be almost completely untraceable in his movies. That is why biographers and psychologists find themselves disappointed when they try to assign that personality in order to locate the center of his art. This is not, of course, because he would not have a personality, but because the driving force in his movies is so strong that it seems that they are governed from a great distance. Therefore, in order to enter his realm, one needs to look for certain characteristics in style and recurring images - less obscure, surely, than a number, 114, that must have been of particular importance, but less common, too, than the cliche of the genius who never left his house.
Kubrick made his first film, Fear and Desire, with money that he had hustled as a chessplayer in Greenwich Village. His passion for chess has never left him and this is something that can be clearly told from his movies. The perspective with which Kubrick looks at reality is that of a chessplayer: strategic, distanced and with a surplus of cognitive ability and rationality. It is a view on the world that disregards the personal, the 'human-all-too-human'. This indeed romanticized him with an unapproachable and legendary aura, but his psychological structure simply had to bring along this preoccupation with what is 'great' - not because it could not degenerate into paranoia or absolutism, but because 'greatness' is the perspective with which chessplayers look at the world. Not by chance, the chessplayer shares this outlook with both generals and filmdirectors, as can be told from the panoramic battlefield of Spartacus, Paths of Glory and Full metal Jacket. Not as panoramic, but blown up, nonetheless, to the very extreme are such typical Kubrickian settings as the immense 'War Room' in Dr. Strangelove, the colossal hotel in The Shining and, finally, space itself in 2001: A Space Odyssey. Of course, the more the consequences of this perspective inflate reality, the nearer the border is drawn to a moment where either nothing is possible or everything turns into its opposite. Kubrick reached this moment rather early in his career, in a film that in its long title expresses the outcome of this process: Dr. Strangelove, or How I Learned to Stop Worrying and Love the Bomb. A nightmare comedy with a nuclear apocolyps as its final solution: it seems as though Kubrick went straight through reality here, even when he could not preserve his seriousness. Still, the humor in this movie is not the result of a concealing or extenuating approach, but, rather, of the absolute urgency with which Kubrick posed the question of the future of man and atomic bomb. After all, one cannot expect to preserve oneself, or even one's seriousness when one attempts to pursue a movement of thought that leads to catastrophe. Kubrick used Peter Sellers as his alter ego, but immediately dispersed into three through him (the Group Captain Mandrake, President Muffley and Dr. Strangelove; originally also the cowboy who at the end personally delivers the bomb to the Ruski's). This is how he tried to outsmart reality, by surrounding it from all sides and assailing it with alternatives. More balanced and, indeed, more poetic, Kubrick repeated this process six years later in 2001: A Space Odyssey, where he 'went through reality' once more, this time by having astronaut Dave Bowman break through the barrier of space and time ("Beyond the infinite") and have him witness his own rebirth as "Star Child".
Realities such as these, taken to the extreme consequence, were the result of a logic that Kubrick could only give form and shape to if and when he attained complete and full control over his films. Outside influences on his work were to be kept at the lowest possible level. This did not only apply to human interfering, but also to reality itself, which he rebuilt in his studio. To Kubrick this was the only way to design a world according to his own insights.  In contrast - but not in contradiction - to the fending off of other peoples' interfering with his movies, Kubrick attached high value to mankind in a world that, since the Enlightenment of Barry Lyndon's 18th century, had more and more come to reflect his own chessplayer's mind: rational, logical and, as an extension of that, technical and scientific. Nothing fascinated Kubrick so much as the fatal disparity between the ever progressing technological achievements on the one hand and the lagging spiritual developments of mankind on the other. This is the reason why Kubrick's people (mostly men; women, who emphasize feeling, play secondary roles) try to find access to a system (often their own creation) that is founded on logic and rationality. But in order to gain access they need to surrender their control over themselves. As soon as that happens the system turns itself against them and expels them, after which they are left to wander meaninglessly through a labyrinth-type surrounding, where they find that the only thing they can rely on is, after all, that same fragile humanity.
One early depiction of such a labyrinth can be found in the endless trenches of Paths of Glory. They are the mad creation of a system that cynically claims its own men, who have given up the authority over themselves. Another labyrinth is on board the spaceship of 2001: A Space Odyssey, where the astronauts do their workouts in paths that have no beginning, ending or even direction, and where the HAL 9000-computer finally and fatally takes command. In The Shining we find the opposite mechanism at work: the gigantic hotel, with its endless hallways, chambers and enormous spaces does not expel Jack Torrance (Jack Nicholson) but gains power over him and reduces him to a mere function of its morbid jokes. Perhaps this is the reason why the labyrinth got its most literal expression in this movie: not only outside, in the snow, but inside too, in the hallways where the little boy drives his tricycle in endless rounds and blood from ages past comes flooding in. There is another figure in which Kubrick depicted his appreciation of the human: that of the machine-man. The most literal example of that creation is, of course, the HAL-9000 computer in 2001: A Space Odyssey But there is Dr. Strangelove, too, who is not able to control his arm and Alex Burgess in A Clockwork Orange, who has his impulses programmed into him. In Full Metal Jacket, soldiers are trained to become killing machines. They expel the fat boy Gomer Pyle from their midst, an event that is mirrored in the second half of the movie by Pyle's antipode, the North-Vietnamese female sniper, who singlehandedly takes up the task of expelling the Americans from her country. Finally, in A.I. (Artificial Intelligence), the project that Kubrick had been working on since 1977 but that he left unfinished, again the subject was a machine-man: a robot in the guise of a little boy, who, against a background of ultramodern high tech, desires to become human.
Going from this machine-man to Eyes Wide Shut seems to be quite a leap, since the human factor would supposedly be visible au naturel here. But what is better suited for depicting the loss of humanity than the moment where love and eroticism transfer into mechanically experienced sex? After a party at a friend's house, where Alice Harford (Nicole Kidman) is seduced by one of the guests, she confesses to her husband Bill (Tom Cruise) that several years before she had an encounter with a naval officer during which she was willing to give up "everything": him, their marriage, their 7 year old daughter, herself. Additionally, she tells him about a dream that she had in which she went to bed with "hundreds" of men. Bill becomes so upset by this that he leaves the house, not so much with the plan to commit adultery, as to find out which powers are at work here. His wandering expedition leads him through a series of women, each of whom is willing to give herself to him, although this never actually takes place. It all results in the visual highpoint of the movie: a closed gathering with a Freemasonry character in a Kubrickian country house (huge rooms, hallways, staircases) where masked men and women indulge in sex. It is here that Harford is exposed as an intruder and where both the motive of the system versus the human, as well as the subsequent expulsion become actual. And so, Bill and Alice relate inversely proportional to eachother: what Alice experiences in her dream is what Bill unsuccessfully tries to copy in reality. But considering the title and the corresponding title of Arthur Schnitzler Traumnovelle ("Dream novella") on which Kubrick based the script, one wonders whether or not what Bill experienced is real at all. Perhaps Bill's quest was nothing but a dreamt initiationrite1 with the purpose of renewing him and making him see that Alice is not only related to him through sexual ties. Their reconciliation in the end, while doing Christmas shopping with their daughter, indicates that despite Kubrick's passing away there might still be hope for mankind. It is a conclusion to which the already classic final word of the movie - Alice's four letter invitation to Bill - seems to follow up on very nicely.
Rutger H Cornets de Groot http://sites.netscape.net/cornets/film/ews.htm E-mail with comments to<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


Carrier Demo
This is a Cordova application that uses my fancy new Carrier plugin.


Call of Duty is a first-person shooter video game franchise published by Activision. Starting out in 2003, it first focused on games set in World War II. However, over time, the series has seen games set in modern times, the midst of the Cold War, futuristic worlds, and outer space. The games were first developed by Infinity Ward, then also by Treyarch and Sledgehammer Games. Several spin-off and handheld games were made by other developers. The most recent title, Call of Duty: Modern Warfare, was released on October 25, 2019. The series originally focused on the World War II setting, with Infinity Ward developing the first (2003) and second (2005) titles in the series and Treyarch developing the third (2006). Call of Duty 4: Modern Warfare (2007) introduced a new, modern setting, and proved to be the breakthrough title for the series, creating the Modern Warfare sub-series. The game's legacy also influenced the creation of a remastered version, released in 2016.
Two other entries, Modern Warfare 2 (2009) and 3 (2011), were made. The sub-series received a soft-reboot with Modern Warfare in 2019. Infinity Ward have also developed two games outside of the Modern Warfare sub-series, Ghosts (2013) and Infinite Warfare (2016). Treyarch made one last World War II-based game, World at War (2008), before releasing Black Ops (2010) and subsequently creating the Black Ops sub-series. Three other entries, Black Ops II (2012), III (2015), and 4 (2018), were made. Sledgehammer Games, who were co-developers for Modern Warfare 3, have also developed two titles, Advanced Warfare (2014) and WWII (2017). As of February 2016, the series has sold over 250 million copies. Sales of all Call of Duty games topped US$15 billion.[1] Other products in the franchise include a line of action figures designed by Plan B Toys, a card game created by Upper Deck Company, Mega Bloks sets by Mega Brands, and a comic book miniseries published by WildStorm Productions.
Call of Duty is a first-person shooter video game based on id Tech 3, and was released on October 29, 2003. The game was developed by Infinity Ward and published by Activision. Read More
Modern Warfare is a sub-series of the Call of Duty franchise from Activision. Modern Warfare was created by Infinity Ward, and currently consists of four games, Call of Duty 4: Modern Warfare, Call of Duty: Modern Warfare 2, Call of Duty: Modern Warfare 3, and Call of Duty: Modern Warfare. Read More
On August 17, 1942, Marine Private C. Miller watches the torture, beating, and execution of two fellow Marines by Japanese soldiers. Before he is assaulted, a Marine squad led by Corporal Roebuck and Sergeant Sullivan rescue him as part of their assault on the island. Read More
When it comes to the Call of Duty frst person shooter game, Media of other kind (films, animations and merchandise) is usually involved to bring in an element of interest to the audience hence it ensures the satisfaction of it's clients. Read More


Frank de Jonge
Freelance Developer
Flysystem
A pragmatic event sourcing library for PHP with a focus on developer experience.
Learning EventSourcing
is pretty hard.
Learning EventSourcing
is pretty hard
and takes time.
EventSourcing is
built on a number
of techniques.
EventSourcing is
not hard, but it
is complex.
The individual parts
don't make a lot
of sense.
Talk is cheap, show me some code.
Event Aggregate Root Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
$credit = 100;
$purchase = 80;
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = 60;
$purchase = 80;
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = 80;
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = amount_from_request();
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = amount_from_request();
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = amount_from_request();
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = amount_from_request();
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
$credit = fetch_credit();
echo "Credit is $credit\n";
$purchase = amount_from_request();
if ($credit >= $purchase) {
$credit -= $purchase;
echo "Purchase of $purchase is OK!";
} else {
echo "Purchase of $purchase has failed.";
}
class PersonalBudget {
private $credit;
public function __construct(int $credit) {
$this->credit = $credit;
}
public function spend(int $amount): bool {
if ($amount > $this->credit) return false;
$this->credit -= $amount;
return true;
}
}
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = PersonalBudget::find($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$personalBudget->save();
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Event
a representation of a historical fact; something that happened in the past.
Event
a value-object; an object that represents a value
class PurchaseWasMade
{
private $amount;
public function __construct(int $amount) {
$this->amount = $amount;
}
public function amount(): int {
return $this->amount;
}
}
class PurchaseWasMade
{
// ...
public function toPayload(): array {
return ['amount' => $this->amount];
}
public static function fromPayload(array $payload) {
return new static($payload['amount']);
}
}
$event1 = new PurchaseWasMade(150);
$payload = $event1->toPayload();
$event2 = PurchaseWasMade::fromPayload($payload);
var_dump('same', $event1 === $event2);
var_dump('equal', $event1 == $event2);
Aggregate Root
a whole formed by combining several separate elements
Aggregate Root
the entry point for our model
class PersonalBudget
{
private $budget = 0;
public function __construct(AggregateRootId $id)
{
$this->id = $id;
}
}
class PersonalBudget
{
// ...
public function increaseBudget(int $amount)
{
$this->budget += $amount;
}
}
class PersonalBudget
{
// ...
public function increaseBudget(int $amount)
{
$this->recordThat(new BudgetWasIncreased($amount));
}
}
class PersonalBudget
{
// ...
protected function recordThat(object $event)
{
$this->apply($event);
$this->recordedEvents[] = $event;
}
}
class PersonalBudget
{
// ...
protected function apply(object $event)
{
$parts = explode('\\', get_class($event));
$this->{'apply' . end($parts)}($event);
}
}
class PersonalBudget
{
// ...
protected function applyBudgetWasIncreased(
BudgetWasIncreased $event
) {
$this->budget += $event->amount();
}
}
class PersonalBudget
{
public function spend(int $amount)
{
if ($this->budget >= $amount) {
$this->budget -= $amount;
return true;
} else {
return false;
}
}
}
class PersonalBudget
{
public function spend(int $amount)
{
if ($this->budget >= $amount) {
$this->recordThat(new PurchaseWasMade($amount));
return true;
} else {
return false;
}
}
}
class PersonalBudget
{
public function spend(int $amount)
{
if ($this->budget >= $amount) {
$this->recordThat(new PurchaseWasMade($amount));
return true;
} else {
$this->recordThat(new BudgetWasInsufficient($amount));
return false;
}
}
}
class PersonalBudget
{
protected function applyPurchaseWasMade(
PurchaseWasMade $event
) {
$this->budget -= $event->amount();
}
// ...
}
$personalBudget->increaseBudget(50);
$personalBudget->increaseBudget(100);
$personalBudget->spend(75);
// Can I spend 10 now?
var_dump($personalBudget->spend(10));
$personalBudget->increaseBudget(50);
$personalBudget->increaseBudget(100);
$personalBudget->spend(75);
// Can I spend 100 now?
var_dump($personalBudget->spend(100));
new BudgetWasIncreased(50);
new BudgetWasIncreased(100);
new PurchaseWasMade(75);
// Can I spend 100 now?
new BudgetWasInsufficient(100);
class PersonalBudget
{
protected function recordThat(object $event)
{
$this->apply($event);
$this->recordedEvents[] = $event;
}
}
class PersonalBudget
{
protected function recordThat(object $event)
{
$this->apply($event);
$this->recordedEvents[] = $event;
}
public function releaseEvents(): array
{
$releasedEvents = $this->recordedEvents;
$this->recordedEvents = [];
return $releasedEvents;
}
}
Aggregate Root Repository
is responsible for storing recorded events and reconstituting aggregates
interface AggregateRootRepository
{
public function persist(object $aggregateRoot);
public function retrieve(AggregateRootId id): object;
}
class AggregateRootRepository
{
public function persist(AggregateRoot $aggregate)
{
$events = $aggregate->releaseEvents();
$aggregateRootId = $aggregate->aggregateRootId();
$headers = [Header::AGGREGATE_ROOT_ID => $aggregateRootId];
$messages = array_map(function (object $event) use ($headers) {
return new Message($event, $headers);
}, $events);
$this->messages->persist(...$messages);
$this->dispatcher->dispatch(...$messages);
}
}
class AggregateRootRepository
{
public function persist(AggregateRoot $aggregate)
{
$events = $aggregate->releaseEvents();
$aggregateRootId = $aggregate->aggregateRootId();
$headers = [Header::AGGREGATE_ROOT_ID => $aggregateRootId];
$messages = array_map(function (object $event) use ($headers) {
return new Message($event, $headers);
}, $events);
$this->messages->persist(...$messages);
$this->dispatcher->dispatch(...$messages);
}
}
class AggregateRootRepository
{
public function persist(AggregateRoot $aggregate)
{
$events = $aggregate->releaseEvents();
$aggregateRootId = $aggregate->aggregateRootId();
$headers = [Header::AGGREGATE_ROOT_ID => $aggregateRootId];
$messages = array_map(function (object $event) use ($headers) {
return new Message($event, $headers);
}, $events);
$this->messages->persist(...$messages);
$this->dispatcher->dispatch(...$messages);
}
}
class AggregateRootRepository
{
public function persist(AggregateRoot $aggregate)
{
$events = $aggregate->releaseEvents();
$aggregateRootId = $aggregate->aggregateRootId();
$headers = [Header::AGGREGATE_ROOT_ID => $aggregateRootId];
$messages = array_map(function (object $event) use ($headers) {
return new Message($event, $headers);
}, $events);
$this->messages->persist(...$messages);
$this->dispatcher->dispatch(...$messages);
}
}
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Message
a wrapper for an event containing additional metadata (aggregate id, event type, etc)
class Message
{
/** @var object */
private $event;
/** @var array */
private $headers = [];
public function __construct(object $event, array $headers = [])
{
$this->event = $event;
$this->headers = $headers;
}
// ...
}
interface MessageRepository
{
public function persist(Message ...$messages);
public function retrieveAll(AggregateRootId $id): Generator;
}
CREATE TABLE domain_messages (
event_id VARCHAR(36) NOT NULL,
event_type VARCHAR(100) NOT NULL,
aggregate_root_id VARCHAR(36) NULL,
time_of_recording DATETIME(6) NOT NULL,
payload JSON NOT NULL,
INDEX aggregate_root_id (aggregate_root_id),
INDEX time_of_recording (time_of_recording)
)
{
"header" {
"aggregate_root_id": "4d975448-d12b-4a2e-bea4-13efd557bd6e",
"event_type": "some_company.namespace.purchase_was_made"
},
"payload": {
"amount": 80
}
}
{
"header" {
"aggregate_root_id": "4d975448-d12b-4a2e-bea4-13efd557bd6e",
"event_type": "some_company.namespace.purchase_was_made"
},
"payload": {
"amount": 80
}
}
{
"header" {
"aggregate_root_id": "4d975448-d12b-4a2e-bea4-13efd557bd6e",
"event_type": "some_company.namespace.purchase_was_made"
},
"payload": {
"amount": 80
}
}
{
"header" {
"aggregate_root_id": "4d975448-d12b-4a2e-bea4-13efd557bd6e",
"event_type": "some_company.namespace.purchase_was_made"
},
"payload": {
"amount": 80
}
}
interface MessageDispatcher
{
public function dispatch(Message ...$messages);
}
class SynchronousMessageDispatcher implements MessageDispatcher
{
private $consumers;
public function __construct(Consumer ...$consumers)
{
$this->consumers = $consumers;
}
public function dispatch(Message ...$messages)
{
foreach ($messages as $message) {
foreach ($this->consumers as $consumer) {
$consumer->handle($message);
}
}
}
}
✅ No extra infrastructure
✅ Good enough (?)
❌ No retry mechanisms
❌ No horizontal scaling
❌ No easy rebuilds
❌ Extra infrastructure
❌ More complex setup
✅ Retry mechanisms
✅ Horizontal scaling
✅ Rebuilds possible
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Event Aggregate (Root) Aggregate Root Repository Message Message Repository Message Dispatcher Consumer(s) Projection(s) Read Model(s) Process Manager(s)
Consumer
something that reacts to events
interface Consumer
{
public function handle(Message $message);
}
Projection
something that uses event data to create a read-model (view)
Read Model
a view of the event data optimized for reading
class MostSpentList implements Consumer
{
public function handle(Message $message)
{
$event = $message->event();
if ($event instanceof PurchaseWasMade) {
$this->spentPerUser->increase(
$message->aggregateRootId(),
$event->amount()
);
}
}
}
class HighestPurchasePerMonth implements Consumer
{
public function handle(Message $message)
{
$event = $message->event();
if ($event instanceof PurchaseWasMade) {
$period = substr(
$message->header(Header::TIME_OF_RECORDING), 0, 7
); // 2019-01
$currentHighest = $this->purchases->highest($period);
if ($currentHighest < $event->amount()) {
$this->purchases->updateHighest(
$period, $event->amount()
);
}
}
}
}
❌ No automatic view
❌ Separate setup required
✅ Views are independent
✅ Use far simpler views
✅ Use any type of DB
$personalBudget = new PersonalBudget($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
Reconstitution
the action of building something up again
class AggregateRootRepository
{
public function __construct(
string $aggregateRootClassName,
MessageRepository $messageRepository
) {
$this->aggregateRootClassName = $aggregateRootClassName;
$this->messages = $messageRepository;
}
}
class AggregateRootRepository
{
public function retrieve(AggregateRootId $id): object
{
$className = $this->aggregateRootClassName;
return $className::reconstituteFromEvents(
$id,
$this->retrieveAllEvents($id)
);
}
}
class AggregateRootRepository
{
private function retrieveAllEvents(AggregateRootId $id): Generator
{
$messages = $this->messages->retrieveAll($id);
/** @var Message $message */
foreach ($messages as $message) {
yield $message->event();
}
}
}
SELECT *
FROM `domain_messages`
WHERE `aggregate_id` = :aggregate_id
ORDER BY `time_of_recording` ASC
class PersonalBudget
{
public static function reconstituteFromEvents(
Identifier $id,
Generator $events
): PersonalBudget
{
$budget = new static($id);
foreach ($events as $event) $budget->apply($event);
return $budget;
}
}
class PersonalBudget
{
public static function reconstituteFromEvents(
Identifier $id,
Generator $events
): PersonalBudget
{
$budget = new static($id);
foreach ($events as $event) $budget->apply($event);
return $budget;
}
}
A reconstituted aggregate is ready to make a decision.
$personalBudget = $repository->retrieve($id);
if ($personalBudget->spend(amount_to_spend())) {
echo "Spending succeeded";
} else {
echo "Spending failed";
}
$repository->persist($personalBudget);
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
$messageRepository = new InMemoryMessageRepository();
$aggregateRootRepository = new AggregateRootRepository(
PersonalBudget::class,
$messageRepository
);
$id = AggregateRootId::create();
$headers = [Header::AGGREGATE_ROOT_ID => $id];
$messageRepository->persist(
new Message(new BudgetWasIncreased(100), $headers)
);
$budget = $aggregateRootRepository->retrieve($id);
$budget->spend(150);
$aggregateRootRepository->persist($budget);
var_dump($messageRepository->lastCommit());
Given
Certain events happened
When
Handling a type of input
Then
We can assert the output
/**
* @test
*/
public function it_allows_to_spend_within_the_budget()
{
$id = $this->aggregateRootId();
$this->given(
new BudgetWasIncreased(100)
)->when(
new MakePurchase($id, 40)
)->then(
new PurchaseWasMade(40)
);
}
/**
* @test
*/
public function it_disallows_to_spend_over_budget()
{
$id = $this->aggregateRootId();
$this->given(
new BudgetWasIncreased(100),
new PurchaseWasMade(80)
)->when(
new MakePurchase($id, 40)
)->then(
new BudgetWasInsufficient(40)
);
}
/**
* @test
*/
public function it_disallows_to_spend_over_budget()
{
$id = $this->aggregateRootId();
$this->given(
new BudgetWasIncreased(100),
new PurchaseWasMade(80)
)->when(
new MakePurchase($id, 40)
)->expectToFail(
new InsufficientFundsException()
);
}
✅ Event Sourcing
✅ Test Tooling
✅ Code Generation


0x000000CE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
WINDOWS HEALTH IS CRITICAL PLEASE CONTACT CERTIFIED TECHNICIANS BSOD : Error 333 Registry Failure of operating system - Host : Please Contact Certified Technicians At Toll Free : 1-855-410-7214 To Immediately Rectify issue to prevent Data Loss |


WELCOME TO MY WIBSITE
- I studied marketing and business administration, and I majored in marketing
- I'm graduated from ASU with a master's degree. I am looking forward to expanding
- my knowledge and skills in programing & digital marketing pleased to meet you All
Top 10 Favorite Drink
- Coffee
- Tea
- Milk
- Iced Tea
- Black coffee
- Frozen strawberry
- Apple juice
- cocktail
- water
- Turkish coffee


Fundamental W-W-W's of the novicehacks
Novice Hacks is dedicated for learning and sharing tips, tricks and solutions to enable efficient and faster coding.
Novice Hacks platform is dedicated to share knowledge in our Blog. All the products from NoviceHacks will be developed in and for open source community.
Many of us in ever growing Technology industry are eager to learn better ways of learning, writing, understanding and debugging the code.
Novice Hacks is a platform I chose to share my learnings, and at the same time help fellow programmers.
Novice hacks is the home of a passionate programmer who started as a fresh graduate in 2k7, continuously learning and developing software applications since then.
Know more about the experience and open source contributions of this passionate programmer.
Community Contributions
@ novicehacks youtube channel


Vim documentation: usr_11
main help file*usr_11.txt* For Vim version 7.2. Last change: 2006 Apr 24 VIM USER MANUAL - by Bram Moolenaar Recovering from a crash Did your computer crash? And you just spent hours editing? Don't panic! Vim keeps enough information on harddisk to be able to restore most of your work. This chapter shows you how to get your work back and explains how the swap file is used. |11.1| Basic recovery |11.2| Where is the swap file? |11.3| Crashed or not? |11.4| Further reading Next chapter: |usr_12.txt| Clever tricks Previous chapter: |usr_10.txt| Making big changes Table of contents: |usr_toc.txt|
*11.1* Basic recovery In most cases recovering a file is quite simple, assuming you know which file you were editing (and the harddisk is still working). Start Vim on the file, with the "-r" argument added: vim -r help.txt Vim will read the swap file (used to store text you were editing) and may read bits and pieces of the original file. If all is well, you will see these messages (with different file names, of course): Using swap file ".help.txt.swp" Original file "~/vim/runtime/doc/help.txt" Recovery completed. You should check if everything is OK. (You might want to write out this file under another name and run diff with the original file to check for changes) Delete the .swp file afterwards. To be on the safe side, write this file under another name: :write help.txt.recovered Compare the file with the original file to check if you ended up with what you expected. Vimdiff is very useful for this |08.7|. Watch out for the original file to contain a more recent version (you saved the file just before the computer crashed). And check that no lines are missing (something went wrong that Vim could not recover). If Vim produces warning messages when recovering, read them carefully. This is rare though. It's normal that the last few changes can not be recovered. Vim flushes the changes to disk when you don't type for about four seconds, or after typing about two hundred characters. This is set with the 'updatetime' and 'updatecount' options. Thus when Vim didn't get a chance to save itself when the system went down, the changes after the last flush will be lost. If you were editing without a file name, give an empty string as argument: vim -r "" You must be in the right directory, otherwise Vim can't find the swap file.
*11.2* Where is the swap file? Vim can store the swap file in several places. Normally it is in the same directory as the original file. To find it, change to the directory of the file, and use: vim -r Vim will list the swap files that it can find. It will also look in other directories where the swap file for files in the current directory may be located. It will not find swap files in any other directories though, it doesn't search the directory tree. The output could look like this: Swap files found: In current directory: 1. .main.c.swp owned by: mool dated: Tue May 29 21:00:25 2001 file name: ~mool/vim/vim6/src/main.c modified: YES user name: mool host name: masaka.moolenaar.net process ID: 12525 In directory ~/tmp: -- none -- In directory /var/tmp: -- none -- In directory /tmp: -- none -- If there are several swap files that look like they may be the one you want to use, a list is given of these swap files and you are requested to enter the number of the one you want to use. Carefully look at the dates to decide which one you want to use. In case you don't know which one to use, just try them one by one and check the resulting files if they are what you expected. USING A SPECIFIC SWAP FILE If you know which swap file needs to be used, you can recover by giving the swap file name. Vim will then finds out the name of the original file from the swap file. Example: vim -r .help.txt.swo This is also handy when the swap file is in another directory than expected. If this still does not work, see what file names Vim reports and rename the files accordingly. Check the 'directory' option to see where Vim may have put the swap file. Note: Vim tries to find the swap file by searching the directories in the 'dir' option, looking for files that match "filename.sw?". If wildcard expansion doesn't work (e.g., when the 'shell' option is invalid), Vim does a desperate try to find the file "filename.swp". If that fails too, you will have to give the name of the swapfile itself to be able to recover the file.
*11.3* Crashed or not?  Suppose you innocently start editing a file, expecting the contents of the file to show up. Instead, Vim produces a very long message: E325: ATTENTION Found a swap file by the name ".main.c.swp" owned by: mool dated: Tue May 29 21:09:28 2001 file name: ~mool/vim/vim6/src/main.c modified: no user name: mool host name: masaka.moolenaar.net process ID: 12559 (still running) While opening file "main.c" dated: Tue May 29 19:46:12 2001 (1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed. If this is the case, use ":recover" or "vim -r main.c" to recover the changes (see ":help recovery"). If you did this already, delete the swap file ".main.c.swp" to avoid this message. You get this message, because, when starting to edit a file, Vim checks if a swap file already exists for that file. If there is one, there must be something wrong. It may be one of these two situations. 1. Another edit session is active on this file. Look in the message for the line with "process ID". It might look like this: process ID: 12559 (still running) The text "(still running)" indicates that the process editing this file runs on the same computer. When working on a non-Unix system you will not get this extra hint. When editing a file over a network, you may not see the hint, because the process might be running on another computer. In those two cases you must find out what the situation is yourself. If there is another Vim editing the same file, continuing to edit will result in two versions of the same file. The one that is written last will overwrite the other one, resulting in loss of changes. You better quit this Vim. 2. The swap file might be the result from a previous crash of Vim or the computer. Check the dates mentioned in the message. If the date of the swap file is newer than the file you were editing, and this line appears: modified: YES Then you very likely have a crashed edit session that is worth recovering. If the date of the file is newer than the date of the swap file, then either it was changed after the crash (perhaps you recovered it earlier, but didn't delete the swap file?), or else the file was saved before the crash but after the last write of the swap file (then you're lucky: you don't even need that old swap file). Vim will warn you for this with this extra line: NEWER than swap file! UNREADABLE SWAP FILE Sometimes the line [cannot be read] will appear under the name of the swap file. This can be good or bad, depending on circumstances. It is good if a previous editing session crashed without having made any changes to the file. Then a directory listing of the swap file will show that it has zero bytes. You may delete it and proceed. It is slightly bad if you don't have read permission for the swap file. You may want to view the file read-only, or quit. On multi-user systems, if you yourself did the last changes under a different login name, a logout followed by a login under that other name might cure the "read error". Or else you might want to find out who last edited (or is editing) the file and have a talk with them. It is very bad if it means there is a physical read error on the disk containing the swap file. Fortunately, this almost never happens. You may want to view the file read-only at first (if you can), to see the extent of the changes that were "forgotten". If you are the one in charge of that file, be prepared to redo your last changes. WHAT TO DO? If dialogs are supported you will be asked to select one of five choices: Swap file ".main.c.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it: O Open the file readonly. Use this when you just want to view the file and don't need to recover it. You might want to use this when you know someone else is editing the file, but you just want to look in it and not make changes. E Edit the file anyway. Use this with caution! If the file is being edited in another Vim, you might end up with two versions of the file. Vim will try to warn you when this happens, but better be safe then sorry. R Recover the file from the swap file. Use this if you know that the swap file contains changes that you want to recover. Q Quit. This avoids starting to edit the file. Use this if there is another Vim editing the same file. When you just started Vim, this will exit Vim. When starting Vim with files in several windows, Vim quits only if there is a swap file for the first one. When using an edit command, the file will not be loaded and you are taken back to the previously edited file. A Abort. Like Quit, but also abort further commands. This is useful when loading a script that edits several files, such as a session with multiple windows. D Delete the swap file. Use this when you are sure you no longer need it. For example, when it doesn't contain changes, or when the file itself is newer than the swap file. On Unix this choice is only offered when the process that created the swap file does not appear to be running. If you do not get the dialog (you are running a version of Vim that does not support it), you will have to do it manually. To recover the file, use this command: :recover Vim cannot always detect that a swap file already exists for a file. This is the case when the other edit session puts the swap files in another directory or when the path name for the file is different when editing it on different machines. Therefore, don't rely on Vim always warning you. If you really don't want to see this message, you can add the 'A' flag to the 'shortmess' option. But it's very unusual that you need this.
*11.4* Further reading |swap-file| An explanation about where the swap file will be created and what its name is. |:preserve| Manually flushing the swap file to disk. |:swapname| See the name of the swap file for the current file. 'updatecount' Number of key strokes after which the swap file is flushed to disk. 'updatetime' Timeout after which the swap file is flushed to disk. 'swapsync' Whether the disk is synced when the swap file is flushed. 'directory' List of directory names where to store the swap file. 'maxmem' Limit for memory usage before writing text to the swap file. 'maxmemtot' Same, but for all files in total.
Next chapter: |usr_12.txt| Clever tricks Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl: top - main help file


A collection of shell / bash scripts used to install dotfiles for customizing a terminal / shell, and installing software.
I made this to facilitate setting up a new Arch-based distro for everyday use and development.
Notable installations:
Allows backing up of old config files.
Learned a bit of shell scripting in a second-year CS class, so this was a lot of fun to put it into practice.


{% extends "accounts/base.html" %} {% block content %}
{% trans %}User login and registration has been currently disabled on your site.{% endtrans %} {% trans %}If you think it is a mistake, please contact an administrator.{% endtrans %}
{% trans %}Thank you.{% endtrans %}


Paragraph: Powell Cat from the Powell Cat fan-club on Instagram
Here's a link to Instagram.
| First | Second | Dead Last |
|---|---|---|
| Godfather 2 | Godfather 1 | Godfather 3 |
| Cancun, Mission | Gordos | Taco Bell |
| Oakland | San Francisco | Palo Alto |
| ODB | Mission Man | Noodles |
| Wire Season 4 | Wire Season 5 | Wire Season 1 |
| Chris Rock | Louis CK | Dane Cook |
| Halloween | Valentine's Day | Columbus Day |


Send a Push to GCM via XHR
OR
Copy and paste the following CURL command into your terminal to send a push message to your browser.
The Weather API is


Burkina Faso attacks kill three soldiers in north: security sources
Three soldiers were killed on Thursday in two simultaneous attacks in northern Burkina Faso, where the armed forces are struggling to contain an Islamist insurgency, security sources said.
The attacks are part of increasing jihadist violence in the West African country, where 700 people have been killed in the nearly five years since fighting spilled across the border from Mali, according to an AFP count.
"Early this morning, an armed group attacked a military unit in Kelbo. Two soldiers were killed during this attack," a security source told AFP.
"Almost at the same time, a separate armed group attacked a unit in Namissiguima. Another soldier was killed there."
Militants took away motorbikes and a pickup truck during the attacks, another security source said confirming the two incidents.
Attacks in Burkina Faso, which borders Mali and Niger, have targeted mostly the north and east of the country, though the capital Ouagadougou has been hit three times.
Most of the violence is attributed to jihadists affiliated with al-Qaeda or the Islamic State group, with around 500,000 people internally displaced by attacks, according to the UN.
Attacks have intensified this year as the underequipped, poorly trained Burkina Faso army struggles to contain the Islamist militancy.
An ambush on a convoy transporting employees of a Canadian mining company killed 37 people earlier this month, the deadliest attack in nearly five years of jihadist violence.
Security forces also said this month they had killed more than 50 jihadists in a series of operations.
Burkina Faso President Roch Marc Christian called for a "general mobilisation against terrorism" and announced plans for voluntary recruitment for the armed forces in vulnerable regions.


plant virus aphid etÂ plants aphids population infected vector winged host transmission VMPPs NPT feeding dynamics viruses âˆ’ VMPP Fig.Â density {border-style Eq.Â dispersal wingless (Fig.Â acceptability px;} #ffffff;} (i.e., deter effects plants, probing results (Mauck constant healthy infection plants. behavior epidemic probability >Â (), Plant deterrence incidence settling size virusâ€�infected acquisition attractiveness effect leads new Aphid However, aphids. i.e., local number spread additional associated attract disease growth model vectors Click LINK data dispersals epidemics file. final important previous rate viral virusâ€�bearing vs. (A) AppendixÂ Markov alighting aphids, background form hosts inhibit manipulation movement populations px; transmitted {font-family A). Aphids Groen Prob. Sisterson cells chain eventâ€�based font-size higher highly impact increase individual inoculation insect interactions loss mosaic phenotypes probe studies susceptible terms ultimately values viruses, ÎµÂ (McElhany (TableÂ BoxÂ Carmoâ€�Sousa Therefore, VMPP, Virus addition, assumption attractiveness, changes curves double; endemic enhance epidemics, epidermal increased influence initially inoculum invasion key lead occurs plant, production progress prolonged range released represent reproduction retain simulations stochastic viruses. virusâ€�induced Î½Â (A)â€"(C) (B) (or (which (ÎµÂ Assuming Attract Carr E., Eqs.Â Mauck, NPT, NPT. S). assume attraction border-color border-width calculated different epidemiological framework impacts increases mathematical modeling models modifications modified offspring parameters period phloem promotes risk seen size. solid; solution solving steadyâ€�state transmissions used virally {font-style {font-weight ()Â (AppendixÂ (Braendle (see (Î½Â Analysis C.Mescher. Figure J., M.DeMoraes, PacqÂ PinocÂ Thus, Virology:â€". Westwood acceptability, alight analyses assuming benefits bold case combination compared conditioning contrast, courier; dashed day denoted density, develop distinct dynamic em; encourage encouraging established feeding, field finding following infectious initial likelihood likely longâ€�distance lower mean median mortality natural nonpersistently particles particular, preference probed probes pt;} required retention selfâ€�limiting settle settled simulation spatial specialist support thought time type using vector, virus.


Online Classes
If you’re working on creative coding projects, or want to get into the field, it would be my pleasure to help you with online classes. The lessons would be delivered via Zoom, or any other videochat platform you might prefer.
Depending on your needs, we could build a personalized curriculum that would allow you to progress at a satisfying and engaging pace. Despite being a highly technical field, creative coding can be remarkably fun and intuitive to learn. I believe that a student can find enjoyment at every step of the way, if the learning curve is just steep enough to be exciting, but not enough to be intimidating.
Don’t hesitate to contact me for any questions about your creative ideas and how I might help you to achieve them.
Specific areas of expertise
p5.js, SuperCollider, WebGL Shaders, audioreactive projects, cellular automata, chaotic and dynamical systems.
About your teacher
My creative coding journey began with Introduction to Programming for the Visual Arts with p5.js, a free online course by Lauren McCarthy, Chandler McWilliams, and Casey Reas. My learning continued with Daniel Shiffman’s excellent videos for The Coding Train. I then started to code to compose and perform music with the help of the SuperCollider Tutorials from Eli Fieldsteel.
I’ve been involved in creative coding and generative art since 2016, and prior to that I studied and worked in the arts, mostly in animation film, and also in independent comics, and illustration.
Best of luck with all your projects, and let me know if you think I might be able to help you along the way.


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
public interface Server
The Server
interface represents a handler that is
used to process Socket
objects. Implementations of
this object will read HTTP requests for the provided sockets and
dispatch the requests for processing by the core protocol handler.
The intended use of a Server
is that it be used in
conjunction with a Container
object, which acts as the
primary protocol handler for a server. Typically the server will
deliver callbacks to a container with both Request
and
Response
objects encapsulating the transaction.
Core responsibilities of the server are to manage connections, to ensure that all HTTP requests are collected, and to dispatch the collected requests to an appropriate handler. It is also required to manage multiplexing such that many connections can be processed concurrently without a high latency period.
| Method Summary | |
|---|---|
void |
process(Socket socket)
Used to process the Socket which is a full duplex
communication link that may contain several HTTP requests. |
void |
stop()
This method is used to stop the Server such that
it will accept no more sockets. |
| Method Detail |
|---|
void process(Socket socket) throws java.io.IOException
Socket
which is a full duplex
communication link that may contain several HTTP requests. This
will be used to read the requests from the Socket
and to pass these requests to a Container
for
processing.
Typical usage of this method is to accept multiple sockets objects, each representing a unique HTTP channel to the client, and process requests from those sockets concurrently.
socket
- this is the connected HTTP socket to process
java.io.IOException
void stop() throws java.io.IOException
Server
such that
it will accept no more sockets. Stopping the server ensures
that all resources occupied will be released. This is required
so that all threads are stopped, and all memory is released.
Typically this method is called once all connections to the server have been stopped. As a final act of shutting down the entire server all threads must be stopped, this allows collection of unused memory and the closing of file and socket resources.
java.io.IOException
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


The Docker slogan ‘Build, Ship, and Run’ advertises easy set up of immutable software builds, but it is not always that easy. Setting up immutable builds with Docker is pretty straight forward and shipping is just a matter of pushing the image to a repository. The next step is building the cloud infrastructure to run the containers. In the talk at the Cloud Native Meetup in Taipei I have shown how to create an immutable infrastructure on AWS with Terraform. The example belows shows how you can run your micro services in docker containers on AWS.
In this talk I briefly touch upon building immutable software. But the main focus of the talk will be on creating an immutable infrastructure. In this talk I will show you how to create an immutable infrastructure on AWS with Terraform. I will use a real world example to explain and show live how easy you can get micro services live on AWS and continuously apply changes to the same cloud environment..
Below the slides that I used for the talk, the slides are available as well on GitLab. You can easy navigate through the slides with the spacebar.
To get started with Terraform the best starting points are:
During the talk, I demonstrated a hello world example, see the link above. This examples shows some basics of terraform by creating a ec2 instance and security group to server a simple web application. The example only works in the AWS region eu-west-1
since the AMI used is only available in this region.
The second example I have shown, is creating an immutable infrastructure to server docker containers. The picture below descibes briefly the enviroment that will be cretaed.
The example also creates log groups in cloudwatch to capture the logging of the ecs agent and the running containers (services).
Before you can start, you need an AWS account with sufficient rights (admin), and you should create a AWS_ACCESS_KEY_ID
and AWS_SECRET_ACCESS_KEY
to be able to access your account programmatically.
Clone the repository containing the ECS sample terraform code. To create the infrastructure step-by-step you can check out the tags vpc
and ecs
.
git clone https://github.com/npalm/tf-ecs-demo.git
git checkout taipei-vpc
You should also have Terraform installed (home brew install terraform
) and
tfenv to manage your terraform installation. Alternatively use a docker container to run the terraform commands, for example:
docker run -it --env-file <AWS_KEYS_FILE> -v $(pwd):/data -w /data \
hashicorp/terraform:0.10.4 <terraform command>
In this example you can swithc the reqion by changing the region variable
aws_region
to your own choice. Or set the following environment variable: export TF_VAR_aws_region=ap-northeast-1
for Tokyo.
In the next steps we will create the network layers.
First, we initialize and plan our changes.
terraform init
terraform plan
Terraform should print on the console that 19 needs to be added and 0 to change or destroyed. Next we apply the change be executing terraform apply
.
Now we have the network layer created, we will add the ECS cluster. By default the bastion host is disabled, the bastion can be enabled by updating the variable enable_bastion
in the terraform.tfvars
file. Time to plan and apply the new resources for ECS.
git checkout taipei-ecs-1
terraform plan
terraform apply
Once terraform is ready it will print the url of two applications on the console. One application, is a simple micro service that just prints the AWS availabilty zone where it is running, the other is a graphql micro service. It will take a few minutes before the services are available.
Time to have some more fun. Edit the main.tf
and start making changes. Remove all the services, add your own service. By default for each service an application load balancer (ALB) is created. Add for each services that you want to deploy a configuration as below and update the variables as required.
module "your-service" {
source = "ecs-service"
service_name = "<service-name>"
image_url = "<docker-image>"
container_port = <port in the container where the service is listening>
desired_count = <number of instances>
aws_region = "${var.aws_region}"
environment = "${var.environment}"
vpc_id = "${module.vpc.vpc_id}"
subnets = "${module.vpc.public_subnets}"
cluster_id = "${module.ecs-cluster.cluster_id}"
ecs_service_role_name = "${module.ecs-cluster.ecs_service_role_name}"
}
Now plan and apply your changes, Terraform will inform you that a few resources will be destroyed (the removed services) and a few will be added.
Once done you can easily clean-up all created resources in AWS, just run terraform destroy
.
Since a few months Amazon support running containers without managing your
ec2 instances, aka Serverless Containers. This services is called Fargate. I
have written a blog
post about
how to run you containers serveless with terraform. Creating a mix of both
ways of running of containers is explained as well. Be aware that Fargate is
still only avaialable in us-east-1
.
Have fun!


| Name | Kind | Description |
| DanceForYourDinner | operation | |
| data | package | |
| Data | artifact | |
| Data | class | |
| data | deployment view | |
| data | class view | |
| data | attribute | |
| DataCondition | class | |
| DataCondition | artifact | |
| DataCondition | operation | |
| DataCondition | operation | |
| DataCondition | operation | |
| DataCondition | operation | |
| dataManager | attribute | |
| DataManager | operation | |
| DataManager | class | |
| DataManager | artifact | |
| dataTimeout | attribute | in minutes |
| date | attribute | |
| date | attribute | |
| DayData | class | |
| DayData | artifact | |
| DayData | operation | |
| daysMet | attribute | |
| DEFAULT_THRESHOLD | attribute | |
| DefaultTriggers | artifact | |
| DefaultTriggers | class |


Main Page Code:
<!DOCTYPE html>

<meta charset="utf-8" />
<title>Adam Sorrenti</title>

Home
Technical Report
Validation Report

Adam Sorrenti, #500903848

What I want to learn in CPS530:

CSS

JavaScript

mySQL

This is my personal site hosted at cs.ryerson.ca :

Report :
How did you password protect your page (what method)?
o Using an .htaccess configuration file for use on web servers running the Apache Web Server software and the .htpasswd file I created an encrypted password for my site.
What new tag did you try? What was its effect?
o I had never used the iframe tag before. I used this new tag on the main page to link my personal site I created on Ryerson’s moon server. The effect was a window directing to my other site. Redirecting within the iframe did not seem to work well. Hopefully this is something I can improve upon.
Does your page look different in different browsers and platforms(IE/Edge/Firefox/Chrome/Safari - desktop/tablet/phone)? If yes, what are the main differences?
o The differences seen between browsers are minimal. Some differences include default font and the .htaccess password prompt GUI.
o The site is best seen from a desktop but when testing on my iPhone I noticed minimal formatting errors which I hope to improve upon in the future with a more responsive design.
How long did you spend on this lab (approximately)
o I spent approximately ½ an hour setting up my web host at x10hosting.com and another 1 ½ hours on the actual programming and development of the site(not including the technical report).


Wikibase as an Infrastructure
for Knowledge Graphs
The EU Knowledge Graph
Dennis Diefenbach (The QA Company)
Max De Wilde (Université libre de Bruxelles)
Samantha Alipio (Wikimedia Deutschland)
October 2021
Wikimedia hosts many wikis...
Wikibase is the software behind Wikidata
Wikibase architecture
2. The EU Knowledge Graph
A repository to store structured data
about the European Union
Can be edited by humans and by bots
Wikibase hosts Wikidata, one of the largest existing KG which contains 5 billion triples
1. Take any structured data
2. Model the data
- We need entities like buildings, offices...
- We need properties like address, opening hours, occupant...
- Whenever possible, reuse Wikidata entities/properties or other existing ones
3. Keep identifiers
Use other identifiers so that one can use them to link to other resources!
4. Import using Wikibase APIs
We always use Pywikibot
But there are alternatives...
The data imported understandable, aligned with existing concepts, queryable and easy to reuse
Directorates-General (DGs)
942.289 projects co-funded by the European Union
257.784 beneficiaries of EU funds
3. Question Answering
We allow to explore the KG using natural language
Use case: Kohesio
Transparency on programmes and projects co-funded by the EU
What is Kohesio?
- Cohesion funds are managed together with national and local authorities in the 27 EU member states
- The member states have a legal obligation to publish the list of projects and beneficiaries on their national websites
- The goal of Kohesio is to aggregate this data and make it publicly available in an easy, open way
Raw data
- Hundreds of files in CSV, XLSX or XLS provided by EU member states
- Reference data: intervention fields, thematic objectives, programmes, funds, NUTS, etc.
- Wikidata
Enriching the data
- Translating project labels and descriptions into English
- Computing geographic coordinates based on postal code (geocoding)
- Deducing in which NUTS region the project is located
- Linking NUTS regions and beneficiaries with Wikidata
Build a website for citizens on top
3. Comparison with classical approach
4. In-use Wikibase instances
Conclusion
We have shown:
- How Wikibase can be used as an infrastructure for Knowledge Graphs
- The content of the EU KG, how the data is ingested, and which services are offered
- How this differs to a traditional approach to knowledge graphs
- Some instances currently in use
- What is the future roadmap
Acknowledgements:
- DORIS Team @ DG CNECT
- Knowledge Management Team @ DG REGIO
- Wikimedia Deutschland (WMDE)


Lifespan:
Generation:
Best Fitness:
Start
Population Size:
25
Mutation Rate:
0.01
* must reset to change variables
Reset


Overview
The first few weeks of Semester Azul, we've been getting to know each other, establishing a routine, and are exploring our local bays and oceans.
Our morning begins with conversation and a walk. We start the day with "coffee talk," during which we catch up and chat about how we are and topics that interest us. After a short walk to the bay, we read independently for a half-an-hour. We then do some applied math problems that are connected to understanding the ocean in a new way (e.g. problems about the physics of waves, relativity, water pressure and scuba diving).
In the afternoons we're often doing fieldwork or working on independent projects.
Some days are focused on doing one particuar activity and developing a specific skillset (e.g. graphic design, photography and videography, etc.), which is connected to the greater project we're aspiring to complete by the end of the semester. Right now, we're focused on figuring out how we may be able to build some kind of small scale artificial reef that serves as both an underwater lab and a restoration project.


Angela Linda O'Keefe
Democrat
VP Operations, Scout APM
BA, History, Yale University, 1996
80439
With the current social justice activity happening in the state, now more than ever I am deeply concerned with the interests of underrepresented groups in Colorado, although I have not formally been involved. To date, I have only participated in peaceful protesting for women's and reproductive rights, and for Black Lives Matter.
Volunteered and donated to Jessie Danielson in 2016 and prior campaigns (CO house of representatives and CO senate), Volunteered for Hillary Clinton, Tammy Story and Lisa Cutter in 2016, Volunteered for Colorado Democrats, get out the vote, 2020 election. Donated to senate campaigns for Mark Kelly, Amy McGrath and Jaime Harrison (2020).
Wilmot Elementary School PTA member and school volunteer.
I think the representation that Colorado receives in our government, at the state and national levels, is fundamentally important to our democracy. I believe all people should be represented fairly. How these lines are drawn will determine if certain groups have outsized importance in our public policy. I would love to do my part to help insure fair representation of all Coloradoans.
Throughout my professional career, I have had to influence people who did not report to me, in order to meet my goals and get things done. Beginning in venture capital, I was not in a leadership role but had to promote investments, nor was I on the board when I needed our CEOs to undertake initiatives. Later, in a corporate development role at Madison Square Garden, or in operations with K1 Capital, I had no formal control over the people I needed to accomplish my professional goals. I have always done this by understanding the perspectives and goals of each person around the table, and articulating why said initiative can help to further their goals, and focusing on other people's strengths in accomplishing these team goals. I find that finding the common thread - the common purpose - brings people naturally onto the same page. Keeping everyone's goals in mind allows us to find a single direction and work together.
I started my career as a financial analyst, so this has always been a core skill of mine. I spent 7 years doing financial modelling and financial analysis in both investment banking and venture capital investing. Since moving into corporate development and operations, I use analytics to inform all of my business decisions. Whether understanding markets to determine whether we should launch a particular business, understanding an existing customer base to identify future sales targets, speaking with customers to inform product development, or projecting sales forecasts and budgets, all of my decisions are based on the analysis of relevant data.
female


UNIVERSAL SOLDIER: THE RETURN A film review by Steve Rhodes Copyright 1999 Steve Rhodes RATING (0 TO ****): *
UNIVERSAL SOLDIER: THE RETURN is about the power of recycling.
The villains are recycled dead soldiers called Unisols. The movie itself is a recycled version of the original as well as every action picture you've ever seen. Its idea of a talking, rogue computer who seizes control is, of course, recycled from 2001: A SPACE ODYSSEY.
The video-game level plot can be summarized as: Fight. Shoot. Kill. The compassionless violence has humans being slaughtered three at a clip.
The star of the film's mindless violence is Jean-Claude Van Damme as Luc Deveraux, a haggard veteran who represents humanity's one chance when the Unisols go on a killing spree. Lead by the computer, S.E.T.H., these almost unstoppable fighting machines are ready to take over the world. Michael Jai White plays the human incarnation of S.E.T.H. (think HAL but with a buff black body). "The only way [to stop them] is to blow them up and hope the pieces don't keep fighting us," Deveraux explains.
The script by William Malone and John Fasano makes Deveraux a single dad so that his daughter is available for some cheap child endangerment scenes. It also cleverly sends Deveraux to a club that serves up topless dancers, phone sex and online pornography. The reason? He needs to get Internet access in order to hack into S.E.T.H. This lets them throw in lots of naked breasts so that the movie can have gratuitous nudity to go along with its gratuitous violence.
Heidi Schanz, trying her best to be Sandra Bullock, plays Erin, an aggressive television reporter accidentally caught in the heat of the battle. She follows Deveraux around so that she can get an exclusive, inside story. Trying as hard as she can ("What is it with you boys and your war toys?"), Erin never develops any genuine chemistry, positive or negative, with Deveraux.
As bad as it gets, which is pretty awful, at least you can say this for UNIVERSAL SOLDIER: THE RETURN: It isn't pretentious. Why it was released theatrically rather than going direct to late-night cable is its only mystery.
Email<EMAIL_ADDRESS>Web: http://www.InternetReviews.com
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


The callback to invoke on each event
The events that belong to this part
the amount of variation from the given time.
Loop value
When the note is scheduled to start.
When the note is scheduled to start.
The playback speed of the note. A speed of 1 is no change.
private holder of probability value
A delay time from when the event is scheduled to start
Tracks the scheduled events
The callback to invoke.
The context belonging to the node.
Set this debug flag to log all events that happen in this class.
If mute is true, the callback won't be invoked.
The value which is passed to the callback function.
The version number semver
The number of seconds of 1 processing block (128 samples)
Indicates if the instance was disposed. 'Disposing' an instance means that all of the Web Audio nodes that were created for the instance are disconnected and freed for garbage collection.
The number of scheduled notes in the part.
If the part should loop or not between Part.loopStart and Part.loopEnd. If set to true, the part will loop indefinitely, if set to a number greater than 1 it will play a specific number of times, if set to false, 0 or 1, the part will only play once.
If the part should loop or not between Part.loopStart and Part.loopEnd. If set to true, the part will loop indefinitely, if set to a number greater than 1 it will play a specific number of times, if set to false, 0 or 1, the part will only play once.
The loopEnd point determines when it will loop if Part.loop is true.
The loopEnd point determines when it will loop if Part.loop is true.
The loopStart point determines when it will loop if Part.loop is true.
The loopStart point determines when it will loop if Part.loop is true.
The playback rate of the part
The playback rate of the part
The current progress of the loop interval. Returns 0 if the event is not started yet or it is not set to loop.
The duration in seconds of one sample.
Returns the playback state of the note, either "started" or "stopped".
Get the duration of the loop.
Get a subset of the properties which are in the partial props
Restart the given event
Set the attribute of all of the events
the attribute to set
The value to set it to
Determine if the event should be currently looping given the loop boundries of this Part.
The event to test
Internal tick method
The time of the event in seconds
Assert that the statement is true, otherwise invoke the error.
The message which is passed into an Error
Get/Set an Event's value at the given time. If a value is passed in and no event exists at the given time, one will be created with that value. If two events are at the same time, the first one will be returned.
The time of the event to get or set.
If a value is passed in, the value of the event at the given time will be set to it.
Cancel scheduled state change events: i.e. "start" and "stop".
The time after which to cancel the scheduled events.
Remove all of the notes from the group.
Get the object's attributes.
Return the current time of the Context clock without any lookAhead.
Prints the outputs to the console log for debugging purposes.
Prints the contents only if either the object has a property
called debug
set to true, or a variable called TONE_DEBUG_CLASS
is set to the name of the class.
Return the current time of the Context clock plus the lookAhead.
Set multiple properties at once with an object.
Start the part at the given time.
When to start the part.
The offset from the start of the part to begin playing at.
Stop the part at the given time.
When to stop the part.
Convert the class to a string
Generated using TypeDoc
Part is a collection ToneEvents which can be started/stopped and looped as a single unit.
import { Part, Synth } from "tone"; const synth = new Synth().toDestination(); const part = new Part(((time, note) => { // the notes given as the second element in the array // will be passed in as the second argument synth.triggerAttackRelease(note, "8n", time); }), [[0, "C2"], ["0:2", "C3"], ["0:3:2", "G2"]]);
import { Part, Synth } from "tone"; const synth = new Synth().toDestination(); // use an array of objects as long as the object has a "time" attribute const part = new Part(((time, value) => { // the value is an object which contains both the note and the velocity synth.triggerAttackRelease(value.note, "8n", time, value.velocity); }), [{ time: 0, note: "C3", velocity: 0.9 }, { time: "0:2", note: "C4", velocity: 0.5 } ]).start(0);


Sex position, duration don’t determine child’s gender – Expert
by The Eagle OnlineDr Olatoye Ogundipe, a gynecologist, on Wednesday, says the gender of a child is not determined by the sex position or duration contrary to beliefs by some people.
Ogundipe, who spoke with the News Agency of Nigeria in Ilorin, said that most couples had been misled in believing that there were certain sex positions to adopt to have a baby boy or girl.
“This is erroneous and misleading, the formation of a child is more than just sex by the couple, a lot goes on in the body.
“I hear some traditional healers say a lot of things about conception, some say; do not have sex when the sun is high.
“Others say there is a particular time of the menstrual cycle to conceive in order to have a boy or girl; these claims are not medically proven.
“What medicine says is that sperm carries the X or Y chromosomes while the female egg is X. If the sperm carrying Y meets the egg first, it results to XY which is a boy and if it is X, it becomes XX which is a girl.”
According to him, some men are still not knowledgeable of the fact that the gender of a child is determined by them and therefore, the woman is not to blame.
“It is time we humans understand that the cycle of life is dependent on both the man and the woman; we cannot continue to wish for baby boys alone, then, who will carry future pregnancies.
“We need women too. They are important too. The birth of a baby girl is a blessing to the human race, so is a boy.
“However, the sex position, duration or timing cannot determine a child’s gender, otherwise, until such a claim is proven medically,” he said.
Previous Post
Buhari presides over FEC meeting
Next Post
Buhari greets ex-President Jonathan at 62


Config Configuration
The config
is a block that can describe settings related to stein lint. Basically stein configuration is based on “Smart default” concept. It means that it has been set up sufficiently from the beginning. Moreover, this means that you can use it without having to define this block and no need to change the setting. However, depending on the item, you may want to customize it. Therefore, you can change the setting according to the config
block accordingly.
This page assumes you’re familiar with the configuration syntax already.
Example
A config
configuration looks like the following:
config {
report {
format = "${format("{{.Level}}: {{.Rule}} %s", color("{{.Message}}", "white"))}"
style = "console"
color = true
}
}
Description
Only one config
block can be defined.
Within the block (the { }
) is configuration for the config block.
Meta-parameters
There are meta-parameters available to config block:
report
(configuration block) -format
(string) - Report message format. It’s shown in lint message. In format, it can be described with Go template.{{.Level}}
is converted to the lint level,{{.Rule}}
is converted to the rule name, and{{.Message}}
is converted to the lint message.style
(string) - Report style. It can take “console”, “inline” now.color
(bool) - Whether to color output.
If config block isn’t defined, the following configuration is used by default.
config {
report {
format = "${format("[{{.Level}}] {{.Rule}} {{.Message}}")}"
style = "console"
color = true
}
}
Syntax
The full syntax is:
config {
[REPORT]
}
where REPORT is:
report {
format = FORMAT
style = [console|inline]
color = bool
}


BY EDWIN JAHIEL
NOT ONE LESS ( Yi ge dou bu neng shao) ( China, 1999) *** Directed by Zhang Yimou. Written by Shi Xiangsheng, from his novel. Photography, Hou Yong. Editing, Zhai Ru. Art director, Cao Jiuping. Music, San Bao. Cast: Wei Minzhi (Herself), Zhang Huike (Himself), Tian Zhenda (Mayor Tian), Gao Enman (Teacher Gao), Sun Zhimei (Sun Zhimei), Feng Yuying (Television Station Receptionist), Li Fanfan (Television Host). Produced by Zhao Yu. A Sony Pictures Classics release. In Mandarin (with English subtitles). 106 minutes.
The American director Joseph Von Sternberg (1894-1969) comes to mind as I think of the Chinese director Zhang Yimou (b.1951). Sternberg "created" Marlene Dietrich in the "Blue Angel" and six additional films (1930-35), the high point of his career. Their relationship went beyond cinema. Zhang Yimou's feature debut "Red Sorghum" was also that of actress Gong Li. The two were an "item" for about 8 years as he directed her in the highly successful, "Ju Dou," " Raise the Red Lantern," "The Story of Qiu Ju," and "To Live" for a total of 7, including the unfamiliar (to me) "Codename Cougar." Their last collaboration, "ShanghaiTriad" (Yao a yao yao dao wai pei qiao) had mixed reviews. Zhang-ites hope that now Pygmalion minus Galatea will not, as in Sternberg's case, result in declining popularity.
"Not One Less" may put those fears to rest, although Zhang changed style and content so radically that comparisons are not valid. His early career was as a cinematographer. All his films until now have powerful, creative visuals. But here, the customary, delicate bravura (not an oxymoron) of often saturated colors, their orchestrated, eye-arresting scenes, give way to utter simplicity. Made almost like a documentary, the pictures is a cousin of cinema-verite and Italian neorealism.
The village of Shuiquan seems to be in the middle of nowhere, but as it turns out, is 3-4 hours by bus from Beijing. What makes one think "boondocks," is generalized poverty and the fact that we see very little of the place. The images are predominantly of a run-down, one-classroom, one-teacher schoolhouse and of dusty dirt roads around it.
Teacher Gao is leaving for a month to attend his ailing mother. Wei, age 13, an elementary school graduate, has been hired as substitute teacher. She's not much older than her pupils. And she does not know much more than they do. The idea is to band-aid the emergency.. Wei will receive 50 yuan at some point (which keeps eluding her) for a month's work. It's essentially a kind of baby-sitting, just keep the kids in class.
According to today's exchange rates, one yuan equals 12 US cents. At the village, once can of Coca-Cola is either one or two yuans. Wei's 50 yuans come to $6.
Given the dire shape of the place, students who need to work for their families or elsewhere drop school alarmingly fast --from 40 to 28 since the school year began. This menaces the subsidies to the school (such as they are!). Teacher Gao warns Wei to hold the line. He sweetens this by promising a bonus (10 yuan) if all 28 kids remain. "Not One Less!"
The conditions at the school, and, surely, in the village, are dismal. Wei and some kids (who is not clear) sleep in a horrid room. Where their food comes from is also unclear. Chalk is rationed: one per day. When some chalk trampled on , it is a catastrophe. There are no books. Wei copies the lessons on the blackboard. She admonishes a child not to write too large or press too much since it uses up too much chalk.
In Part Two of the film, a 10-year old boy, Zhang Huike, smart, lively and prone to trouble-making (pitifully mild by American standards) stops coming to school. His widowed mother is in debt. Zhang went to the big, unnamed city to find work. Through brick-moving the class collects minuscule sum for Wei to go to the city and search for the boy. It is unclear whether she does it to keep the students at the 28 level, or to get her bonus --For a Few Yuan More.
Her small adventures follow, there is a rather unlikely happy ending. As Wei reaches the end of her rope, she is told to take her case to almighty TV. The stumbling block is an autocratic, bureaucratic-to-the-letter receptionist. But a manager ex machina saves the day. Wei goes on a telecast, with a typically chatty, elegant anchorwoman. The newness of it all literally dumbfounds Wei. She freezes, says nothing.
The boy is found, he returns to the village with Wei and a camera crew. But TV micro-celebrity and a gift of tons of chalks solve nothing. End-titles tell us that a million children a year drop school for work. It's a false figure. Reality is ten times higher. But since this is a criticism of China's system, and since director Zhang Yimou has often had troubles with the government and censors, he lowered the figure to what authorities would deem acceptable.
In Italian neorealism the movies did not hesitate to show or denounce evils by individuals as well as the state. Matters are much more careful and balanced here, a bit as in old Soviet movies. The TV station bureaucrat receptionist is scolded, and it another bureaucrat who is helpful. The kindness of strangers gets some credit as a restaurant helps hungry Zhan, although this is done primarily to avoid his bothering the customers. You may glimpse a chic woman or two but contrasts are kept down. No discotheques, no pricey stores. You sense the movie's political prudence.
What's new and interesting is that almost all the characters are non-actors who use their real names ands who do in real life what they do on the screen --starting with Wei who was chosen from an enormous field of candidates. What is most successful is how well, starting again with Wei, all those non-professionals fit their roles and situations. Were that the movie could give a big boost to the casting of amateurs. If this escalates the multi-million-dollar salaries of stars could go the way of the walls of Jericho. Fat chance.
"Le mauvais gout mene au crime"(Stendhal)
Edwin Jahiel's film reviews are at: http://www.prairienet.org/ejahiel/
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