Software Philosophy
3.46K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
#پست_مجدد این پست تا به حال بیش از ۲۷۰۰ بار مشاهده شده و به نظر میرسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
برای افرادی که برنامه نویسی IoT علاقه دارند، Raspberry Pi 3 یک سخت افزار هیجان انگیز به حساب می‌آید. مهمترین ویژگی این مدل نسبت به مدل‌های قبلی وجود Builtin WiFi در آن می‌باشد. در این مقاله از Scott Hanselman‌ نشان داده شده که چطور با استفاده از زبان JavaScript و VS Code می‌توان روی این سخت‌افزار کد نوشت.

https://www.hanselman.com/blog/BuildingVisualStudioCodeOnARaspberryPi3.aspx


@SoftwarePhilosophy


___
هرم شیطان یا Pyramid of Doom یک مشکل معروف در دنیای برنامه‌نویسی است. این مشکل معمولا وقتی پیش می‌آید که برنامه‌نویس مجبور است تعداد زیادی if تو در تو بنویسد، در این صورت با رعایت تو رفتگی‌های کد، کد شما از دور یک هرم خیلی بزرگ به نظر می‌رسد. یک نمونه متداول چک کردن مقادیر null به وسیله if های تو در تو است. این هرم هنگام استفاده از callback های متوالی نیز پیش می‌آید. در برنامه نویسی به زبان JavaScript حتما این هرم را در کدها دیده‌اید. لینک زیر نحوه تشکیل این هرم در کد را نشان می‌دهد و برای رفع آن در برخی حالت‌ها راه حل هایی ارائه داده است.

https://en.wikipedia.org/wiki/Pyramid_of_doom_(programming)

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
اگر ایده‌هایی در سر دارید و می‌خواهید یک استارتاپ شکل دهید، باید بتوانید در مورد آن حرف بزنید! باید بتوانید ایده خود را به بقیه (از جمله سرمایه‌گذاران) توضیح دهید. شما معمولا فقط دو دقیقه فرصت دارید تا ایده خود را توضیح دهید. چه بخواهید، چه نخواهید معمولا بعد از ۲ دقیقه شنیده نمی‌شوید.
نصیحت یک سرمایه‌گذار به موسسین استارتاپ‌ها: «هر چه بیشتر حرف بزنید، احتمال بیشتری وجود دارد چیزی بگویید که مخاطبتان خوشش نیاید، پس کمتر حرف زدن بهتر است!»
مقاله زیر نکاتی بسیار مهم را توضیح داده که هنگام ارائه دو دقیقه‌ای خود باید در نظر داشته باشید.

https://medium.com/the-startup-magazine-collection/what-to-include-in-your-2-minute-startup-pitch-b166f529f388?ref=quuu#.wp67z53jl

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
#پست_مجدد این پست تا به حال بیش از ۳۶۰۰ بار مشاهده شده و به نظر میرسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
یکی از مباحثی که همیشه در تشکیل تیم‌های نرم‌افزاری مطرح است، انتخاب زبان برنامه‌نویسی و یا تکنولوژی‌های مورد استفاده است. مقایسه محصولات موفق و نا موفق نشان می‌دهد هیچکدام از آنها صرفا با یک تکنولوژی و یا یک زبان خاص نوشته نشده‌اند. برای مثال سیستم‌های موفق زیادی وجود دارند که با Java و یا C# نوشته شده‌اند. همچنین سیستم‌های بی کیفیت زیادی نیز وجود دارد که با Java و یا C# نوشته شده‌اند. این حقیقت نشان می‌دهد دلیل موفقیت یا شکست سیستم‌ها نمی‌تواند زبان برنامه‌نویسی باشد. مقاله زیر توضیح می‌دهد که چطور طرز فکر برنامه‌نویس‌ها موفقیت و یا شکست یک سیستم را رقم می‌زند.

https://mehrandvd.me/2015/10/15/software-quality-comes-from-people-not-languages/

#مهران_داودی
https://ir.linkedin.com/in/mehrandvd


کانال تلگرام:
@SoftwarePhilosophy

___
سایت StackOverflow به تازگی بخشی با عنوان Documentation اضافه کرده‌است که بسیار جذاب است و در چند روز اولیه شروع آن با استقبال خوبی از طرف کاربران مواجه شده‌است. در این بخش به شیوه بسیار جالب و پویایی مستندات هر زبان و یا تکنولوژی توسط کاربران ساخته می‌شود. در یک اقدام جالب شرکت مایکروسافت نیز خبر داده‌است به زودی محتوای مستندات مرجع API ها در docs.mirosoft.com با این بخش یکپارچه خواهد شد.
لینک زیر چگونگی کارکرد این بخش Documentation را شرح داده‌است.

https://docs.microsoft.com/teamblog/stackoverflow-documentation-for-microsoft-developers

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
اگر به برنامه نویسی با HoloLens علاقه دارید، ولی دستگاه آن را ندارید (که طبیعتا در ایران نداریم!) می‌توانید از HoloLens Emulator استفاده کنید. شما در این شبیه‌ساز می‌توانید نتیجه برنامه‌های خود را ببینید.
در این شبیه‌ساز چند نوع اتاق پیش‌فرض وجود دارد که می‌توانید از آنها استفاده کنید. همچنین حرکات دست کاربر در فضا و قابلیت‌های دیگر قابل استفاده هستند.
لینک زیر به طور خلاصه امکانات این شبیه‌ساز را توضیح داده‌است.

https://developer.microsoft.com/en-us/windows/holographic/using_the_hololens_emulator

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
زبان TypeScript یک زبان نسل جدید است که بر پایه JavaScript نوشته شده است. خیلی‌ها آن را شبیه C# می‌دانند و خیلی‌ها آن را شبیه JavaScript. تیم طراحی این زبان دیدگاه‌های جالبی در طراحی این زبان دارند. یکی از ویژگی‌های این زبان این است که قرار است هر کدی به زبان JavaScript یک کد معتبر در TypeScript باشد. به این منظور آنها در کمیته تعریف و طراحی نسخه‌های جدید استانداردهای JavaScript همکاری بسیار فعالی دارند تا بتوانند قسمت‌های استاندارد شده را با حفظ تطابق با JavaScript به TypeScript اضافه کنند.
مقاله زیر این زبان را با رویکرد مقایسه شباهت‌ها و تفاوت‌های آن با C#‌ و JavaScript توضیح داده است.

https://msdn.microsoft.com/magazine/dn890374.aspx

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
Forwarded from Iran .Net
تهیه SSL Certificate رایگان
پروژه Let`s Encrypt به جهت بالابردن امنیت دنیای وب و فراگیرتر شدن ایمنی وب سایت ها راه اندازی شده است. هدف از این پروژه فراهم آوردن امکانی است که افراد بتوانند SSL Certificate رایگان و معتبر تهیه کنند. بنابرین برای عمده مصارف دیگر نیازی به خرید و پرداخت هزینه و مذاکره با شرکت های مربوطه نیست. با Let`s Encryptمی توانیم Certificate معتبر را توسط خودمان تهیه کنیم.
با آنکه این ابزار در وهله اول برای لینوکس تهیه شده است، اما ابزارهایی هم برای استفاده از این پروژه در ویندوز سرور - توسط سایرین - تهیه شده است.

در مقاله زیر توضیح داده شده است که چطور می توانیم با چند کلیک SSL تهیه کنیم. البته باید این ابزار را بر روی "ویندوز سرور" اجرا کنیم.

https://weblog.west-wind.com/posts/2016/Jul/09/Moving-to-Lets-Encrypt-SSL-Certificates

پروژه Let`s Encrypt توسط شرکت های مهمی نظیر فیس بوک، گوگل و سیسکو پشتیبانی می شود.
https://letsencrypt.org

@irandotnet
فریم‌ورک AutoMapper یکی از فریم‌ورک‌های محبوب برای کپی کردن اشیا‌ است. از این فریم‌ورک معمولا برای تبدیل Persistant Model به DTO ها و برعکس استفاده می‌شود.
برای استفاده از این فریم‌ورک در asp.net core می‌توانید از مکانیسم Dependency Injection که در آن تعبیه شده استفاده کنید.
مقاله زیر روش استفاده از این فریم‌ورک را در معماری جدید asp.net core توضیح داده‌است.

https://lostechies.com/jimmybogard/2016/07/20/integrating-automapper-with-asp-net-core-di

#مهران_داودی
لینکدین:
https://ir.linkedin.com/in/mehrandvd

کانال تلگرام:
@SoftwarePhilosophy


___
امکان Temporal یکی از ویژگی‌های بانک اطلاعاتی رابطه‌ای است که در سال 2011 توسط ANSI SQL معرفی شد. ولی شرکت مایکروسافت در سال 2016 و پس از پنج سال آن را با عنوان Temporal Table که با نام System-Versioned نیز شناخته می شود، به SQL Server اضافه کرد. Temporal Tables را نباید با Temporary Tables اشتباه گرفت، این دو هیچ ربطی به هم ندارند. این ویژگی جدید، این امکان را فراهم می کند تا SQL Server 2016 بصورت خودکار تاریخچه اطلاعات را نگهداری کند. البته باید این موضوع را در نظر گرفت که با استفاده از این ویژگی رشد اطلاعات بسیار زیاد خواهد بود و شما را مجبور خواهد کرد تا برای Storage هزینه کنید.
لینک زیر سناریوهایی که می توان با استفاده از این تکنولوژی پیاده سازی نمود را شرح می دهد.

https://msdn.microsoft.com/en-us/library/mt631669.aspx

#محمدمحبتی

لینکدین :
https://www.linkedin.com/in/mohabbati

کانال تلگرام:
@SoftwarePhilosophy



___
Forwarded from Iran .Net
دسترسی به ویژگی های internal از اسمبلی دیگر
ما طبق اصل Law Of Demeter دسترسی های مربوط به کلاس ها و محتویات آن ها را مشخص می کنیم تا به معماری Loosely Coupled دست پیدا کنیم.
اما گاه نیاز هست علی رغم internal تعریف شدن برخی از ویژگی ها، بخواهیم در اسمبلی دیگری به آن ها دسترسی داشته باشیم. مثلا بخواهیم تست بنویسیم و یا اینکه حتی این دو اسمبلی ممکن است واقعا دارای یک مفهوم و کارکرد باشند و تنها به دلایلی در سطح کد از هم جدا شده اند. چطور کاری کنیم که بدون public نمودنِ ویژگی ها و از دست دادن اصل Law Of Demeter این دو اسمبلی به اطلاعات internal هم دسترسی داشته باشند؟
در دات نت 2، مفهومی به نام Friend Assembly تغریف شده است. اگر یه Assembly دوستِ Assembly دیگر باشد، می تواند ویژگی های internal آن را ببیند.

https://msdn.microsoft.com/en-us/library/mt632254.aspx

@irandotnet
پیشنهاد می‌کنم اگر به اسکرام علاقمند هستید در این کانال عضو شوید. این کانال توسط دوست خوبم «اسد صفری» مدیریت می‌شود.
@IranAgile
#مهران_داودی
Forwarded from Iran Agile
آیا تا به حال فکر کردید برگزاری جلسات داخلی و خارجی با مشتریان چه هزینه ای برای شرکت ها و سازمان ها دارد? چه تعداد ساعت در جلسه هستيم? بهبود در روش های برگزاری جلسات می تواند باعث کاهش هزینه های زیادی شود.


https://www.slate.com/blogs/quora/2016/07/14/what_do_you_run_a_productive_meeting.html
برای چک کردن برابری در Java، از متد equals() كلاس Object استفاده مى‌شود که برای هر کلاس می‌تواند تعریف متفاوتی داشته باشد. از این متد در collection ها نیز استفاده می شود.
زمانى كه قرار است چک شود كه يك collection شامل شئ خاصى هست يا نه، collection بر روى تمام شئ‌ها equality را با شئ مورد نظر چك مى كند.
در Hash-based collection ها براى جستجوی یک شئ روش سریع تری دارد. در زمان ذخیره شئ، متد hashCode() بر اساس key داده شده، يك hash code توليد مى كند كه مشخص مى كند آن را در كدام area ذخيره كند و در زمان بازیابی به همین شکل مشخص می کند که شی در کدام area ذخیره شده است. از آنجا که اين متد ممكن است براى آبجكت هاى نابرابر، hash code هاى يكسان توليد كند، بنابراين لازم است كه equality براى آبجكت هايى كه در يك area هستند نیز چك شود.
بعد از خواندن اين مقاله به خوبى متوجه خواهيد شد كه چرا:
١.هر دو آبجكتى كه hash code يكسان دارند لزوما برابر نيستند.
٢.هر دو آبجكتى كه با هم برابرند حتما hash code يكسانى باید داشته باشند. (به همین دلیل نیز بهتر است که در صورت تعریف متد equals() در یک کلاس، متدhashCode() آن را نیز مجددا تعریف کرد).

https://tutorials.jenkov.com/java-collections/hashcode-equals.html

#زهره_مرادی

لینکدین:
https://ir.linkedin.com/in/zohre-moradi

کانال تلگرام:
@SoftwarePhilosophy



___
Forwarded from Iran .Net
پیاده سازیِ سیاست دسترسی به داده ها توسط ویژگی RLS در SQL Server 2016

در بسیاری موارد (مانند سیستم های Multi Tenant) لازم هست تا مانع از این شویم که داده های کاربران با هم تداخل پیدا کند و یا آن ها بتوانند به داده های هم دسترسی داشته باشند. مثلا می خواهیم کاربران هر شعبه از سازمان، تنها به اطلاعات شعبه خودشان دسترسی داشته باشند. یک کار ساده، پردردسر و بسیار بد آن است که از برنامه نویس ها بخواهیم در هر کوئری عبارتی را اضافه کنند که سطح دسترسی را چک کند. اما اگر برنامه نویس جایی فراموش کرد چی؟ اگر سیاست دسترسی پیچیده تر بود و مبنی بر پارامتر های مختلف محاسبه می شد چه خواهد شد؟ این راهکار در حجم بزرگ غیر مطمئن و غیرقابل نگهداری است.

در EF6 قابلیتی به نام Interception وجود دارد که با استفاده از آن می توان سیاست دسترسی به داده را در لایه های پایینی طراحی کرد. در این روش برنامه نویس لایه هایی بالا، بدون آنکه درگیر مفاهیمی مانند Tenant و سیاست ها بشود، می تواند به راحتی کوئری هایش را تولید کند. سپس EF به طور خودکار تغییری در کوئری ها خواهد داد تا دسترسی های لازم رعایت کرده باشد. برای اینکار می توانید از کتابخانه EntityFramework.DynamicFilters استفاده کنید.

این روش هم علی رغم همه مزایا معایبی هم دارد. اگر بخواهیم از همین پایگاه داده استفاده کنیم ولی در محیط دات نت نباشیم و یا از EF6 استفاده نکنیم، دوباره مشکلات اغاز می شوند. سیاست ها را باید در همه جا کپی کنیم و در صورت لزوم هم، مجددا همه را تغییر دهیم.

در SQL Server 2016 قابلیتی به نام Row Level Security وجود دارد، که به ما اجازه می دهد سیاست های دسترسی با داده را در لایه پایگاه داده متمرکز کنیم. در این صورت اپلیکشن ها هیچگونه آگاهی ایی نسبت به سیاست ها نخواهند داشت و درگیر این مفاهیم در سطح کد نخواهیم بود. همچنین در صورت لزوم به تغییر سیاست ها، فقط لازم است تغییراتی را در پایگاه داده بدهیم. با این روش، به هر طریقی و از هر ابزاری که به پایگاه داده کوئری هایمان را ارسال کنیم، سیاست های دسترسی به داده اعمال خواهند شد و امنیت بالا و البته ریزدانه ای (granular) را خواهیم داشت.

در مثال زیر خواهیم دید که چگونه می توان با استفاده از EF6 از ویژگی RLS بهره برد. این مثال یکی دیگر از کاربرد های Interception را نیز توضیح می دهد.

https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/
Forwarded from Iran .Net
چرا از متد های async نمی توانیم در بدنه lock استفاده کنیم؟

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

به هر حال، اگر برای شما پیش آمده باشد که از این متد ها درون بدنه عبارت lock استفاده کنید، با پیغام خطایی از سمت کامپایلر رو به رو خواهید شد. حتی اگر به طریقی کامپایلر متوجه قرار گرفتن متد async در بدنه lock نشود، در زمانِ اجرا با خطا رو به رو خواهیم شد. علت بروز این خطا چیست؟

موضوع به مبحثی تحت عنوان thread affinity مربوط می شود. در مسئله ما، این موضوع یعنی اینکه هر thread ایی که وارد بدنه lock شده است، همان thread هم فقط اجازه خروج از بدنه lock را خواهد داشت.

در متد های async، نکته حائز اهمیت آن می باشد که بدنه متد تا قبل از رسیدن به کلمه await، توسط یک thread اجرا می شود و پس از اجرای دستور await توسط thread دیگری (به احتمال خیلی زیاد) اجرا خواهد شد. این ویژگی عاملی مهمی در بالا رفتن کارایی برنامه ها (مخصوصا در پلتفرم وب) خواهد بود. اما به هر حال در مسئله ما بدین معنی است که :
1. Thread-A وارد lock خواهد شد.
2. Thread-A دستور await را اجرا کرده و اجرای دستور را به Thread-B واگذار می کند تا به صورت asynchronous فعالیت انجام شود.
3. پس از اتمام کار Thread-B، روند اجرای برنامه به دستورِ پس از await خواهد رسید. ولی این بار Thread-C فرمانِ اجرای کد را بر عهده خواهد داشت.
4. چون thread ایی که وارد بدنه lock شده است با thread ایی که می خواهد از آن خارج شود، متفاوت است، با خطا رو به رو خواهیم شد.

* در دات نت ابزارهای Synchronization ایی نظیر Monitor، Mutex و ReaderWriterLock دارای Thread Affinity می باشند. پس در حیطه کنترل این ها نمی توانیم از async استفاده کنیم.

* عبارت lock، در پس پرده از Monitor برای مدیریت همزمانی Thread ها استفاده می کند. به همین خاطر است که در بدنه lock نمی توانیم از متد های async استفاده کنیم.

* اما ابزارهای Semaphore و SemaphoreSlim دچار این مشکل نمی باشند و لازم نیست Thread ایی که وارد منطقه بحرانی می شود، همان Thread ایی باشد که از آن خارج می شود.

https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/

https://msdn.microsoft.com/en-us/library/ms228964(v=vs.110).aspx


@irandotnet
Forwarded from Software Philosophy
اگر دوستانی دارید که نه تنها برنامه نویس هستند، بلکه اعتقاد دارید «مهندس نرم‌افزار» هم هستند، آنها را به کانال @SoftwarePhilosophy دعوت کنید.
این پیغام را برای آنها Forward کنید.
#پست_مجدد این پست تا به حال بیش از ۲۰۰۰ بار مشاهده شده و به نظر میرسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
وجود یک «لکه» یا Blob در کد برنامه شما یک نمونه ضد الگوی برنامه نویسی (Anti Pattern) محسوب می‌شود. یکی از علائمی که نشان می‌دهد برنامه شما لکه دارد، زمانی است که از این جمله استفاده می‌کنید: «این قسمت از کد، قلب سیستم است»
وقتی از این جمله استفاده می‌کنید، یعنی قسمتی از کد شما وجود دارد که در آن حجم زیادی از منطق برنامه شما نوشته شده‌است و شکسته نشده‌است. لکه‌ها تمایل به بزرگ شدن دارند،‌ یعنی خیلی وقت‌ها برای نوشتن یک کد جدید، احساس‌ می‌کنید باید آن را به «قلب سیستم» اضافه کنید. خیلی وقت‌ها علت این مشکل معماری بد و یا حتی «نبود معماری» است.

لینک زیر بیشتر در مورد این Anti Pattern توضیح داده است.

https://sourcemaking.com/antipatterns/the-blob

#مهران_داودی
لینکداین:
https://ir.linkedin.com/in/mehrandvd


کانال تلگرام:
@SoftwarePhilosophy


___