مزایای استفاده از MongoDB

mongodb

قبل از شروع به نصب MongoDB بهتر است کمی از مزایای آن را نام برد.من تجربه ای که در کار با این دیتابیس دارم این است که براحتی نصب می شود و راه اندازی آن بسیار ساده است.در ضمن کار با آن در زبان های مختلف به وسیله  Driver های تولید شده نیز فراهم شده.

زبانهایی که در حال حاضر  برای آن ها درایور تهیه شده در لیست زیر آورده شده اند:

  • C
  • C++
  • C#
  • Go
  • Java
  • JavaScript
  • Node.js
  • Perl
  • PHP
  • Python
  • Ruby
  • Scala

مزایا

بدون Schema بودن .یعنی بر پایه سند است و هر سند می تواند با سند دیگر از قبیل دیتا،سایز و یا حتی تعداد فیلد تفاوت داشته باشد.

ساختار هر سند واضح است.

خبری از joinهای پیچیده نیست.(شاید هم خیلی ها آن را بد بدانند.)

قابلیت گسترش ساده را دارد.

نیازی به mapping بین اشیا دیتابیس و اشیا برنامه وجود ندارد.

دارای یک حافظه داخلی است که باعث بوجود آمدن سرعت بیشتر می شود.

قابلیت ایندکس گذاری روی هر attribute که نیاز باشد را دارد.

نسبتا ساده برای یادگیری است.

قابلیت Sharding خودکار.

استفاده از Map-Reduce به ساده ترین حالت.

پشتیبانی بسیار خوب توسط MongoDB.

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

The advantages and disadvantages of MongoDB

Why You Should Never Use MongoDB

آموزش MongoD‌‌‌‌B

mongodb

کاربرد دیتابیس های NoSQL هر روز بیشتر می شود و نیاز است تا با ساختار آن ها بیشتر آشنا شویم.

کلمه NoSQL بیشتر به Non-Relational یا غیر رابطه‌ای بودن اینگونه بانک‌های اطلاعاتی بر می‌گردد. مباحثی مانند مدل‌های داده‌ای نرمال شده، اتصالات و Join جداول، در دنیای NoSQL وجود خارجی ندارند.

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

MongoD‌‌‌‌B یک دیتابیس NoSQL سورس باز  که بر پایه سند (Document)است.این دیتابیس به وسیله زبان C++ نوشته شده است.

MongoD‌‌‌‌B یک دیتابیس cross-platform  که دارای خصوصیاتی از قبیل دسترس پذیری بالا,توسعه پذیری و همچنین بازدهی بالا است.

قبل از شروع نیاز است تا با یک سری از لغات که کاربرد زیادی دارند آشنا شویم:

Database

در واقع Database یک ظرفی برای نگهداری collectionها است. هر Database یک سری فایل منحصر بفرد خود  دارد.

Collection

یک گروه از اسناد در MongoD‌‌‌‌B است و می توان آن را معادل جدول در RDBMS ها دانست.در Collection ها دیگر نیازی به schema نیست و داده ها می توانند به هر ساختاری که مد نظر است ذخیره شوند.فرض کنید که دیگر برای ساخت یک جدول نیازی ندارید تا اول از همه ساختار ستون هایش را تعیین کنید.

Document

یک داکیومنت یا سند تشکیل شده از یک سری key-value با ساختاری داینامیک .داینامیک به این معنی که ساختار دو سند می تواند به طور کلی با هم فرق کند.


{
_id: ObjectId(7df78458902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://ageeknotes.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2011,1,20,2,15),
like: 0
},
{
user:'user2',
message: 'My second comments',
dateCreated: new Date(2011,1,25,7,45),
like: 5
}
]
}

معرفی سایت Codecademy

نحوه یادگیری بک زبان برنامه نویسی برای هر برنامه نویس متفاوت است.بعضی ها با کتاب خواندن شروع به یادگیری می کنند بعضی ها با مستندات زبان و … .در این بین عده ای هستند که می خواهند از همان ابتدا شروع به کد زدن کنند اگر شما جز این دسته از افراد هستید و می خواهید یک زبان برنامه نویسی جدید را به صورت interactive  یاد بگیرید سایت Codecademy گزینه مناسبی برای شما است.

Codecademy

این سایت با محیطی ساده و جذاب به شما کمک می کند نکات اولیه یک زبان را به صورت ساده تر فرابگیرید و آماده شیرجه در آن زبان شوید.

زبان هایی که در این سایت برای یاد گیری موجود است عبارت اند از:

  • JavaScript
  • HTML/CSS
  •  PHP
  •  Python
  •  Ruby

نکته ای که باید روی آن تاکید کرد این است که شما در این سایت بیشتر با سینتکس زبان و یک سری از امکانات معمول آن آشنا می شوید و نه با ساختار پایه ای آن.

نگاهی به Roslyn

همانطور که در این پست اشاره کردم  Roslyn نگاهی جدید به کامپایلر است.مایکروسافت کد نوشته شده با C++ را در کامپایلر دات نت با managed code جایگزین و با سی شارپ و ویژوال بیسیک باز نویسی کرده است.حالا بعد از پنح سال Roslyn انتشار یافته آن هم به صورت سورس باز.

کامپایلر ها عموما بسیار پیچیده طراحی شده اند و کوچکترین تغییرات زبانی نیاز به کارهای بسیار زیادی دارد. کامپایلرها در C# و VB از ریشه با هم تفاوت های اساسی داشتند و این باعث بوجود آمدن و پیاده سازی business  های پیچیده در IDE و همچنین باعث بروز رفتار های متفاوت درIDE های   C# و VB می شد.

مزایای Roslyn چیست؟

سورس باز است.شما می توانید از این جا سورس کدش را مطالعه کنید.

rsolyn

با مدلی زبانی که بوجود آورده می توان به راحتی یک سری ابزار برای analyze  کد نوشت.

می توان یک سری ابزار refactorings و حتی هشدارهای اختصاصی نوشت.

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

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

حالا سوالی که ممکن است برای همه پیش بیاید این است که واقعا کد نوشته شده C++ که بسیار سریعتر است چگونه با کد های  C# و VB  جایگزین شده اند و آیا از لحاظ سرعت افت کرده اند یا نه.

نحوه کار در JetBrains

دات نتی ها به احتمال زیاد شرکت JetBrains را با Resharper می شناسند در این پست که برداشتی  از مطلب hadi hariri  است نحوه کار کردن در این شرکت را از زبان او توضیج می دهم.

jetbrains team

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

به غیر از یک نفر همگی به صورت Remote کار می کنیم البته اگر در اداره هم باشیم برنامه زمانبندی خاصی نداریم و ممکن است یکی ساعت ۸ صبح از راه برسد یکی ساعت ۱۱ ظهر یکی هم ساعت ۵ بعد از ظهر و ساعت ملاک نیست.

از Micromanagement خبری نیست.من به Micromanagement اعتقادی ندارم .به تیمم اعتماد دارم، همه یک دید(vision) را به اشتراک می گذاریم ، آن ها را آزاد می گذارم و اعتقاد دارم که آنها بهترین عمل را برای رسیدن به اهدافمان انجام می دهند.

مدیریتی وجود ندارد.من از لحاظ فنی تیم را مدیریت می کنم وزمانی که مشکلی بوجود آمد آن را حل می کنم ،از این اطمینان پیدا می کنم که همه در تیم خوشحال هستند.بیشتر خودم را Scrum Master می دانم ولی کلمه Master  را دوست ندارم در حالیکه می توان در دو روز گواهینامه اش را گرفت.

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

ما از YouTrack(یک محصول از شرکت JetBrains )برای کنترل محصول و ارتباط با اعضای تیم و زمانبندی کارها استفاده می کنیم.

ما اغلب جلسات را از طریق اسکایپ به صورت یک به یک برگزار می کنیم ولی هفته ای یک بار جلسات گروهی به وسیله گوگل هنگ اوت داریم که آن را What’s up می نامیم و هدف آن عوض شدن روحیه است زیرا مدت زیادی به وسیله Remote کار می کنیم.

من از کسانی که در تیمم کار می کنند انتظار دارم که ابتکار به خرج دهند و فقط محدود کارهایی که به آنها داده شده نباشند و حوزه هایی را پیدا کنند تا بتوانند چیزها را بهبود ببخشند.

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

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

من فکر می کنم یکی از مهمترین کارها ساختن یک تیم،پیدا کردن افراد مناسب و اعتماد به آن ها است.

پ.ن :برداشت آزاد.

معرفی بهترین ویدئو هایی که در سایت TED دیدم

با سایت TED همگی آشنایی دارید به نظرم یکی از سایت هایی است که واقعا محتوای با ارزشی تولید می کند در این پست تصمیم دارم چند تا از بهترین ویدئوهایی که در این سایت دیدم را یه شما معرفی کنم.

I got 99 problems… palsy is just one

این ویدئو درباره دختری است که دچار رعشه ی عصبی است،

How great leaders inspire action

چه چیزی.چه جوری.چرا.

The puzzle of motivation

چگونه به اقزاد انگیزه بدهیم تا خروجی بهتر داشته باشیم.

The power of introverts

درباره قدرت درونگراها

The art of asking

درباره هنر سوال کردن و در خواست

Why we do what we do

۶ عنصر موثر در زندگی

How to live before you die

سخنرانی استیو جابز در استنفورد

معرفی سایت: .NET Foundation

مایکروسافت قدم جدیدی را در جهت تبدیل شدن به یک بازیگر بزرگ در دنیای سورس باز با معرقی سایت NET Foundation. برداشت.

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

این بنیاد شامل ۶ شرکت به جز مایکروسافت هم هست:

  • Miguel de Icaza of Xamarin.
  • Laurent Bugnion of IdentityMine
  • Niels Hartvig of Umbraco
  • Nigel Sampson of Compiled Experience
  • Anthony von der Hoom of Glimpse
  • Paul Betts of GitHub

وتا به این لحظه ۲۴ پروژه در آن وجود دارد :

جای خالی سیلورلایت و WPF را می شود در این لیست مشاهده کرد.

منبع:

Introducing the .NET Foundation

C# 6 از راه رسید

خب سی شارپ ۶ هم از راه رسید ولی خبر جالب اینه که مایکروسافت کد کامپایلر سی شارپ رو به صورت سورس باز عرضه کرده و می تونید در صورتی که تواناییشو در خودتون می بینید با تیم کامپایلر سی شارپ همکاری و مشارکت کنید 🙂 .

خبرهایی در باره ویژگی هایی که قرار بود در سی شارپ جدید وجود داشته باشد رو همگی شنیدید.من چند تا از ویژگی های جدید رو براتون توضیح خواهم داد:

Primary constructors:

به جای اینکه شما یک constructor اصلی در برنامه خودتون بسازید و مقدار دهی اولیه را به صورت دستی انجام دهید می توانید به صورت زیر عمل کنید:

public class Point(int x, int y)

{

}

Auto-property initializers and Getter-only auto-properties-:

در Primary constructors مشاهده کردید که می توانید بک سازنده اصلی ایجاد کنید حال فرض کنید می خواهید مقادیر پاس شده را به  property های کلاس تخصیص دهید در این حالت می توانید به شکل زیر عمل کنید:


public class Point(int x, int y)

{

public int X { get; set; } = x;

public int Y { get; } = y;

}

Using static members:

در نظر بگیرید که شما در حال نوشتن یک برنامه کنسولی هستید در این حالت هر جایی که بخواهید از Console.WriteLine استفاده کنید نیاز خواهید داشت تا حتما نام کلاس Console برده شود و بهتر این بود که می توانستیم به طور مستقیم از memberهای static استفاده کنیم.در C# 6 این کار امکان پذیر است.

using System.Console;
public class Point(int x, int y)

{

public int X { get; set; } = x;

public int Y { get; } = y;

public void Print()     {

Write(x);

}

}

یعنی فقط با افزودن namespace.

Dictionary initializer

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


new JObject { ["x"] = 3, ["y"] = 7 }

Declaration expressions

شما زمانی که با یک متد کار می کردید که یک پارامتر out داشت احتمال زیاد متوجه شده اید که ابتدا باید یک متغیر تعریف کرد و سپس آن را پاس داد که دیگر نیازی به آن کار نیست:

int.TryParse(s, out var x);

Expression-bodied members (برنامه ریزی شده)

این امکان هنوز اضافه نشده و فقط برای سی شارپ می باشد و نه برای وی بی.فرض کنید شما زمانی نیاز دارید که expression داشته باشید که چند چیز را محاسبه می کند و در یک متغیر قرار می دهد در این حالت یک راه سریع و تمیز برای این کار وجود دارد:

public double Dist => Sqrt(X * X + Y * Y);

Null propagation (برنامه ریزی شده)

همه ما تا بحال با خطای null point reference exception ربرو شده ایم.برای جلوگیری از این خطا ما همیشه باید null بودن یک شی را قبل از دسترسی به شی چک کنیم.

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

customer?.Orders?[5]?.$price

منابع:

Language feature implementation status

Microsoft Open Sources C# Compiler

اهمیت خواندن کد

در حال خواندن کتاب کار برنامه‌نویسان «مصاحبه با ۱۵ تن از برجسته‌ترین برنامه‌نویسان جهان» نوشته پیتر سیبل بودم که در آن توجهم به این جلب شد که در سرتاسر کتاب از اهمیت خواندن کد دیگران به مراتب نام برده شده بود.
نوشتن کد برای هر برنامه نویسی لذت بخش است ولی خواندن کد خودمان هم ممکن است کاری دشوار باشد.

calmandsimplecode.027
خواندن کد دیگران می تواند بطور عجیبی مهارت ما را در برنامه نویسی بالا ببرد.فرض کنید شما در حال خواندن یک کد هستید که از ابتدا تا انتهای آن مشغول بدو بیراه گفتن به برنامه نویسش هستید.
چه مشکلاتی در کد مشاهده می کنید؟نام گذاری ضعیف؟توابع پیچیده و بلند؟عدم استفاده از الگوهای برنامه نویسی؟استفاده و خوراندن الگوهای برنامه نویسی در جاهای نامناسب؟

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

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

کد ساده نوشتن اصلا ساده نیست

مروری بر Stack و Heap

به احتمال زیاد شما هم مثل من در کتابهای زیادی درباره Stack و Heap خوانده اید ولی در واقع شاید به طور شایسته ای روی آن تمرکز نشده باشد.

در این پست قصد دارم شما را با Stack و Heap آشنا کنم و درباره هر کدام توضیحاتی را بدهم:

اول باید بگویم که Stack و Heap درواقع جز بحثهای مدیریت حافظه هستند.

stack and heap

Stack چیست؟

یک بلاک از حافظه که برای اجرا شدن Thread یا برای ذخیره متغیر های محلی و همچنین صدا زدن یک تابع رزرو  می شود و زمانی که آن قسمت از کد که باعث رزرو شدن بلاک بود به اتمام رسید به طور اتواماتیک خالی در نظر گرفته می شود.

مشخصات:

  • به مانند Heap در Ram ذخیره شده است.
  • متغیر هایی که در Stack ذخیره می شوند بعد از خروج اتوماتیک آزاد سازی می شوند.
  • بسیار سریعتر از Heap است.
  • پیاده سازی ساختمان داده آن مثل Stack است
  • می تواند در صورت استفاده بیشتر از گنجایش  و یا زمانی که loop بی نهایت رخ دهد دچار stackoverflow شود.
  • داده ها در stack برای استفاده نیازی به pointer ندارند.
  • شما زمانی که سایز دقیق داده ها را می دانید از Stack استفاده کنید.
  • به صورت FILO است.
  • Scope یک Stack در واقع lifetime یک thread است.

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

Heap چیست؟

یک نوع memory است که به صورت داینامیک تخصیص داده می شود.برخلاف Stack شما هیچ الگویی برای تخصیص دادن و آزادسازی حافظه ندارید.شما می توانید هر بلاک از حافظه را هر وقت که خواستید تخصیص دهید و آزاد سازی کنید.در این حالات مدیریت حافظه بسیار دشوار و سخت تر ازStack است زیرا شما باید بدانید که در حال حاضر چه قسمت از حافظه تخصیص داده شده و چه قسمت از حافظه خالی است.

مشخصات:

    • به مانند stack در RAM ذخیره شده است..
    • داده ها در Heap باید به صورت دستی آزاد سازی شود
    • تخصیص بسیار کند ار stack است.
    • می تواند با تخصیص و آزادسازی های زیاد باعث fragmentation شود.
    • زمانی که ما حجم داده هارا جهت ذخیره سازی نمی دانیم در heap ذخیره می کنیم.
    • مسئولیت نشتی حافظه با Heap است.

در برنامه های multi thread  به ازای هر thread یک Stack اختصاصی خواهیم داشت.این درحالی است که معمولا به ازای هر پروسس یک Heap داریم.

i6k0Z

منابع: