۱۳۹۰/۱۲/۰۸

ارتقاء به NH 3.2 - قسمت دوم


پيشتر مطلبي را در مورد 18 مقاله‌اي كه اكثر حالت‌هاي Mapping موجود در NHibernate را خلاصه كرده بود، مطالعه كرديد.
يك مورد هم در اين مطلب به نظر در مقايسه با Fluent NHibernate درنظر گرفته نشده است و آن هم بحث AutoMapping است. Fluent NHibernate اين قابليت را دارد كه بر اساس تعاريف كلاس‌هاي شما و روابط بين آن‌ها به صورت خودكار نگاشت‌ها را تشكيل دهيد. يعني خودش مباحث ارتباط‌هاي يك به چند و چند به چند و غيره را در پشت صحنه به صورت خودكار توليد كند؛ بدون حتي يك سطر كدنويسي اضافي. فقط حداكثر يك سري IAutoMappingOverride و همچنين تعدادي Convention نامگذاري را هم مي‌توان جهت تنظيمات اين سيستم تمام خودكار اعمال كرد. مثلا توسط IAutoMappingOverride، يكي از خاصيت‌هاي كلاس را به صورت Unique معرفي كرد و مابقي هم به صورت خودكار توسط قابليت Autommaping نگاشت مي‌شوند. يا توسط Convention نامگذاري سفارشي خود، به Fluent NHibernate اعلام مي‌كنيم كه من علاقمندم نام مثلا كليدهاي خارجي تشكيل شده بجاي اعدادي منحصربفرد، از روش ويژه‌اي كه تعيين مي‌كنم، ساخته شوند. اينجا است كه به نظر من كار با NHibernate حتي از Entity framework هم ساده‌تر است (يا ساده‌تر شده است).
قابليت AutoMapping ياد شده، در سيستم جديد توكار Mapping by code هم وجود دارد. فقط چون جايي به صورت درست و درمان مستند نشده، همه دور خودشان مي‌چرخند! به همين جهت مثالي را در اين زمينه آماده كردم كه موارد زير را پوشش مي‌دهد:
- نحوه اعمال تنظيمات بانك اطلاعاتي با كدنويسي در NH3,2
- نحوه يكپارچه سازي اين روش جديد با كتابخانه NHibernate Validator
- استفاده از NHibernate Validator جهت تنظيم طول فيلدهاي بانك اطلاعاتي توليدي به صورت خودكار
- نحوه تعريف قراردادهاي نامگذاري ويژه (مثلا نام جداول توليد شده به صورت خودكار،‌ برخلاف نام موجوديت‌ها، جمع باشد نه مفرد)
- اضافه كردن قابليت تشخيص many-to-many به auto-mapping موجود در NH3,2 (براي تشخيص اين مورد به كمك امكانات مهياي پيش فرض NH3,2، بايد اندكي كدنويسي كرد)
- نحوه بازنويسي قراردادهاي پيش فرض auto-mapping. مثلا اگر قرار باشد همه چيز خودكار شود اما يكي از فيلدها به صورت unique معرفي شود چكار بايد كرد.
- نحوه ذخيره اطلاعات mapping كامپايل شده در فايل و سپس بارگذاري خودكار آن در حين اجراي برنامه جهت بالا بردن سرعت بارگذاري اوليه برنامه.



۱۳۹۰/۱۱/۳۰

ارتقاء به NHibernate 3.2


شروع به كار با NH به دو قسمت تقسيم مي‌شود. يك قسمت نگاشت كلا‌س‌ها است و قسمت دوم سشن گرداني آن. قسمت دوم آن به همان مباحث كلاس‌هاي singleton ايي كه بحث آن‌ها در سايت هست بر مي‌گردد. يا حتي استفاده از كتابخانه‌هاي IOC براي مديريت آن (كه اين پياده سازي را به صورت توكار هم دارند).
قسمت نگاشت كلاس‌ها در NH انواع و اقسامي دارد:
  • ابتدا همان فايل‌هاي XML مدل Hibernate جاوا بود.
  • بعد شد مدل annotation ايي به نام Castle ActiveRecord. (اين پروژه آنچنان فعال نيست و علتش به اين بر مي‌گردد كه نويسنده اصلي جذب مايكروسافت شده)
  • سپس Fluent NHibernate پديد آمد. (اين پروژه هم پس از NH 3.2 ، سرد شده و به نظر آنچنان فعال نيست)
  • الان هم مدل جديدي به صورت توكار و بدون نياز به كتابخانه‌هاي جانبي از NH 3.2 به بعد به آن اضافه شده به نام mapping-by-code .
بنابراين روش مرجح از NH 3,2 به بعد، همين روش mapping-by-code توكار آن است. خصوصا اينكه نياز به وابستگي خارجي ندارد. براي مثال به دليل عدم فعال بودن پروژه‌هايي كه نام برده شد، مثلا NH 3,3 امروز ارائه مي‌شود، شايد دو ماه بعد، اين كتابخانه‌هاي جانبي ساده سازي نگاشت‌ها، به روز شوند يا نشوند.

و ... خبر خوب اينكه شخصي در 18 قسمت به توضيح اين قابليت جديد mapping by code پرداخته و روش‌هاي نگاشت مرتبط رو با مثال توضيح داده كه در آدرس زير مي‌تونيد اون‌ها رو پيدا كنيد:



NHibernate و مديريت خودكار تغييرات ساختار بانك اطلاعاتي


يكي از دردهاي عظمايي كه حين كار با بانك‌هاي اطلاعاتي رابطه‌اي وجود دارد، هماهنگ نبودن ديتابيس توسعه، با ديتابيس كاري است. البته ابزار‌هاي متعددي براي تهيه Diff بين اين دو وجود دارند. ولي زمانيكه قرار باشد اين كار را در چندجا هم انجام دهيم، باز هم مشكل خواهد بود.
با NHibernate مي‌شود كل اين مساله را فراموش كرد! مي‌شود راحت خاصيتي را به كلاسي اضافه كرد و در اولين بار اجراي برنامه، خود NHibernate هماهنگ سازي‌ها را انجام دهد. فيلد اضافه كند. جدول اضافه كند. روابط مرتبط را اضافه كند. يعني تا اين حد كه ما فقط فايل اجرايي برنامه را به روز كنيم، كافي باشد. البته در لابلاي مطالبي كه تا به حال در مورد NHibernate در اين سايت منتشر شده به اين موضوع هم پرداخته شده و مطلب جاري، خلاصه‌ي بزرگنمايي شده آن‌ها است.

اولين قدم: آيا ساختار ديتابيس جاري، با مدل برنامه تطابق دارد؟
قبل از اينكه از NHibernate بخواهيم ساختار بانك اطلاعاتي ما را تغيير دهيد، بايد بدانيم كه آيا واقعا نيازي به اينكار هست يا خير؟
توضيحات بيشتر در مورد روش تشخيص در اينجا: (^)

قدم دوم: اگر ساختار ديتابيس جاري با مدل برنامه تطابق ندارد، چگونه بايد آن‌را به صورت خودكار به روز كرد؟
متد زير بر اساس Configuration ابتدايي بانك اطلاعاتي و نگاشت‌هاي شما، كار به روز رساني خودكار ساختار بانك اطلاعاتي را انجام خواهد داد:

public void UpdateDatabaseSchema(NHibernate.Cfg.Configuration config)
{
     var schemaUpdate = new NHibernate.Tool.hbm2ddl.SchemaUpdate(config);
     schemaUpdate.Execute(script: false, doUpdate: true);
}

يك نكته را هم بايد درنظر داشت. در اين روش هيچ فيلد و جدولي حذف نمي‌شود و به اين ترتيب، جهت امنيت بيشتر طراحي شده. اگر واقعا نياز داشتيد فيلد يا جدولي را حذف كنيد بايد دستي، همانند سابق اقدام كنيد.

قدم سوم: چگونه و در كجا، دو قدم قبل را با برنامه يكپارچه كنيم؟
بلافاصله پس از ايجاد SessionFactory در برنامه، متد زير را فراخواني كنيد:

public void TryValidateAndUpdateDatabaseSchema(NHibernate.Cfg.Configuration config)
{
     try
     {
            ValidateDatabaseSchemaAgainstMappings();
     }
     catch
     {
            UpdateDatabaseSchema(config);
     }
}

متد ValidateDatabaseSchemaAgainstMappings در صورت عدم تطابق مدلي با بانك اطلاعاتي، يك exception را صادر مي‌كند. بنابراين در اينجا كافي است متد UpdateDatabaseSchema را در قسمت catch فراخواني كرد.
و از اين پس ديگر مي‌توانيد به روز رساني ساختار بانك اطلاعاتي برنامه را فراموش كنيد! فيلد اضافه كنيد، كلاس اضافه كنيد، تمام اين‌ها در اولين بار اجراي برنامه به روز شده، به صورت خودكار به بانك اطلاعاتي اعمال خواهند شد.


حساسيت سيستم فيلترينگ به عبارات كوكي‌هاي سايت‌ها


از ديروز نمي‌تونستم به يك سايت آزمايشي ASP.NET وصل بشم. مشكل هم با فايرفاكس بود. با IE تست كردم و سايت وارد شد. بنابراين سايت فيلتر نشده بود. مشكل از كجا بود؟


بله ... سيستم فيلترينگ به هدرها هم حساس شده. كوكي را دستي پاك كردم. مجددا پس از لاگين، با ساخته شدن كوكي جديد، مشكل برطرف شد.
اين حروف هم به صورت اتفاقي توليد مي‌شوند؛ بنابراين ممكن است با اين نوع مسايل زياد مواجه شويد! اگر يك سايت را با دو مرورگر متفاوت، يكي فيلتر شده و ديگري بدون مشكل باز كرديد، يعني يكبار بايد كوكي‌هاي سايت را در مرورگري كه با آن مشكل وجود دارد، پاك كنيد!

خطايي را هم كه مشاهده خواهيد كرد اين است:

IMB2-6
http://10.10.34.34?type=Invalid Pattern&policy=MainPolicy

۱۳۹۰/۱۱/۲۶

تعيين Fallback font براي قلم‌هاي فارسي در WPF


اكثر قلم‌هاي فارسي، فاقد تعاريف مرتبط با حروف انگليسي هستند. البته عموم كاربران متوجه اين امر نمي‌شوند چون ويندوز دو مفهوم Font Fallback و Font Linking را جهت پوشش glyph هاي تعريف نشده، در پشت صحنه اعمال خواهد كرد. جزئيات بيشتر در اينجا: (^ و ^)

به صورت خلاصه كار Font Fallback در ويندوز جايگزيني خودكار قلم مورد استفاده است؛ تحت شرايط زير:
- فونت تعريف شده در برنامه، در سيستم كاربر وجود نداشته باشد.
- تعاريف Glyphهاي بكارگرفته شده در متن جاري، در قلم انتخابي وجود نداشته باشند.

در WPF اين مساله كاملا قابل كنترل است. قلمي كه به صورت خودكار به عنوان جايگزين مطرح مي‌شود در قلمي به نام "Global User Interface" تعريف شده است. تعاريف اين قلم تركيبي هم در فايلي به نام GlobalUserInterface.CompositeFont در پوشه فونت‌هاي سيستم موجود است (براي مثال، مسير c:\windows\fonts حاوي اين فايل متني است).
اگر اين فايل XML را با يك اديتور متني باز كنيد، مشاهده خواهيد كرد كه بازه‌هاي مختلف كاراكترهاي يونيكد، به فونت‌هاي پيش فرضي نگاشت شده‌اند. بنابراين اگر اين سؤال وجود دارد كه در متن مخلوط فارسي و انگليسي من، فونت پيش فرض حروف انگليسي از كجا تامين و مشخص مي‌شود، پاسخ را در اين فايل مي‌توانيد مشاهده كنيد.

روش ديگري هم براي تعيين Fallback font در WPF وجود دارد. يك مثال:

<Window x:Class="WpfFontTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock 
            Text="نمايش مخلوطي از متن فارسي و متن English با هم"
            Margin="7"
            FontFamily="Fonts/BNazanin.ttf#B Nazanin, Comic Sans Ms"
            FontSize="25"
            FlowDirection="RightToLeft"
            VerticalAlignment="Top" HorizontalAlignment="Center"  />
    </Grid>
</Window>

در اين مثال فونت B Nazanin در برنامه قرار داده شده است (embedded font). همچنين در كنار آن پس از علامت كاما، Fallback font مشخص است. به اين معنا كه تاجايي كه ميسر است لطفا از فونت B Nazanin براي نمايش متن مورد نظر استفاده شود؛ اگر نشد از قلم Comic Sans Ms استفاده گردد. قلم B Nazanin حاوي تعاريف حروف انگليسي نيست. بنابراين WPF جهت نمايش آن‌ها از فونت دوم معرفي شده كمك مي‌گيرد. توضيحات بيشتر در اينجا: (^)

۱۳۹۰/۱۱/۲۵

زير نويس فارسي ويديوهاي ساخت برنامه‌هاي مترو توسط سي شارپ و XAML - قسمت آخر


زيرنويس‌هاي فارسي قسمت آخر «Building Windows 8 Metro Apps in C# and XAML» را از اينجا مي‌تونيد دريافت كنيد.

اين قسمت براي كساني كه مي‌خواهند مروري بر مفاهيم Binding موجود در WPF و سيلورلايت داشته باشند و همچنين تفاوت‌هاي آن‌را با نمونه موجود در WinRT بررسي كنند، بسيار مفيد است. در كل سيستم Binding موجود در WinRT يك نمونه ساده شده آنچيزي است كه در سيلورلايت موجود است (و البته سيلورلايت هم يك نمونه ساده شده WPF است!).
براي مثال خاصيت UpdateSourceTrigger موجود در عبارات Binding مرتبط با WPF و سيلورلايت فعلا در WinRT وجود ندارد.
تفاوت ديگر اين است كه هرچند اينترفيس INotifyPropertyChanged در WinRT هم وجود دارد اما نمونه مهياي در فضاي نام جديدي به نام windows.ui.xaml.data توسط WinRT شناسايي مي‌شود و اگر كدهاي ساير فناوري‌هاي مشابه را به سيستم مترو تبديل كنيد، كار نخواهند كرد! چون اين اينترفيس پيشتر در فضاي نام System.ComponentModel تعريف شده بود و هنوز هم حضور دارد (فقط در حد يك تغيير سطر تعاريف فضاهاي نام كفايت مي‌كند).
يك تله ديگر هم در WinRT وجود دارد. در اينجا هم كلاسي به نام DependencyObject وجود دارد كه ... معادل نمونه مشابه WPF و Silverlight نيست و XAML امكان تشخيص خودكار تغييرات خواص آن‌را ندارد.
همچنين اينترفيس INotifyCollectionChanged مرتبط با ObservableCollection موجود در WPF و Silverlight در WinRT فعلا وجود خارجي ندارند (هرچند هنوز در خود دات نت فريم ورك وجود دارند، اما كار نمي‌كنند). به نظر قرار است تا قبل از ارائه نهايي ويندوز 8 در اين مورد تصميم گيري شود. اما در اينجا بايد از IObservableVector استفاده كرد! (كلا اين كلمه Vector ابراز وجود زايد طراحان سي++ مترو است! يعني ما هنوز هم زنده‌ايم و سي++ هنوز هم مهم است!)
نحوه گروه بندي اطلاعات نيز تغيير كرده است و بايد منبع داده‌اي، اينترفيس جديد IGroupInfo را پياده سازي كند. به علاوه CollectionViewSource آن نيز فعلا قابليت‌هاي جستجو و مرتب سازي موجود در WPF و سيلورلايت را ارائه نمي‌دهد.

۱۳۹۰/۱۱/۲۲

دسترسي رايگان به كل مجموعه Pluralsight به مدت 10 روز


سايت Pluralsight به مدت 10 روز دسترسي به 213 دوره خودش رو رايگان كرده. براي ثبت نام مي‌تونيد به اينجا مراجعه كنيد.

منبع

۱۳۹۰/۱۱/۲۰

رزومه‌اي دريافتي از آبادان!


بيل گيتس زماني خودش رو از مايكروسافت بازنشسته كرد كه من قول دادم برم اونجا كار كنم!
من با تله پاتي، 1020 كلمه در دقيقه تايپ مي‌كنم!
من برج Hanoi رو در يك حركت حل مي‌كنم!
زبان‌هاي برنامه نويسي رو كه نمي‌دونم، اون‌هايي هستند كه هنوز اختراع نكردم!
اينتل سخت افزار خودش رو براي تطابق با كامپايلر من بهينه مي‌كنه!
كامنت‌هاي كدهاي من جايزه Pulitzer رو برنده شدن!
من راحت 10 ميليون سطر كد سي++ رو در notepad تايپ مي‌كنم و بعد هم بدون مشكل كامپايل ميشه!
من وقتي استثنايي رو صادر مي‌كنم از ديوارها هم رد مي‌شن!
استيل كد نويسي من در طي دو سال بعد بعنوان بهترين استيل ممكن در نظر گرفته ميشه و قراردادهاي كاري من بعد از قرائت كتاب مقدس خونده مي‌شن!
مسيح تنها شخصي است كه صلاحيت code review كارهاي من رو داره! او زماني به زمين باز خواهد گشت كه من نياز به code review داشته باشم و البته هنوز نياز نشده!
تنها الگوي برنامه نويسي شيءگرايي رو كه مي‌شناسم «God Object» هست!
من كل برنامه رو در طي يك Assert مي‌تونم Unit test كنم!
من نيازي به تايپ sudo قبل از نوشتن فرامين مديريتي ندارم؛ فقط كافي است اسم خودم رو ابتداي فرمان تايپ كنم!
تمام آرايه‌هاي تعريف شده توسط من داراي اندازه بي‌نهايت هستند؛‌ براي اينكه من حد و مرزي رو نمي‌شناسم!
دفتر ثبت اختراعات، قبل از صدور مجوز جديدي، وبلاگ من رو جهت تكراري نبودن مورد ارجاعي، بررسي مي‌كنه!
من هيچ وقت استانداردهاي وب رو رعايت نمي‌كنم، چون وب استانداردهاي خودش رو از من مي‌گيره!
من حتي مي‌تونم Recycling Bin رو هم Delete كنم!
من شماره نگارشي براي برنامه خودم درنظر نمي‌گيرم؛ چون اين برنامه در همان سعي اول نهايي ميشه!
من معمولا تنها كسي هستم كه به جلسات دعوت مي‌شم؛ البته من از همه اين‌ها صرفنظر مي‌كنم!
چون من هيچ وقت باگي رو به كدها اضافه نمي‌كنم، بعد از استخدام من مي‌تونيد افراد گروه تست را بازنشسته كنيد!
كار كردن با من افتخاري براي شركت شما خوهد بود و من اين رو هر روز به شما يادآوري خواهم كرد!
پياده سازي IEqualityComparer در مورد من صدق نمي‌كنه، چون من معادلي ندارم!
من مشكلي براي حضور در شركت شما در سراسر كشور ندارم، چون حوزه كاري من آبادان و «حومه» است!

ماخذ!

۱۳۹۰/۱۱/۱۹

iTextSharp و نمايش صحيح تاريخ در متني راست به چپ


خروجي PDF زير را در نظر بگيريد:

مشكلي را در آن مشاهده مي‌كنيد؟ اصل آن يا صحيح آن بايد به شكل زير باشد:


و اين وارونه نمايش دادن‌ها، دقيقا مشكلي است كه حين كار با iTextSharp براي نمايش متني مثلا به همراه يك تاريخ شمسي وجود دارد. البته اين مشكل هم اساسا به خود استاندارد يونيكد برمي‌گردد كه يك سري كاراكتر را «كاراكتر ضعيف» معرفي كرده؛ براي مثال كاراكتر اسلش بكار رفته در يك تاريخ هم از اين دست است. بنابراين PDF توليدي توسط iTextSharp از ديد استاندارد يونيكد مشكلي ندارد، زيرا يك «نويسه ضعيف» مثل اسلش نمي‌تواند جهت را تغيير دهد؛ مگر اينكه از يك «نويسه قوي» براي دستكاري آن استفاده شود. براي مثال اين نويسه‌ها قوي هستند:

U+202A:   LEFT-TO-RIGHT EMBEDDING (LRE) 
U+202B:   RIGHT-TO-LEFT EMBEDDING (RLE) 
U+202D:   LEFT-TO-RIGHT OVERRIDE (LRO) 
U+202E:   RIGHT-TO-LEFT OVERRIDE (RLO) 
U+202C:   POP DIRECTIONAL FORMATTING (PDF) 

براي رسيدن به تصوير صحيح نمايش داده شده در بالا، متد FixWeakCharacters زير را تهيه كرده‌ام كه حداقل با iTextSharp جواب مي‌ده:

using System;
using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace RleTests
{
    class Program
    {
        const char RightToLeftEmbedding = (char)0x202B;
        const char PopDirectionalFormatting = (char)0x202C;

        static string FixWeakCharacters(string data)
        {
            if (string.IsNullOrWhiteSpace(data)) return string.Empty;
            var weakCharacters = new[] { @"\", "/", "+", "-", "=", ";", "$" };
            foreach (var weakCharacter in weakCharacters)
            {
                data = data.Replace(weakCharacter, RightToLeftEmbedding + weakCharacter + PopDirectionalFormatting);
            }
            return data;
        }

        static void Main(string[] args)
        {
            using (var pdfDoc = new Document(PageSize.A4))
            {
                PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
                pdfDoc.Open();

                FontFactory.Register("c:\\windows\\fonts\\Arial.ttf");
                Font tahoma = FontFactory.GetFont("Arial", BaseFont.IDENTITY_H);

                var table1 = new PdfPTable(1);
                table1.WidthPercentage = 100;

                var pdfCell = new PdfPCell
                {
                    RunDirection = PdfWriter.RUN_DIRECTION_RTL,
                    Border = 0,
                    Phrase = new Phrase(FixWeakCharacters(
                        "تاريخ: " + "1390/11/18" + Environment.NewLine +
                        "شماره پروژه: " + "1/2/3/4/56" + Environment.NewLine +
                        "اسلش: " + " 12/A/13 " + Environment.NewLine +
                        "بك اسلش: " + "  12\\13\\14 " + Environment.NewLine +
                        "مساوي و جمع: " + " 2+3=5 " + Environment.NewLine +
                        "سمي كولون: " + " 2=1+1; " + Environment.NewLine +
                        "دلار: " + "12$" + Environment.NewLine +
                        "كاما: " + "12,34,67" + Environment.NewLine +
                        "نقطه: " + "12.34" + Environment.NewLine +
                        "پرانتز: " + "متن (ساده)"
                        ),
                        tahoma)
                };

                table1.AddCell(pdfCell);
                pdfDoc.Add(table1);

            }

            Process.Start("Test.pdf");
        }
    }
}

از اين نوع مشكلات حين كار با HTML هم هست؛ وارونه نمايش داده شدن تاريخ فارسي در بين يك متن راست به چپ. البته در آنجا راه حل زير هم توصيه شده (بدون نياز به دستكاري نويسه‌ها):

<span dir="ltr" style="display:inline">1390/11/19</span>

۱۳۹۰/۱۱/۱۴

استفاده از قابليت Speech Recognition ويندوز 7 براي توليد زيرنويس انگليسي


از ويندوز ويستا به بعد، ويندوز به صورت توكار داراي يك موتور تشخيص صدا شده است كه در اين مسير قابل مشاهده مي‌باشد:
Control Panel\Ease of Access\Speech Recognition

اين سرويس از طريق اسمبلي استاندارد System.Speech در دات نت فريم ورك قابل استفاده است كه اكنون با برنامه‌ي Subtitle tools يكپارچه شده است.


يكي از خصوصيات مفيد اين موتور تشخيص صدا، امكان دريافت فايل‌هاي صوتي نيز مي‌باشد. فايل صوتي دريافتي بايد مطابق يكي از فرمت‌هاي پشتيباني شده توسط آن، تهيه شود؛ كه اين مورد را ذيل قسمت Supported audio formats شكل فوق مي‌توانيد مشاهده كنيد.
براي نمونه توسط برنامه AoA Audio Extractor Basic، مي‌توان اين تبديلات را انجام داد و يكي از تنظيمات قابل قبول توسط موتور Speech Recognition ويندوز 7 را در تصوير ذيل مي‌توانيد مشاهده كنيد: (و در غيراينصورت هيچ خروجي را نخواهيد گرفت؛‌ خيلي مهم!)


پس از انتخاب و گشودن فايل صوتي در برنامه Subtitle tools (كليك بر روي دكمه Open WAV‌ در اينجا) و سپس كليك بر روي دكمه‌ي Recognize يا Start ، كار موتور Speech Recognition ويندوز شروع شده و برنامه هم در اينجا از فرصت استفاده كرده و دريافتي نهايي را تبديل به ركوردهاي فايل زيرنويس مي‌كند كه نمونه‌اي از آن‌را در شكل فوق مي‌توانيد ملاحظه كنيد.


نكاتي در مورد استفاده بهينه از موتور تشخيص صداي ويندوز:

الف) براي آزمايش برنامه، يك فايل voice را از اينجا دريافت كنيد. اين فايل voice از همان سري مترو PluralSight تهيه شده است.
ابتدا موتور تشخيص صداي انتخابي را بر روي حالت US قرار داده و تست كنيد. در ادامه يكبار هم برروي حالت UK قرار دهيد و كار تشخيص صدا را آغاز نمائيد.
نتايج كاملا متفاوت خواهند بود و با توجه به لهجه انگليسي گوينده، تشخيص‌هاي حالت UK، به واقعيت نزديكتر هستند. اين مورد را در گزينه‌ي Average confidence هم مي‌توانيد مشاهده نمائيد. مثلا در اينجا موتور تشخيص صدا در كل به 60 درصد خروجي توليدي‌اش اطمينان دارد و مابقي ... آنچنان اعتباري ندارند.
مثلا متن صحيح سطر چهارم در تصوير فوق بايد «when they are not in the foreground» باشد!

ب) تنظيمات Timeouts
اگر به فايل voice فوق دقت كنيد، گوينده يك نفس از ابتدا تا انتها صحبت مي‌كند. اينجا است كه به كمك مقادير Silence timeout ، مي‌توان تعداد ركوردها را بر اساس فواصل تنفس كوتاهتري، بيشتر كرد. مثلا با اعداد پيش فرض سيستم، با فايل صوتي فوق به 5 خروجي خواهيد رسيد؛ اما با توجه به تنظيماتي كه در تصوير مشاهده مي‌كنيد، به 8 خروجي متعادل‌تر مي‌رسيم.


مزايا:
  • كار زمانبندي زير نويس خودكار مي‌شود.
  • تا حدود 60 درصد، خروجي متني مطمئني را مي‌توان شاهد بود.

در مورد ويندوز XP :

ويندوز XP به صورت پيش فرض داراي موتور Speech Recognition نيست. دو راه براي نصب آن در اين سيستم وجود دارد:

الف) استفاده از بسته نرم افزاري آفيس XP
به كنترل پنل مراجعه كرده، گزينه‌ي Add/remove programs را انتخاب نمائيد. در اينجا Microsoft Office XP را انتخاب و بر روي دكمه Change كليك كنيد. نياز است تا يكي از ويژگي‌هاي نصب نشده آن‌را نصب كنيم. به همين جهت در صفحه ظاهر شده، Add or Remove Features را انتخاب و در ادامه در قسمت Features to install ، گزينه‌ي Office Shared Features را انتخاب كنيد. ذيل مدخل Alternative User Input، امكان انتخاب و نصب Speech مهيا است.

ب) استفاده از Microsoft Speech SDK Setup 5.1
بر روي ويندوز 7، نگارش 8 اين برنامه نصب است؛ اما براي ويندوز XP تا نگارش 5.1 بيشتر ارائه نشده است. فايل‌هاي آن‌را از اينجا مي‌توانيد دريافت كنيد. نصب آن هم در اينجا توضيح داده شده.


من در كل ويندوز XP را براي اينكار توصيه نمي‌كنم چون هم موتور تشخيص صداي آن قديمي است و هم حالت Asynchronous آن درست كار نمي‌كند. براي مثال اين يك خروجي تهيه شده از همان فايل voice فوق، توسط موتور تشخيص صداي مخصوص ويندوز XP است كه بي‌شباهت به طنز نيست!


زير نويس فارسي ويديوهاي ساخت برنامه‌هاي مترو توسط سي شارپ و XAML - قسمت پنجم


زيرنويس‌هاي فارسي قسمت پنجم «Building Windows 8 Metro Apps in C# and XAML» را از اينجا و يا اينجا مي‌تونيد دريافت كنيد.

ليست سرفصل‌هاي قسمت پنجم به شرح زير است:

Application Model  00:59:50 
Metro and WinRT introduce some significant changes to the world in which applications execute. 
This module describes the implications for developers. 
Introduction
Application Lifecycle
Demo: Application Lifecycle
Managing State
Demo: Saving State
Splash Screens
Launching Applications
Application Manifest
Packaging
Summary


اين قسمت به جزئيات نحوه اجراي برنامه‌هاي مترو مي‌پردازد. اگر با IIS كار كرده باشيد، سيكل اجرايي برنامه‌هاي مترو ويندوز 8، همانند سيكل اجرايي برنامه‌هاي ASP.NET شده است! ويندوز مختار است برنامه شما را پس از مدتي بيكاري (البته اين مدت در اينجا فقط 5 ثانيه است!)، معلق كرده يا حتي خاتمه دهد و تمام اين‌ها هم از ديد كاربر نهايي مخفي است. مانند زمانيكه يك برنامه ASP.NET پس از مدتي بيكاري، توسط IIS خاتمه مي‌يابد (از حافظه خارج مي‌شود) و پس از مدتي با رسيدن يك درخواست جديد، يك پروسه جديد براي اجراي آن ايجاد شده و مجددا سايت شروع به كار خواهد كرد؛ اينجا هم در دنياي مترو تقريبا به همين نحو با يك برنامه رفتار مي‌شود.
يك نكته جالب ديگر هم در برنامه‌هاي مترو وجود دارد: ترد اصلي برنامه از ترد رابط كاربري جدا شده است. براي مثال سازنده كلاس App برنامه در يك ترد و رابط كاربري برنامه در ترد مجزاي ديگري اجرا مي‌شوند.
به علاوه روش‌هاي متفاوتي هم براي اجراي برنامه‌هاي مترو درنظر گرفته شده. ديگر فقط حالت كليك بر روي يك برنامه سبب اجراي آن نمي‌شود. مي‌توان بر اساس اتصال يك سخت افزار خاص به سيستم يا حتي يك جستجو هم سبب اجراي برنامه‌اي شد. براي مثال مي‌توانيد برنامه خود را طوري طراحي كنيد كه نتيجه‌ي جستجويي را در سيستم نمايش دهد.
سيستم بسته بندي برنامه‌هاي مترو نيز بسيار شبيه به فايل‌هاي XAP برنامه‌هاي سيلورلايت است كه همه چيز داخل يك فايل قرار داده مي‌شود؛ از فايل‌هاي تنظيمات برنامه تا فايل‌هاي كامپايل شده و منابع مورد نياز. البته در اينجا نامش به appx تغيير يافته است به علاوه يك فايل cer كه حاوي مجوز ديجيتال اجباري توزيع برنامه‌هاي مترو در فروشگاه ويندوز است.

۱۳۹۰/۱۱/۱۲

اندكي به روز رساني


ليست RSS وبلاگ‌هاي IT‌ ايراني و همچنين فايل خلاصه وبلاگ را به روز كردم كه از طريق منوي سمت چپ صفحه قسمت گزيده‌ها، قابل دريافت هستند ( + و + ).
به اين ليست، يك گروه جديد رو هم اضافه كردم به نام «آي تي ايراني در شبكه‌هاي اجتماعي» كه مرتبط است به فيدهاي گوگل پلاس و توئيتر. جالبه در كل از اين جهت كه بدونيم در لايه‌هاي مختلف اين دنيا چه خبره!