TAPI در ویژوال بیسیک چيست ؟
TAPI يا Telephony API يک
کتابخانه استاندارد برای کار با مودم و نوشتن برنامه های تلفنی می باشد .
برای نمونه می توان از برنامه های Phone Dialer ( شماره گير تلفن ) ،
برنامه شبکه سازی تلفنی ( Dialup Networking ) ، برنامه تشخيص پالس مودم
برای ضبط اطلاعات وارد شده از طرف کاربران و کاربردهای ديگر در اين زمينه
نام برد . اين کتابخانه به شما کمک کمک می کند تا بدون درگير شدن با برنامه
نويسی سخت افزار مودم و درايور آن بطور مستقيم بتوانيد برنامه های
کاربردیي در اين زمينه بنويسيد .
مروری بر Microsoft Telephony :
Telephony
امکان مجتمع سازی کامپيوترها با دستگاههای ارتباطی و شبکه ها را فراهم
نموده است . معمولاً دستگاه ارتباطی يک مودم و خط ارتباطی نيز شبکه PSTN (
شبکه عمومی تلفن سوئيچينگ ) می باشد . برخی از کاربردهای Telephony عبارتند
از :
۱ – کنفرانسهای مالتی مديا بصورت Multicast
۲ – VoIP
۳ – مرکز پاسخ گويي اتوماتيک
۴ – تماس تلفنی از طريق کامپيوتر روی شبکه PSTN
دياگرام زير معماری Microsoft Telephony را نشان می دهد :
برنامه های TAPI :
برای
نوشتن برنامه های کاربردی با استفاده از TAPI بايستی ابتدا در مورد سطح
سرويسی که می خواهيم ارائه دهيم تصميم گيری کنيم . برای مثال برای نوشتن يک
برنامه شماره گير تلفن نياز به استفاده کامل از TAPI نيست و می توان از
قابليتهای خود ويندوز در اين زمينه استفاده کرد ( Assisted Telephony ) .
در بخشهای بعدی در مورد سطوح مختلف سرويس در TAPI بيشتر صحبت خواهم کرد .
دومين
مطلبی که بايد مورد توجه قرار داد اينست که می خواهيم از TAPI 2.x استفاده
کنيم يا از TAPI 3.x . تفاوت ايندو آنست که TAPI ورژن ۲ يک API برمبنای C
است در حاليکه ورژن ۳ آن بر مبنای تکنولوژی COM می باشد . در بخشهای بعدی
مطالب بيشتری در مورد تفاوتهای اين دو نسخه بيان خواهم کرد .
بخشهای اصلی يک برنامه کامل TAPI عبارتند از :
۱
– TAPI Initialization : شامل load کردن TAPI dll ، اتصال به TAPI Server ،
مذاکره در مورد ورژن TAPI و برپاسازی سيستم اطلاع رسانی event می باشد .
۲ – Session Control : مقداردهی اوليه ، دريافت و کنترل تماسها
۳ – Device Control : دريافت و تنظيم اطلاعات دستگاه
۴ – Media Control : تشخيص و يا توليد تونها و ارقام ، کنترل stream
۵ – TAPI Shutdown : آزاد سازی منابع
مقداردهی اوليه TAPI :
عملکرد درست اجزای TAPI نياز به برپاسازی محيط ارتباطی روی کامپيوتر مورد نظر دارد . مراحل اين امر عبارتند از :
۱
– نصب TAPI : زمانيکه سخت افزار و يا نرم افزار برای اولين بار به
کامپيوتر اضافه می شود انجام می گيرد . جزئيات کار به سيستم عامل و نرم
افزار بستگی دارد .
۲ – مقداردهی ابتدائی : ساخت اشيا و مسيرهای ارتباطی
۳ – مذاکره در مورد ورژن TAPI : برای اطمينان از اينکه اجزای TAPI قادر به تبادل داده ها باشند .
۴ – استخراج اطلاعات منابع : بدست آوردن اطلاعاتی در مورد دستگاهی که می توان از آن در برنامه TAPI مورد نظرمان استفاده نمود .
۵ – Event notification : برپاسازی سيستم اطلاع رسانی event
مقداردهی اوليه TAPI در ويژوال بيسيک :
از منوی Project گزينه References را انتخاب کرده و از ليست مربوطه مورد Microsoft TAPI 3.0 Type Library را انتخاب کنيد .
حال وارد بخش کد نويسی فرمتان شويد و متغير objTAPI را بصورت زير تعريف کنيد :
Dim objTapi As TAPI
سپس در بخش مربوط به Form Load شی objTAPI را بصورت زير ايجاد می کنيم :
Set objTapi = New TAPI
همانطور که در بخشهای قبلی گفته شد ، قبل
از فراخوانی هر تابع TAPI ابتدا بايستی آنرا مقداردهی اوليه کنيم . برای
مقداردهی اوليه کردن شی TAPI عبارت زير را بنويسيد :
Call objTapi.Initialize
انتخاب يک آدرس :
کد زير نشان
می دهد که چگونه می توان با استفاده از شی TAPI در ويژوال بيسيک منابع
تلفنی در دسترس را برای يک آدرس که بتواند يک مجموعه مشخص از نيازها را
مديريت کند ، بررسی کرد .
توجه داشته باشيد که قبل از انجام اين کار بايستی عمل مقداردهی اوليه TAPI را که در بخش قبل ررسی شد ، انجام دهيد .
نکته
: در کد زير عمل error checking انجام نگرفته است و برای استفاده از کد
زير در برنامه های واقعی بايستی بخش بررسی خطا را به آن اضافه کنيد .
۱ – تعريف يک شی آدرس و يک شی مجموعه آدرس :
Dim gobjAddress As ITAddress
Dim objCollAddresses As ITCollection
۲ – تنظيم شی objCollAddress بعنوان يک مجموعه آدرس از شی objTapi :
Set objCollAddresses = objTapi.Addresses
۳ – پيدا کردن آدرسی که بتواند از واسط مورد نظر ما پشتيبانی کند :
bFound = False
For indexAddr = 1 To objCollAddresses.Count
Set objCrtAddress = objCollAddresses.Item(indexAddr)x
Set objMediaSupport = objCrtAddress
Set objAddressCapabilities = objCrtAddress
If objMediaSupport.QueryMediaType( nSelectedType ) x
bFound = True
End If
Set objAddressCapabilities = Nothing
Set objMediaSupport = Nothing
Set objCrtAddress = Nothing
If bFound = True Then Exit For
Next indexAddr
در صورتيکه آدرس مورد نظزر پيدا شود برنامه از حلقه خارج شده و gobjAddress يک آدرس قابل استفاده خواهد بود :
Set gobjAddress = objcollAddresses.Item(indexAddr)x
انجام EventHandling در TAPI :
کد
زير شامل يک event handler ساده برای TAPI ، رجيستر کردن واسط event ،
تنظيم فيلتر event و رجيستر کردن تمام فراخوانيهای دادن اخطار است . هدف
اصلی از اين کد اينست که مطمئن شويم بخشی از TAPI که event ها را دريافت می
کند پردازشی را قبل از انتقال به بخشهای ديگر انجام دهد .
تعاريفها :
Dim WithEvents gobjTapiWithEvents As TAPI
Attribute gobjTapiWithEvents.VB_VarHelpID = -1
Dim glRegistrationToken As Long
Const TAPI3_CALL_EVENTS =TE_CALLMEDIA Or
TE_CALLNOTIFICATION Or TE_CALLSTATE
تنظيم eventfilter بصورتيکه تمام event های تعريف شده برای TAPI را بپذيرد :
objTapi.EventFilter = TAPI3_CALL_EVENTS
رجيستر کردن event ها :
Set gobjTapiWithEvents = objTapi
Dim fOwner As Boolean, fMonitor As Boolean
Dim lMediaTypes As Long, lCallbackInstance As Long
fOwner = True
fOwner = True
fMonitor = False
lMediaTypes = TAPIMEDIATYPE_AUDIO
lCallbackInstance = 1
glRegistrationToken = gobjTapi.RegisterCallNotifications(gobjAddress,fMonitor,
fOwner,lMediaTypes,lCallbackInstance)x
انتخاب يک ترمينال :
+ قبل از اينکه يک ترمينال را برای برقراری ارتباط انتخاب کنيد بايستی TAPI Initialization و عمل انتخاب آدرس را انجام داده باشيد .
ابتدا يک متغير از نوع ITBasicCallControl ( واسط کنترل تماس ) تعريف می کنيم :
Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo
سپس يک متغير از نوع ITTerminalSupport ( کوئری از شی آدرس ) تعريف می کنيم :
Dim objTerminalSupport As ITTerminalSupport
Set objTerminalSupport = gobjAddress
سپس متغير ترمينال را تعريف کرده و توسط شی objTerminalSupport يک ترمينال را برای آن استخراج می کنيم :
Dim objTerminal As ITTerminal
Set objTerminal = objTerminalSupport.GetDefaultStaticTerminal(lMediaType, dir)x
در اينجا ديگر نيازی به شی objTerminalSupport نيست بنابراين آنرا آزاد می کنيم :
Set objTerminalSupport = Nothing
سپس نياز به تعريف شی objStreamControl برای کنترل ترمينال است :
Dim objStreamControl As ITStreamControl
Set objStreamControl = objCallControl
در صورتيکه اين شی ايجاد شود ، به ازای
استريم های موجود در ITCollection امکان ايجاد ترمينال در يک حلقه for
بررسی می شود و ترمينال مناسب انتخاب می گردد :
If Not (objStreamControl Is Nothing) Then
Dim objITCollStreams As ITCollection
Set objITCollStreams = objStreamControl.Streams
Dim nIndex As Long, objCrtStream As ITStream
For nIndex = 1 To objITCollStreams.Count
Set objCrtStream = objITCollStreams.Item(nIndex)x
If objCrtStream.MediaType = lMediaType Then
If objCrtStream.Direction = dir Then
Call objCrtStream.SelectTerminal(objTerminal)x
End If
End If
Set objCrtStream = Nothing
Next nIndex
Set objITCollStreams = Nothing
Set objStreamControl = Nothing
End If
ايجاد يک تماس ( Make a Call ) :
+ قبل از اين بخش بايستی مراحل TAPI Initialization و عمل انتخاب آدرس انجام شده باشد .
اين
بخش برای ايجاد يک شی تماس ، بررسی و مشخص کردن استريمی که با اين تماس در
ارتباط است ، انتخاب و ايجاد ترمينالهای مناسب و کامل کردن ارتباط استفاده
می شود .
قبل TAPI Initialization و عمل انتخاب آدرس و انتخاب ترمينال انجام شده باشد .
در ابتدا با استفاده از متد CreateCall يک شی تماس ساخته می شود :
Set gobjCall = gobjOrigAddress.CreateCall(strDestAddress, nSelectedType,lMediaTypes)x
سپس در اينجا بايستی کدی که در بخش اول اين درس برای انتخاب ترمينال نوشته شد آورده شود :
}
Select Terminal Code
{
سپس بايستی دستور Connect اجرا شود :
gobjCall.Connect (False)x
False بدين معناست که ارتباط بصورت آسنکرون برقرار می شود .
دريافت يک تماس :
کد زير
برای يافتن و يا ايجاد يک ترمينال مناسب برای دريافت يک تماس بکار می رود .
بايستی توجه داشته باشيد که قبل از اجرای کد زير بايستی مراحل مقداردهی
اوليه ، انتخاب يک آدرس و رجيسر کردن event ها را انجام دهيد . همچنين در
کد زير بايستی مرحله انتخاب ترمينال را نيز انجام دهيد . توجه داشته باشيد
که در کد زير متغير pEvent يک اشاره گر برای واسط ITCallNotificationEvent
است که توسط TAPI به event Handler داده می شود :
If TapiEvent = TE_CALLNOTIFICATION Then
Dim objCallNotificationEvent As ITCallNotificationEvent
Set objCallNotificationEvent = pEvent
Dim gobjReceivedCallInfo As ITCallInfo
Set gobjReceivedCallInfo = objCallNotificationEvent.Call
Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo
objCallControl.Answer
مفهوم P/E چيست؟
يا نسبت قيمت به سود يكي از افزارهاي قديمي و
عموماً پر استفاده به منظور ارزش گذاري سهام است. هر چند محاسبه P/E بسيار
ساده است اما تفسير آن عملاً دشوار مي نمايد. در شرايط معيني اين نسبت
بسيار گويا و در زمان هاي ديگر كاملاً بي معنا جلوه مي كند. از اين رو،
غالباً سرمايه گذاران اين اصطلاح را نادرست به كار مي گيرند و در
تصميماتشان بيش از حد لازم به آن وزن مي دهند.
در بخش هاي بعدي اين
مقاله ابتدا به تشريح و تبيين P/E مي پردازيم، سپس چگونگي استفاده از اين
نسبت را در تجزيه و تحليل سهام بازگو مي كنيم، و سرانجام به شرايطي مي
پردازيم كه نبايد از اين نسبت استفاده شود.
P/E چيست ؟
P/E
كوتاه شده نسبت price) P يا قيمت سهم) به ESP) Earning Per Share) يا سود
هر سهم است. همان گونه كه از نام آن پيدا است، براي محاسبه P/E آخرين قيمت
روز سهام يك شركت به سود هر سهم (EPS) آن تقسيم مي شود.غالباً P/E در تاريخ
هايي محاسبه مي شود كه شركت ها اطلاعات EPS (معمولاً سه ماهانه) را افشا
مي كنند. اين P/E را كه بر مبناي آخرين EPS محاسبه مي شود بعضاً P/E دنباله
دار نيز مي گويند. اما گاهي از EPS برآوردي براي محاسبه P/E استفاده مي
شود، اين EPS معمولاً معرف سود برآوردي سال آينده است. در اين صورت به P/E
محاسبه شده P/E برآوردي يا پيشتاز گفته مي شود.
محاسبه P/E گاهي روش
سومي هم دارد كه مبتني بر ميانگين دو فصل گذشته و برآورد دو فصل باقيمانده
سال است. تفاوت عمده اي بين اين سه نوع وجود ندارد اما بايد بدانيد كه از
محاسبات داده هاي تاريخي واقعي در مقايسه با برآوردهاي تحليلگران مالي
استفاده كنيد. مشكل بزرگ محاسبه P/E مربوط به شركت هايي است كه سود آور
نيستند و از اين رو EPS منفي دارند. در خصوص چگونگي رفتار با اين پديده
ديدگاه هاي متفاوتي وجود دارد. برخي قائل به وجود P/E منفي هستند، گروهي در
اين حالت P/E را صفر مي دانند و بسياري ديگر هم معتقدند كه ديگر P/E محلي
از اعراب ندارد.
به لحاظ تاريخي در بورس اوراق بهادار تهران عموماً
ميانگينP/E در دامنه ۲/۳ تا ۲/۱۳تجربه شده است. نوسان P/E در اين دامنه
عمدتاً بستگي به شرايط اقتصادي هر زمان دارد. در حال حاضر ميانگين P/E كل
شركت هاي پذيرفته شده در بورس تهران حدود ۲/۸ است. همچنينP/E بين شركت ها و
صنايع مي تواند كاملاً متفاوت باشد.
كاربرد P/E :
به
لحاظ نظري، P/E يك سهم به ما مي گويد كه سرمايه گذاران چند ريال حاضرند به
ازاي هر ريال سود يك شركت پرداخت نمايند. به همين جهت به آن ضريب سهام نيز
مي گويند. به عبارت ديگر اگر P/E يك سهم ۲۰ باشد بدين معني است كه سرمايه
گذاران حاضرند ۲۰ ريال براي هر ريال از سود اين سهم (كه شركت توليد مي كند)
بپردازند.
الف- رشد سود
آنچه در بحث
بالا به آن پرداختيم رشد شركت ها است. قيمت سهام بازتاب انتظارات سرمايه
گذاران از ارزشو رشد آينده شركت است. اما توجه كنيد كه اندازه سود (EPS)
معمولاً مبتني بر سود هاي (EPSهاي) گذشته است. اگر شركتي انتظار رشد دارد
بنابراين انتظار داريم كه سودش نيز رشد كند. در نتيجه تفسيري بهتر از P/E
آن است كه خوشبيني بازار از آينده رشد يك شركت را باز تاب مي دهد.
اگر
P/E شركتي بالاتر از ميانگين بازار يا صنعت باشد بدين معني است كه بازار در
ماه ها يا سال هاي آينده انتظارات بزرگي از سهم اين شركت دارد. شركتي با
P/E بالا بايد سود هاي فزاينده ايجاد كند، در غير اين صورت قيمت سهمش سقوط
خواهد كرد. مثالي از شركت ايران خودرو گوياي اين بحث است.
ب- ارزاني يا گراني
P/E در
مقايسه با قيمت بازار شاخص بهتري براي ارزش گذاري سهم است. مثلاً به شرط
پايداري ساير متغيرها، سهمي با قيمت ۲۰۰ ريال و P/E برابر ۱۰ بسيار گران تر
از سهمي با قيمت ۲۰۰۰۰ و P/E برابر ۱۰ است. توجه كنيد كه محدوديت هايي در
اين مثال وجود دارد. شما نمي توانيد P/E هاي دو شركت كاملاً متفاوت را براي
ارزش گذاري بهتر آنها مقايسه كنيد. به عبارت ديگر تعيين بالا يا پايين
بودن P/E بدون توجه به دو عامل اصلي بسيار دشوار است: ۱) نرخ رشد شركت و ۲)
صنعت.
۱- نرخ رشد شركت
آيااندازه
رشد گذشته شركت ها مي تواند معرف نرخ هاي انتظاري از رشد آينده باشد؟ هر
چند پاسخ اين پرسش نمي تواند صريح باشد اما در عمل سرمايه گذاران براي پيش
بيني سود (EPS ) و محاسبه P/E از نرخ هاي رشد گذشته استفاده مي كنند.
۲- صنعت
مقايسه شركت ها
تنها در صورتي فايده مند است كه به يك صنعت تعلق داشته باشند، مثلاً شركت
هاي صنعتي كه عمدتاً داراي ضرايب P/E پايين هستند. چون به رغم ثبات صنعت
رشد پاييني دارند. از طرف ديگر شركت هاي صنعتي به دليل انتظار رشد از P/E
هاي بالايي برخوردارند.
دام هاي كاربرد P/E
تا بدين جا آموختيم كه در شرايط معيني
P/E مي تواند ما را در تعيين بالا يا پايين بودن ارزش يك شركت كمك كند.
همچنين پي برديم كه P/E تنها در شرايط معيني معتبر است. اما علاوه براين
دام هاي ديگري نيز در تحليل P/E وجود دارد كه در ادامه درباره برخي از آنها
بحث مي شود.
حسابداري
سود يك اندازه حسابداري است كه در محاسبه
اش از اقلام غيرنقدي نيز استفاده ميشود. معيارهاي اندازه گيري سود بر طبق
اصول حسابداري همگاني (GAAP ) مقرر مي شوند. اين اصول در گذر زمان تغيير
مي كند و در هر كشوري نيز متفاوت از ديگر كشورها است. از اين رو محاسبه سود
( EPS) بسته به چگونگي دفترداري و حسابداري مي تواند به صورت هاي متفاوت
ارائه شود. در نتيجه مقايسه سودها (EPS ها) با يكديگر گاهي به مقايسه سيب و
پرتقال مي ماند.
تورم
در شرايطي كه اقتصاد كشور تورم بالايي را
تجربه مي كند طبعاً كالاها و هزينه هاي استهلاك به دليل بالا رفتن هزينه
هاي جايگزيني كالاها و تجهيزات در مقايسه با سطح عمومي قيمت ها كم نمايي مي
شود. بنابراين در زمان هاي تورمي P/E ها عموماً پايين تر مي آيند زيرا
بازار سودها را كه به صورت ساختگي به بالا گرايش دارد تخريب شده مي بيند.
بررسي P/E همانند تمامي نسبت ها در گذر زمان براي پي بردن به روند آن
ارزشمند است. تورم اين بررسي را دشوار مي كند زيرا اطلاعات گذشته در امروز
از فايده مندي كمتري برخوردارند.
تفسيري ديگر
P/E پايين لزوماً بدين معني نيست كه ارزش
يك شركت كم نمايي شده است. بلكه به معناي آن است كه بازار معتقد است شركت
در آينده نزديك با مشكل روبه رو خواهد شد. سهمي كه قيمتش پايين مي آيد
معمولاً دليلي دارد.
عمده ترين دليلش اين است كه سود شركت كمتر از سود
انتظاري اش خواهد بود. اين مسئله P/E دنباله دار بازتابي ندارد مگر آن كه
سود در عمل نيز محقق گردد.
تنها به اتكاي P/E سهام نخريد
يكي از پر بسامدترين اشتباهاتي كه سرمايه
گذاران غير حرفه اي مرتكب مي شوند خريد سهام صرفاً به اتكاي P/E بالا يا
پايين است. توجه كنيد كه ارزشيابي سهام تنها با تكيه بر شاخص هاي ساده اي
مانند P/E ساده انگارانه و نادرست است. P/E بالا ممكن است به معني بيش
نمايي ارزش سهم باشد و هيچ تضميني وجود ندارد كه بعداً به سرعت پايين
نيايد. ضمناً توجه كنيد كه حتي اگر ارزش سهمي كم نمايي شده باشد ممكن است
ماه ها يا حتي سال ها طول بكشد تا بازار ارزش آن را اصلاح نمايد.
در هر
صورت تجزيه و تحليل سهام امري بسيار پيچيده تر از دانستن چند نسبت ساده
است. به عبارت ديگر هر چند كليدي براي معماي ارزش گذاري سهام است اما تمام
آن نيست. از اين رو توصيه مي شود كه سرمايه گذاران براي خريد سهام با
خبرگان سرمايه گذاري رايزني نمايند. پاسارگاد نيك آماده است تا سرمايه
گذاران علاقه مند را با قواعد سرمايه گذاري آشنا سازد.
نتيجه گيري
P/E همه چيز يا به عبارتي حرف آخر را
درباره ارزش سهم نمي گويد اما براي مقايسه شركت هاي يك صنعت، كل بازار يا
روند تاريخي P/E يك شركت سودآور است.
به ياد بسپاريد كه :
الف – P/E يك نسبت است و از تقسيم P يا PRICE يا قيمت روز سهم به EPS يا E يا سود هر سهم به دست مي آيد.
ب- سه نوع EPS به نام هاي EPS دنباله دار، آينده و ميانگين وجود دارد.
ج- به لحاظ تاريخي، ميانگين P/E ها در بازه ۲/۳ _ ۲/۱۳ قرار مي گيرد.
د- به لحاظ نظري، P/E يك سهم به ما مي گويد كه سرمايه گذاران حاضرند چند ريال به ازاي هر ريال سود بپردازند.
هـ – تفسير بهتري از P/E اين است كه آن بازتاب خوشبيني بازار از آينده رشد يك شركت است.
و- P/E در مقايسه با قيمت بازار شاخص بهتري براي ارزش گذاري يك سهم است.
ز- بدون در نظر گرفتن نرخ هاي رشد صنعت، صحبت از بالا يا پايين بودن P/E يك شركت بي معناست.
ح- تغيير در اصول حسابداري شامل وجود چندين روش مجاز براي سود (EPS ) تجزيه و تحليل P/E را دشوار مي كند.
ط- P/E ها عموماً در زمان تورم حاد پايين تر مي آيند.
ي- تفاسير بسياري پيرامون دليل پايين بودن P/E يك شركت وجود دارد.
ك- تنها به اتكاي ضريب P/E اقدام به خريد و فروش سهام نكنيد.