رسانه: تکرار یک کلمه تا وقتی که بی معنی شود، اخته شود!
نقد کتاب کافه پیانو
کافه پیانو by فرهاد جعفریrating: 5 of 5 stars
کافه پیانو کتابی است که به راحتی نمیتوان در مورد آن اظهار نظر کرد. از یک طرف جزو کتابهای بسیار پرفروش است (5 بار انتشار در طول 9 ماه) که خود اتفاق میمونی در فضای کتابخوانی ایران است، و از طرفی دیگر بسیار از دوستان تو را از خواندن آن نهی میکنند و البته تعدادی هم تشویق. کتابی که باعث بحثهای بسیاری در حوزه ی نقد و بررسی و همچنین در فضای روشنفکری شده است و همین خودش آدم را ترغیب به خواندن آن میکند.
من اما، جزو آن آدمهایی بودم که نتوانستم بر وسوسه ی خواندن "کافه پیانو" غلبه کنم و سر انجام آن را خریدم و خواندم. باید اقرار کنم که از کتاب خوشم آمد و پس از خواندن آن بلافاصله فکر کردم که چرا از این کتاب خوشم می آید؟
1- اصولا بین طبقه ی نسبتا روشن فکر جوی نسبتا منفی نسبت به نویسنده های ایرانی وجود دارد. به این شکل که نویسنده ها یا بسیار سطح پایین و مبتذل تلقی میشوند و یا بیش از حد سطح بالا، فلسفی و سخت فهم. این باعث میشود که تیراژ کتابها یا از یکی دو هزار بیشتر نشود و یا بسیار بیشتر (کتابهای با مضامین عاشقانه همچون کتابهای فهیمه رحیمی). اما در این بین کافه پیانو از دید خود نویسنده، "کتابی متوسط برای طبقه ی متوسط" است. کافه پیانو کتابی کاملا متوسط است. در این کتاب نه از بحثهای پیچیده و شیوه های روایی عجیب و غریب و دیرفهم خبری است و نه اینکه کتابی کاملا تهی شده از مضامین انتقادی و ساختارهای روایی باشد. در این کتاب اثری از تحلیلهای پیچیده و یا بسیار سیاه از دنیا دیده نمیشود و در عین حال هم رابطه خودش را با دنیای خارج از دست نداده و هرجا که توانسته است سعی در انتقاد از وضع موجود، انتقادهایی موضعی و شخصی و نه کلی و جهانشمولی، میکند. من به شخصه با خیلی از کتابهای داخلی خوب ارتباط نمیتوانم برقرار کنم. یعنی فضای آنها برایم نامفهوم است، انگار از دنیایی دیگر هستند و باید برای فهمیدنشان زحمت زیادی کشید. در حالی که وقتی مشغول مطالعه کافه پیانو میشوم فضای داستان برایم کاملا آشناست و مشکل زیادی در درک این فضا ندارم. این یکی از معدود نکاتی است که میتواند باعث شود من رمانی از نویسنده ای داخلی بخوانم. اینکه فضای رمان با ذهن من همخوان باشد، چیزی که به زحمت در مورد یک رمان خارجی یافت میشود.
2- ساختار روایی کتاب در نوع خود جالب توجه و منحصر به فرد است. حجم زیادی از اول کتاب را روایتهایی چند صفحه ای اشغال کرده است که من آنها را روایتهای اتمی مینامم. این روایتها هیچ ربط منطقی به هم ندارند. یعنی هرکدام یک نمیچه داستان هستند که در ظاهر ربطی هم به بقیه ندارند و در طی آنها مثلا با فلان خاطره ی نویسنده از فلان روزی که فلان دوستش آمده بود کافه آشنا میشویم. اما در عین حال وقتی که چند تا از این روایتهای اتمی را میخوانیم کم کم حس میکنیم که یک ابرروایت در بطن همه ی این نیمچه روایتها وجود دارد و علاوه بر اینکه نویسنده به صورت غیر مستقیم فضای داستان و شخصیتها را به ما عرضه میکند، کشف این ابر روایت هم لذت وافری به خواننده میدهد و اتفاقا در میانه های کتاب این ابر روایت شکل منسجمتری به خود میگیرد و تبدیل به روایت اصلی کتاب میشود. هرچند آخرهای کتاب نویسنده یک جوری خواننده را توی روایت کله پا میکند که هیچ وقت نفهمد از کجا خورده است.
3- یکی از مهمترین نکاتی که واکنش منفی منتقدان را نسبت به این کتاب بر انگیخته است لحن به اصطلاح "وبلاگی" کتاب است. هرچند من به شخصه تاکنون وبلاگهای بسیار کمی دیده ام که لحنی به این سلیسی داشته باشند، اما این خود جای سوال دارد که استفاده از چنین لحنی کاری مثبت است یا منفی؟ من فکر میکنم که این کار نمیتواند منفی باشد، چون به هر حال این ما نیستیم که سلیقه ی خوانندگانمان را تعیین میکنیم، بلکه این آنها هستند که سلیقه خود را به ما تحمیل میکنند، و اگر به خواندن چنین کتابهایی روی آورده اند، خب لابد شرایط امروزی زندگی در این جامعه آنها را به سمت این گونه لحنهای راحت الحقوم سوق داده است.
4- بدون اغراق باید گفت که کافه پیانو کتابی است حاصل ترکیب "ناطور دشت" و "عقاید یک دلقک". پس اگر این کتابها را میپسندید احتمالا کافه پیانو را هم خواهید پسندید.
5- و در آخر سوالی که در باره کتاب هنوز من برایم حل ناشده باقی مانده است. اینکه "چرا نویسنده مارکها را در متن اینقدر جدی گرفته و حتی آنها را به شکل پررنگ در همه جای کتاب چاپ کرده است؟"
View all my reviews.
ماهی غضبناک
(طراحی شده در محیط فلش)
گرافلب و گرافیک برداری
برنامه GraphLab یه برنامه برای کار با گرافهاست که تو دانشکده نوشتیم که اگر گسسته
پیشدانشگاهیپاس کرده باشید میدونید گراف چیه.
حالا میشه اونو راحت با افزودن 150 خط برنامه نویسی (جاوا) به یه ادیتور گرافیک برداری تبدیل کرد:
سورسو اینجا میگذارم تا دوباره به طرز اسفباری از دستش ندادم.
Init.java:
public class Init implements PluginInterface {
HashSet addedGRs = new HashSet();
static final String CURVE_WIDTH = "Curve Width";
public void init(final BlackBoard blackboard) {
blackboard.addListener(new Event(AbstractGraphRenderer.name), new Listener() {
public void notifyRelevantActions(Event notifierName, Object value) {
AbstractGraphRenderer gr = AbstractGraphRenderer.getCurrentGraphRenderer(blackboard);
if (addedGRs.contains(gr)) return;
gr.addPaintHandler(new Painter());
addedGRs.add(gr);
}
});
VertexModel.addGlobalUserDefinedAttribute(CURVE_WIDTH, 5);
}
}
Painter.java:
public class Painter implements PaintHandler {
GraphData gd = new GraphData(GraphLab.blackboard);
GraphModel G = gd.getGraph();
public void paint(Graphics gr1d, Object destinationComponent) {
final Graphics2D gr = (Graphics2D) gr1d;
final int n = G.getVerticesCount();
if (n == 0) return;
AbstractGraphRenderer.getCurrentGraphRenderer(GraphLab.blackboard).ignoreRepaints(new Runnable() {
public void run() {
boolean[] marks = new boolean[n];
BaseVertex V[] = G.getVertexArray();
final VertexModel parent[] = new VertexModel[n];
//consider the hole structure as a tree
AlgorithmUtils.BFSrun(G, (VertexModel) V[0], new AlgorithmUtils.BFSListener() {
public void visit(VertexModel v, VertexModel p) {
parent[v.getId()] = p;
}
});
for (VertexModel v : G) {
if (v.getId() == 0) continue;
if (v.getColor() == 0) {
VertexModel v1 = parent[v.getId()];
if (v1 == null || v1.getColor() != 0) continue;
VertexModel v2 = parent[v1.getId()];
if (v2 == null || v2.getColor() != 0) continue;
//generate the curve between v1, v2 and v3
GraphPoint p1 = v.getLocation();
GraphPoint p2 = v1.getLocation();
GraphPoint p3 = v2.getLocation();
GraphPoint m1 = AlgorithmUtils.getMiddlePoint(p1, p2);
GraphPoint m2 = AlgorithmUtils.getMiddlePoint(p2, p3);
GraphPoint cp = p2;
Integer w1 = v.getUserDefinedAttribute(CURVE_WIDTH);
Integer w2 = v1.getUserDefinedAttribute(CURVE_WIDTH);
Integer w3 = v2.getUserDefinedAttribute(CURVE_WIDTH);
int startWidth = (w1 + w2) / 2;
int endWidth = (w3 + w2) / 2;
int middleWidth = w2;
double teta1 = AlgorithmUtils.getAngle(p1, p2);
double teta2 = AlgorithmUtils.getAngle(p1, p3);
double teta3 = AlgorithmUtils.getAngle(p2, p3);
//generate boundary curves
java.awt.geom.QuadCurve2D c1 = new QuadCurve2D.Double(
m1.x - startWidth * sin(teta1), m1.y + startWidth * cos(teta1),
cp.x - middleWidth * sin(teta2), cp.y + middleWidth * cos(teta2),
m2.x - endWidth * sin(teta3), m2.y + endWidth * cos(teta3));
java.awt.geom.QuadCurve2D c2 = new QuadCurve2D.Double(
m2.x + endWidth * sin(teta3), m2.y - endWidth * cos(teta3),
cp.x + middleWidth * sin(teta2), cp.y - middleWidth * cos(teta2),
m1.x + startWidth * sin(teta1), m1.y - startWidth * cos(teta1));
//mix them
GeneralPath gp = new GeneralPath(c1);
gp.append(c2, true);
gp.closePath();
gr.setColor(Color.black);
//fill the curve
gr.fill(gp);
}
}
}
}, false /* dont repaint after*/);
}
}
اشتراک در:
پستها (Atom)



