۱۳۹۴/۰۱/۰۸

لیست موارد افزوده شده به درایور MongoDB 2

خلاصه موارد افزوده شده به درایور MongoDB 2  :



  • collection.insertOne افزودن یک سند.
  • collection.insertMany افزودن چندیدن سند.
  • collection.replaceOne جایگزین کردن یک سند بایک سند جدید.
  • collection.updateOne بروزرسانی یک سند.
  • collection.updateMany بروز رسانی چندین سند در یک زمان.
  • collection.deleteOne حذف یک سند.
  • collection.deleteMany حذف چندین سند در یک زمان.
  • collection.findOneAndUpdate استفاده از findAndModify برای بروزرسانی سند.
  • collection.findOneAndRemove استفاده از findAndModify برای حذف یک سند خاص.
  • collection.findOneAndReplace استفاده از findAndModify برای جایگزین کردن یک سند خاص.

نکته :

متدهای فعلی برای insert - update - remove  منسوخ شده اند و در نسخه درایور 3 حذف خواهند شد.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۲/۰۵/۰۸

ایجاد یک سایت وبلاگی با node js


node js  چیست ؟

node js  یک بستر برای ایجاد سریع بر نامه های تحت شبکه است. node js  از یک مدل رویدادگرا event-driven استفاده
می کند که بدون ایجاد هیچ توقف و خللی در ارسال و دریافت اطلاعات می تواند برنامه هایی که تعامل دائمی و بروز با سرور
دارند را تولید نماید.
با استفاده از node js می توان گستره وسیعی از برنامه های کاربردی که می توانند اطلاعات بروز به کاربر بدهند را ایجاد نمود.
در node js از زبان قدرتمند و قابل انعطاف javascript برای توسعه و ایجاد برنامه ها استفاده می شود.

express چیست ؟

express یک بستر تولید برنامه های تحت وب برای node js  است. با کمک express می توان وب سایتهایی با یک یا چندین
صفحه ایجاد نمود.

نصب node js :
در سایت رسمی node js  با نشانی www.nodejs.org روی دکمه install  کلیک کنید. پس از دریافت فایل نصب کافی است آن را روی کامپیوترتان نصب کنید.
بطور خودکار نرم افزار نصاب دو فایل node.exe و npm.bat را در مسیر اجرایی فایلهای ویندوز قرار می دهد.

فابل node.exe برای اجرای برنامه های نوشته شده در بستر node js استفاده می شود.
فایل npm.bat برای مدیریت افزونه های قابل استفاده در node js کاربرد دارد. افزونه ها  بسیار مهم هستند و قابلیتهای node js  را افزایش می دهند.

اعمالی مانند ارتباط با پایگاه داده و یا استفاده از نوع داده JSON در node js  با کمک افزونه ها انجام می شوند .
برای اطلاعات از انواع اقزونه های node js به سایت www.npmjs.org مراجعه کنید.

ایجاد پروژه وبلاگ :

پس از نصب node js  یک پوشه برای پروژه وبلاگ بنام blog1 ایجاد می کنیم. قبل از شروع کار باید express را نصب کنیم.
برای اینکار از دو روش زیر می توان اقدام کرد.

روش اول :
در پوشه blog1 فایلی بنام package.json ایجاد کرده و محتویات زیر را در آن می نویسیم :


{
   "name": "blog1",
   "description": "Weblog App with node and express",
   "version": "0.0.1",
   "dependencies": {
      "express": "3.x"
   }
}
 از طریق خط فرمان به پوشه blog1 رفته و دستورزیر را اجرا می کنیم:

npm install

این فرمان موجب می شود که مدیر افزونه node js با استفاده ار ساختاری که بعنوان توصیف کننده برنامه
در فایل package.json ایجاد کردیم express  را دانلود کرده ودر پوشه  node_modules در پوشه blog1 قرار دهد.

روش دوم :
در محیط خط فرمان دستور زیر را اجرا می کنیم :

npm install -g express

این فرمان express را دانلود کرده و در مسیر اصلی نصب node js  در کنار سایر افزونه ها قرار می دهد.
مزیت روش دوم این است که با استفاده از فرمان express براحتی می توان ساختار برنامه های دیگری را که می خواهیم با 
express ایجاد کنیم را با یک بار نصب آن درست کنیم. در حقیقت در روش اول express فقط برای برنامه فعلی که همان
blog1  است نصب شده است اما در روش دوم هر بار که به express نیاز داریم دیگر نیازی به دانلود مجدد ندارد.

ادامه دارد.....

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۱/۰۳/۰۹

Drag کردن اجسام در Box2D

قبلا در مورد Box2D مطلب کوتاهی نوشتم در مثال زیر روش drag کردن اجسام را نشان می دهم.

با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.


package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 import Box2D.Dynamics.Joints.*;
 public class cratetest extends Sprite {
  public var m_world:b2World;
  public var m_iterations:int = 10;
  public var m_timeStep:Number = 1/30;
  public var mousePVec:b2Vec2 = new b2Vec2();
  public var real_x_mouse:Number;
  public var real_y_mouse:Number;
  public var pixels_in_a_meter = 30;
  public var worldAABB:b2AABB = new b2AABB();
  public var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
  public var mouseJoint:b2MouseJoint;
  public function cratetest() {
   addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, on_mouse_down);
   stage.addEventListener(MouseEvent.MOUSE_UP, on_mouse_up);
   worldAABB.lowerBound.Set(-100.0, -100.0);
   worldAABB.upperBound.Set(100.0, 100.0);
   m_world = new b2World(worldAABB, gravity, true);
   var body:b2Body;
   var bodyDef:b2BodyDef;
   var boxDef:b2PolygonDef;
   bodyDef = new b2BodyDef();
   bodyDef.position.Set(8.5, 13.5);
   boxDef = new b2PolygonDef();
   var ground_width = 8.5;
   var ground_height = 0.5;
   boxDef.SetAsBox(ground_width, ground_height);
   boxDef.friction = 0.3;
   boxDef.density = 0;
   bodyDef.userData = new floor();
   bodyDef.userData.width = ground_width * 2 * pixels_in_a_meter;
   bodyDef.userData.height = ground_height * 2 * pixels_in_a_meter;
   addChild(bodyDef.userData);
   body = m_world.CreateBody(bodyDef);
   body.CreateShape(boxDef);
   body.SetMassFromShapes();
   for (var i:int = 1; i <=5; i++) {
    bodyDef = new b2BodyDef();
    bodyDef.position.x = Math.random() * 15 + 1;
    bodyDef.position.y = Math.random();
    var crate_width:Number = 1.5;
    var crate_height:Number = 1.5;
    boxDef = new b2PolygonDef();
    boxDef.SetAsBox(crate_width, crate_height);
    boxDef.density = 1.0;
    boxDef.friction = 0.5;
    boxDef.restitution = 0.2;
    bodyDef.userData = new crate();
    bodyDef.userData.width = crate_width * 2 * pixels_in_a_meter;
    bodyDef.userData.height = crate_height * 2* pixels_in_a_meter;
    body = m_world.CreateBody(bodyDef);
    body.CreateShape(boxDef);
    body.SetMassFromShapes();
    addChild(bodyDef.userData);
   }
  }
  public function Update(e:Event):void {
   m_world.Step(m_timeStep, m_iterations);
   if (mouseJoint) {
    var mouseXWorldPhys = mouseX/pixels_in_a_meter;
    var mouseYWorldPhys = mouseY/pixels_in_a_meter;
    var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys);
    mouseJoint.SetTarget(p2);
   }
   for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
    if (bb.m_userData is Sprite) {
     bb.m_userData.x = bb.GetPosition().x * pixels_in_a_meter;
     bb.m_userData.y = bb.GetPosition().y * pixels_in_a_meter;
     bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
    }
   }
  }
  public function on_mouse_down(evt:MouseEvent):void {
   var body:b2Body = GetBodyAtMouse();
   if (body) {
    var mouse_joint:b2MouseJointDef = new b2MouseJointDef;
    mouse_joint.body1 = m_world.GetGroundBody();
    mouse_joint.body2 = body;
    mouse_joint.target.Set(mouseX/pixels_in_a_meter, mouseY/pixels_in_a_meter);
    mouse_joint.maxForce = 10000;
    mouse_joint.timeStep = m_timeStep;
    mouseJoint = m_world.CreateJoint(mouse_joint) as b2MouseJoint;
   }
  }
  public function on_mouse_up(evt:MouseEvent):void {
   if (mouseJoint) {
    m_world.DestroyJoint(mouseJoint);
    mouseJoint = null;
   }
  }
  public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
   real_x_mouse = (stage.mouseX)/pixels_in_a_meter;
   real_y_mouse = (stage.mouseY)/pixels_in_a_meter;
   mousePVec.Set(real_x_mouse, real_y_mouse);
   var aabb:b2AABB = new b2AABB();
   aabb.lowerBound.Set(real_x_mouse - 0.001, real_y_mouse - 0.001);
   aabb.upperBound.Set(real_x_mouse + 0.001, real_y_mouse + 0.001);
   var k_maxCount:int = 10;
   var shapes:Array = new Array();
   var count:int = m_world.Query(aabb, shapes, k_maxCount);
   var body:b2Body = null;
   for (var i:int = 0; i < count; ++i) {
    if (shapes[i].m_body.IsStatic() == false || includeStatic) {
     var tShape:b2Shape = shapes[i] as b2Shape;
     var inside:Boolean = tShape.TestPoint(tShape.m_body.GetXForm(), mousePVec);
     if (inside) {
      body = tShape.m_body;
      break;
     }
    }
   }
   return body;
  }
 }
}


  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۱/۰۳/۰۴

مقدمه اب براستارلینگ - قسمت اول

استارلینگ را می شناسید؟

یک موتور سورس باز برای ساخت بازی در فلش که از قابلیت های جدید فلش پلیر (Stage3D) استفاده می کند.Stage3D عليرغم نامش توانايي ايجاد پروژه های دو بعدی را نیز دارد . در مثال زیر نحوه انجام یک پروژه دوبعدی ساده را باهم مرور می کنیم.

برای راحتی بیشتر بهتر است از نسخه 4.6 فلاش بیلدر استفاده کنید.

ابتدا مانند تصویر زیر یک پروژه اکشن اسکریپت را شروع کنید:


بعد از نامگذاری پروژه و تعیین مسیر ذخیره آن بجای دکمه Finish  روی دکمه Next كليك كنيد.


در تب Source Path مسیر پوشه Starling\src را ىر پوشه کتابخانه استارلینگ که قبلا دانلود کرده اید را وارد نمایید..

خب حالا وقت کد نویسی است خیلی ساده یک نمونه از استارلینگ ایجاد کنید :
package{
 import flash.display.Sprite;
 import starling.core.Starling;
 
 [SWF(width="500", height="500", frameRate="60", backgroundColor="#000000")]
 public class Main extends Sprite{
  private var starling:Starling;
  public function Main(){
   starling = new Starling(Game, stage);
   starling.start();
  }
 }
}

وسپس فایل Game.as :

package{
 import starling.display.Image;
 import starling.display.Sprite;
 import starling.events.Event;
 
 public class Game extends Sprite{
  [Embed(source = "background.png")]
  private static const Background:Class;
 
  [Embed(source = "greencircle.png")]
  private static const GreenCircle:Class;
 
  private var greenCircleVector:Vector.=new Vector.();
  private var xSpeedVector:Vector.=new Vector.();
  private var ySpeedVector:Vector.=new Vector.();
 
  public function Game(){
   addEventListener(Event.ADDED_TO_STAGE,setup);
  }
 
  private function setup(e:Event):void{
   var background:Image = Image.fromBitmap(new Background());
   addChild(background);  
   for(var i:uint=0;i<10;i++){
    var greenCircle:Image=Image.fromBitmap(new GreenCircle());
    greenCircle.x=Math.random()*500;
    greenCircle.y=Math.random()*500;
    var randomDirection:Number=Math.random()*2*Math.PI;
    addChild(greenCircle);
    greenCircleVector.push(greenCircle);
    xSpeedVector.push(2*Math.cos(randomDirection));
    ySpeedVector.push(2*Math.sin(randomDirection));
   } 
   stage.addEventListener(Event.ENTER_FRAME, update);
  }
 
  private function update(e:Event):void{
   for(var i:uint=0;i500){
     greenCircleVector[i].x-=500;
    }
    if(greenCircleVector[i].x<0){
     greenCircleVector[i].x+=500;
    }
    if(greenCircleVector[i].y>500){
     greenCircleVector[i].y-=500;
    }
    if(greenCircleVector[i].y<0){
     greenCircleVector[i].y+=500;
    }
   }
  }
 }
}

در کد بالا به نحوه استفاده از کلاسهای رویداد و اسپرایت که از بسته استارلینگ گرفته شده اند دقت کنید. این کلاسها جایگزین معادل فلش خود شده اند. نمونه اولیه ایجاد شد. در بخش های بعدی کار را برای تولید بازی ادامه خواهیم داد.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۹۱/۰۲/۲۹

نکاتی در مورد اجسام در Box2D

Box2d يك موتور سورس باز شبیه ساز فیزیک در فلاش است که دارای یک نسخه ++C هم مي باشد.
یکی از مفاهیم کلیدی در این موتور مفهموم بادی یا جسم است که در حقیقت یک موجودیت واحد بدون انعطاف است و به سه صورت زیر دیده می شود.

1- جسم غیر ایستا : این نوع جسم تحت تاثیر نیروهای محیطی قرار می گیرد و به برخوردها واکنش نشان می دهد.
2- جسم ایستا : دقیقا بر عکس جسم غیر ایستا است. تحت اثر هیچ نیرویی قرار نمی گیرد و کاملا بی حرکت است.
3 - جسم کینماتیک : در حقیفت یک نوع ترکیبی است از یک طرف مانند جسم ایستا به نیروهای محیطی واکنش نشان نمی دهد و از طرفی دیگر مانند جسم غیر ایستا متحرک است. یعنی با سرعتی مشخص در یک مسیر خطی حرکت می کند .

مثال زیر مطلب را بهتر شرح می دهد:



package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.utils.Timer;
 import flash.events.TimerEvent;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 public class Main extends Sprite {
  private var world:b2World=new b2World(new b2Vec2(0,5),true);
  private var worldScale:Number=30;
  private var timer:Timer=new Timer(1000);
  public function Main() {
   debugDraw();
   for (var i:int=0; i<10; i++) {
    // building 10 kinematic spheres
    // five on the left side of the stage moving right
    // five on the right side of the stage moving left
    kinematicSphere(640*(i%2),50+40*i,10,(1-2*(i%2))*(Math.random()*10+5));
   }
   addEventListener(Event.ENTER_FRAME,updateWorld);
   // I will make a dynamic sphere fall from the top of the stage
   // at every second
   timer.start();
   timer.addEventListener(TimerEvent.TIMER,addSphere);
  }
  private function addSphere(e:TimerEvent):void {
   dynamicSphere(320,-10,10);
  }
  private function dynamicSphere(pX:int,pY:int,r:Number):void {
   var bodyDef:b2BodyDef=new b2BodyDef();
   bodyDef.position.Set(pX/worldScale,pY/worldScale);
   bodyDef.type=b2Body.b2_dynamicBody;
   var circleShape:b2CircleShape=new b2CircleShape(r/worldScale);
   var fixtureDef:b2FixtureDef=new b2FixtureDef();
   fixtureDef.shape=circleShape;
   var theDynamic:b2Body=world.CreateBody(bodyDef);
   theDynamic.CreateFixture(fixtureDef);
  }
  private function kinematicSphere(pX:int,pY:int,r:Number,hV):void {
   var bodyDef:b2BodyDef=new b2BodyDef();
   bodyDef.position.Set(pX/worldScale,pY/worldScale);
   // ************************** HERE IS THE MAGIC LINE ************************** \\
   bodyDef.type=b2Body.b2_kinematicBody;
   var circleShape:b2CircleShape=new b2CircleShape(r/worldScale);
   var fixtureDef:b2FixtureDef=new b2FixtureDef();
   fixtureDef.shape=circleShape;
   var theKinematic:b2Body=world.CreateBody(bodyDef);
   theKinematic.CreateFixture(fixtureDef);
   // look, I can set a linear velocity
   theKinematic.SetLinearVelocity(new b2Vec2(hV,0));
  }
  private function debugDraw():void {
   var debugDraw:b2DebugDraw=new b2DebugDraw();
   var debugSprite:Sprite=new Sprite();
   addChild(debugSprite);
   debugDraw.SetSprite(debugSprite);
   debugDraw.SetDrawScale(worldScale);
   debugDraw.SetFlags(b2DebugDraw.e_shapeBit);
   debugDraw.SetFillAlpha(0.5);
   world.SetDebugDraw(debugDraw);
  }
  private function updateWorld(e:Event):void {
   world.Step(1/30,10,10);
   world.ClearForces();
   for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
    // changing kinematic sphere linear velocity if it touches stage edges
    if (b.GetType()==b2Body.b2_kinematicBody) {
     var xSpeed:Number=b.GetLinearVelocity().x;
     var xPos:Number=b.GetWorldCenter().x*worldScale;
     if ((xPos<10&&xSpeed<0) || (xPos>630&&xSpeed>0)) {
      xSpeed*=-1;
      b.SetLinearVelocity(new b2Vec2(xSpeed,0));
     }
    }
    else {
     if (b.GetWorldCenter().y*worldScale>480) {
      world.DestroyBody(b);
     }
    }
   }
   world.DrawDebugData();
  }
 }
}
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

۱۳۸۹/۱۰/۳۰

اضافه کردن یک باکس جستجو به منو در WordPress

برای اینکار در ورد پرس 3 به بعد باید کدهای زیر را در فایل functions.php که در پوشه تم موجود است قرار دهید اگر این فایل را ندارید با استفاده از یک ویرایشگر متن ساده آن را ایجاد کنید.

add_filter('wp_nav_menu_items','add_search_box', 10, 2);
function add_search_box($items, $args) {

        ob_start();
        get_search_form();
        $searchform = ob_get_contents();
        ob_end_clean();

        $items .= '
  • ' . $searchform . '
  • '; return $items; }

    به همین سادگی!!!
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۲

    اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 6

    ایجاد یک کنسل کننده ترکیبی برای چندین Task

    می‌توانید با استفاده از چند CancellationToken یک Token ترکیبی ایجاد نمود در این حالت با کنسل شدن هر کدام از Token های زیر مجموعه خود Token اصلی کنسل خواهد شد.این امر با قرار دادن Token ها در متد CreateLinkedTokenSource از کلاس CancellationTokenSource محقق می‌شود مثال :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_11 {
    
    class Listing_11 {
    
    static void Main(string[] args) {
    
    // create the cancellation token sources
    
    CancellationTokenSource tokenSource1 = new CancellationTokenSource();
    
    CancellationTokenSource tokenSource2 = new CancellationTokenSource();
    
    CancellationTokenSource tokenSource3 = new CancellationTokenSource();
    
    // create a composite token source using multiple tokens
    
    CancellationTokenSource compositeSource =
    
    CancellationTokenSource.CreateLinkedTokenSource(
    
    tokenSource1.Token, tokenSource2.Token, tokenSource3.Token);
    
    // create a cancellable task using the composite token
    
    Task task = new Task(() => {
    
    // wait until the token has been cancelled
    
    compositeSource.Token.WaitHandle.WaitOne();
    
    // throw a cancellation exception
    
    throw new OperationCanceledException(compositeSource.Token);
    
    }, compositeSource.Token);
    
    // start the task
    
    task.Start();
    
    // cancel one of the original tokens
    
    tokenSource2.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    }
    

    چگونه می‌توان تعیین کرد یک Task کنسل شده است؟

    با استفاده از خصوصیت IsCancelled از کلاس Task می‌توان تعیین نمود که یک Task کنسل شده است یا خیر.

    اگر true باشد یعنی فرایند کنسل شدن بدرستی انجام شده است در غیر این صورت Task کنسل نشده است.مثال :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_12 {
    
    class Listing_12 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource1 = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token1 = tokenSource1.Token;
    
    // create the first task, which we will let run fully
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < 10; i++) {
    
    token1.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 1 - Int value {0}", i);
    
    }
    
    }, token1);
    
    // create the second cancellation token source
    
    CancellationTokenSource tokenSource2 = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token2 = tokenSource2.Token;
    // create the second task, which we will cancel
    
    Task task2 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token2.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 2 - Int value {0}", i);
    
    }
    
    }, token2);
    
    // start all of the tasks
    
    task1.Start();
    
    task2.Start();
    
    // cancel the second token source
    
    tokenSource2.Cancel();
    
    // write out the cancellation detail of each task
    
    Console.WriteLine("Task 1 cancelled? {0}", task1.IsCanceled);
    
    Console.WriteLine("Task 2 cancelled? {0}", task2.IsCanceled);
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    در مثال فوق دو Task ایجاد شده است. هر دو Task از دو CancellationToken مختلف که دو CancellationTokenSource متفاوت دارند استفاده می نمایند. CancellationTokenSource برای Task دوم کنسل می‌شود اما Task اول اجازه دارد که وظیفه‌اش را بطور کامل انجام دهد. خروجی برنامه چنین خواهد بود :
    Task 1 cancelled? False Task 2 cancelled? True Task 1 - Int value 0 … Task 1 - Int value 9 Main method complete. Press enter to finish.
    انتظار برای گذشت زمان
    هنگام کاربا Task ها در برخی از موارد لازم است برای مدت زمانی خاص برنامه درنگ کند.مثلا در هنگام اجرای یک Task لازم است برنامه مقداری را بدست آورد و ادامه برنامه با توجه به مقدار بدست آمده اجرا شود برای این کار لازم است Task برای مدت زمانی خاص صبر کند یا اصطلاحاً بخواب رود.بعد از سپری شدن مدت زمان مورد نظر Task از خواب بیدار شده و کارش را ادامه خواهد داد.در ادامه روشهای خواب کردن Task ها را مورد بررسی قرار خواهیم داد.
    استفاده از هندل انتظار Cancellation Token
    این روش بهترین راه برای خواب کردن یک Task می باشد.همانطور که قبلاً دیدیم برای اینکه یک Task را کنسل کنیم ابتدا نمونه‌ای از کلاس CancellationTokenSource را تعریف می‌کنیم سپس با کمک خصوصیت Token آن شی CancellationToken را مقدار دهی می‌کنیم در آخر کار با استفاده از متد خصوصیت WaitHandle و متد WaitOne می‌توان Task را کنسل نمود. اما متد WaitOne می‌تواند پارامتری را به عنوان زمان داشته باشد که Task را برای مدت زمانی خاص بر حسب میلی ثانیه قبل از کنسل شدن بخواب ببرد. مثال زیر موضوع را شفاف می‌کند :
    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_13 {
    
    class Listing_13 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the first task, which we will let run fully
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < Int32.MaxValue; i++) {
    // put the task to sleep for 10 seconds
    
    bool cancelled = token.WaitHandle.WaitOne(10000);
    
    // print out a message
    
    Console.WriteLine("Task 1 - Int value {0}. Cancelled? {1}",i, cancelled);
    
    // check to see if we have been cancelled
    
    if (cancelled) {
    
    throw new OperationCanceledException(token);
    
    }
    
    }
    
    }, token);
    
    // start task
    
    task1.Start();
    
    // wait for input before exiting
    
    Console.WriteLine("Press enter to cancel token.");
    
    Console.ReadLine();
    
    // cancel the token
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    در کد بالا یک Task ایجاد شده که یک پیغام را به خروجی می‌فرستد سپس با استفاده از متد WaitOne به مدت 10 ثانیه بخواب می‌رود .برنامه تا زمان دریافت کلید Enter از کاربر پیغام ها به خروجی می فرستد. و در صورت کنسل شدن Task پایان می‌یابد البته زمانی کنسل شدن صورت می‌گیرد که زمان 10 ثانیه سپری شده باشد.
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۱

    شمارش تعداد لینکهای موجود در قسمت blogroll

    نیاز داشتم تا در سایتی تعداد لینکهای موجود در blogroll شمارش کرده و به کاربر نشان دهم
    یک شی بنامwpfb$ و مقداری کد sql مشکل رو حل کرد.

    کد زیر :
    <?php
    $numlinks = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links WHERE link_visible = 'Y'");
    if (0 < $numlinks) $numlinks = number_format($numlinks);
    echo $numlinks;
    ?>
    
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    تغییر ویرایشگر پیش فرض در WordPress

    در دشبورد ورد پرس بطور پیش فرض از ادیتور Visual Editor استفاده می شود.
    برای اینکه از ادیتور دیگری مثلا HTML editor استفاده شود باید کد زیر را در در فایل functions.php قرار دهیم.

    add_filter('wp_default_editor', create_function('', 'return "html";'));
    

    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis

    ۱۳۸۹/۱۰/۲۰

    اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 5

    مونیتور کردن فرایند کنسل شدن با کمک Delegate

    براحتی می‌توانید یک Delegate را با یک CancellationToken ثبت کنید و در هنگامی که متد Cancel صدا زده می‌شود از آن استفاده نمود .این روش در برنامه‌هایی که دارای رابط کاربری هستند مثل برنامه‌های WinForm یاWPF مفید است . اگردر Task مورد نظر پروسه غیر همزمان دیگری مثل خواندن و نوشتن روی دیسک انجام می‌شود این روش بسیار مفید است و Delegate ترید اصلی برنامه را براحتی از دریافت درخواست کنسل شدن Task آگاه می کند. مثال :
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_08 {
    
    class Listing_08 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the task
    
    Task task = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    if (token.IsCancellationRequested) {
    
    Console.WriteLine("Task cancel detected");
    
    throw new OperationCanceledException(token);
    
    } 
    else
     {
    
    Console.WriteLine("Int value {0}", i);
    
    }
    
    }
    
    }, token);
    
    // register a cancellation delegate
    
    token.Register(() => {
    
    Console.WriteLine(">>>>>> Delegate Invoked\n");
    
    });
    
    // wait for input before we start the task
    
    Console.WriteLine("Press enter to start task");
    
    Console.WriteLine("Press enter again to cancel task");
    
    Console.ReadLine();
    
    // start the task
    
    task.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling task");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    

    تنها تفاوت دو مثال قبلی دراستفاده از متد Register از کلاس CancellationToken می باشد. متد Register یک نمونه از کلاس Action را دریافت کرده و در هنگام کنسل کردن Task نمونه کلاس Action را اجرا می کند.

    مونیتور کردن فرایند کنسل شدن با استفاده از هندل انتظار یا Wait Handle


    در این روش از متد WaitOne ازخصوصیت WaitHandle کلاس CancellationToken استفاده می‌شود . در مثال زیر دو Task وجود دارد Task دوم متد WaitOne را از token که در Task اول استفاده می‌شود را صدا می‌زند این امر موجب بلاک شدن ترید تا زمان مشخص شدن تکلیف کنسل شدن Task اول می‌شود :

    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_09 {
    
    class Listing_09 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the task
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    if (token.IsCancellationRequested) {
    
    Console.WriteLine("Task cancel detected");
    
    throw new OperationCanceledException(token);
    
    }
     else 
    {
    
    Console.WriteLine("Int value {0}", i);
    
    }
    
    }
    
    }, token);
    
    // create a second task that will use the wait handle
    
    Task task2 = new Task(() => {
    
    // wait on the handle
    
    token.WaitHandle.WaitOne();
    
    // write out a message
    
    Console.WriteLine(">>>>> Wait handle released");
    
    });
    
    // wait for input before we start the task
    
    Console.WriteLine("Press enter to start task");
    
    Console.WriteLine("Press enter again to cancel task");
    
    Console.ReadLine();
    
    // start the tasks
    
    task1.Start();
    
    task2.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling task");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    }
    
    }
    
    }
    

    کنسل کردن چندین Task بطور همزمان
    با تعریف یک نمونه از کلاس CancellationToken و استفاده از آن در هنگام ایجاد چند Task براحتی می‌توانید با یک بار صدا کردن متد Cancel تمام Task ها را با هم کنسل نمود . مثال :
    using System;
    
    using System.Threading;
    
    using System.Threading.Tasks;
    
    namespace Listing_10 {
    
    class Listing_10 {
    
    static void Main(string[] args) {
    
    // create the cancellation token source
    
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    
    // create the cancellation token
    
    CancellationToken token = tokenSource.Token;
    
    // create the tasks
    
    Task task1 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 1 - Int value {0}", i);
    
    }
    
    }, token);
    
    Task task2 = new Task(() => {
    
    for (int i = 0; i < int.MaxValue; i++) {
    
    token.ThrowIfCancellationRequested();
    
    Console.WriteLine("Task 2 - Int value {0}", i);
    }
    
    }, token);
    
    // wait for input before we start the tasks
    
    Console.WriteLine("Press enter to start tasks");
    
    Console.WriteLine("Press enter again to cancel tasks");
    
    Console.ReadLine();
    
    // start the tasks
    
    task1.Start();
    
    task2.Start();
    
    // read a line from the console.
    
    Console.ReadLine();
    
    // cancel the task
    
    Console.WriteLine("Cancelling tasks");
    
    tokenSource.Cancel();
    
    // wait for input before exiting
    
    Console.WriteLine("Main method complete. Press enter to finish.");
    
    Console.ReadLine();
    
    }
    
    }
    
    }
    
    • Digg
    • Sphinn
    • del.icio.us
    • Facebook
    • Google
    • Furl
    • Reddit
    • StumbleUpon
    • Donbaleh
    • Technorati
    • Balatarin
    • twitthis