text:
Elastic Nodes Example
Demonstrates how to interact with graphical items in a scene.
The Elastic Nodes example shows how to implement edges between nodes in a graph, with basic interaction. You can click to drag a node around, and zoom in and out using the mouse wheel or the keyboard. Hitting the space bar will randomize the nodes. The example is also resolution independent; as you zoom in, the graphics remain crisp.
Graphics View provides the QGraphicsScene class for managing and interacting with a large number of custom-made 2D graphical items derived from the QGraphicsItem class, and a QGraphicsView widget for visualizing the items, with support for zooming and rotation.
This example consists of a Node
class, an Edge
class, a GraphWidget
test, and a main
function: the Node
class represents draggable yellow nodes in a grid, the Edge
class represents the lines between the nodes, the GraphWidget
class represents the application window, and the main()
function creates and shows this window, and runs the event loop.
Node Class Definition
The Node
class serves three purposes:
- Painting a yellow gradient "ball" in two states: sunken and raised.
- Managing connections to other nodes.
- Calculating forces pulling and pushing the nodes in the grid.
Let's start by looking at the Node
class declaration.
class Node : public QGraphicsItem { public: Node(GraphWidget *graphWidget); void addEdge(Edge *edge); QVector<Edge *> edges() const; enum { Type = UserType + 1 }; int type() const override { return Type; } void calculateForces(); bool advancePosition(); QRectF boundingRect() const override; QPainterPath shape() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; private: QVector<Edge *> edgeList; QPointF newPos; GraphWidget *graph; };
The Node
class inherits QGraphicsItem, and reimplements the two mandatory functions boundingRect() and paint() to provide its visual appearance. It also reimplements shape() to ensure its hit area has an elliptic shape (as opposed to the default bounding rectangle).
For edge management purposes, the node provides a simple API for adding edges to a node, and for listing all connected edges.
The advance() reimplementation is called whenever the scene's state advances by one step. The calculateForces() function is called to calculate the forces that push and pull on this node and its neighbors.
The Node
class also reimplements itemChange() to react to state changes (in this case, position changes), and mousePressEvent() and mouseReleaseEvent() to update the item's visual appearance.
We will start reviewing the Node
implementation by looking at its constructor:
Node::Node(GraphWidget *graphWidget) : graph(graphWidget) { setFlag(ItemIsMovable); setFlag(ItemSendsGeometryChanges); setCacheMode(DeviceCoordinateCache); setZValue(-1); }
In the constructor, we set the ItemIsMovable flag to allow the item to move in response to mouse dragging, and ItemSendsGeometryChanges to enable itemChange() notifications for position and transformation changes. We also enable DeviceCoordinateCache to speed up rendering performance. To ensure that the nodes are always stacked on top of edges, we finally set the item's Z value to -1.
's constructor takes a GraphWidget
pointer and stores this as a member variable. We will revisit this pointer later on.
void Node::addEdge(Edge *edge) { edgeList << edge; edge->adjust(); } QVector<Edge *> Node::edges() const { return edgeList; }
The addEdge() function adds the input edge to a list of attached edges. The edge is then adjusted so that the end points for the edge match the positions of the source and destination nodes.
The edges() function simply returns the list of attached edges.
void Node::calculateForces() { if (!scene() || scene()->mouseGrabberItem() == this) { newPos = pos(); return; }
There are two ways to move a node. The calculateForces()
function implements the elastic effect that pulls and pushes on nodes in the grid. In addition, the user can directly move one node around with the mouse. Because we do not want the two approaches to operate at the same time on the same node, we start calculateForces()
by checking if this Node
is the current mouse grabber item (i.e., QGraphicsScene::mouseGrabberItem()). Because we need to find all neighboring (but not necessarily connected) nodes, we also make sure the item is part of a scene in the first place.
// Sum up all forces pushing this item away qreal xvel = 0; qreal yvel = 0; const QList<QGraphicsItem *> items = scene()->items(); for (QGraphicsItem *item : items) { Node *node = qgraphicsitem_cast<Node *>(item); if (!node) continue; QPointF vec = mapToItem(node, 0, 0); qreal dx = vec.x(); qreal dy = vec.y(); double l = 2.0 * (dx * dx + dy * dy); if (l > 0) { xvel += (dx * 150.0) / l; yvel += (dy * 150.0) / l; } }
The "elastic" effect comes from an algorithm that applies pushing and pulling forces. The effect is impressive, and surprisingly simple to implement.
The algorithm has two steps: the first is to calculate the forces that push the nodes apart, and the second is to subtract the forces that pull the nodes together. First we need to find all the nodes in the graph. We call QGraphicsScene::items() to find all items in the scene, and then use qgraphicsitem_cast() to look for Node
We make use of mapFromItem() to create a temporary vector pointing from this node to each other node, in local coordinates. We use the decomposed components of this vector to determine the direction and strength of force that should apply to the node. The forces accumulate for each node, and are then adjusted so that the closest nodes are given the strongest force, with rapid degradation when distance increases. The sum of all forces is stored in xvel
(X-velocity) and yvel
// Now subtract all forces pulling items together double weight = (edgeList.size() + 1) * 10; for (const Edge *edge : qAsConst(edgeList)) { QPointF vec; if (edge->sourceNode() == this) vec = mapToItem(edge->destNode(), 0, 0); else vec = mapToItem(edge->sourceNode(), 0, 0); xvel -= vec.x() / weight; yvel -= vec.y() / weight; }
The edges between the nodes represent forces that pull the nodes together. By visiting each edge that is connected to this node, we can use a similar approach as above to find the direction and strength of all pulling forces. These forces are subtracted from xvel
and yvel
In theory, the sum of pushing and pulling forces should stabilize to precisely 0. In practice, however, they never do. To circumvent errors in numerical precision, we simply force the sum of forces to be 0 when they are less than 0.1.
QRectF sceneRect = scene()->sceneRect(); newPos = pos() + QPointF(xvel, yvel); newPos.setX(qMin(qMax(newPos.x(), sceneRect.left() + 10), sceneRect.right() - 10)); newPos.setY(qMin(qMax(newPos.y(), sceneRect.top() + 10), sceneRect.bottom() - 10)); }
The final step of calculateForces()
determines the node's new position. We add the force to the node's current position. We also make sure the new position stays inside of our defined boundaries. We don't actually move the item in this function; that's done in a separate step, from advance()
bool Node::advancePosition() { if (newPos == pos()) return false; setPos(newPos); return true; }
The advance()
function updates the item's current position. It is called from GraphWidget::timerEvent()
. If the node's position changed, the function returns true; otherwise false is returned.
QRectF Node::boundingRect() const { qreal adjust = 2; return QRectF( -10 - adjust, -10 - adjust, 23 + adjust, 23 + adjust); }
The Node
's bounding rectangle is a 20x20 sized rectangle centered around its origin (0, 0), adjusted by 2 units in all directions to compensate for the node's outline stroke, and by 3 units down and to the right to make room for a simple drop shadow.
QPainterPath Node::shape() const { QPainterPath path; path.addEllipse(-10, -10, 20, 20); return path; }
The shape is a simple ellipse. This ensures that you must click inside the node's elliptic shape in order to drag it around. You can test this effect by running the example, and zooming far in so that the nodes are very large. Without reimplementing shape(), the item's hit area would be identical to its bounding rectangle (i.e., rectangular).
void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) { painter->setPen(Qt::NoPen); painter->setBrush(Qt::darkGray); painter->drawEllipse(-7, -7, 20, 20); QRadialGradient gradient(-3, -3, 10); if (option->state & QStyle::State_Sunken) { gradient.setCenter(3, 3); gradient.setFocalPoint(3, 3); gradient.setColorAt(1, QColor(Qt::yellow).lighter(120)); gradient.setColorAt(0, QColor(Qt::darkYellow).lighter(120)); } else { gradient.setColorAt(0, Qt::yellow); gradient.setColorAt(1, Qt::darkYellow); } painter->setBrush(gradient); painter->setPen(QPen(Qt::black, 0)); painter->drawEllipse(-10, -10, 20, 20); }
This function implements the node's painting. We start by drawing a simple dark gray elliptic drop shadow at (-7, -7), that is, (3, 3) units down and to the right from the top-left corner (-10, -10) of the ellipse.
We then draw an ellipse with a radial gradient fill. This fill is either Qt::yellow to Qt::darkYellow when raised, or the opposite when sunken. In sunken state we also shift the center and focal point by (3, 3) to emphasize the impression that something has been pushed down.
Drawing filled ellipses with gradients can be quite slow, especially when using complex gradients such as QRadialGradient. This is why this example uses DeviceCoordinateCache, a simple yet effective measure that prevents unnecessary redrawing.
QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) { switch (change) { case ItemPositionHasChanged: for (Edge *edge : qAsConst(edgeList)) edge->adjust(); graph->itemMoved(); break; default: break; }; return QGraphicsItem::itemChange(change, value); }
We reimplement itemChange() to adjust the position of all connected edges, and to notify the scene that an item has moved (i.e., "something has happened"). This will trigger new force calculations.
This notification is the only reason why the nodes need to keep a pointer back to the GraphWidget
. Another approach could be to provide such notification using a signal; in such case, Node
would need to inherit from QGraphicsObject.
void Node::mousePressEvent(QGraphicsSceneMouseEvent *event) { update(); QGraphicsItem::mousePressEvent(event); } void Node::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { update(); QGraphicsItem::mouseReleaseEvent(event); }
Because we have set the ItemIsMovable flag, we don't need to implement the logic that moves the node according to mouse input; this is already provided for us. We still need to reimplement the mouse press and release handlers, though, to update the nodes' visual appearance (i.e., sunken or raised).
Edge Class Definition
The Edge
class represents the arrow-lines between the nodes in this example. The class is very simple: it maintains a source- and destination node pointer, and provides an adjust()
function that makes sure the line starts at the position of the source, and ends at the position of the destination. The edges are the only items that change continuously as forces pull and push on the nodes.
Let's take a look at the class declaration:
class Edge : public QGraphicsItem { public: Edge(Node *sourceNode, Node *destNode); Node *sourceNode() const; Node *destNode() const; void adjust(); enum { Type = UserType + 2 }; int type() const override { return Type; } protected: QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; private: Node *source, *dest; QPointF sourcePoint; QPointF destPoint; qreal arrowSize = 10; };
inherits from QGraphicsItem, as it's a simple class that has no use for signals, slots, and properties (compare to QGraphicsObject).
The constructor takes two node pointers as input. Both pointers are mandatory in this example. We also provide get-functions for each node.
The adjust()
function repositions the edge, and the item also implements boundingRect() and paint().
We will now review its implementation.
Edge::Edge(Node *sourceNode, Node *destNode) : source(sourceNode), dest(destNode) { setAcceptedMouseButtons(Qt::NoButton); source->addEdge(this); dest->addEdge(this); adjust(); }
The Edge
constructor initializes its arrowSize
data member to 10 units; this determines the size of the arrow which is drawn in paint().
In the constructor body, we call setAcceptedMouseButtons(0). This ensures that the edge items are not considered for mouse input at all (i.e., you cannot click the edges). Then, the source and destination pointers are updated, this edge is registered with each node, and we call adjust()
to update this edge's start end end position.
Node *Edge::sourceNode() const { return source; } Node *Edge::destNode() const { return dest; }
The source and destination get-functions simply return the respective pointers.
void Edge::adjust() { if (!source || !dest) return; QLineF line(mapFromItem(source, 0, 0), mapFromItem(dest, 0, 0)); qreal length = line.length(); prepareGeometryChange(); if (length > qreal(20.)) { QPointF edgeOffset((line.dx() * 10) / length, (line.dy() * 10) / length); sourcePoint = line.p1() + edgeOffset; destPoint = line.p2() - edgeOffset; } else { sourcePoint = destPoint = line.p1(); } }
In adjust()
, we define two points: sourcePoint
, and destPoint
, pointing at the source and destination nodes' origins respectively. Each point is calculated using local coordinates.
We want the tip of the edge's arrows to point to the exact outline of the nodes, as opposed to the center of the nodes. To find this point, we first decompose the vector pointing from the center of the source to the center of the destination node into X and Y, and then normalize the components by dividing by the length of the vector. This gives us an X and Y unit delta that, when multiplied by the radius of the node (which is 10), gives us the offset that must be added to one point of the edge, and subtracted from the other.
If the length of the vector is less than 20 (i.e., if two nodes overlap), then we fix the source and destination pointer at the center of the source node. In practice this case is very hard to reproduce manually, as the forces between the two nodes is then at its maximum.
It's important to notice that we call prepareGeometryChange() in this function. The reason is that the variables sourcePoint
and destPoint
are used directly when painting, and they are returned from the boundingRect() reimplementation. We must always call prepareGeometryChange() before changing what boundingRect() returns, and before these variables can be used by paint(), to keep Graphics View's internal bookkeeping clean. It's safest to call this function once, immediately before any such variable is modified.
QRectF Edge::boundingRect() const { if (!source || !dest) return QRectF(); qreal penWidth = 1; qreal extra = (penWidth + arrowSize) / 2.0; return QRectF(sourcePoint, QSizeF(destPoint.x() - sourcePoint.x(), destPoint.y() - sourcePoint.y())) .normalized() .adjusted(-extra, -extra, extra, extra); }
The edge's bounding rectangle is defined as the smallest rectangle that includes both the start and the end point of the edge. Because we draw an arrow on each edge, we also need to compensate by adjusting with half the arrow size and half the pen width in all directions. The pen is used to draw the outline of the arrow, and we can assume that half of the outline can be drawn outside of the arrow's area, and half will be drawn inside.
void Edge::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { if (!source || !dest) return; QLineF line(sourcePoint, destPoint); if (qFuzzyCompare(line.length(), qreal(0.))) return;
We start the reimplementation of paint() by checking a few preconditions. Firstly, if either the source or destination node is not set, then we return immediately; there is nothing to draw.
At the same time, we check if the length of the edge is approximately 0, and if it is, then we also return.
// Draw the line itself painter->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter->drawLine(line);
We draw the line using a pen that has round joins and caps. If you run the example, zoom in and study the edge in detail, you will see that there are no sharp/square edges.
// Draw the arrows double angle = std::atan2(-line.dy(), line.dx()); QPointF sourceArrowP1 = sourcePoint + QPointF(sin(angle + M_PI / 3) * arrowSize, cos(angle + M_PI / 3) * arrowSize); QPointF sourceArrowP2 = sourcePoint + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize, cos(angle + M_PI - M_PI / 3) * arrowSize); QPointF destArrowP1 = destPoint + QPointF(sin(angle - M_PI / 3) * arrowSize, cos(angle - M_PI / 3) * arrowSize); QPointF destArrowP2 = destPoint + QPointF(sin(angle - M_PI + M_PI / 3) * arrowSize, cos(angle - M_PI + M_PI / 3) * arrowSize); painter->setBrush(Qt::black); painter->drawPolygon(QPolygonF() << line.p1() << sourceArrowP1 << sourceArrowP2); painter->drawPolygon(QPolygonF() << line.p2() << destArrowP1 << destArrowP2); }
We proceed to drawing one arrow at each end of the edge. Each arrow is drawn as a polygon with a black fill. The coordinates for the arrow are determined using simple trigonometry.
GraphWidget Class Definition
is a subclass of QGraphicsView, which provides the main window with scrollbars.
class GraphWidget : public QGraphicsView { Q_OBJECT public: GraphWidget(QWidget *parent = nullptr); void itemMoved(); public slots: void shuffle(); void zoomIn(); void zoomOut(); protected: void keyPressEvent(QKeyEvent *event) override; void timerEvent(QTimerEvent *event) override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif void drawBackground(QPainter *painter, const QRectF &rect) override; void scaleView(qreal scaleFactor); private: int timerId = 0; Node *centerNode; };
The class provides a basic constructor that initializes the scene, an itemMoved()
function to notify changes in the scene's node graph, a few event handlers, a reimplementation of drawBackground(), and a helper function for scaling the view by using the mouse wheel or keyboard.
GraphWidget::GraphWidget(QWidget *parent) : QGraphicsView(parent) { QGraphicsScene *scene = new QGraphicsScene(this); scene->setItemIndexMethod(QGraphicsScene::NoIndex); scene->setSceneRect(-200, -200, 400, 400); setScene(scene); setCacheMode(CacheBackground); setViewportUpdateMode(BoundingRectViewportUpdate); setRenderHint(QPainter::Antialiasing); setTransformationAnchor(AnchorUnderMouse); scale(qreal(0.8), qreal(0.8)); setMinimumSize(400, 400); setWindowTitle(tr("Elastic Nodes"));
's constructor creates the scene, and because most items move around most of the time, it sets QGraphicsScene::NoIndex. The scene then gets a fixed scene rectangle, and is assigned to the GraphWidget
The view enables QGraphicsView::CacheBackground to cache rendering of its static, and somewhat complex, background. Because the graph renders a close collection of small items that all move around, it's unnecessary for Graphics View to waste time finding accurate update regions, so we set the QGraphicsView::BoundingRectViewportUpdate viewport update mode. The default would work fine, but this mode is noticably faster for this example.
To improve rendering quality, we set QPainter::Antialiasing.
The transformation anchor decides how the view should scroll when you transform the view, or in our case, when we zoom in or out. We have chosen QGraphicsView::AnchorUnderMouse, which centers the view on the point under the mouse cursor. This makes it easy to zoom towards a point in the scene by moving the mouse over it, and then rolling the mouse wheel.
Finally we give the window a minimum size that matches the scene's default size, and set a suitable window title.
Node *node1 = new Node(this); Node *node2 = new Node(this); Node *node3 = new Node(this); Node *node4 = new Node(this); centerNode = new Node(this); Node *node6 = new Node(this); Node *node7 = new Node(this); Node *node8 = new Node(this); Node *node9 = new Node(this); scene->addItem(node1); scene->addItem(node2); scene->addItem(node3); scene->addItem(node4); scene->addItem(centerNode); scene->addItem(node6); scene->addItem(node7); scene->addItem(node8); scene->addItem(node9); scene->addItem(new Edge(node1, node2)); scene->addItem(new Edge(node2, node3)); scene->addItem(new Edge(node2, centerNode)); scene->addItem(new Edge(node3, node6)); scene->addItem(new Edge(node4, node1)); scene->addItem(new Edge(node4, centerNode)); scene->addItem(new Edge(centerNode, node6)); scene->addItem(new Edge(centerNode, node8)); scene->addItem(new Edge(node6, node9)); scene->addItem(new Edge(node7, node4)); scene->addItem(new Edge(node8, node7)); scene->addItem(new Edge(node9, node8)); node1->setPos(-50, -50); node2->setPos(0, -50); node3->setPos(50, -50); node4->setPos(-50, 0); centerNode->setPos(0, 0); node6->setPos(50, 0); node7->setPos(-50, 50); node8->setPos(0, 50); node9->setPos(50, 50); }
The last part of the constructor creates the grid of nodes and edges, and gives each node an initial position.
void GraphWidget::itemMoved() { if (!timerId) timerId = startTimer(1000 / 25); }
is notified of node movement through this itemMoved()
function. Its job is simply to restart the main timer in case it's not running already. The timer is designed to stop when the graph stabilizes, and start once it's unstable again.
void GraphWidget::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Up: centerNode->moveBy(0, -20); break; case Qt::Key_Down: centerNode->moveBy(0, 20); break; case Qt::Key_Left: centerNode->moveBy(-20, 0); break; case Qt::Key_Right: centerNode->moveBy(20, 0); break; case Qt::Key_Plus: zoomIn(); break; case Qt::Key_Minus: zoomOut(); break; case Qt::Key_Space: case Qt::Key_Enter: shuffle(); break; default: QGraphicsView::keyPressEvent(event); } }
This is GraphWidget
's key event handler. The arrow keys move the center node around, the '+' and '-' keys zoom in and out by calling scaleView()
, and the enter and space keys randomize the positions of the nodes. All other key events (e.g., page up and page down) are handled by QGraphicsView's default implementation.
void GraphWidget::timerEvent(QTimerEvent *event) { Q_UNUSED(event); QVector<Node *> nodes; const QList<QGraphicsItem *> items = scene()->items(); for (QGraphicsItem *item : items) { if (Node *node = qgraphicsitem_cast<Node *>(item)) nodes << node; } for (Node *node : qAsConst(nodes)) node->calculateForces(); bool itemsMoved = false; for (Node *node : qAsConst(nodes)) { if (node->advancePosition()) itemsMoved = true; } if (!itemsMoved) { killTimer(timerId); timerId = 0; } }
The timer event handler's job is to run the whole force calculation machinery as a smooth animation. Each time the timer is triggered, the handler will find all nodes in the scene, and call Node::calculateForces()
on each node, one at a time. Then, in a final step it will call Node::advance()
to move all nodes to their new positions. By checking the return value of advance()
, we can decide if the grid stabilized (i.e., no nodes moved). If so, we can stop the timer.
void GraphWidget::wheelEvent(QWheelEvent *event) { scaleView(pow(2., -event->angleDelta().y() / 240.0)); }
In the wheel event handler, we convert the mouse wheel delta to a scale factor, and pass this factor to scaleView()
. This approach takes into account the speed that the wheel is rolled. The faster you roll the mouse wheel, the faster the view will zoom.
void GraphWidget::drawBackground(QPainter *painter, const QRectF &rect) { Q_UNUSED(rect); // Shadow QRectF sceneRect = this->sceneRect(); QRectF rightShadow(sceneRect.right(), sceneRect.top() + 5, 5, sceneRect.height()); QRectF bottomShadow(sceneRect.left() + 5, sceneRect.bottom(), sceneRect.width(), 5); if (rightShadow.intersects(rect) || rightShadow.contains(rect)) painter->fillRect(rightShadow, Qt::darkGray); if (bottomShadow.intersects(rect) || bottomShadow.contains(rect)) painter->fillRect(bottomShadow, Qt::darkGray); // Fill QLinearGradient gradient(sceneRect.topLeft(), sceneRect.bottomRight()); gradient.setColorAt(0, Qt::white); gradient.setColorAt(1, Qt::lightGray); painter->fillRect(rect.intersected(sceneRect), gradient); painter->setBrush(Qt::NoBrush); painter->drawRect(sceneRect); // Text QRectF textRect(sceneRect.left() + 4, sceneRect.top() + 4, sceneRect.width() - 4, sceneRect.height() - 4); QString message(tr("Click and drag the nodes around, and zoom with the mouse " "wheel or the '+' and '-' keys")); QFont font = painter->font(); font.setBold(true); font.setPointSize(14); painter->setFont(font); painter->setPen(Qt::lightGray); painter->drawText(textRect.translated(2, 2), message); painter->setPen(Qt::black); painter->drawText(textRect, message); }
The view's background is rendered in a reimplementation of QGraphicsView::drawBackground(). We draw a large rectangle filled with a linear gradient, add a drop shadow, and then render text on top. The text is rendered twice for a simple drop-shadow effect.
This background rendering is quite expensive; this is why the view enables QGraphicsView::CacheBackground.
void GraphWidget::scaleView(qreal scaleFactor) { qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); if (factor < 0.07 || factor > 100) return; scale(scaleFactor, scaleFactor); }
The scaleView()
helper function checks that the scale factor stays within certain limits (i.e., you cannot zoom too far in nor too far out), and then applies this scale to the view.
The main() Function
In contrast to the complexity of the rest of this example, the main()
function is very simple: We create a QApplication instance, then create and show an instance of GraphWidget
. Because all nodes in the grid are moved initially, the GraphWidget
timer will start immediately after control has returned to the event loop.
© 2024 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.


text:
created 2003 · complexity basic · author Stanislav Sitar · version 5.7
- See proposal below to replace this with a redirect.
The question of using Vim for writing email messages with Vim on windows was raised many times.
Finally there is an elegant solution. At http://sylpheed-claws.sourceforge.net/win32/
download sylpheed-0.9.6claws.exe
and install.
Go to menu configuration -> Common preferences
Go to tab Other and fill something like
c:\Progra~1\Vim\vim62b\gvim.exe -f "%s"
(depending on where your Vim is installed) as the the editor option
The -f option is very important so Vim does not fork.
You might also go to Compose tab and select Automatically launch an external editor.
Are you sure about the "-f" flag ? So far, I've never seen this flag do anything under Windows. That's why I use mutt compiled for cygwin with the win32 version of Vim.
You wrote "Finally there is an elegant solution", but there are many solutions: at random Mahogany http://mahogany.sf.net (excellent one) or pine (great, ever great) or use Google.
Let me get this right - you want me to switch to a whole new email client just so that I can change its default editor to something else. Not just Vim - *anything*. How is this a Vim tip, exactly??
PC-Pine offers an external-editor-feature too.
Look at script#1052 -- it can send, receive and organize emails from within Vim on Windows and Unix (but requires not only Vim with embedded Perl but also external Perl).
See VimTip805 for a general solution for Windows.
I propose replacing this page with a redirect to tip 805: Use gvim as an external editor for Windows apps. There is nothing useful here. Any comments? (I'm putting this in to see if that reminds me to find this later.) JohnBeckett 09:11, August 20, 2011 (UTC)

subset: commoncrawl


text:
barmar, on 2020-July-08, 20:19, said:
The only health-related class I remember was sometime in 5th or 6th grade they had an evening assembly where they told us about how our bodies would be changing during puberty. I'm pretty sure they had separate sessions for boys and girls, and I recall my father going with me. I assume it must have been optional, as I'm sure many parents would have preferred to deal with it (or not) at home. I'm pretty sure it was the first time I'd heard the word "masturbation".
My older daughter was in 8th grade in the early 70s. At some teacher/parent discussion I learned that they would be discussing sexual matters in class. I had no problem with factual discussion, but I expressed wariness about any plans for instruction about what they should and shouldn't do. I was assured that would not be part of the teaching.
Giving advice puts the teacher in an almost impossible position, or so I think. At one extreme I recall a push for sexual encouragement, summarized (probably jokingly) as "Sex before eight, before it's too late" and at the other extreme there is the expectation of virgin brides. maybe even virgin bridegrooms. As a senior in high school, 1955-56, I took psychology. In 1950s St. Paul sexual matters were close to forbidden in high school courses, but the teacher did advise "No matter how modern a young woman might believe she is, she cannot really be happy about having a sexual relationship outside of marriage". Ok, it's a bit simplistic, but it could be understood as "It's serious stuff, don't approach it frivolously". This is another teacher I liked a great deal. To see just how much sex was avoided even in a psychology class, he suggested that for a term paper I research and write about Freud. I said "Who is Freud?". The name had not come up in our lessons.
In my introductory post on this thread I said "It might be useful to recall our own younger years, the good and the bad, in thinking of what might work." When I was 12 or so I checked out a book from the school library called Mythology that included a story about a bathing goddess Diana. I just looked it up on the wik and although I had mis-remembered some of the details, I had the general idea right:
The myth of Diana and Actaeon can be found in Ovid's Metamorphoses. The tale recounts the unfortunate fate of a young hunter named Actaeon, who was a grandson of Cadmus, and his encounter with chaste Artemis, known to the Romans as Diana, goddess of the hunt. The latter is nude and enjoying a bath in a spring with help from her escort of nymphs when the mortal man unwittingly stumbles upon the scene. The nymphs scream in surprise and attempt to cover Diana, who, in a fit of embarrassed fury, splashes water upon Actaeon. He is transformed into a deer with a dappled hide and long antlers, robbed of his ability to speak, and thereafter promptly flees in fear. It is not long, however, before his own hounds track him down and kill him, failing to recognize their master.[1]
I was an easily frightened child and this really upset me.
Anyway, I sometimes think educational experts totally forget their own childhoods as they give advice. In this time where we have to cope with severe additional problems, care is needed. Learning just how the world works is not easy.


text:
As part of the Glasgow 2014 Cultural Programme Edinburgh Art Festival in partnership with City Art Centre presents a major international exhibition of contemporary art selected by five curators from Commonwealth countries. Over 20 international artists explore and interrogate the ideas, ideals and myths which underpin notions of community, common-wealth, and the commons. Curated by Aaron Kreisler, Kathleen Ritter, Richard Hylton, Thembinkosi Goniwe, Vidya Shivadas with works by Amar Kanwar, Antonia Hirsch, Arpita Singh, Brian Jungen and Duane Linklater, Derek Sullivan, Emma Rushton and Derek Tyman, Gavin Hipkins, Kay Hassan, Kushana Bush, Mary Evans, Mary Sibande, Masooma Syed, Naeem Mohaiemen, Pascal Grandmaison, Rebecca Belmore, Shannon Te Ao, Shilpa Gupta, Steve Carr, Tam Joseph, Uriel Orlow, Yvonne Todd.
31 Jul '14 – 19 Oct '14


text:
Tag: New Landscape Plants
A Sneak Peek At 13 New Plant Varieties For 2023
Star Roses and Plants Showcases 13 New Varieties At Cultivate Show
Star® Roses and Plants presented its new 2023 plant varieties at Cultivate'22. The event...
Low Input, High Impact Landscapes
Lawn alternatives for water management, eco-benefit, and beauty.
Bartlett Finds Successful Treatments For Beech Leaf Disease
Bartlett researchers have found two successful treatments for Beech Leaf Disease, or BLD. They include a foliar application program for small trees and a root flare injection for large trees.
Featured Videos
[VIDEO] Dickies®: Discover Workwear That's Anything But Uniform
Looking for uniform solutions for your large team? An unmatched inventory and versatile looks are just a few reasons why companies trust Dickies®.
A Preview Of Hardscape North America 2024
New speakers, a new Hardscape Construction Roundtable, an expanded estimating session, and more are planned at Hardscape North America 2024.
John Deere Debuts Five New P-Tier Models & Three New Attachments
John Deere introduces the 330 and 334 P-Tier Skid Steer Loaders, the 331, 333 and 335 P-Tier Compact Track Loaders to market.
Hilltip Brings Line Of SnowStriker ™ Snowplows To North America
Hilltip's SnowStriker™ snowplows compatible with half-ton pickups, SUVs, UTVs, tractors, and loaders, have come to North America.
Remote-Operated, Autonomous Industrial Snow Plow Hits The Market
Teleo and Storm Equipment have introduced America's only remote-operated and autonomous industrial snow plow.


text:
Reporting? Look no further!
To create advanced reports, it is important to have full control over the layout and behaviour of the report. DataFlex Reports provides an extensive visual designer and a vast library for software developers, to integrate reports in Windows, web and mobile applications.
Reports convey information. But they require a good, functional design as well. DataFlex Reports comes with a visual designer to create good looking reports. The WYSIWYG tools really help to create a pixel-perfect result, including text, objects and charts.
Creating new reports is fully guided by means of a wizard. Simply go through all steps to get a first version of your report. It includes collecting data, visually creating or checking relationships between tables, selecting fields to show, sub-totals, sorting, filtering etc. etc.
Fully programmable formulas at one end are complemented with a very simple to use Filter Expert. Simply apply constraints with a wizard-like support.
Information can be shared in a variety of ways; different types of reports can be made. Lists, labels and charts. Each type of report suits a different purpose.
Reports dont necessarily need to be printed on paper. On the contrary, todays business demands need to cover digital methods of sharing reports, and data. Therefore export options allow the user to produce PDF, HTML, Word, Excel, CSV and pictures as output.
For integrating reports in a Windows application, a viewer (OCX) is available. However, delivery of information is not limited to that. People want to look at reports on any device. DataFlex reports supports smart technology, delivering information as PDF or HTML on web and mobile devices.
End-users can create their own reports easily. These reports can be run stand-alone in the DataFlex Reports Studio. For more flexibility, reports can be started from a command-line with parameters.
DataFlex Reports supports all popular databases like Microsoft SQL Server, Oracle and IBM DB2. And it supports reporting on the embedded DataFlex database as well!
Version 6.2 introduces support for SQLite databases
The integration library that comes with DataFlex reports offers a vast array of options to control which printer is used, and how it is used. This includes running reports in a Citrix, or Terminal Services environment as well as selecting a specific paper tray, to do the job.
Some reports become quite complex. In order to keep such a report easily maintainable sometimes the best thing to do is to break it down into sub-reports. Sub-reports are fully integrated into the main report, which further simplifies maintenance and deployment.
Page layers are a very unique feature for a report writing tool. Page layers are the option to add a visual or graphic design to a report. As a background one, or more page layers can be added. The layers can be programmatically added or removed from a report.
Watch the video about page Layers and what they can do for you!
Software engineers love the vast and extensive library that comes with DataFlex Reports. It gives them full control over reporting within their applications, be it Windows, or Web.
When information is shown on screen, it is possible to make the data interactive. This means that a click in a particular part of the screen, may bring up a dialog that offers specific functionality. It can be a hyperlink-like connection to underlying data (drill-down), or a pop-up view, to change the address of the customer, whose data was clicked on
Within the Studio, when designing reports, a formula editors displays all functions, variables, statements and constants. These formulas can perform certain calculations, textual manipulation, or influence the response or look of the report. Think of conditional pagination, or formatting.
The Runtime Data Source feature is a very special option to load data into your report. A host application collects the data in a virtual array, and the report will run against this data. So, the data collection is fully at the discretion of the programmer. Data can come from a database, but also a web service, or another non-DBMS source.
Watch the video on how to use Runtime Data Source, to create advanced reports!
Sometimes there is a need for a highly specialized function that is not supported by DataFlex Reports. An external function can be developed, for example in C that can be invoked in the system, making a new function available for creating formulas.
DataFlex Reports is a product that supports many functions and features and supports a library for the developer that is very extensive. To read more about the features, read the documentation of the Developer Edition.


text:
As Thursday draws to a close in Kyiv and in Moscow, here are the key developments of the day:
No breakthrough came from the highest-level Ukraine-Russia meeting since fighting began. Ukrainian Foreign Minister Dmytro Kuleba and his Russian counterpart Sergey Lavrov reached no significant agreement in Antalya, Turkey, in the countries' first cabinet-level meeting since the start of the invasion on Feb. 24.
The toll of Russia's attack on a maternity hospital in Mariupol becomes clearer. Ukrainian officials say three people died, including one child, and at least 17 people were wounded in Wednesday's attack. Russian authorities claim the hospital was used as a paramilitary base. Russia's Embassy in the U.K. claimed in a tweetthat a pregnant beauty blogger "played" an injured victim for photos with "realistic makeup." Mariupol, meanwhile, remains under siege. These satellite images show the devastation.
The U.S. still believes a no-fly zone over Ukraine could result in a larger war. Secretary of State Antony Blinken said either a full or limited no-fly zone would "almost certainly" lead to a direct confrontation between Russia and the U.S. and NATO. Visiting Poland,Vice President Kamala Harris voiced support for an international investigation into war crimes by Russia.
Goldman Sachs became the first major Wall Street bank to pull out of Russia. This follows exits by McDonald's, Pepsi, Coca-Cola, Starbucks and hundreds of otherforeign companies. Despite concerns from journalists and activists, Google imposed more restrictions on payments from YouTube — among the country's most popular platforms, and one of the few to evade Kremlin shutdowns so far.
The Senate is expected to vote soon on a $13.6 billion emergency aid package for Ukraine that the House of Representatives approved late Wednesday as part of a massive government spending package. Lawmakers more than doubled the amount of aid as the conflict grew.
How Russia's war in Ukraine could end, according to Condoleezza Rice.
The letter Z is becoming a symbol of Russia's war in Ukraine. But what does it mean?
A Polish hotel recovering from its own tragic past has become a refuge for Ukrainians.
The first of Ukraine's fallen soldiers are starting to return home. Hundreds gather to honor them.
The U.K. sanctions Roman Abramovich, halting his plan to sell Chelsea Football Club.
As oil prices climb, the U.S. sees a potential thaw in tensions with Venezuela — Russia's top ally in Latin America.
Earlier developments
You can read more news from Thursday here, as well as more in-depth reporting and daily recaps here. Also, listen and subscribe to NPR's State of Ukraine podcast for updates throughout the day.
Copyright 2022 NPR. To see more, visit https://www.npr.org.


text:
A sailor was fatally shot aboard a U.S. Navy guided missile destroyer docked in the nation's largest naval base late Monday. Naval security forces then killed the civilian suspect.
A statement issued by the U.S. Naval Station Norfolk said the incident occurred about 11:20 p.m. aboard the USS Mahan (DDG 72).
"Naval Station Norfolk was briefly put on lockdown as a precautionary measure. The lockdown lasted approximately 45 minutes," the statement said. "No other injuries have been reported."
Base spokeswoman Terri Davis tells The Associated Press on Tuesday that the suspect was a male civilian but said she couldn't say whether he had permission to be aboard the ship or on the base. She would not describe the circumstances of the shooting but said the scene was secure.
She said the sailor killed also was a male but did not give other details about him.
The AP says:
"To get on the base, civilians must be escorted or have a pass. Each base entrance is guarded, and all 13 piers have additional security forces. As part of ongoing security efforts, handheld ID scanners were implemented this year at Navy bases in the region, including the Norfolk station.
"The shooting, which was under investigation, comes months after a September incident at the Washington Navy Yard, in which a gunman — identified as a contractor and former Navy reservist — killed 12 civilian workers before being shot to death."
Copyright 2021 NPR. To see more, visit https://www.npr.org.


text:
For seven years I have been practising Yoga without chanting more than a single syllable: OM. Not that I consider myself a person who doesn't enjoy singing, I sing with headphones, in the shower, at concerts and sometimes with friends, but mostly when I'm alone and always when I'm in a good mood. However, when it came to introducing mantra chanting in my yoga practice I considered it unnecessary and ignored the ultimate benefits it could entail both for my yoga praxis and myself. As many people do, I strongly linked the mantras strictly to a devotional dimension of Yoga that I did not wholly profess, chants where a different form of pray for me and thus I was not appealed by their nature nor by their symbolism, and was clearly driven off by the essence of religious alienation I had reduced them to. Talking to, and observing other Yoga students throughout these years, I have found that this perspective is far from being uncommon. We tend to identify chanting only with its religious dimension, ignoring its spiritual benefits but also the physical, emotional and mental effects it can have on us -from an Occidental point of view- and letting ourselves be pushed away by a bunch of prejudices we unmistakably associate to its devotional nature and its group-practice. I was no exception.
It took me seven years to reconsider such judgement and start reflecting on the effects and importance of singing in my daily life, in my character and in my mood. I then realised that I tend to sing more when I'm alone and only when I am already in a good mood, that singing made me feel happier, and that it felt even better when someone else sang along with me. These are objective conclusions that I draw solely from personal observation; meaning that, regardless of any symbolical, religious or social implication, of anything I could read or hear, I was aware of the fact I enjoy singing and that it has a positive effect on me. Again, I am no exception. We all acknowledge from personal experience that we mostly sing when we are happy, that we are usually self-conscious about our voice, so we tend to sing more when we are alone, and that, alone or along with someone else, singing unquestionably uplifts our mood. Still, we incomprehensibly refuse to consider singing as an intentional regular practice and instead we content ourselves with its spontaneous and occasional occurrence in our lives. It seems to me that, if regardless of any other consideration we recognise that singing occurs naturally in our daily routine and that it has a positive effect in ourselves, we should be open enough to consider its regular practice as a useful tool to improve our mood, our spirits and ultimately our lives. Starting from our Yoga practice, we must allow ourselves to put aside the prejudices, the religious aspects and the preconceived, and be determined to experience chanting solely from the observance of its effects in our body, mood and mind. Only then we will give mantras a chance to demonstrate their inherent power.
The OM journey
When first introducing Yoga students to chanting, it is common practice to start them with the OM chant and get them used to it before introducing any mantras at all. This established initiation procedure not only responds to the founding and essential nature of this syllable in Yogic philosophy and texts (OM is the cosmic syllable, the eternal, unity and source, the seed of any idea, word, thought, or thing in nature. OM is everything we can and cannot touch, see, feel and think. Everything is OM and OM is All) but also to the fact that our prejudices and shyness are not as strongly grounded for OM chanting as they are for mantras. OM being a single syllable allows us to be less self-conscious of our singing skills and the abstract and complex nature of its meaning and translation allows us to detach from its devotional or praying nature. These two aspects clearly helped me in introducing OM in my Yoga practice almost from the start though at first I remained somewhat suspicious of its hypothetical positive effects. I accepted it as a ritual feature, an ornament, but I didn't recognise the purpose or the importance it could have in my personal Yoga practice, not until I read about the physical and medically proved effects it has in our bodies.
Looking back, I know consider this the first turning point from my reductionist approach towards chanting in Yoga. Religious devotion and mysticism aside, I realised that singing OM on a regular basis has numerous positive physical effects in our bodies mostly due to the internal vibration of the sound in itself. It has been scientifically proved that singing OM has invaluable vibratory effects in our bodies, helps to achieve slow, regular and complete exhalation, aids to control and relax our breathing system and has several soothing effects in our minds. However, stating such benefits is frequently insufficient, it seems to me that it is essential to understand the physical explanations than underlay these benefits for a change in perception to occur in our western epistemological minds. Thus, we are now going to take the time to develop each of them separately, in order to understand why and how when we are chanting OM we aren't just singing, nor praying, but enabling a series of positive physical changes to occur in our bodies and mind, making us feel better than we did before.
Of the above mentioned, the most powerful physical benefit of chanting OM is related with its vibratory effects. The sustained 'O' -formed by the 'AU'- sound makes all the bones of the thoracic cage vibrate, proving that vibration is communicated to the mass of air contained in our lungs and that the delicate membrane of alveolus in contact with this air vibrates too, this stimulates the pulmonary cells and enables an optimum gaseous exchange in our lungs. Furthermore, the latest research of many Western physiologists has also shown how this vibration produces very accentuated effects in the endocrine glands, to which Science is gradually attributing an increasing importance.
More specifically, Dr.Leser-Lasario dedicated 25 years of study to the effects of vocal vibrations in the human body and his work has concluded, with an absolute scientific rigor, that the emission of vowels during exhales causes a vibratory auto-massage of the internal organs. These vibrations reach the deepest tissues and nervous cells, intensifying blood circulation in the target tissues and internal organs. Internal secreting glands are equally stimulated to secrete their hormones directly into the bloodstream and the lymph (pituitary, pineal, thyroids, thymus, adrenals and gonads), and this vibration of the vocal chords similarly influences both the sympathetic and vagus nerve. The musculature of the breathing apparatus is both relaxed and strengthened, expanding the thoracic cavity and thus the pulmonary capacity, an enlarged breathe which translates in an increase of oxygen supply to the whole body. Besides, the vibrant internal massage resulting from the emission of the vowels 'au', acts especially in the abdominal organs and the organs of the thoracic cage, whilst the vibration of the 'mmm' in our skulls induces a vibration of the cranial nerves.
The OM being chanted during the exhalation, it directly contributes to make it slow, regular and complete. The emission of the 'Au' sound limits the pace of the expired air, and the benefits of slow breathing are numerous and well known by Yoga practitioners (increased lung capacity results in a higher supply of oxygen, increased vitality, cleansing of the bloodstream and toxins in the lungs, and calming of the brain, amongst others). Regular exhale is a direct result of a uniform emission of the 'au' sound, which, if prolonged until the end of our capacity, assures the complete emptiness of our lungs. This complete, regular and slow breathing enables us to totally expel the stale air from our lungs and reduce as much as possible the volume of residual air. As an immediate and direct consequence of this integral emptying of the lungs, our inhale enlarges and deepens progressively, increasing our lung capacity and oxygen supply with the previously stated beneficial effects.
Chanting Om correctly will also help us to relax and gain control over our breathing apparatus. Since the exhaling is produced by a relaxation of the muscles in our breathing system, the OM sound will not be emitted uniformly unless this relaxation is fully under control. Thus, should there be any tension at the throat or muscles of the thoracic cage, the sound will exit our bodies in jolts, whereas, if the sound is continuous and smooth, it will indicate a perfect control of progressive relaxation of all the breathing muscles and subsequently a comfortable and ease inhale. This appreciation of the quality of our sound emission during our OM chanting enables us to learn how to eliminate latent and unconscious contractions in muscles of our body that we do not fully control.
And last of all, the OM chanting produces direct effects in our minds that are just as important as the effects it has in our body. The abstract and complex meaning of the syllable OM makes its way into our minds intercepting the flow of thoughts we are constantly submitted too. Our mental stuff is made out of words, when we think, talk, dream and even when we talk to ourselves internally; we use words in detriment of images. However, when the air is expelled from our lungs, accompanied by the sound OM and the vibration of the vocal chords, it occupies entirely our conscience inhibiting the process of sentence construction in our minds. Gaining the control over our minds to restrain this continuous flow of thoughts to which we are constantly subjected is the ultimate goal of Yoga practice and it can only be achieved through meditation -liberating the mind of all thoughts, what we would define as leaving the mind blank for a sustained period of time-, but gaining mastery of the mind is a long and difficult process. Therefore, the OM reveals itself as the first taste of this sensation for a new practitioner, it provides a sort of parenthesis to our minds in which we experience a preliminary detachment of this flow of thoughts that we are so used to having we can no longer conceive as possible to restrain. The fact is, OM chanting on its own will not restrain it, but it aids in achieving the first step: slowing it down. As a result of this temporary vacation from our thoughts, the mind is calmed, and because the mind governs the whole body, its calm state will in turn reflect in a further relaxation of the latest too. Furthermore, concentration becomes easier and your mind is awaken, while the electromagnetic waves produced by the vibration are spread throughout all the body increasing dynamism and vitality. The experiences of Dr. Leser-Lasario greatly proved how the entire body is relaxed by the internal vibrant-massage, which mentally liberates us from our inhibitions, depressions and complexes, harmonising our psyches.
Learning these scientific explanations underlying the benefits of OM chanting in my body was a crucial step for me to change my preconceived judgement. From then onwards I started to consider it another Yoga exercise, freed from any suspicion, this enabled me to observe its effects in my body, in my breath, in my mood. Devotion may or may not arrive with practice, but the fact is, the effects of OM chanting in our practice are just as obvious as the asanas' if we allow ourselves to experience it from the certainty that its effects greatly exceed its mystical nature and have a logical scientific base. And in order to do this, learning and understanding this base is essential for Western practitioners. Everything is ineffective if we approach it with the inner conviction that it will not work, and vice versa, placebo treatments in medicine rely strictly on this principle. Our minds are so powerful that if we convince ourselves something will be useless, even a medical treatment, we will inhibit its positive effects. Thus, liberating the OM from my doubts and prejudices was my first acknowledgment of the benefits of chanting in my Yoga practice, in fact, the Om would become the one and only chant I would perform for the following five years, before the mantras finally made their way into my practice.


text:
The Cat-Dog and the Apocalypse
December 29, 2016.
Science fiction.
Remember that: science fiction. You'll see that, in your coming nightmares, it will help you to not become so distressed, or at least not uselessly distressed.
Perhaps you remember some science fiction movie. Perhaps science fiction set some of you down the path of scientific science.
It didn't do that for me, perhaps because my favorite science fiction movie is La Nave de los Monstruosi with the unforgettable Eulalio González, known as "el Piporro," the soundtrack for which has been unjustly excluded from the Oscars, the Golden Globes, and the local and renowned "Clay Pozol Bowl."ii Perhaps you've heard talk of the movie: it's a "cult" film, according to one of those specialized magazines that nobody reads, not even the people who edit it. If you remember the film and/or you see it, you'll doubtless understand why I ended up lost in the mountains of the Mexican Southeast and not in the suffocating bureaucratic web that, at least in Mexico, chokes scientific investigation.
You'll also cheer the fact that that movie is my point of reference for science fiction, instead of 2001: A Space Odyssey by Kubrick, or Alien by Ridley Scott (with Lieutenant Ripley breaking with Charlton Heston's blueprint of the macho survivor in "Planet of the Apes"), or Blade Runner, also by Ridley, where the question "Do androids dream of electric sheep?" is the nodal point.
So you should thank Piporro and his "Star of Desire"iii and the robot Tor in love with a jukeboxiv for the fact that that I'm not on their side in this encounter.
Anyway, cinephile philias aside, let's suppose an average film of the genre: an apocalypse in progress or in the past; all of humanity in danger; first an audacious and intrepid man as the protagonist; then, from the hand of innocuous feminism, a woman, also audacious and intrepid; a group of scientists is convoked to a super secret facility (invariably of course located in the United States); a high-ranking military official explains to them: they must create a plan to save humanity; they do so, but it turns out that in the end, they need an individual hero or heroine who, as the story goes, annuls the collective work and at the last second, with a pair of pliers that appeared inexplicably, cuts the green or blue or white or black or red cable at random, and ta-da, humanity is saved; the group of scientists applauds like crazy; the young man or woman finds true love; the respectable public vacates the theater while the free-loaders check the seats to see if anyone left any half-finished cartons of popcorn, with that delicious and unbeatable taste of sodium benzoate.
The catastrophe has a variety of origins: a meteorite has changed course with the same constancy as a politician making declarations about the gas hikes; or a tornado of sharks; or a planet spinning off its course; or an irritated sun sending one of those igneous tongues out of its orbit; or an illness that comes from outer space, or a spaceship; or a biological weapon that gets out of control and, converted into an odorless gas, transforms whoever has contact with it into a professional politician or maybe into something not quite so horrible.
That, or the apocalypse is already a done deal and a group of survivors wanders without hope, introjecting the exterior barbarity into their individual and collective behavior, while humanity struggles between life and death.
The end can vary but the constant is the group of scientists, be they the ones who caused the disaster or the only hope of salvation, if of course a handsome man or woman appears at the opportune moment.
The film's conclusion could be open-ended, or it could be a downright "dark beating" (José Alfredo Jiménez had already warned us that "life isn't worth anything").
Sure, let's take as an example any novel, movie or TV series with an apocalyptic or catastrophic theme. Let's say one with a popular theme: zombies.
A concrete example: the TV series The Walking Dead. For those who aren't familiar with the plot, it's simple: due to some unspecified cause, people who die "turn into" zombies; the protagonist wanders, he encounters a group, they establish a hierarchical organization in continual crisis and they try to survive. The series' success could be due to the fact that it shows characters who, in normal situations, are mediocre or pariahs, and they become heroines and heroes willing to do whatever it takes. Some of them are:
Michonne, a housewife ignored and belittled by her husband and siblings, who becomes a fearsome warrior with a katana (played by the actress and dramaturge Danai Jekesal Gurira and, not to make you jealous, she's the only one whose real name I give because, in the trunk left by SupMarcos, I found a picture of her in the character of Michonne, dedicated by her own hand to the deceased. Arrrrroz con leche!v).
Daryl, a manipulated pariah transformed into a "tracker" and a fearsome crossbowman. Up until now the symbol of the refusal to submit, resistance and rebellion.
Glenn, a pizza delivery boy turned star explorer. The handyman and "thousand lives" of the series, until Rickman returned to the comic.
Maggie, a young woman whom the zombie apocalypse saves from the monotonous life on a farm and converts her into a leader, despite being pregnant.
Carol, an abused wife transformed into a female version of Rambo, but smart.
Carl, an adolescent who behind his eyepatch hides a serial killer, as Negan well deduced.
Eugene, a nerd who symbolized science and eventually goes from being a pathological liar to becoming useful to the group.
Father Gabriel, the self-serving, opportunistic religious leader who reconverts himself and becomes necessary.
Tara and Aaron, the lesbian woman and the gay man who ensure the political correctness of the plot.
Rosita, my preferred wet dream, the Latina who combines passion, skill and courage.
Morgan, the survivor in "shaolin monk" mode.
Sasha, the woman who changes from the classic romantic role to that of realistic survivor.
And in the upper part of the hierarchy, the battered symbol of order, Rick, an ex-sheriff's deputy who barely hides the fascist inclinations of any police officer.
I don't know what season you're on. Since the fifth one I stopped watching because the law caught up with the movie guy who used to send me the "alternative" editions and now who knows where he is (which is a shame, because he had promised me up to season 10, though not even Kirkman knows if there will be 10 seasons). But with what I've been able to watch, I understand the reason for its success.
It's not hard to follow the plot, anyway: it's enough to look at the spoilers that filter through on the respective Twitter hashtags.
A few moons ago, I asked a compañera what would have happened if Rick, or any member of the group, had known ahead of time that what was going to happen would happen. I choose the police officer as my example because it seems that he is the only one whose survival is guaranteed, at least in the comic of the same name.
Would Rick have prepared himself? Would he have constructed a bunker and stockpiled in it food, medicines, fuel, weapons and ammunition, and the complete works of George Romero?vi
Or would he perhaps have tried to stop the disaster?
The compañera, Zapatista to the end, answered me with the same question: what did I think Rick Grimes would have done?
I didn't hesitate to answer her: nothing. Even knowing what was going to happen, neither Rick nor any of the characters would have done anything.
And there's a simple reason for that: despite all the evidence, they would have kept thinking, up until the very last minute, that nothing bad was going to happen, that it wasn't such a big deal, that someone somewhere would have the solution, that order would be re-established, that there would be someone to obey and someone to boss around, that, in any case, the tragedy would happen to other people, somewhere else, geographically distant or distant in terms of their social position.
They would think up until the night before that the tragedy was something destined not for them [ellas, ellos, elloas], but for those who survive below… and to the left.
Zombies aside, in the majority of those apocalyptic narratives, there are one or more moments in which someone, invariably the protagonist, when everyone is surrounded by a horde of zombies or the meteorite is a short distance from their heads, or in a similar situation, says, with all the serenity and aplomb, "Everything is going to be all right".
And it turns out that for this meeting I got stuck with the role of party pooper. So I should tell you what we see: No, it's not a science fiction movie, but rather reality; and no, everything is not going to be all right, only a few things will be all right if we prepare ourselves ahead of time.
According to our analysis (and until now, we haven't seen anyone or anything that refutes it; on the contrary, they confirm it), we are already in the middle of a structural crisis that, in colloquial terms, means the reign of criminal violence, natural disasters, runaway shortages and unemployment, scarcity of basic services, collapse of energy infrastructure, migration, hunger, sickness, destruction, death, desperation, anguish, terror, helplessness.
In sum: dehumanization.
The crime is in progress. The biggest, most brutal and cruel crime in the brief history of humanity.
And the criminal is a system willing to go to any lengths: capitalism.
In apocalyptic terms: it's a fight between humanity and the system, between life and death.
The second option, death—I wouldn't recommend it.
Actually, don't die. It's not in your best interest. Believe me, I know something about that because I've died several times.
It's very boring. Since the entrances to heaven and hell suffer from an annoying bureaucracy (though it's not as bad as those in the universities and research centers), the wait is worse than an airport or a bus station during holiday season.
Hell's the same, you have to organize gatherings of the arts, exact and natural sciences, social sciences, originary peoples, and other equally terrible things. They force you to bathe and comb your hair. They inject you and make you to eat squash soup all the time. You have to listen to Peña Nieto and Donald Trump in a never-ending press conference.
Heaven, for its part, is the same, just that there you have to put up with a monotonous chorus of palid angels, and they all give you the runaround if you want to talk to God to complain about the music.
In sum: say no to death and yes to life.
But don't fool yourselves.
You're going to have to fight every day, at all hours and everywhere.
In that fight, sooner or later, you'll realize that only collectively will you have any possibility of triumph.
And even so, you'll see that you also need the arts and that you need us, too, and others [otros, otras, otroas] like us.
Organize yourselves.
As Zapatistas we are, we're not only not asking you to abandon your scientific practice, we're demanding that you continue it and deepen it.
Continue exploring this and other worlds, don't stop, don't despair, don't give up, don't sell out, don't give in.
But we're also asking you to seek out the arts. Even though the contrary might seem to be true, they will "anchor" your scientific task in what you have in common: humanity.
Enjoy dance in any of its forms. Perhaps at the beginning you won't be able to avoid framing the movements in the laws of physics, but afterwards you'll feel it, boom.
Go beyond geometry, color theory and neurology and enjoy painting and sculpture.
Resist the temptation to find the scientific logic to that poem, that novel, and let the words discover galaxies for you that only inhabit the arts.
Surrender when faced with the lack of scientific basis to the stories that in theater and film peer into that which is humanly imperfect, unstable, and unpredictable.
And so on with all the arts.
Now imagine that it's not your own daily life but rather the arts which are in danger of extinction.
Imagine people, not statistics: men, women, children, elders, with a face, a history, a culture, threatened with annihilation.
See yourselves in those mirrors.
Understand that it's not about fighting for them or in their place, but rather with them.
See yourselves as we Zapatistas see you.
Science is not your limit, your dead weight, your useless burden, the activity you should carry out in clandestinity or hiding in the closet of the academies and institutes.
Understand what we have already understood: that, as scientists, you all fight for humanity, that is to say, for life.
Yesterday Subcomandante Insurgente Moisés was explaining to us that the communities are, and have been for decades, our teachers and tutors. That the interest in science is new in Zapatismo. That it's been incited by the new generations, by the Zapatista youth who want to know more and better how the world works. That out of the organized communities came this newest push that has us here in front of you.
It's true. But what's not new in Zapatismo is the struggle for life.
Even in our willingness and plans when faced with death, we were concerned with life from the start.
Those who are older, or who are interested despite not being older, may know about the uprising: the taking of 7 municipal capitals, the bombardments, the clashes with the military forces, the desperation of the government upon seeing that they couldn't defeat us, the civil uprising that forced them to stop, what's followed in these almost 23 years.
What you might not know is what I'm going to tell you next:
We prepared ourselves to kill and to die—Subcomandante Insurgente Moises already summarized that for you. So then we had two options in front of us: the country as a whole would be ignited, or we would be annihilated. Imagine our bewilderment when neither the one nor the other took place. But that's another story for which perhaps there will be another occasion.
Two options, but both had the common denominator of death and destruction. Even though you might not believe it, the first thing we did was prepare ourselves to live.
And I don't mean those of us who fought in combat, those of us for whom knowledge of the resistance of different materials was useful for taking cover and finding shelter in combat and during bombardments; nor the knowledge that allowed the insurgent health workers to save the lives of dozens of Zapatistas.
I'm talking about the Zapatista bases of support, those to whom, as Subcomandante Insurgente Moisés explained last night, we owe the path, the pace, the direction and the destination as Zapatistas we are, just as we owe to them the interest in the arts, the sciences, and the effort to include us with the workers of the countryside and the cities, the world headquarters of struggle, resistance, and rebellion that's called "the Sixth."
Starting a few years prior to that apparently now distant January 1, in the Zapatista communities the so-called "reserve battalions" were formed.
The mission that was given to them was the most important one in the gigantic operation that carried thousands into combat: to survive.
For months they were given instruction. Thousands of boys, girls, women, men and elders trained to protect themselves from bullets and bombs; to gather and retreat in orderly fashion in case the army attacked or bombarded the towns; to place and locate deposits of food, water and medicine that would allow them to survive in the mountains for a long time.
"Do not die" was the only order that they were to follow.
The order that those of us who went to combat had was: "Don't give up, don't sell out, don't give in."
When we came back to the mountains and we met back up with our communities, we fused the two orders and made them into one alone: "Struggle to build our freedom."
And we agreed to do so with everyone [todas, todos, todoas].
And we agreed that, if it wasn't possible to do so in this world, then we would make another world, a bigger one, a better one, one where all the possible worlds fit, the ones that already exist and the ones we still haven't imagined but that can already be found in the arts and sciences.
Thank you very much.
From CIDECI-Unitierra.
Mexico, December 2016.
From the Notebook of the Cat-Dog.
"What's Lacking"
I was in my hut, reviewing and analyzing some videos of plays by Maradona and Messi.
Like a premonition, a ball bounced inside. "Defensa Zapatista" arrived behind it, entering without giving notice or asking permission. Behind the girl came the notorious Cat-Dog.
"Defensa Zapatista" grabbed the ball and approached to look over my shoulder. I was busy trying to keep the Cat-Dog from eating the computer mouse so I didn't notice that the girl was watching the videos with great interest.
"Hey Sup", she said to me, "do you think Maradona and Messi are all that?"
I didn't answer. From experience I know that Defensa Zapatista's questions are either rhetorical or she's not interested in hearing my answer.
She continued:
"But you're not seeing the issue," she said, "for as much as they might have of art and science, they both have a serious lack."
Yes, that's how she said it: "lack." There I did interrupt her and I asked, "And just where did you get that word or where did you learn it?"
She responded, indignant: "That very bad Pedrito said it to me. He told me that I couldn't play football because girls lack technique."
"I got mad and I gave him a slap upside the head, because I didn't know what that word meant and what if it's a bad word. Of course, the very bad Pedrito ran to the education promotora to make a complaint about me and they called me in. I explained to the teacher the national and international situation, as they say, that the situation with the Hydra is really messed up and everything. And since the promotora understood that we have to support each other as the women we are, they didn't reprimand me, but they sent me to look up what "lack" means. And well, I thought it was a better punishment than if they had sent me to eat squash soup."
I nodded understandingly as I tried to get the mouse out of the Cat-Dog's mouth.
"Well anyway, I went to look up what "lack" means on the internet in the office of the Junta de Buen Gobierno [Good Government Council] and I found that it's a song by the musicians of the struggle, that it's really happy and that everyone starts dancing and jumping around as if they gotten into an anthill of leafcutter ants. So I went to the education promotora and I told her that "lack" is a song that goes: "I wake up in the morning and I don't feel like going to school." She laughed and told me, "it's 'going to work.'" So then I told her that songs are up to each person's taste and the problems they have. Which is to say I gave her the political explanation, but I don't think she understood, because she just laughed. And then she sent me back to find out not about the song, but rather to look up what the word means. So I headed back and when I get there I had to wait for the guy who was on duty at the Junta to send out a denunciation. After that I was able to go in and there I saw that "lack" means you're missing something. So I headed back to the education promotora and told her, and she said that there, now I'd seen that it wasn't a bad word and she congratulated me. But since Pedrito was there eavesdropping I gave him another slap upside the head for going around saying that I lack technique. And then the promotora said she was going to tell my moms that I was doing that kind of thing, so I came to hide here because I know that nobody comes to see you."
I took the jab heroically, as I was finally able to snatch the mouse back from the Cat-Dog.
"Defensa Zapatista" continued her long-winded speech:
"But don't worry Sup, before coming in, first I peeked in to make sure you weren't looking at pictures of naked ladies that, errrr, just to get it over with, Sup, it's really unbelievable, and anyway I'm not going to make a complaint against you with the collective "The Women We Are," but I'll tell you plainly that it's no good what you're doing, because it just means you have a lack of moms, that is, like SupMoy says when he gets angry, no tienes madre" [you have no mother].
I'd like to clarify here that it's not true what "Zapatista Defense" says, what happened is that I was taking a correspondence course on anatomy.
Anyway, before the girl could continue airing my secrets, I asked her why she said that Maradona and Messi were seriously lacking in something.
She was almost in the threshold of the door when she answered:
"Because they're missing the most important thing: being women."
"An Interstellar Trip"
Among the pile of papers and drawings that the late SupMarcos left, I found what I'm going to read to you below. It's a sort of draft or notes for a script, or something like that, supposedly for a science fiction film. It's called:
Toward What Does the Gaze Look?
Planet Earth. Some year in the distant future, let's say 2024. Among the new tourist destinations, now it's possible to travel to space and go around the world in a satellite adapted "ad hoc" for that purpose. The spaceship is a scale replica of the lunar satellite, with a big window that looks out, during the whole trip, onto Earth. On the other side, let's say the back, there's a sort of skylight, about the size of a house window, that always looks out onto the rest of the galaxy. The tourists, of all colors and nationalities, crowd up against the window that looks onto the planet of origin. They take selfies and live-stream the images of the world, "blue like an orange," to their friends and family. But not all the travelers are on that side. At least four people are in front of the opposite window. They're forgotten about their respective cameras and they look out in ecstasy at the jumbled collage of celestial bodies: the snaking line of dusty light that is the Milky Way, the twinkling glimmer of stars that might not exist anymore, the frenetic dance of asteroids and planets.
One of the people is an artist; they're not immobile, in their brain they imagine rhythms, lines and colors, movements, sequences, words, inert or mobile representations; their hands and fingers move involuntarily, their lips mumble incomprehensible words and sounds, their eyes open and close continuously. The arts see what they see and they see what could come to be seen.
Another one of the people is a scientist; their body doesn't move at all, they look fixedly not at the closest lights and colors but rather at the most distant ones; in their brain they imagine unthought galaxies, inert and living worlds, stars being born, insatiable black holes, interplanetary vessels without flags. The sciences see what they see and they see what could come to be seen.
The third person is indigenous, of short stature, with dark skin and ancestral features. They look at and touch the window. Their mind and body press upon the solid, transparent material. In their brain they imagine the path and the pace, the speed and the rhythm; they imagine a destination that's constantly changing. The originary peoples see what they see and they see the life that could be created in order to be seen.
The fourth person is Zapatista, of changing color and features. They look through and delicately touch the glass with their hand. They take our their notebook and start writing frenetically. In their brain they begin to make calculations, lists of tasks, jobs to start, they trace maps, they dream. Zapatismo sees what it sees and sees the world that it will be necessary to build so that the arts, sciences, and originary peoples can realize and fulfill what they see with their gaze.
At the end of the trip, while the other travelers acquire their last souvenirs in the "duty free" shops, the artist runs to their studio, or whatever it is, so that others [otros, otras, otroas] can see and feel what they see; the scientist immediately convokes other scientists because there are theories and formulas that need to be proposed, demonstrated, and applied; the indigenous person gets together with their fellow peoples and tells them what they saw in order that, collectively, the gaze can define the path, the pace, the company, the rhythm, the speed and the destination.
The Zapatista person goes to their community and in the community assembly explains and details everything that must be done so that the artist, the scientist, and the indigenous person can travel. The first thing the assembly does is critique the story or the tale or the script or whatever it's called, because it's missing the workers of the city and the countryside. It is proposed then that a commission write a letter to the deceased SupMarcos so that he puts the fifth element in the story, that is, the Cat Dog, because it already ate the internet cable and two flash drives belonging to the Tercios Compas, and it spends all its time chasing around the computer mouse, so better that they take it with them; and so that he also adds, as the sixth element, the Sixth, because without the Sixth the story isn't complete. Having approved this, the assembly proposes, discusses, adds and subtracts, plans the timetables, distributes the tasks, votes to determine general agreement and names the commissions for each task.
Before the assembly is adjourned and everyone goes to start the tasks assigned to them, a little girl asks to have the floor.Without coming up to the front, standing almost at the back of the communal house, the girl strains to raise her voice and says: "I propose that on the list of things to take, that they include a soccer ball and a whole lot of pozol." The rest of the assembly laughs uproariously. SubMoy, who's sitting on the panel that's coordinating the meeting, calls for order. Having achieved silence, SubMoy asks the girl what her name is. The girl responds, "My name is Defensa Zapatista," and she puts on her best "you'll never get past me, not even if you're aliens" face. SubMoy then asks Defensa Zapatista why she is proposing this.
The girl climbs up on a wooden bench and argues: "The ball is because if they aren't going to be able to play, then it's pointless to go there where they want go. And the whole lot of pozol is to give them strength so they don't faint along the journey. And also so that way out there, far away, where the other worlds are, they don't forget where they came from".
The little girl's proposal is approved by popular acclaim. SubMoy is about to adjourn the meeting when "Defensa Zapatista" raises her little hand asking again for the floor. It is conceded to her. As the girl speaks, in one arm she holds a soccer ball and in the other hugs a small animal to her. It seems to be a dog… or a cat, or a cat-dog: "I just want to say that we haven't filled out the team yet, but don't worry, soon there are going to be more of us, sometimes it takes a while, but soon there are going to be more."
I testify.
i "La Nave de los Monstruos" (1960) or "The Ship of the Monsters," a Mexican science fiction comedy film.
ii "Pozol de Barro," prize to be awarded by the EZLN to the winning team in a 2005 soccer (football) competition between the Zapatista team and the FC Internationale de Milán.
iii Musical number by Piporro that appears in "La Nave de los Monstruos."
iv Tor the robot and his jukebox lover are characters in the film.
v Literally "rice with milk," a sweet rice dessert, but in this context an exclamation after a suggestive comment or as a general exclamation of excitement, as in "Yeehaw" or "Woohoo"
vi Director of cult classics Night of the Living Dead and Dawn of the Dead among many other horror films.
Comentario de La Chica — febrero 22, 2017 @ 10:48 pm
RSS para comentarios de este artículo.


text:
Thanks so much to Sid Schwab for being on the show. It was a really fun interview. (video post above) We probably could have talked for another hour. I'll definitely have to bring him back on the show. There was talk in the chat room about bringing Mrs. Sid onto the next show. So, that should be interesting.
We talked about how be chose general surgery as a career. He also shared some stories from medical school, residency, and his 25 years of practice. At the end of the show, we briefly talked about his book: Cutting Remarks: Insights and Recollections of a Surgeon.
The chat room was as busy as it has ever been -at times as many as 22 people chatting. So, if you have never listened to the show live - you are missing "the show within the show." I did have a few small technical glitches, but I don't think that it affected the audio at all (you can let me know otherwise).
Thanks so much to the people who called in as well. Bongi called in all the way from South Africa where is was 4am. Sid has a dream of working with Bongi some day. Dr. Rob also called in and Sid called him "The Dave Barry of the Medical Blogosphere." It was great to hear from Dr. Rob again.
Enrico checked in to give a brief update on his situation. Suffice to say that he is going to have to find a new URL - maybe we can help him find a new name for his blog (leave me a comment if you would like to help - hehe). Enrico asked the question about how to balance work and life.
SeaSpray said that she never called into a show or was in a chat room before. Thanks so much for calling in. She is a regular reader and commenter on Sid's blog. She also shared a story of how Sid helped her last year. Finally, EricThePragmatic called in and told the story of how Sid was his mother's surgeon - a touching story.
So, if you didn't listen live - why didn't you? Sheesh! Well, listen in my sidebar or click here. Also, if I can ask a favor, after you listen to the show, please rate the show and leave a comment. It will really help my BlogTalkRadio ratings.
Next week - Look out, because The Ladies invade The Doctor Anonymous Show. It is the Valentine's Day Estrofest. My guests include Dr. Val, Jenni from Chronic Babe, Crzegrl, and EE. Call your friends and wake the neighbors - This will be a fun show. Who knows what we'll talk about and what will happen? Have a great weekend, everybody!


text:
The overarching goal of our research is to design catalysts and catalytic processes that will advance the emerging biobased chemical industry. We interrogate complementary characterization techniques and combine reaction engineering methods with computational tools to fundamentally understand the intermediate's chemistry and their transformations on catalytic surfaces. Our work addresses challenges associated with unconventional feedstock molecules, reactions in complex media, and the catalysts' material chemistry under operation conditions
Copyright © 2017 The Tessonnier Group. All rights reserved. Site by Rippke Design.


text:
Oct 4, 2006
Day 4- Mama...just killed a man...
No, really, I love The Bad Seed. Anyone who doesn't is a jerk.
I'll get around to writing about it one of these days…I have this weird tendency not to write about my favorite movies because…well, I don't know why. I always figure, like I said above, that I'll "get around to it one of these days". Maybe when I'm old and infirm, close to my deathbed. My helper monkey Otis can type as I dictate my thoughts on Killer Workout at long last.
Whilst perusing the 'horror' shelves at Ye Olde Videoe Store yesterday, wondering to myself if there was anything good and scary left out there or if it was all simply low-budget straight-to-video crap, I spotted Mommy (1995) and immediately felt as if a weight had been lifted from my shoulders.
Don't get me wrong- Mommy kind of IS low-budget straight-to-video crap, but I DON'T CARE.
This movie, you see, is an unofficial sequel to the aforementioned The Bad Seed and stars the bad seed herself, Patty McCormack. Couple this exciting news with my unabashed love of this horror/thriller sub-genre (see my Stepfather II review from last year's Shocktober!) and the only way I wasn't gonna love Mommy is if the DVD somehow turned into a deadly sawblade or something and started rolling around my house cutting up my cats and my prized Hummel collection. It didn't, so don't worry. Hot Cocoa is just fine, and so is Hummel Bells on High.
The she still looks awesome and I wish she was in every movie Patty McCormack stars as the unnamed, titular mommy of the precocious but praise Jebus not cloying Jessica Ann (Rachel Lemieux). Mommy sets about disposing of anyone standing in the way of her getting what she wants. That bitch teacher didn't select Jessica Ann for Outstanding Student of the Year? So long, bitch teacher! Like any good psychopath, Mommy also "takes care" of any witnesses she may have left behind, like that white trash janitor who knows Mommy killed that bitch teacher and thought she was so big and totally threatened to tell the police.
Jessica Ann is no dummy, however, and very quickly realizes that Mommy might...be up to something. Something like killing! Everyone around her seems to die- including a line of wealthy "daddies". Unfortunately for Jessica Ann, however, Mommy decides to go on the lam…and before she splits for good, she needs to take care of just one more loose end…
Writer/director Max Allan Collins (CSI, Road to Perdition) has crafted a fun little tribute to The Bad Seed that succeeds despite its ultra-low budget and noticeable lack of violence. The 'kills' are incredibly tame and there's really no violence shown on screen, even though Mommy can do some major damage with her bare hands alone.
Collins utilizes absurdly dramatic lighting in places to bring out some cheeky humor- check out the way Mommy dispatches a jar of strawberries with those eeeevil hands!
Movies like Mommy succeed or fail based almost entirely on the performances of the leads- think of Terry O'Quinn's fantastic performances in Stepfather and it's sequel, or Rebecca DeMornay's icy nanny kill machine in The Hand That Rocks the Cradle. Because they're folks capable of horrendous acts and will kill anyone in their immediate vicinity should the need arise but who seem totally normal when they're not...you know, killing, the lead actor or actress needs to be able to play "nice" and then turn psychotic on a dime…and it only works well if the actor or actress can keep the performance balanced right on the line between serious and campy. Patty McCormack proves she's only gotten better at this type of role than she was 50 years ago playing sweet-n-psycho little Rhoda I'll say it again, I wish she was in every movie.
McCormack is supported by a strong cast that includes Jason "Father Damien" Miller, B-Movie Queen Brinke Stevens, and Mickey "it's Mickey frickin' Spillane!" Spillane. In her screen debut as young Jessica Ann, Rachel Lemieux really holds her own. I need to track down Mommy 2 ASAP, I tells ya.
Keep my predisposition to seriously enjoy this type of flick in mind before you decide whether or not to give Mommy a chance. It's a virtually violence-free cheapie thriller. Like I said, this simply doesn't matter to me…but these…insightful comments from the IMDb boards will give you other opinions- quite the opposite opinions to mine- to chew on:
lequaietermaine: i think that this movie is quite possibly the worst movie that i have ever seen except perhaps for mommy 2. the murders in this movie are really quite pathetic i mean it is so utterly pathetic the way the first two people are killed. that old bat is pathetic. goodnite new york.
Anikan: yes you are quite right this is plain garbage
witty_pseudonym: I don't think this could have possible been worse. So cheap, so ludicrouse, there was not one positive to the whole film.
jeff-1250: I cannot even begin to describe how woeful this one is, well okay l'm reviewing it for an external site so guess l will be doing just that. Was it just my copy or is this movie too dark to actually see what's going down in places ?*
There you go, folks. I give it 6.5 out of 10 now the world don't move to the beat of just one drum…what might be right for you, may not be right for some! A man is born, he's a man of means. Then along comes two, they got nothin' but some dreams, but they got…diff'rent strokes. It takes diff'rent strokes to move the world! Everybody's got a special kind of story…everybody finds a way to shine! It don't matter that you got—not a lot! So what? They'll have theirs, you'll have yours and I'll have mine…and together we'll be fine! 'Cause it takes…diff'rent strokes, it takes…diff'rent strokes…it takes…diff'rent strokes to move the world! MMMM!s.
*note: there is no "going down" anywhere in the film.
8 comments:
That's hilarious that Spillane is in that movie. Max Allan Collins was a huge fan, and eventually became a good friend of Spillane's. When Spillane died, Collins (whom I coincidentally walked past on Saturday) wrote a very nice appreciation of him. Someplace I can't remember... Sorry about that...
- CRwM said...
Killer parental figures are cinema gold, man. I do not know why. I only know it is so.
I recommend that dead-pan cannibalistic fun of Parents. Think: Wonder Years if the mother served long pig instead of meatloaf. Good stuff. - 10/4/06, 6:04 PM
- Josh DeSlasher said...
It's nice to see someone else saw a good flick today (I watched the movie Deep Red).
I'm still wondering which films are better though. The 50s-60s, or the 70s-80s? They're both full of "yays" and "nays", but I'm leaning towards 70s-80s, as it's more familiar to me.
But, I'll take your word for it, and try to check out Bad Seed. Yay for Stacie's reviews!
-bodyhorror.blogspot - 10/4/06, 8:43 PM
- Amanda By Night said...
I've been curious about this movie. Brinke Stevens loved making this movie... She doesn't get to do a lot of good films anymore, which is sad...
They played this movie on Lifetime once for Halloween, and I remember it looked so budge, I skipped it. Stupid me...
Patty McCormick was WHITE HOT as Jeffrey Tambor's wife in The Ropers! - 10/4/06, 11:08 PM
- Stacie Ponder said...
Bill- That's a nice anecdote about Spillane. I really enjoy Collins's work whenever I come across it...and he's got alot of work out there was you take notice of his name.
crwm- For some reason, I've never seen Parents! Man, what a fun marathon it would be to watch every familial horror flick you can come up with in on sitting...
Josh- The Bad Seed is definitely a classic! My favorite era is undoubtedly 70s-80s though. There's just so many great movies from that period...and I'll be keeping an eye on your blog.
Miss Amanda- Brinke was great in this movie, and it was sort of nice to see her play a normal role- she's just...the sister. The somewhat dowdy sister, even! Man, does she have a great voice.
This movie IS very low-budget, but not inept low-budget, you know? The sound quality is always a-ok (where most low-budget flicks immediately fall apart), the acting is great, there are inventive camera angles...it's just obviously made on the cheap, but I think it succeeds within those confines. The kills, though, are wicked tame.
You know who else Patty McCormack played? I was shocked! SHOCKED I tells ya, to read "Evelyn" on Dallas...the woman who tried to tempt Mitch away from Lucy!! She looks much better in Mommy... - 10/5/06, 8:27 AM
Has it really been 50 years since "The Bad Seed" came out? Sheesh, I'm getting old. I used to see it often on Saturday daytime TV in the late 60s, when I was a kid. Little Rhoda was a role model. She was a kid who knew how to get what she wanted...
- SikeChick said...
I too love The Bad Seed, but mostly because of all the over-acting by just about everyone in the movie. It is one of my guilty pleasures.
- David Lee Ingersoll said...
Wasn't there a sequel to this? Let's check the imdb.
Yup. Mommy II: Mommy's Day. More bad seed goodness. - 10/6/06, 10:50 AM


text:
RocketJump Shorts
Heroes of the Storm – Firebat Reveal + Vancouver!
Earlier this month, Blizzard asked us to make a little trailer for the reveal of Firebat "Blaze" in Heroes of the Storm, so we drove up to the snow in Vancouver and did it!
Posted October 1, 2014
The thrilling conclusion to the lazer tag saga!


text:
Flirtatious Boujie Bee Lashes
Boujie Bee Luxury Mink Lashes are the perfect addition to any look you are going for. Whether it be a night on the town, the perfect dinner date or just wanting to dress up for yourself; these luxury mink eyelashes are sure to make you look STUNNING!
- 100% High Quality Mink Eyelashes
- Black Cotton Band
- Hypoallergenic - Sterilized
- Lightweight
- Reusable, Stack-able
- 15-20 Wears with Proper Care


text:
I'm looking for an explanation of the following result:
If D is a maximal order in a definite (i.e. ramified at infinity) quaternion algebra B over $\mathbb{Q}$, and $\phi : B\otimes\mathbb{R}\rightarrow\mathbb{H}$ is an isomorphism over $\mathbb{R}$ (where $\mathbb{H}$ is the Hamiltonian quaternions over $\mathbb{R}$), then the co-volume of $\phi(D)$ in $\mathbb{H}$ (with respect to the Lebesgue measure for the basis 1,i,j,k) is $(1/4) \cdot Disc(D)$ (where the discriminant is the determinant of the trace form on a basis of $D$, or, equivalently since $D$ is maximal, the product of the finite primes where $B$ ramifies).
Right now the only way I have to see this is through an explicit calculation using the generators for maximal orders described in a paper by Ibukiyama available here: Link , but I feel like there must be a nice way to see this using just properties of maximal orders without having to calculate with an explicit basis. Any ideas or references?


text:
In a hotel of Havana, under the fixed sun of the Revolution : the fierce and partisan overtones of leather and tobacco meddle with the paneling's waxen silence. In the cool dimness, fawn grimaces shimmer along with the smoke of cigars and the barrels of guns.
Head Notes Bergamot, Grapefruit, Rhum.
Heart Notes Clove, Labdanum, Oak Wood, Patchouli.
Base Notes Amber, Leather, Moss, Tobacco.