نظرات مطالب
4# آموزش سیستم مدیریت کد Git : نصب و پیکر‌‏بندی
- OpenSSH کار مدیریت و اجرای دستورات کاربران راه دور سرور Git را انجام می‌دهد.
- در لینوکس OpenSSH هست. کار CopSSH (که دیگر رایگان نیست) ساده سازی نصب OpenSSH بر روی ویندوز است. البته OpenSSH را در ویندوز بدون نیاز به این ابزارهای جانبی، توسط cygwin می‌شود نصب کرد (اصل کار و درستش به این صورت است). شبیه CopSSH، مثلا sshwindows هم هست ولی بهتره وقت بگذارید روی cygwin.
- اگر ویندوزی می‌خواهید کار کنید و سرور Git راه اندازی کنید، از Bonobo Git Server استفاده کنید. راهنمای نصب
- همچنین Bitvise SSH Server هم برای ویندوز تهیه شده و از آن هم می‌شود جهت نصب سرور Git استفاده کرد.
- لیست کاملتر نصاب‌های سرور Git روی ویندوز
مطالب
نرمال سازی (قسمت اول: First Normal Form)
مقدمه
نرمالسازی یا normalization باعث جلوگیری از تکرار و افزونگی اطلاعات می‌شود. و همچنین مانع از یکسری ناهنجاری‌ها در عملیات درج، بروز رسانی، حذف و انتخاب خواهد شد.
شکل‌های نرمال متعددی تعریف شده اند که به شرح زیر است:
  • شکل نرمال اول (1NF)
  • شکل نرمال دوم (2ND)
  • شکل نرمال سوم (3NF)
  • شکل نرمال بویس کاد (BCNF)
  • شکل نرمال چهارم (4NF)
  • شکل نرمال پنجم (5NF)
سه شکل اول نرمال یعنی 1NF، 2NF و 3NF توسط دکتر Codd تعریف شده اند. شکل نرمال بویس کاد نیز که یک تعریف اصلاح شده و قوی‌تر از 3NF به Boyce و Codd منسوب است. بعد از آن Fagin شکل چهارم نرمال(4NF) را تعریف کرد (چرا که در آن زمان BCNF شکل سوم نرمال خوانده می‌شد). 

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

شکل اول نرمال (First Normal Form)
تعریف رسمی:
یک متغیر رابطه ای به شکل اول نرمال است اگر و فقط اگر در هر مقدار مجاز آن متغیر رابطه ای، هر چندتایی فقط یک مقدار برای هر خصیصه داشته باشد.
 
منظور از اصطلاحات متغیر رابطه ای، چندتایی و خصیصه به طور غیر رسمی به ترتیب برابر است با جدول، سطر و ستون.
قسمت کلیدی تعریف، این جمله است:  "فقط یک مقدار برای هر خصیصه داشته باشد"
به دو جدول زیر توجه کنید، این جداول به شکل اول نرمال نمی‌باشد چرا که به ازای هر مشتری برای خصیصه شماره تلفن چند مقدار خواهیم داشت:


در جدول اول ستون شماره تلفن چند بار تکرار شده است. یعنی برای یک مشتری چند مقدار برای خصیصه شماره تلفن خواهیم داشت که این مغایر با تعریف شکل اول نرمال است. همین اتفاق نیز در جدول دوم افتاده است با این فرق که مقادیر خصیصه شماره تلفن در یک ستون درج شده اند.

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


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

گروه‌های تکرار شونده را با آکولاد ({}) مشکل کرده ام. این گونه جداول (که حتی در شکل نرمال اول هم قرار ندارند) مشکلات فراوانی دارند که در زیر به مواردی اشاره خواهیم داشت:
  • چگونه معدل ترم 5 را در جدول درج کنیم؟ پس برای اینکه بتوانیم تمام معدل‌ها را در جدول داشته باشیم باید به تعداد حداکثر ترم تحصیلی گروه‌های تکرار شونده در جدول داشته باشیم.
  • برای دانشجویی که فقط یک ترم تحصیل کرده است تمام گروه‌های تکرار شونده به غیر از یکی خالی خواهد ماند. فضای بسیاری به هدر خواهد رفت.
  • گزارش گیری بسیار سخت خواهد شد. بطور نمونه، چطور می‌خواهید بالاتری معدل دانشجویان را بدست بیاورین؟

پس با تبدیل جدول غیر نرمال به شکل نرمال اول، به مشکلات فوق غلبه خواهیم کرد:

اما یک متغیر رابطه ای که فقط به صورت شکل اول نرمال است ساختاری دارد که به دلایل متعدد، نامطلوب است.

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

در بخش بعدی ابتدا وابستگی تابعی مورد بررسی قرار خواهد گرفت سپس به فرم دوم نرمال پرداخته خواهد شد.

دوره‌ها
بررسی مفاهیم معکوس سازی وابستگی‌ها و ابزارهای مرتبط با آن
در این دوره به مفاهیمی مانند معکوس سازی وابستگی‌ها و تزریق وابستگی‌ها پرداخته خواهد شد. بسیاری از برنامه نویس‌ها مفاهیم DIP، IoC و DI را با هم مخلوط کرده و بجای هم بکار می‌برند. بنابراین قصد داریم هر یک را به تفصیل بررسی کرده و تفاوت‌های آن‌ها را برشماریم. سپس سعی خواهیم کرد تا یک کتابخانه تزریق وابستگی‌های ابتدایی را ایجاد کرده و نهایتا نحوه استفاده از چندین فریم ورک IOC موجود بررسی خواهند شد. این سری پیشنیاز درک مفاهیمی است که در لایه بندی اجزای مختلف برنامه‌ها مورد نیاز می‌باشند.
اشتراک‌ها
مقایسه دو کتابخانه دریافت تصویر در اندروید Picasso&Glide

دو کتابخانه Picasso و Glide از کتابخانه‌های معروف دریافت تصویر در اندروید هستند که Glide از طرف شرکت گوگل ارائه شده است. در این مقاله این دو کتابخانه مقایسه می‌شوند.

مقایسه دو کتابخانه دریافت تصویر در اندروید Picasso&Glide
مطالب
امن سازی برنامه‌های ASP.NET Core توسط IdentityServer 4x - قسمت اول - نیاز به تامین کننده‌ی هویت مرکزی
عصر Thick Clients

امن سازی برنامه‌های وب همواره چالش برانگیز بوده‌است؛ خصوصا این روزها که نیاز است برنامه‌ها، خارج از دیوارهای یک شرکت نیز در دسترس باشند و توسط انواع و اقسام وسایل ارتباطی مورد استفاده قرار گیرند. در سال‌های قبل، عموما برنامه‌های thick clients مانند WPF و WinForms برای شرکت‌ها توسعه داده می‌شدند و یا برنامه‌های وب مانند ASP.NET Web Forms که مبتنی بر سرویس‌ها نبودند. در برنامه‌های ویندوزی، پس از لاگین شخص به شبکه و دومین داخلی شرکت، عموما از روش Windows Authentication برای مشخص سازی سطوح دسترسی کاربران استفاده می‌شود. در برنامه‌های Web Forms نیز بیشتر روش Forms Authentication برای اعتبارسنجی کاربران مرسوم است. امن سازی این نوع برنامه‌ها ساده‌است. عموما بر روی یک دومین ارائه می‌شوند و کوکی‌های اعتبارسنجی کاربران برای ارائه‌ی مباحثی مانند single sign-on (داشتن تنها یک صفحه‌ی لاگین برای دسترسی به تمام برنامه‌های شرکت)، میسر است.


عصر شروع به‌کارگیری سرویس‌های وب

در سال‌های اخیر این شیوه‌ی کاری تغییر کرده و بیشتر بر اساس بکارگیری برنامه‌های مبتنی بر سرویس‌ها شده‌است. برای مثال برای این مورد استاندارد WS-Security مربوط به WCF ارائه شده‌است که باز هم مرتبط است به برنامه‌های یک دومین و یا یک Application pool. اگر تعداد دومین‌ها بیشتر شوند و نیاز به ارتباط امن بین آن‌ها باشد، استاندارد SAML 2.0 مورد استفاده قرار می‌گرفت که هدف از آن، انتقال امن اعتبارسنجی و سطوح دسترسی کاربران بین دومین‌های مختلف است. همانطور که ملاحظه می‌کنید تمام این برنامه‌ها و استانداردها، داخل دیوارهای یک شرکت و یک دومین زندگی می‌کنند.


عصر شروع به‌کارگیری Restful-API's

پس از آن باز هم شیوه‌ی طراحی برنامه‌های تغییر کرد و شروع به ایجاد Restful-API's و HTTP API's کردیم. این‌ها دیگر الزاما داخل یک دومین ارائه نمی‌شوند و گاهی از اوقات حتی تحت کنترل ما هم نیستند. همچنین برنامه‌های ارائه شده نیز دیگر thick clients نیستند و ممکن است برنامه‌های سمت کلاینت Angular و یا حتی موبایل باشند که مستقیما با سرویس‌های API برنامه‌ها کار می‌کنند. حتی ممکن است یک API را طراحی کنیم که با یک API دیگر کار می‌کند.


در این حالت دیگر نمی‌توان این APIها را با نگهداری آن‌ها داخل دیوارهای یک شرکت محافظت کرد. اگر قرار است با یک HTTP API کار کنیم، این API باید عمومی باشد و در اینجا دیگر نمی‌توان از روش Forms Authentication استفاده کرد. زیرا این روش اعتبارسنجی مختص برنامه‌های سمت سرور قرار گرفته‌ی در یک دومین طراحی شده‌است و آنچنان سازگاری با برنامه‌های سمت کلاینت و موبایل خارج از دیوارهای آن ندارد. همچنین ارسال نام کاربری و کلمه‌ی عبور به ازای هر درخواست نیز روشی بسیار بدوی و نا امن است. اینجا است که عصر امن سازی برنامه‌ها به کمک توکن‌ها شروع می‌شود. با استفاده‌ی از توکن‌ها، بجای هر بار ارسال نام کاربری و کلمه‌ی عبور به ازای هر درخواست از API، صرفا لیست سطوح دسترسی امضا شده‌ی به امکاناتی خاص، ارسال می‌شوند.


عصر شروع به‌کارگیری Security Tokens

بنابراین در اینجا نیاز به برنامه‌ای برای تولید توکن‌ها و ارسال آن‌ها به کلاینت‌ها داریم. روش متداول پیاده سازی آن، ساخت یک برنامه‌ی ابتدایی، برای دریافت نام کاربری و کلمه‌ی عبور از کاربران و سپس بازگشت یک JSON Web Token به آن‌ها است که بیانگر سطوح دسترسی آن‌ها به قسمت‌های مختلف برنامه است و کاربران باید این توکن را به ازای هر درخواستی به سمت سرور (بجای نام کاربری و کلمه‌ی عبور و خود) ارسال کنند.
مشکل این روش در اینجا است که آن برنامه‌ی خاص، باید از نام کاربری و کلمه‌ی عبور کاربران مطلع باشد تا بتواند توکن مناسبی را برای آن کاربر خاص تولید کند. هر چند این روش برای یک تک برنامه‌ی خاص بسیار مناسب به نظر می‌رسد، اما در یک شرکت، ده‌ها برنامه مشغول به کارند و به اشتراک گذاری نام کاربری و کلمه‌ی عبور کاربران، با تک تک آن‌ها ایده‌ی مناسبی نیست و پس از مدتی از کنترل خارج خواهد شد. برای مثال کاربری در یک برنامه، کلمه‌ی عبور خود را تغییر می‌دهد اما در برنامه‌ای دیگر خیر و همین مساله‌ی عدم هماهنگی بین برنامه‌ها و همچنین بخش‌های مختلف یک شرکت، مدیریت یک دست برنامه‌ها را تقریبا غیر ممکن می‌کند. همچنین در اینجا برنامه‌های ثالث را نیز باید در نظر داشت که آیا ضروری است آن‌ها به ریز اطلاعات کاربران شرکت دسترسی پیدا کنند؟
به علاوه مشکل دیگر توسعه‌ی این نوع برنامه‌های صدور توکن خانگی، اختراع مجدد چرخ است. در اینجا برای بهبود امنیت برنامه باید منقضی شدن، تمدید، امضای دیجیتال و اعتبارسنجی توکن‌ها را خودمان پیاده سازی کنیم. توسعه‌ی یک چنین سیستمی اگر غیرممکن نباشد، بسیار سخت و پیچیده است و همچنین باید باگ‌های امنیتی ممکن را نیز مدنظر داشت.


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


حرکت به سمت «تامین کننده‌ی هویت مرکزی»


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


به علاوه این روزها روش استفاده‌ی از نام کاربری و کلمه‌ی عبور، تنها راه ورود به یک سیستم نیست و استفاده از کلیدهای دیجیتال و یا روش‌های ویژه‌ی ابزارهای موبایل نیز به این لیست اضافه شده‌اند.


حرکت به سمت استاندارد OAuth 2

OAuth 2.0 پروتکلی است استاندارد، برای Authorization امن کاربران، توسط برنامه‌های وب، موبایل و دسکتاپ. به این ترتیب می‌توان امکان دسترسی یک برنامه را به یک API، به نحوی استاندارد و امن میسر ساخت. OAuth 2.0 یک توکن دسترسی (Access token) را تولید می‌کند و در اختیار کلاینت قرار می‌دهد. سپس آن کلاینت با ارسال این توکن به API مدنظر، امکان دسترسی به امکانات مختلف آن‌را خواهد یافت. به علاوه چون ماهیت برنامه‌های کلاینت وب و غیر وب متفاوت است، این استاندارد نحوه‌ی دریافت چنین توکنی را برای برنامه‌های مختلف نیز تعریف می‌کند. به این ترتیب موارد مشترکی مانند تولید و نحوه‌ی انتقال توکن‌ها به کلاینت‌های مختلف توسط این پروتکل استاندارد بیان می‌شود. در این حالت راه‌حل‌های خانگی ما تبدیل به راه‌حل‌هایی می‌شوند که استاندارد OAuth 2.0 را پیاده سازی کرده باشند. بنابراین IDP ما باید بر مبنای این استاندارد تهیه شده باشد. برای مثال IdentityServer که در این سری بررسی خواهد شد و یا Azure Active Directory، نمونه‌ای از IDPهایی هستند که این استاندارد را کاملا پیاده سازی کرده‌اند.
البته باید دقت داشت که این توکن‌های دسترسی، تنها سطوح دسترسی به منابع API را مشخص می‌کنند و یا به عبارتی عملیات Authorization توسط آن‌ها میسر می‌شود. عملیات ورود به سیستم اصطلاحا Authentication نام دارد و توسط استاندارد دیگری به نام OpenID Connect مدیریت می‌شود.


حرکت به سمت استاندارد OpenID Connect


OpenID Connect یک لایه‌ی امنیتی بر فراز پروتکل OAuth 2.0 است که به اختصار به آن OIDC نیز گفته می‌شود. توسط آن یک کلاینت می‌تواند یک Identity token را علاوه بر Access token درخواست کند. از این Identity token برای ورود به برنامه‌ی کلاینت استفاده می‌شود (Authentication) و پس از آن، برنامه‌ی کلاینت بر اساس سطوح دسترسی تعریف شده‌ی در Access token، امکان دسترسی به امکانات مختلف یک API را خواهد یافت (Authorization). همچنین OpenID Connect امکان دسترسی به اطلاعات بیشتری از یک کاربر را نیز میسر می‌کند.
بنابراین OpenID Connect پروتکلی است که در عمل استفاده می‌شود و توسعه دهنده و جایگزین کننده‌ی پروتکل OAuth 2.0 می‌باشد. هرچند ممکن است در بسیاری از منابع صرفا به OAuth 2.0 بپردازند، اما در پشت صحنه با همان OpenID Connect کار می‌کنند.
مزیت دیگر کار با OpenID Connect، عدم الزام به استفاده‌ی از API، در برنامه‌ای خاص و یا قدیمی است. اگر برنامه‌ی وب شما با هیچ نوع API ایی کار نمی‌کند، باز هم می‌توانید از امکانات OpenID Connect بهره‌مند شوید.
مطالب
نمونه سوالات مصاحبه استخدامی

مطلبی رو در سایت آقای اسکات هنسلمن دیدم که به نظرم برای برگرداندن به فارسی جالب اومد. شاید باعث شود که اندکی به فکر فرو رویم که ... چکار داریم می‌کنیم و قرار است به کجا برویم/برسیم.

نمونه سوالات مصاحبه استخدامی برنامه نویس‌های ارشد

  • - آیا هنوز کد می‌نویسید؟ آیا به آن علاقمندید؟!
  • - آیا می‌دانید SOLID چیست؟
  • - آیا می‌دانید SRP مخفف چیست و چه اهمیتی دارد؟
  • - پروژه‌ای مبتنی بر یک فناوری جدید به شما انتساب داده شده است. چگونه آن‌را آغاز خواهید کرد؟
  • - در مورد IOC یا Inversion of control چه می‌دانید؟ ارتباط آن با dependency injection چیست؟
  • - برنامه 2 tier با برنامه‌ی 3 tier چه تفاوتی دارد؟
  • - فلسفه‌ی وجودی Interface چیست و چه اهمیتی دارد؟
  • - الگوی Repository را شرح دهید. الگوی Factory‌ چیست؟ چرا الگوهای طراحی برنامه نویسی شیءگرا مهم هستند؟
  • - Anti-patterns کدامند؟ توضیح دهید.
  • - آیا تابحال اسم Gang of Four به گوشتان خورده است؟ در چه موردی است؟
  • - ارتباط الگوهای MVP ، MVC و MVVM در چیست؟ هر کدام از این الگوها در چه زمانی‌هایی بهتر است بکار گرفته شوند؟
  • - مفهوم جداسازی وابستگی‌ها (Separation of Concerns) چیست. مزایا و معایب آن کدامند؟
  • - سه ویژگی اصلی طراحی شیءگرا را نام برده و توضیح دهید.
  • - یک الگوی طراحی را توضیح دهید که در خانواده‌ی الگوی Factory قرار نمی‌گیرد. این الگو چه زمانی بهتر است بکار برده شود و چگونه؟
  • - فرض کنید یک پروژه‌ی قدیمی را که از مشکلات حاد نگهداری رنج می‌برد، به شما انتساب داده‌اند. چه فاکتورها و اقداماتی را جهت بهبود این وضعیت درنظر گرفته و چگونه برنامه را به سمت یک پروژه‌ی پایدار پیش خواهید برد؟
  • - مفهوم Service Orientation چه اثری را بر طراحی سیستم‌ها خواهد گذاشت؟ کجاها بهتر است استفاده شود؟
  • - در مورد portfolio تمام برنامه‌هایی که تاکنون بر روی آن‌ها کار کرده‌اید توضیح دهید. شما چه نقشی در طراحی آن داشته‌‌اید؟
  • - منهای بانک‌های اطلاعاتی رابطه‌ای، با چه روش‌هایی جهت ذخیره سازی اطلاعات آشنایی دارید؟ مزایا و معایب آن‌ها چیست؟
  • - در مورد مفهوم convention over configuration توضیح دهید. آخرین مثال عملی که در این مورد دیده‌اید چه بوده است؟
  • - در مورد سیستم‌های بدون حالت و با حالت (stateless and stateful) توضیح دهید. اثر هر کدام بر parallelism چیست؟
  • - تفاوت‌های بین Stubs و Mocks چیست و از هر کدام در کجاها استفاده خواهید کرد؟
  • - مفهوم YAGNI را به همراه یک مثال عملی توضیح دهید.
  • - sandbox چه معنایی دارد؟ آیا می‌توانید مثال‌هایی عملی از این مفهوم را در سیستم‌های موجود نام ببرید؟
- در مورد Concurrency به سوالات زیر پاسخ دهید:
  • - حالت‌های با و بدون قفل در مدل‌های Concurrency چه تفاوتی دارند؟
  • - زمانیکه از مدل‌های با قفل و یا بدون قفل استفاده می‌کنید ممکن است به چه مشکلاتی برخورد کنید؟
  • - مفهوم resource contention را توضیح دهید.
  • - مدل بر مبتنی بر وظیفه با مدل مبتنی بر ریسمان چه تفاوت‌هایی دارند؟ ( task-based model & threaded model )
  • - تفاوت‌های بین asynchrony و concurrency را توضیح دهید.

اشتراک‌ها
زمان ارائه Windows 8.1 به عموم
مایکروسافت اینبار ویندوز 8.1 را ابتدا به سازنده‌های سخت افزار ارائه داده (نگارش RTM) و به برنامه نویس‌ها عنوان کرده که مانند سایرین صبر کنید تا بعد (برخلاف رویه گذشته که این نگارش، به مشترکین MSDN زودتر از بقیه ارائه می‌شد) و ... این مساله سبب دلخوری شده است.
زمان ارائه Windows 8.1 به عموم
اشتراک‌ها
Windows Blue نگارش بعدی ویندوز
به نظر همان رابط کاربری ویندوز 8 در آن ادامه خواهد داشت.
یک نظر هم از خوانندگان در مورد تصمیمات مایکروسافت:
even the 800 pound gorilla must bend to the wishes of its masters...the consumer buyers !
Windows Blue نگارش بعدی ویندوز