این مقاله به بررسی مزیتهای استفاده از Interfaceها همگام با وراثت در برنامه نویسی شی گرا میپردازد و مناسب کسانی است که قصد دارند این مفاهیم را در یک مثال فرا بگیرند اینترفیسها کمک شایانی به سازگاری اجزا و کلاسها میکند و از اینرو بهتر است آنرا مفهومی یاد گرفت . سورس کدها به زبان C# و VB.NET می باشد.
IrisPdfEditor.zip
Microbenchmark testing Python, Numba, Mojo, Dart, C/gcc, Rust, Go, JavaScript, C#, Java, Kotlin, Pascal, Ruby, Haskell performance in Mandelbrot set generation
Benchmarking several languages/tools with Mandelbrot set generation. 1-to-1 translation of code from one language to another. No SIMD, no multithreading (except prange() trick with Numba), no tricks (e.g. skipping sqrt), a bare minimum of language specific adjustments to make the code nicer while keeping all loops and operations in place.
Cordova شامل یک سری کامپوننت به شرح زیر است:
- سورس کدی برای هر Container و برنامه محلی برای هر یک از سکوهای موبایل که پشتیبانی میشوند. container، کدهای Html5 را بر روی دستگاه (Device) رندر میکند. (در مطالب بعدی در مورد این مطلب توضیح خواهم داد)
- مجموعهای از رابطهای برنامهی کاربردی که امکان دسترسی به قابلیتهای بومی دستگاه را به برنامهی وبی که درون آن در حال اجرا است، میدهند.
- مجموعهای از ابزارها برای مدیریت فرآیند ایجاد پروژه، مدیریت پلاگینها، ساخت (با استفاده از SDKهای محلی) برنامههای محلی و تست برنامه بر روی دستگاه موبایل یا شبیه ساز .
معماری لایه بندی نرم افزار #3
- من در عمل تفاوتی بین لایه مخزن و سرویس شما مشاهده نمیکنم. یعنی لایه مخزن داره GetAll میکنه، بعد لایه سرویس هم داره همون رو به یک شکل دیگری بر میگردونه. این تکرار کد نیست؟ این دو یکی نیستند؟
عموما در منابع لایه مخزن رو به صورت روکشی برای دستورات مثلا EF یا LINQ to SQL معرفی میکنند. فرضشون هم این است که این روش ما رو از تماس مستقیم با ORM برحذر میداره (شاید فکر میکنند ایدز میگیرند اگر مستقیم کار کنند!). ولی عرض کردم این روکش در واقعیت فقط شاید با EF یا L2S قابل تعویض باشه نه با ORMهای دیگر با روشهای مختلف و بیشتر یک تصور واهی هست که جنبه عملی نداره. بیشتر تئوری هست بدون پایه تجربه دنیای واقعی. ضمن اینکه این روکش باعث میشه نتونید از خیلی از امکانات ORM مورد استفاده درست استفاده کنید. مثلا ترکیب کوئریها یا روشهای به تاخیر افتاده و امثال این.
- پس در عمل شما Request ViewModel و Response ViewModel تعریف کردید.
- Kernel
- ماشین مجازی Dalvik
- application framework
- applications
هسته اندروید (kernel) چیست؟
اندروید بر روی هسته لینوکس نسخه 2.6 به بالاتر اجرا میشود. هسته، اولین و نخستین لایهی نرم افزاری در اندروید است که با سخت افزار به صورت کاملا مستقیم در تعامل میباشد. تغییرات در هسته و یا ساختن دوبارهی آن چیزی نیست که لازم باشد از ابتدا به ساکن و مجددا توسط یک برنامه نویس انجام شود! فقط سازندگان سخت افزار قادر به تغییرات درون هسته هستند و این یک امر غیرطبیعی و ناممکن برای برنامه نویسان خواهد بود؛ چرا که یک برنامه نویس تنها قادر است تا لایههای نرم افزاری را تغییر دهد نه سخت افزار آن را و این مورد تنها بهعهدهی افرادی است که با سخت افزار اندروید در ارتباط هستند.
کتابخانه ها
اجزای کتابخانهها بعنوان یک لایه مترجم بین هسته و فریم ورکها عمل میکنند. این کتابخانهها و اجزای درونی آنها با زبان C و ++C نوشته شدهاند؛ اما از طریق یک API در زبان جاوا در اختیار توسعه دهندگان قرار میگیرند تا به سهولت قابل استفاده باشند. برنامه نویسان و توسعه دهندگان میتوانند از طریق فریم ورکهای زبان جاوا برای دسترسی مستقیم به کتابخانههای اصلی C و ++C استفاده کنند.
برخی از کتابخانههای اصلی عبارتند از:
- LibWebCore
- Media libraries
- Graphics libraries
ماشین مجازی Dalvik چیست؟
در اصل آقای Dan Bornstein ماشین مجازی Dalvik را نوشت. ماشین مجازی دالویک برای اجرای برنامهها بر روی دستگاههای مختلف با منابع بسیار محدود نوشته شده بود و این یکی از اولویتهای این ماشین بود تا بتواند با منابع محدود بر روی دستگاه در تعامل باشد و برنامه را اجرا نماید. به طور معمول ماشین دالویک برای تلفنهای همراهای استفاده میشد که توان پردازشی پایین، عمر باتری کم و همچنین حافظهی اندکی داشتند. ماشین مجازی دالویک فایلهای با پسوند dex. را اجرا میکند. این فایلها با استفاده از کلاسهای جاوا کامپایل شدهاند که با در نظر گرفتن نوع کلاس class. یا jar. انجام میشوند و فایلهای class. را به یک ثابت (constant) مشترک و هماهنگ تبدیل مینمایند. ابزار DX، که در Android SDK موجود است، این تبدیل را انجام میدهد.
به تصویر زیر توجه کنید:
به تصویر زیر توجه کنید؛ پس از تبدیل، فایلهای dex. به طرز قابل توجهی کوچکتر و کم حجمتر میشوند!
Application Framework چیست؟
اپلیکیشن فریم ورک، یکی از بلاکهای مهم ساختن سیستم نهایی میباشد. این فریم ورکها مجموعهای از خدمات را درون سیستم برای برنامهنویس یا توسعه دهندگان جهت نوشتن یک برنامه بدون مشکل فراهم میکنند. بهعنوان یک توسعه دهنده شما کد را مینویسید و فقط از APIها برای تکمیل آنها در زبان جاوا استفاده میکنید. از طریق یک API در زبان جاوا قادر خواهید بود تا به هسته و کتابخانههای C و ++C دسترسی داشته باشید.
بعنوان نمونه : کد زیر به شما نحوه پخش یک فایل ویدئویی را نشان میدهد
package com.example.android.apis.media; import com.example.android.apis.R; import android.app.Activity; import android.os.Bundle; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; public class VideoViewDemo extends Activity { /** * TODO: Set the path variable to a streaming video URL or a local media * file path. */ private String path = ""; private VideoView mVideoView; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.videoview); mVideoView = (VideoView) findViewById(R.id.surface_view); if (path == "") { // Tell the user to provide a media file URL/path. Toast.makeText( VideoViewDemo.this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show(); } else { /* * Alternatively,for streaming media you can use * mVideoView.setVideoURI(Uri.parse(URLstring)); */ mVideoView.setVideoPath(path); mVideoView.setMediaController(new MediaController(this)); mVideoView.requestFocus(); } } }
OpenCVSharp #8
به تصویر زیر دقت کنید:
فرض کنید در اینجا قصد دارید تعداد توپهای قرمز را شمارش کنید. از دیدگاه یک انسان، شاید سه توپ قرمز قابل مشاهده باشد. اما از دیدگاه یک برنامه، توپ وسطی به دو توپ تفسیر خواهد شد و همچنین نویزهای قرمزی که بین توپها در صفحه وجود دارند نیز شمارش میشوند. بنابراین بهتر است پیش از پردازش این تصویر، ریخت شناسی آنرا بهبود بخشید. برای مثال توپ وسطی را یکی کرد،حفرههای توپهای دیگر را پوشاند و یا نویزهای قرمز را حذف نمود. به علاوه خطوط آبی رنگی را که با یکدیگر تماس یافتهاند نیز میخواهیم اندکی از هم جدا کنیم.
متدهایی که مورفولوژی تصاویر را تغییر میدهند
در OpenCV سه متد یا فیلتر مهم، کار تغییر مورفولوژی تصاویر را انجام میدهند:
1) Cv2.Erode
تحلیل/فرسایش یا erosion سبب میشود تا نواحی تیرهی تصویر «رشد» کنند.
در اینجا فیلتر Erode کار یکی کردن اجزای جدای توپهای رنگی را انجام دادهاست.
2) Cv2.Dilate
اتساع یا dilation سبب خواهد شد تا نواحی روشن تصویر «رشد» کنند.
بکارگیری فیلتر Dilate سبب شدهاست تا نویزهای تصویر محو شوند و اشیاء به هم پیوسته از هم جدا گردند.
3) Cv2.MorphologyEx
کار این متد انجام اعمال پیشرفتهی مورفولوژی بر روی تصاویر است و در اینجا ترکیبی از erosion و dilation، با هم انجام میشوند.
اگر پارامتر سوم آن به MorphologyOperation.Open تنظیم شود، ابتدا erosion و سپس dilation انجام خواهد شد:
و اگر این پارامتر به MorphologyOperation.Close مقدار دهی شود، ابتدا dilation و سپس erosion انجام میشود:
در تمام این حالات، پارامتر آخر که Structuring Element نام دارد، یکی از مقادیر اشیاء مستطیل، به علاوه و بیضی را میتواند داشته باشد. این اشیاء و اندازهی آنها، مشخص کنندهی میزان تحلیل و یا اتساع نهایی هستند.
استفاده از متدهای مورفولوژی در عمل
در اینجا مثالی را از نحوهی بکارگیری متدهای اتساع و فرسایش، ملاحظه میکنید:
using (var src = new Mat(@"..\..\Images\cvmorph.Png", LoadMode.AnyDepth | LoadMode.AnyColor)) using (var dst = new Mat()) { src.CopyTo(dst); var elementShape = StructuringElementShape.Rect; var maxIterations = 10; var erodeDilateWindow = new Window("Erode/Dilate", image: dst); var erodeDilateTrackbar = erodeDilateWindow.CreateTrackbar( name: "Iterations", value: 0, max: maxIterations * 2 + 1, callback: pos => { var n = pos - maxIterations; var an = n > 0 ? n : -n; var element = Cv2.GetStructuringElement( elementShape, new Size(an * 2 + 1, an * 2 + 1), new Point(an, an)); if (n < 0) { Cv2.Erode(src, dst, element); } else { Cv2.Dilate(src, dst, element); } Cv2.PutText(dst, (n < 0) ? string.Format("Erode[{0}]", elementShape) : string.Format("Dilate[{0}]", elementShape), new Point(10, 15), FontFace.HersheyPlain, 1, Scalar.Black); erodeDilateWindow.Image = dst; }); Cv2.WaitKey(); erodeDilateWindow.Dispose(); }
کار متد PutText، نوشتن یک متن ساده بر روی پنجرهی native مربوط به OpenCV است.
همچنین در ادامه کدهای بکارگیری متد MorphologyEx را که کار ترکیب اتساع و فرسایش را با هم انجام میدهد، ذکر شدهاست و نکات بکارگیری آن همانند مثال اول بحث است:
using (var src = new Mat(@"..\..\Images\cvmorph.Png", LoadMode.AnyDepth | LoadMode.AnyColor)) using (var dst = new Mat()) { src.CopyTo(dst); var elementShape = StructuringElementShape.Rect; var maxIterations = 10; var openCloseWindow = new Window("Open/Close", image: dst); var openCloseTrackbar = openCloseWindow.CreateTrackbar( name: "Iterations", value: 0, max: maxIterations * 2 + 1, callback: pos => { var n = pos - maxIterations; var an = n > 0 ? n : -n; var element = Cv2.GetStructuringElement( elementShape, new Size(an * 2 + 1, an * 2 + 1), new Point(an, an)); if (n < 0) { Cv2.MorphologyEx(src, dst, MorphologyOperation.Open, element); } else { Cv2.MorphologyEx(src, dst, MorphologyOperation.Close, element); } Cv2.PutText(dst, (n < 0) ? string.Format("Open/Erosion followed by Dilation[{0}]", elementShape) : string.Format("Close/Dilation followed by Erosion[{0}]", elementShape), new Point(10, 15), FontFace.HersheyPlain, 1, Scalar.Black); openCloseWindow.Image = dst; }); Cv2.WaitKey(); openCloseWindow.Dispose(); }
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید.
CREATE PROCEDURE CreateNewAuthor @name nvarchar(50) AS BEGIN INSERT INTO Authors values(@name) END GO
Add-Migration StoredProcedureForCreateNewAuthor
public partial class StoredProcedureForCreateNewAuthor : Migration { protected override void Up(MigrationBuilder migrationBuilder) { } protected override void Down(MigrationBuilder migrationBuilder) { } }
protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(@"CREATE PROCEDURE CreateNewAuthor @name nvarchar(50) AS BEGIN INSERT INTO Authors values(@name) END GO"); }
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql("DROP PROCEDURE CreateNewAuthor"); }
افزودن وابستگیهای MailKit به برنامه
برای شروع به استفادهی از MailKit، میتوان بستهی نیوگت آنرا به فایل project.json برنامه معرفی کرد:
{ "dependencies": { "MailKit": "1.10.0" } }
استفاده از MailKit جهت تکمیل وابستگیهای ASP.NET Core Identity
قسمتی از ASP.NET Core Identity، شامل ارسال ایمیلهای «ایمیل خود را تائید کنید» است که آنرا میتوان توسط MailKit به نحو ذیل تکمیل کرد:
using System.Threading.Tasks; using ASPNETCoreIdentitySample.Services.Contracts.Identity; using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; namespace ASPNETCoreIdentitySample.Services.Identity { public class AuthMessageSender : IEmailSender, ISmsSender { public async Task SendEmailAsync(string email, string subject, string message) { var emailMessage = new MimeMessage(); emailMessage.From.Add(new MailboxAddress("DNT", "do-not-reply@dotnettips.info")); emailMessage.To.Add(new MailboxAddress("", email)); emailMessage.Subject = subject; emailMessage.Body = new TextPart(TextFormat.Html) { Text = message }; using (var client = new SmtpClient()) { client.LocalDomain = "dotnettips.info"; await client.ConnectAsync("smtp.relay.uri", 25, SecureSocketOptions.None).ConfigureAwait(false); await client.SendAsync(emailMessage).ConfigureAwait(false); await client.DisconnectAsync(true).ConfigureAwait(false); } } public Task SendSmsAsync(string number, string message) { // Plug in your SMS service here to send a text message. return Task.FromResult(0); } } }
در آخر، این پیام به SmtpClient جهت ارسال نهایی، فرستاده میشود. این SmtpClient هرچند هم نام مشابه آن در System.Net.Mail است اما با آن یکی نیست و متعلق است به MailKit. در اینجا ابتدا LocalDomain تنظیم شدهاست. تنظیم این مورد اختیاری بوده و صرفا به SMTP سرور دریافت کنندهی ایمیلها، مرتبط است که آیا قید آنرا اجباری کردهاست یا خیر. تنظیمات اصلی SMTP Server در متد ConnectAsync ذکر میشوند که شامل مقادیر host ،port و پروتکل ارسالی هستند.
ارسال ایمیل به SMTP pickup folder
روشی که تا به اینجا بررسی شد، جهت ارسال ایمیلها به یک SMTP Server واقعی کاربرد دارد. اما در حین توسعهی محلی برنامه میتوان ایمیلها را در داخل یک پوشهی موقتی ذخیره و آنها را توسط برنامهی Outlook (و یا حتی مرورگر Firefox) بررسی و بازبینی کامل کرد.
در این حالت تنها کاری را که باید انجام داد، جایگزین کردن قسمت ارسال ایمیل واقعی توسط SmtpClient در کدهای فوق، با قطعه کد ذیل است:
using (var stream = new FileStream($@"c:\smtppickup\email-{Guid.NewGuid().ToString("N")}.eml", FileMode.CreateNew)) { emailMessage.WriteTo(stream); }
FAQ و منبع تکمیلی