بایگانی دسته: برنامه‌نویسی

فیلتر کردن ریکوئست‌های SingleR توی فیدلر

SingleR یکی از تکنولوژی‌های وب باحال مایکروسافت برای پیام‌های آنیه که مثلن بهتون اجازه می‌ده به راحتی چیزی مثل یه چت‌روم درست کنید که بدون نیاز به ریفرش کردن صفحه پیام‌های چت آپدیت بشن.

تو پروژه‌ای که الان دارم روش کار می‌کنم از SingleR برای مدیریت نوتیفیکشن‌های کاربرا استفاده کردن. مشکل این‌جاست که اگر بخوام با Fiddler ریکوئست‌های کاربرا رو مسیریابی کنم، تعداد زیادی از ریکوئست‌های SingleR رو می‌بینم و این کار مسیریابی رو خیلی سخت می‌کنه. (باید حواسم باشه که بین اون همه ریکوئست، پترن کدوم‌شون متفاوته و اون رو سریع پیدا کنم و ببینم آیا اون ریکوئست، اونی که می‌خوام هست یا نه)

pic

برای حل این مشکل، کار که من کردم این بود که توی منو سمت راست، رفتم توی بخش Filters و تیک Use filters رو زدم و توی بخش Request headers تیک Hide if URL contains رو زدم و توی تکست‌باکس جلوش، vshub رو وارد کردم.

بعدش توی بالای همون بخش رو Actions زدم و Run filterset now رو زدم تا فیلتر اعمال بشه.

پیاده‌سازی یک الگوریتم خلاصه‌سازی خیلی ساده

الگوریتم‌های خلاصه‌سازی الگوریتم‌های پرکاربردی در مسائل استخراج اطلاعات هستن. به عنوان مثال این الگوریتم‌ها می‌تونن به موتورهای جست‌وجوگر کمک کنن تا ایندکس بهتری از اطلاعات سایت‌ها داشته باشن. چند روز گذشته توی وقت‌های آزادم، تلاش کردم یه الگوریتم خلاصه‌سازی خیلی خیلی ساده که توی این نوشته روش کارش توضیح داده شده رو از پایتون به سی‌شارپ پورت کنم.

الگوریتم ساده‌ست و کد سی‌شارپش رو می‌تونید این‌جا پیدا کنید. به صورت خلاصه پر ارزش‌ترین جمله‌ی هر پاراگراف رو پیدا می‌کنه و یه متن جدید از این جمله‌ها می‌سازه. در ادامه توابع مختلف رو با وجود این‌که از اسم و کامنت‌هاشون مشخصه چی‌کار می‌کنن توضیح می‌دم. توجه کنید که خروجی‌ش خروجی مطلوبی نیست ولی برای شروع خروجی بدی هم نیست :)

SplitContentToSentences: یه پیاده‌سازی خیلی ابتدایی از تابعی که یه متن بگیره و لیستی از جمله‌هاش رو برگردونه.

SplitContentToParagraphs: بر اساس Enterهایی که توی متن زده شده، متن رو به تعدادی پاراگراف تقسیم‌بندی می‌کنه.

SentencesIntersection: این تابع ساده شاید پیچیده‌ترین کد این برنامه باشه. تابع Intersect توی سی‌شارپ عناصر مشترک بین دو لیست رو بر می‌گردونه. این‌جا ما کلمات جمله رو از هم جدا کردیم (باز هم یه پیاده‌سازی خیلی ابتدایی: جداسازی با کارکتر اسپیس) و بعد کلمات مشترک بین دو جمله رو شمردیم و تقسیم بر میانگین تعداد دو جمله کردیم. اگر دو تا جمله با هم اشتراکی نداشته باشن، این عدد برابر صفر می‌شه و اگر جمله‌ها یکسان باشن، برابر یک میشه. از این تابع در ادامه برای پیدا کردن پرارزش‌ترین جمله استفاده می‌کنیم.

FormatSentence: این تابع تمام کارکترهای غیرحروف رو از جمله حذف می‌کنه تا در پردازش‌هامون نگران این‌جور کارکترها نباشیم (و لازم نباشه بودن یا نبودن‌شون رو بررسی کنیم)

GetSentecesRanks: در این تابع، تمام جملات متن ورودی رو دو به دو با هم مقایسه می‌کنیم و یه عدد به هر جمله اختصاص می‌دیم: حاصل جمع خروجی تابع SentencesIntersection که جمله‌ی اصلی و بقیه‌ی جمله‌های متن رو بهش ورودی دادیم.

GetBestSentence: بهترین جمله از متن ورودی رو با استفاده از امتیازهایی که در GetSentecesRanks به دست آوردیم خروجی می‌ده.

و در نهایت تابع GetSummary متن و عنوان متن رو می‌گیره و با استفاده از توابع بالا، یه خلاصه‌ی ساده از متن خروجی می‌ده.

در مرحله‌ی بعد می‌خوام الگوریتم TextRank رو پیاده‌سازی کنم. این کار احتمالن بیشتر طول می‌کشه و الگوریتم پیچیده‌تری هم هست. با توجه به این که حوصله‌ی مقاله خوندن ندارم، برنامه‌م اینه که مثل کاری که با کد پایتون کردم، کد جاوای الگوریتم رو به سی‌شارپ پورت کنم و در حین پورت کردن طریقه‌ی کارش رو بفهمم.

پی‌نوشت: بلاگ‌نویسی در مورد کارهایی که می‌کنیم پیشنهادی بود که امروز استادی سر کلاس داد و پیشنهاد خوبی بود به نظرم. بخشی از انگیزه‌ی نوشته شدن این نوشته (که احتمالن به کار کسی هم نیاد) از اون استاد گرفته شده.

مرتب‌کردن همه‌ی فایل‌های solution توی ویژوال استودیو

Formatting یا مرتب‌سازی کد، یکی از امکانات جذاب یه ویرایشگر برای منه. کاری که می‌کنه اینه که کد رو به شکل خاصی مرتب‌سازی می‌کنه. مثلن فاصله‌گذاری‌ها و خطوط رو تصحیح می‌کنه تا کد زیباتر و خواناتر بشه و از این‌جور کارها.

توی ویژوال استودیو با زدن Ctrl + K + D ویژوال استودیو کدهای صفحه‌ای که توش هستید رو براتون ویرایش می‌کنه. حالا اگر بخواید همه‌ی فایل‌های solutionای که توش هستید رو مرتب‌سازی کنید چی؟

برای این کار، Package Manager Console رو از Tools -> Nuget Package Manager -> Package Manager Console باز کنید و کد زیر رو اون‌جا وارد کنید و اینتر رو بزنید:

function f($projectItems){$projectItems | ForEach-Object {$_.ProjectItems | ForEach-Object { if ($_.Name -ne $null -and $_.Name.EndsWith( ".cs" ) -and -not $_.Name.EndsWith( ".Designer.cs" ) -and -not $_.Name.EndsWith( ".tt.cs" )) {$window = $_.Open('{7651A701-06E5-11D1-8EBD-00A0C90F26EA}'); if ($window){Write-Host $_.Name;[System.Threading.Thread]::Sleep(100);$window.Activate();$_.Document.DTE.ExecuteCommand('Edit.FormatDocument');$_.Document.DTE.ExecuteCommand('Edit.RemoveAndSort');$window.Close(1);}} }}; if ($projectItems){ $projectItems | % { f($_.projectItems) } } }

$dte.Solution.Projects | % { f($_.ProjectItems) }

منبع

اگر gitignore کار نمی‌کنه

برای من چند بار پیش اومده که یک‌سری از فایل‌ها رو کامیت کنم و بعد از اون متوجه اشتباهم بشم و gitignore رو آپدیت کنم تا گیت دیگه به اون فایل‌ها نگاه نکنه. مشکل اینه که گیت برای فایل‌هایی که تا حالا داشته بهشون نگاه می‌کرده دیگه به gitignore توجه نمی‌کنه و اون‌فایل‌ها از سیستم حذف نمی‌شن.
من قبلن این‌جا جواب رو پیدا کرده بودم ولی این دفعه که سرچ کردم، این‌جا پیداش کردم (و لینک استک‌اورفلو رو از توی هیستوری چت‌هام با مهدی پیدا کردم).
برای حل مشکل، اول از همه همه‌ی تغییرات‌تون رو کامیت کنید (و تغییراتی که می‌خواید اعمال نشند رو discard کنید. توجه کنید که با discard کردن اون تغییرات از دست می‌رن). بعد  git shell رو باز کنید و دستورات زیر رو بزنید:


git rm . -r --cached
git add .
git commit -m "fixed untracked files"

آپدیت جدید افزونه‌ی Jadi2 و افزونه‌ی CE93 Oracle Mirror برای دست‌رسی به داکیومنت‌های جاوا بدون نیاز به … که یادم رفته بود دربارش بنویسم

حدود یک ماه پیش با یکی از بچه‌های دانشکده‌ی کامپیوتر، افزونه‌ی CE93-Oracle رو نوشتیم. یکی از دوستان زحمت بخش وب‌ش رو کشید که وقتی به oracle.ce93.ir می‌رید، محتویات docs.oracle.com رو نشون بده و oracle.ce93.ir/a هم محتویات docs.oracle.com/a رو نشون بده.

و من هم اول می‌خواستم از کدهای Jadi2 برای اون استفاده کنم که دیدم یک‌سری مشکل فنی داره و امکان‌پذیر نیست. اگه یادتون باشه گفتم در نسخه‌ی بعدی Jadi2 یه کاری می‌کنم که عکس‌هایی که توی jadi.net هستن رو هم خود کروم از jad2.undo.it لود کنه. برای این کار لازمه هر request رو چک کنیم و اگر مال ما بود، (ینی با jadi.net یا freekeyboard.net شروع می‌شد) رو به jadi2.undo.it ری‌دایرکت کنه.

پس از چند ساعت تلاش شبانه، اون شب تونستم راه خوبش رو پیدا کنم و تا فرداش افزونه‌ی CE93-Oracle آماده شد ولی آپدیت جدید Jadi2 به تعویق افتاد. ۸ روز پیش دوباره تلاشی کردم برای درست کردنش که به دلیل حوصله نداشتن متوقف شد و امروز با وجود این‌که حوصله نداشتم، چون برنامه‌نویسی حس خوبی به آدم می‌ده و پروژه‌ی اصلی‌ای که این روزها دارم روش کار می‌کنم هم به دلیل زیاد روش کار کردن خسته‌کننده شده برای چند ساعت، تصمیم گرفتم که بجای اتلاف وقت، جادی۲ رو درست کنم که حالا آمادست :)

در پایان هم لینک‌های چیزهایی که بالا معرفی کردم:

کد افزونه‌ی CE93 Oracle Mirror

خود افزونه‌ی CE93 Oracle Mirror

کد افزونه‌ی Jadi2

افزونه‌ی Jadi2

پی‌نوشت: این چند روزه، برنامه‌نویسی باعث شده من لذت‌بخش‌ترین روزهای این چند سال رو تجربه کنم. بخش زیادیش رو هم مدیون مایکروسافت هستم با پلت‌فرم معرکه‌ی دات‌نت.

به نظرتون توسعه GTranslate رو ادامه بدم؟

چند روز پیش توی گشت و گذاری که توی کروم استور داشتم، فهمیدم که نسخه دوم افزونه رسمی Google Translate، بالاخره قابلیت ترجمه از طریق راست کلیک رو اضافه کرده (+ یک قابلیت دیگه که اجازه میده ترجمه رو زیر کلمه‌ای که انتخاب کردید ببینید. البته با توجه به سرعت اینترنت یه ذره طول می‌کشه بیاد)

موضوع اینه که چند سال پیش وقتی این افزونه رو درست کردم، برای این بود که هیچ افزونه دیگه‌ای برای این کار نبود. ولی الان با توجه به این‌که دوتا افزونه‌ی پرطرفدارتر از GTranslate هستن که کارایی‌شون مشابهه، در یک دو راهی گیر کردم که آیا توسعه رو ادامه بدم یا نه.

نظر شما چیه؟

معرفی نرم‌افزار WebMatrix: ویرایش سایت و کار کردن با کلی زبان برنامه‌نویسی

با این‌که خیلی‌ها نظرشون نسبت به مایکروسافت منفیه ولی من از این شرکت خوشم میاد. حداقل در زمینه‌ی برنامه‌نویسی به نظرم بهترین ابزارهای برنامه‌نویسی و بهترین زبان برنامه‌نویسی مال این شرکته.

فکر کنم از سال ۲۰۱۰، مایکروسافت نرم‌افزاری به اسم WebMatrix رو معرفی کرد که برای ویرایش سایت‌ها بود. یعنی شما سایت‌تون رو بهش اضافه می‌کردید (از طریق لوکال، Web Deploy یا چندتا تکنولوژی دیگه) و بعد با استفاده از اون می‌تونستید سایت‌تون رو ویرایش و به‌روز رسانی کنید.

مثلا من با Web Deploy به سرور وصل می‌شم و کدهای دو برنامه‌نویس رو با کمک وب‌ماتریکس ویرایش می‌کنم که خیلی راحت‌تر از ویرایش‌گر وردپرسه!

Screenshot (19)

و چون این نرم‌افزار مال مایکروسافته (!) بعیده که خیلی از آدم‌ها باهاش کار کرده باشن. ولی نرم‌افزار خوبیه و ارزش امتحان کردن رو داره. حداقل یک ویرایش‌گر خوب برای فایل‌های وب‌تون خواهید داشت :)

پی‌نوشت با CTRL+ K و بعد CTRL + D می‌تونید کدتون رو مرتب کنید و این امکان بیش‌تر از چیزی که فکر می‌کنید کاربردیه :)

Channel9: یه سایت خوب برای یادگیری تکنولوژی‌های مایکروسافتی

جدیدا سرویس‌های آموزش ویدیویی آنلاین خوبی راه‌اندازی شدن و دارن کار می‌کنن. سرویس‌هایی مثل Coursera و Khan Academy که کارشون هم خوبه.

مایکروسافت قبلا یه سرویس آموزش آنلاین داشت به اسم Microsoft Virtual Academy مثل بالایی‌ها بود: به دانش‌آموزها امتیاز می‌داد و از این جور کارا.

ولی مایکروسافت یه سرویس جمع‌وجورتر هم داره به اسم Channel9 که کارش صرفا اشتراک ویدیوییه و بخش‌های دیگه مثل آزمون یا انجمن نداره. ولی تا جایی که می‌دونم فیلم‌های ویرچوال آکادمی رو هم توش داره.

خلاصه این‌که اگه دوست دارید چیزهایی مثل سی‌شارپ یا برنامه‌نویسی ویندوزفون یا کلی تکنولوژی دیگه یاد بگیرید و شرکتی که ازش اینترنت می‌گیرید هم مثل مبین‌نت نیست که ساعت نامحدود نداشته باشه و هر گیگ حجم رو به قیمت خون پدربزرگ‌ش بفروشه این سایت خیلی می‌تونه کمک‌تون کنه که توی کدنویسی پیش‌رفت کنید.

پی‌نوشت: دیروز متوجه شدم که کسی که آموزش ویندوزفون رو نوشته کل آموزش رو به صورت یک کتاب هم منتشر کرده. ینی غیر از این‌که بخواید ویدیویی آموزش ببینید می‌تونید از کتاب هم استفاده کنید.

چرا سی‌شارپ رو دوست دارم: چند ساعت موزیک یا ویدیو روی کامپیوترم هست؟

توی دات‌نت یه کتاب‌خونه‌ی خیلی خوب برای متادیتای موسیقی‌ها هست به اسم taglib-sharp که دست‌رسی راحت و تقریبا کامل به متادیتای موسیقی‌ها میده و توی ویندوز فون هم اپلیکیشن‌هایی ازش استفاده کردن (و کارش هم خوبه).

من هم با استفاده از همین کتابخونه تو سی‌شارپ یه برنامه نوشتم که طول همه‌ی آهنگ‌ها رو جمع بزنه نشون بده. برنامه‌ی ساده اینه:

string path = Console.ReadLine();
float all = (float)((new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories)).Count());
TimeSpan lenght = new TimeSpan();
foreach (var item in new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories))
{
    try
    {
        using (TagLib.File f = TagLib.File.Create(item.FullName))
        {
            lenght += f.Properties.Duration;
        }
    }
    catch { }
}
Console.WriteLine(lenght.ToString("c"));

و برای خوشگل‌تر شدن‌ش هم یک‌سری کد دیگه اضافه کردم که توی خط اول درصد پیشرفت، توی خط دوم تعداد فایل‌هایی که بررسی شدن و توی خط سوم تعداد کل فایل‌ها و توی خط چهارم هم مجموع زمان فایل‌هایی که بررسی شدن رو نشون می‌ده:

Console.Title = "FileAide Tests";
string path = Console.ReadLine();
float all = (float)((new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories)).Count());
float i = 0;
TimeSpan lenght = new TimeSpan();
Console.Clear();
foreach (var item in new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories))
{
    i++;
    Console.SetCursorPosition(0, 0);
    Console.Write("{0}%", ((float)(i / all * 100)).ToString("0.00"));
    Console.SetCursorPosition(0, 1);
    Console.Write(i);
    Console.SetCursorPosition(0, 2);
    Console.Write(all);
    Console.SetCursorPosition(0, 3);
    Console.Write(lenght.ToString("c"));

    try
    {
        using (TagLib.File f = TagLib.File.Create(item.FullName))
        {
            lenght += f.Properties.Duration;
        }
    }
    catch { }
}

Console.ReadLine();

حالا اگه خیلی وسواسی هستید می‌تونید کد بالا رو کامپایل کنید وگرنه می‌تونید برنامه‌ی اجرایی رو از این‌جا دانلود کنید. دقت کنید که وقتی برنامه باز می‌شه اول باید آدرس پوشه‌ای که موزیک‌هاتون توی اونه رو بهش بدید.

پی‌نوشت: Taglibsharp با فایل‌های mp4 و mkv هم کار می‌کنه (تا جایی که می‌دونم) ولی مطمئن نیستم که فرمت‌های دیگه‌ی ویدیویی رو هم پشتیبانی کنه. در هر صورت می‌تونید از این برنامه برای ویدیوهاتون هم استفاده کنید.

Jadi2: یه افزونه برای راحت‌تر خوندن وبلاگ جادی

همون‌طور که می‌دونید جادی.نت (بخونید جادی دات نت :) ) و freekeyboard.net فیل*ترن و راه‌حل هم (غیر از استفاده از قندشکن و اینا) اینه که بریم تو جادی۲.آندو.ایت. ولی مشکل اینه که وردپرس حتی وقتی میریم تو جادی۲ بازم یه سری از لینک‌ها رو با جادی.نت می‌ده و این موضوع (حداقل برای من) آزاردهنده‌ست که هر بار بخوام آدرس رو به جادی۲.آندو.ایت تغییر بدم.

برای همین هم یه راه‌حل ساده درست کردم: (بالاخره برنامه‌نویس‌ها، برنامه‌نویس می‌شن که راه‌حل‌های ساده رو پیدا کنن دیگه :) ) نوشتن به افزونه که هربار رفتم توی جادی.نت منو ببره به جادی۲.آندو.ایت.

چون قبلا اکانت دولوپر کروم رو خریده بودم اون رو توی کروم استور هم منتشر کردم. شما هم اگه با کروم وبلاگ جادی رو می‌خونید می‌تونید این افزونه رو از این‌جا نصب کنید. در ضمن کدهای افزونه رو می‌تونید توی گیت‌هاب پیدا کنید.

پی‌نوشت: این افزونه قرار بود به صورت یه افزونه‌ی کلی‌تر منتشر بشه و برای همین هم کدهای افزونه واقعا پیچیده‌تر از اون چیزیه که در حالت ساده و فقط برای وبلاگ جادی باید باشه. ولی چون حوصله‌ی کامل کردن افزونه رو تا چند روز آینده ندارم یه افزونه‌ی جدا برای وبلاگ جادی منتشر می‌کنم. شاید این‌جوری بهتر هم باشه.

پی‌نوشت۲: این نسخه فقط وقتی برید به آدرس جادی.نت شما رو می‌فرسته به جادی۲.آندو.ایت. فعلا (تا آپدیت بعدی اگر آپدیتی وجود داشته باشه!) اگر عکس‌ها و فایل‌ها از جادی.نت بارگذاری بشن (و تو یه tab جدید باز نشن) آدرس‌ها عوض نمی‌شن.