- .NET Core is the future of .NET: If you’ve already started working with .NET Core, that’s great! If you’re starting a new project, you should consider .NET Core.
- .NET Framework will continue to be supported: If you have any existing applications on .NET Framework (Windows-only), you can keep those on .NET Framework.
- .NET Releases will become more predictable: Starting with .NET 5.0, there will be 1 major release every year, after which each even-numbered release (6.0, 8.0, etc) will come with LTS (Long-Term Support).
At the time of writing this post, default ASP.NET Core SPA templates allow you to create Angular 5 based app with Visual Studio without installing any third-party extensions or templates. Angular 6 is out now and you can also upgrade the Angular 5 app to Angular 6 . What if you want to create Angular 6 app with VS 2017? This post talks about how to create an Angular 6 App with Visual Studio 2017 and how to extend it with a simple example.
سؤال: چطور میشود برنامهای را که تنظیمات پروکسی ندارد، پروکسی خور کرد؟!
روشی که با سطح دسترسی معمولی و بدون نیاز به درایورهای خاص بررسی پکتهای TCP و UDP سیستم و همچنین توسط دات نت فریم ورک قابل استفاده باشد، استفاده از کتابخانهی معظم FiddlerCore است. برنامهی Fiddler توسط یکی از کارکنان سابق مایکروسافت و عضو پیشین تیم IE تهیه شدهاست. کار اصلی این برنامه، دیباگ درخواستهای HTTP/HTTPS، FTP و امثال آن است. هستهی اصلی آن نیز به صورت یک کتابخانهی مجزا به نام FiddlerCore در اختیار برنامه نویسهای دات نت است. این برنامه اخیرا توسط شرکت تلریک پشتیبانی و تملک شدهاست.
کتابخانهی FiddlerCore و برنامهی Fiddler را از اینجا میتوانید دریافت کنید. (اگر سایت آن باز نمیشود به این علت است که هاستینگ شرکت تلریک IPهای ایرانی را بسته است)
اسکلت اصلی یک برنامهی مبتنی بر FiddlerCore
using System; using System.Net; using System.Threading; using Fiddler; using System.Net.Security; namespace FiddlerTest { class Program { static void beforeRequest(Session oSession) { } static void Main(string[] args) { try { startFiddlerApplication(); Console.WriteLine("FiddlerCore started on port " + FiddlerApplication.oProxy.ListenPort); Console.WriteLine("Press any key to exit"); Console.ReadKey(); } finally { shutdownFiddlerApplication(); } } static void onLogString(object sender, LogEventArgs e) { Console.WriteLine("** LogString: " + e.LogString); } static void onNotification(object sender, NotificationEventArgs e) { Console.WriteLine("** NotifyUser: " + e.NotifyString); } static void onValidateServerCertificate(object sender, ValidateServerCertificateEventArgs e) { if (SslPolicyErrors.None == e.CertificatePolicyErrors) return; Console.WriteLine("invalid certificate: {0}", e.ServerCertificate.Subject); e.ValidityState = CertificateValidity.ForceValid; } static void shutdownFiddlerApplication() { FiddlerApplication.OnNotification -= onNotification; FiddlerApplication.Log.OnLogString -= onLogString; FiddlerApplication.BeforeRequest -= beforeRequest; FiddlerApplication.OnValidateServerCertificate -= onValidateServerCertificate; FiddlerApplication.oProxy.Detach(); FiddlerApplication.Shutdown(); Thread.Sleep(500); } private static void startFiddlerApplication() { FiddlerApplication.OnNotification += onNotification; FiddlerApplication.Log.OnLogString += onLogString; FiddlerApplication.BeforeRequest += beforeRequest; FiddlerApplication.OnValidateServerCertificate += onValidateServerCertificate; FiddlerApplication.Startup(5656, FiddlerCoreStartupFlags.RegisterAsSystemProxy | FiddlerCoreStartupFlags.MonitorAllConnections | FiddlerCoreStartupFlags.CaptureFTP); // proxy server on 5656 } } }
در متد FiddlerApplication.Startup روی پورتی مشخص، کار تنظیم پروکسی فیدلر انجام میشود. سپس مشخص میکنیم که چه مواردی را باید تحت نظر قرار دهد. با تنظیمات RegisterAsSystemProxy و MonitorAllConnections فیدلر قادر خواهد بود ترافیک وب اکثر برنامههای ویندوزی را مونیتور و دیباگ کند.
در متد shutdownFiddlerApplication نیز روالهای رخدادگردان، آزاد شده و پروکسی آن خاموش میشود.
هدایت درخواستهای وب کلیهی برنامهها به یک پروکسی مشخص
static void beforeRequest(Session oSession) { //send each request to the next proxy oSession["X-OverrideGateway"] = "socks=" + IPAddress.Loopback + ":" + 2002; //socks on 2002 }
هدایت درخواستهای تنها یک برنامهی خاص به یک پروکسی مشخص
در متد beforeRequest، متغیر oSession.LocalProcessID مشخص کنندهی مقدار PID پروسهای است که درخواست وب آن در حال بررسی است. برای بدست آوردن این PIDها در دات نت میتوان از متد Process.GetProcesses استفاده کرد. Id هر پروسه، همان LocalProcessID فیدلر است. بر این اساس میتوان تنها یک پروسهی مشخص را تحت نظر قرار داد و نه کل سیستم را.
کاربردها
- فرض کنید برنامهای تنظیمات پروکسی ندارد. با استفاده از روش فوق میتوان برای آن پروکسی تعریف کرد.
- فرض کنید برنامهای تنظیمات HTTP پروکسی دارد، اما پروکسی سرور شما از نوع ساکس است و نمیتوان از این پروکسی سرور در برنامهی مورد نظر استفاده کرد. X-OverrideGateway ذکر شده با هر دو نوع پروکسیهای HTTP و Socks کار میکند.
اگر علاقمند به مطالعهی اطلاعات بیشتری در مورد این کتابخانه هستید، کتاب 316 صفحهای Debugging with Fiddler نویسندهی اصلی آن، Eric Lawrence توصیه میشود.
معرفی برنامهی Process Proxifier
اگر اطلاعات فوق را کنار هم قرار دهیم و یک GUI نیز برای آن طراحی کنیم، به برنامهی Process Proxifier خواهیم رسید:
کار کردن با آن نیز بسیار سادهاست. در قسمت تنظیمات پیش فرض برنامه، آدرس IP و پورت پروکسی سرور خود را وارد کنید. نوع آنرا نیز مشخص نمائید که Socks است یا از نوع HTTP Proxy.
سپس در لیست پروسهها، مواردی را که لازم است از این پروکسی عبور کنند تیک بزنید. در اینجا میشود یا از تنظیمات پیش فرض استفاده کرد، یا میتوان به ازای هر پروسه، از یک پروکسی مجزا با تنظیماتی که ذکر میکنید، کمک گرفت. اگر صرفا یک پروسه را انتخاب کنید و اطلاعاتی را وارد ننمائید، از اطلاعات پروکسی پیش فرض استفاده خواهد شد.
دریافت سورس + باینری
ProcessProxifier_V1.0.rar
وبلاگها ، سایتها و مقالات ایرانی (داخل و خارج از ایران)
- تنظیم Http Proxy در CVS
- URL Rewrite Module for IIS 7.0
- تریگرها در SQL Server
- گستره سیاست ها در Group Policy
- لینوس توروالدز به سوی میزکار گنوم باز می گردد
- ابر برچسبها و مقایسهی سخنرانیهای بوش و اوباما
- اندیسهای فیلتر شده
ASP. Net
- ASP.NET MVC 1.0 Release Candidate
- ویدیوی معرفی ASP.NET MVC و ویدیویی دیگر
- GridView and CommandArguments
طراحی و توسعه وب
PHP
- PDT 2.0 : ابزارهای جدیدی برای برنامه نویسهای PHP
- NetBeans ، PHP و کار با دیتابیس
- بررسی سرعت و میزان مصرف حافظهی متدهای مختلف در PHP
سی شارپ
عمومی دات نت
ویندوز
(ایکاش بجای تمام اینکارها یک سیستم سادهتر توسعهی پلاگین برای آن طراحی میکردند ... یا به عبارتی یکی از مهمترین دلیلهای اقبال مردم به فایرفاکس را به صورت بسیار کم رنگی دارد)
مسایل اجتماعی و انسانی برنامه نویسی
- داستان استفاده از برنامههای خود پیش از استفاده دیگران
- راههایی برای افزایش بهره وری
- راههایی برای کاهش بهره وری!
متفرقه
Here are some of the reasons why nullable reference types are less than ideal:
- Invoking a member on a null value will issue a System.NullReferenceException exception, and every invocation that results in a System.NullReferenceException in production code is a bug. Unfortunately, however, with nullable reference types we “fall in” to doing the wrong thing rather than the right thing. The “fall in” action is to invoke a reference type without checking for null.
- There’s an inconsistency between reference types and value types (following the introduction of Nullable<T>) in that value types are nullable when decorated with “?” (for example, int? number); otherwise, they default to non-nullable. In contrast, reference types are nullable by default. This is “normal” to those of us who have been programming in C# for a long time, but if we could do it all over, we’d want the default for reference types to be non-nullable and the addition of a “?” to be an explicit way to allow nulls.
- It’s not possible to run static flow analysis to check all paths regarding whether a value will be null before dereferencing it, or not. Consider, for example, if there were unmanaged code invocations, multi-threading, or null assignment/replacement based on runtime conditions. (Not to mention whether analysis would include checking of all library APIs that are invoked.)
- There’s no reasonable syntax to indicate that a reference type value of null is invalid for a particular declaration.
- There’s no way to decorate parameters to not allow null.
- چرا به کامنت گذاری یا مستند نویسی نیاز داریم؟
- چگونه کامنت بنویسیم؟
- انواع کامنتها چیست؟
- چه کامنتهایی اشتباه هستند؟
همانطور که بیان کردیم، کامنت گذاری یکی از مهمترین کارهایی است که یک برنامه نویس انجام میدهد. به خصوص زمانیکه به صورت تیمی کار میکنید، این امر مهمتر از قبل خود را نشان میدهد. بسیاری از برنامه نویسان که بیشتر دلیل آن تنبلی است، از این کار سرباز میزنند و ممکن است آن را اتلاف وقت بدانند. ولی با کامنت گذاری فهم و درک کد، در آینده بالاتر میرود. در مقالهی تخصصی «هنر کامنت نویسی» نوشتهی «برنهارد اسپویدا» بهانههای جالبی از برنامه نویسان را برای سرباز زدن از اینکار، ذکر شده است؛ به عنوان نمونه:
من کدم را به خوبی متوجه میشوم.کد خوب، خودش گویای همه چیز هست.وقتی برای کامنت نویسی وجود ندارد. باید چسبید به کد.
- شاید امروز معنای یک کد را متوجه شوید، ولی آیا در آینده، مثلا یک سال بعد هم چنین خواهد بود؟
- آیا میتوانید هر سیستمی را که طراحی میکنید، به خاطر بسپارید که فعالیتهایش را به چه نحوی انجام میدهد؟
- اگر در یک کار تیمی باشید، شاید شما متوجه کدتان میشوید، ولی آیا تضمینی وجود دارد که دیگران هم متوجه روش شما شوند؟
- آیا کدی که شما بر روی آن فکر کردهاید و در ذهن خود روش انجام آن را ترسیم کردهاید، میتواند برای برنامه نویسی که کد شما را میبیند هم رخ دهد؟
- اگر شما به صورت تیمی کاری را انجام دهید و یکی از برنامه نویسهای شما از تیم جدا شود، چگونه میتوانید کار او را دنبال کنید؟
- اگر برای برنامه نویسی اتفاق یا حادثهای پیش بیاید که دسترسی شما به او ممکن نباشد چه؟
Documentary Comments: این مستند سازی در سطح یک سند مثل فایل یا به خصوص یک پروژه رخ میدهد که شامل اطلاعات و تاریخچهی آن سند است که این اطلاعات به شرح زیر هستند:
File Name | نام سند |
File Number/Version Number | شماره نسخه آن سند |
Creation Date | تاریخ ایجاد آن |
Last Modification Date | تاریخ آخرین تغییر سند |
Author's Name | سازندهی سند |
Copyright Notice | اطلاعاتی در مورد کپی رایت سند |
Purpose Of Program | هدف کاری برنامه. یک خلاصه از آن چه برنامه انجام میدهد. |
Change History | لیستی از تغییرات مهمی که در جریان ایجاد آن رخ داده است. |
Dependencies | وابستگیهای سند. بیشتر در سطح پروژه معنا پیدا میکند؛ مانند نمونهی آن برای سایت جاری که به صورت عمومی منتشر شده است. |
Special Hardware Requirements | سخت افزار مورد نیاز برای اجرای برنامه. حتی قسمتی میتواند شامل نیازمندیهای نرم افزاری هم باشد. |
PCMBOAT5.PAS************************************************************* ** File: PCMBOAT5.PAS Author: B. Spuida Date: 1.5.1999 Revision: 1.1 PCM-DAS08 and -16S/12 are supported. Sorting routine inserted. Set-files are read in and card as well as amplification factor are parsed. 1.1.1 Standard deviation is calculated. 1.1.2 Median is output. Modal value is output. 1.1.4 Sign in Set-file is evaluated. Individual values are no longer output. (For tests with raw data use PCMRAW.EXE) To do: outliers routine to be revised. Statistics routines need reworking. Existing Datafile is backed up. Purpose: Used for measurement of profiles using the Water-SP-probes using the amplifier andthe PCM-DAS08-card, values are acquired with n = 3000. Measurements are taken in 1 second intervals. The values are sorted using Quicksort and are stacked "raw" as well as after dismissing the highest and lowest 200 values as 'outliers'. Requirements: The Card must have an A/D-converter. Amplifier and probes must be connected. Analog Signal must be present. CB.CFG must be in the directory specified by the env-Variable "CBDIREC" or in present directory.
در بالا، خصوصیت کپی رایت حذف شده است. دلیل این امر این است که این برنامه برای استفاده در سطح داخلی یک شرکت استفاده میشود.
Functional Comments: کامنت نویسی در سطح کاربردی به این معنی نیست که شما اتفاقاتی را که در یک متد یا کلاس یا هر بخشی روی میدهد، خط به خط توضیح دهید؛ بلکه چرخهی کاری آن شی را هم توضیح بدهید کفایت میکند. این مورد میتواند شامل این موارد باشد:
- توضیحی در مورد باگهای این قسمت
- یادداشت گذاری برای دیگر افراد تیم
- احتمالاتی که برای بهبود ویژگیها و کارایی کد وجود دارد.
Explanatory Comment: کامنت گذاری توصیفی در سطح کدنویسی رخ میدهد و شامل توضیح در مورد کارکرد یک شیء و توضیح کدهای شیء مربوطه میگردد. برای قرار دادن کامنت الزامی نیست که کدها را خط به خط توضیح دهید یا اینکه خطوط ساده را هم تشریح کنید؛ بلکه کامنت شما همینقدر که بتواند نحوهی کارکرد هر چند خط کد مرتبط به هم را هم توضیح دهد، کافی است. این توضیحها بیشتر شامل موارد زیر میشوند:
- کدهای آغازین
- کدهای خروجی
- توضیح کوتاه از آنچه که این شیء ، متد یا ... انجام میدهد.
- حلقههای طولانی یا پیچیده
- کدهای منطقی عجیب و پیچیده
- Regular Expression
کدهای آغازین شروع خوبی برای تمرین خواهند بود. به عنوان نمونه اینکه توضیحی در مورد ورودی و خروجی یک متد بدهید که آرگومانهای ورودی چه چیزهایی هستند و چه کاربری داردند و در آغاز برنامه، برنامه چگونه آماده سازی و اجرا میشود. مقادیر پیش فرض چه چیزهایی هستند و پروژه چگونه تنظیم و مقداردهی میشود.
کدهای خروجی هم به همین منوال است. خروجیهای نرمال و غیرنرمال آن چیست؟ کدهای خطایی که ممکن است برگرداند و ... که باید به درستی توضیح داده شوند.
توضیح اشیاء و متدها و ... شامل مواردی چون: هدف از ایجاد آن، آرگومان هایی که به آن پاس میشوند و خروجی که میدهد و اینکه قالب یا فرمت آنها چگونه است و چه محدودیتهایی در مقادیر قابل انتظار وجود دارند. ذکر محدودیتها، مورد بسیاری مهمی است و دلیل بسیاری از باگها، عدم توجه یا اطلاع نداشتن از وجود این محدودیت هاست. مثلا محدودهی خاصی برای آرگومانهای ورودی وجود دارد؟ چه اتفاقی میافتد اگر به یک بافر 128 کاراکتری، 1024 کاراکتر را ارسال کنیم؟
کدهای منطقی عجیب، یکی از حیاتیترین بخشهای کامنت گذاری برای نگه داری یک برنامه در آینده است. به عنوان نمونه استفاده از عبارات با قاعده، اغلب اوقات باعث سردرگمی کاربران شده است. پس توضیح دادن در مورد این نوع کدها، توصیه زیادی میشود. اگر عبارات با قاعده شما طولانی هستند، سعی کنید از هم جدایشان کنید یا خطوط آن را بشکنید و هر خط آن را توضیح دهید.
هر زبانی از یک سیستم خاص برای کامنت گذاری استفاده میکند. به عنوان مثال پرل از سیستم (POD (Plain Old Documentation استفاده میکند یا برای Java سیستم JavaDoc یا برای PHP از سیستم PHPDoc (+ ) که پیاده سازی از JavaDoc میباشد استفاده میکنند. این سیستم برای سی شارپ استفاده از قالب XML است. کد زیر نمونهای از استفاده از این سیستم است:
// XMLsample.cs // compile with: /doc:XMLsample.xml using System; /// <summary> /// Class level summary documentation goes here.</summary> /// <remarks> /// Longer comments can be associated with a type or member /// through the remarks tag</remarks> public class SomeClass { /// <summary> /// Store for the name property</summary> private string myName = null; /// <summary> /// The class constructor. </summary> public SomeClass() { // TODO: Add Constructor Logic here } /// <summary> /// Name property </summary> /// <value> /// A value tag is used to describe the property value</value> public string Name { get { if (myName == null) { throw new Exception("Name is null"); } return myName; } } /// <summary> /// Description for SomeMethod.</summary> /// <param name="s"> Parameter description for s goes here</param> /// <seealso cref="String"> /// You can use the cref attribute on any tag to reference a type or member /// and the compiler will check that the reference exists. </seealso> public void SomeMethod(string s) { } }
دستورات سیستم کامنت گذاری سی شارپ
در سایت جاری، دو مقاله زیر اطلاعاتی در رابطه با نحوهی کامنت گذاری ارئه دادهاند.
- در مقاله «زیباتر کد بنویسیم» چند مورد آن به این موضوع اختصاص دارد.
- مقاله «وادار کردن خود به کامنت نوشتن» گزینهی کامنت گذاری اجباری در ویژوال استودیو را معرفی میکند.
کتاب رایگان MongoDB 3 Succinctly
MongoDB is one of the biggest players in the NoSQL database market, providing high performance, high availability, and automatic scaling. It’s an open-source document database written in C++ and hosted on GitHub. Zoran Maksimovic’s MongoDB 3 Succinctly touches on the most important aspects of the MongoDB database that application developers should be aware of—from installation and the usage of the Mongo Shell, to examples of the MongoDB C# driver APIs for Microsoft .NET Framework.
Table of Contents
- MongoDB Overview
- MongoDB Installation
- The Mongo Shell
- Manipulating Documents
- Data Retrieval
- Basic MongoDB with C#
- Data Handling in C#
- Inserting Data in C#
- Find (Query) Data in C#
- Binary Data (File Handling) in C#
- Back Up and Restore
Request.ServerVariables["REMOTE_ADDR"]