آشنایی با LocalDB

مقدمه

LocalDB یکی از محصولات جدید مایکروسافت است که از طرفی جایگزین SQL Server Express شده است و بسیاری از مشکلات آن را حل نموده و از طرف دیگر نیاز بسیاری از توسعه دهندگان و کاربران را به نصب SQL Server مرتفع می کند.

مزایای LocalDB

  • کم حجم بودن فایل نصبی: حجم نسخه ۳۲ بیت ۲۸٫۲ مگابایت و نسخه ۶۴ بیت ۳۳٫۷ مگابایت است
  • سادگی در استفاده: نیاز به تنظیمات پیچیده یا مدیریت تخصصی ندارد
  • قابلیت اجرا توسط کاربران با دسترسی محدود
  • نصب آسان و ساده
  • پشتیبانی از همان TSQL استفاده شده در SQL Express همچنین پشتیبانی از Stored Procedure ها، تریگرها، Viewها و انواع داده geometry و geography
  • استفاده از همان Provider های مورد استفاده برای بقیه نسخه های SQL Server
  • هیچ سرویسی برای بانک اطلاعاتی ساخته نمی شود: پروسس های LocalDB هر زمان که مورد نیاز باشند شروع به اجرا می کنند و در زمان لازم خاتمه می یابند. به محض اینکه یک برنامه تصمیم به ارتباط با LocalDB نماید پروسس های آن به عنوان زیرمجموعه پروسس های آن برنامه اجرا شده و مدت زمان کوتاهی پس از بستن آخرین ارتباط، پروسس های آن بسته خواهند شد.
  • پشتیبانی از AttachDbFileName: این خاصیت به توسعه دهندگان اجازه می دهد که محل فایل بانک اطلاعاتی را مشخص کنند
  • یک نسخه از LocalDB نصب شده روی سیستم برای همه کاربران آن سیستم استفاده می شود
  • پشتیبانی از نصب خاموش*
  • از آن می توان در پروژه های ASP.NET هم استفاده کرد
  • پشتیبانی از XML (XQuery و XPath) و BLOB
  • پشتیبانی از ADO.NET Sync Framework
  • پشتیبانی از LINQ
  • پشتیبانی از تراکنش های توزیع یافته
  • تعداد نامحدود ارتباط محلی

 

پیش نیازها

  • نیاز به SQL Server Native Client دارد که بصورت پیش فرض به همراه خود LocalDB نصب نمی شود
  • دسترسی Admin برای نصب
  • ۱۴۰ مگابایت فضای هارد دیسک
  • بروزرسانی .NET Frameword 4.0 به .NET Frameword 4.0.2

محدودیت ها

  • از ویندوز XP و Server 2000 و Server 2003 پشتیبانی نمی کند
  • نمی توان نسخه ۳۲ بیتی آن را روی سیستم های ۶۴ بیتی نصب کنید
  • فقط ارتباطات محلی مجاز است و نمی توان از سیستم های دیگر به آن وصل شد
  • فقط می توان از SQL Server  ۲۰۱۲ Management Studio برای مدیریت آن استفاده کرد. نسخه های قبلی را هم نمی توان بکار برد
  • Visual Studio RTM از LocalDB پشتیبانی نمی کند
  • نمی توان از آن در پروژه های موبایل ها استفاده نمود
  • حجم بانک اطلاعاتی محدود به ۱۰ گیگابایت می باشد
  • از FileStream پشتیبانی نمی کند
  • محدود به استفاده از یک CPU است
  • در زمان استفاده از LocalDB نمی توان از اشکال زدای SQL استفاده نمود

 

نصب LocalDB
برای نصب ابتدا باید فایل نصبی آن را از اینجا دریافت کنید. همانطور که در ادامه خواهید دید برای نصب فقط نیاز به تایید موافقتنامه آن را دارید. می توانید از نصب خاموش بصورت زیر استفاده کنید:
msiexec /I SqlLocalDB.msi /qn IACCEPTSQLLOCALDBLICENSETERMS=YES
نصب از طریق رابط کاربری بسیار آسان است و فقط نیاز به تایید موافقتنامه دارد.

نحوه ارتباط با LocalDB از طریق SQL Server Management Studio
شما به شرطی می توانید با استفاده از SQL Server Management Studio به LocalDB وصل شوید که .NET Framework خود را به نسخه ۴٫۰٫۲ ارتقا داده باشید. این بروز رسانی را می توانید از اینجا دریافت کنید. اطلاعات بیشتر مربوط به نسخه ۴٫۰٫۲ را می توانید اینجا مطالعه کنید.
از عبارت “(localdb)\v11.0” برای نام سرویس دهنده استفاده کنید.
از نسخه های قبلی Management Studio نمی توانید برای دسترسی به LocalDB استفاده کنید.

نحوه ارتباط با LocalDB از طریق Visual Studio 2010
با توجه به اینکه بطور پیش فرض از داخل VS2010 نمی توانید اشیا و داده های موجود در بانک اطلاعاتی خود را مدیریت کنید بدین منظور باید سری به این صفحه بزنید و ابزار Microsoft SQL Server Data Tools را دریافت کنید. پس از نصب آن شما می توانید از درون VS2010 بانک اطلاعاتی LocalDB خود را مدیریت کنید.

نحوه استفاده از LocalDB در برنامه ها
همانطور که قبلا هم گفته شد، بانک اطلاعاتی LocalDB را با استفاده از خاصیت AttachDbFileName می توان بصورت یک فایل استفاده کرد و برنامه نویسها از آن بصورت یک بانک اطلاعاتی استفاده می کنند نه یک سرویس دهنده بانک اطلاعاتی. وقتی برنامه نویس یک بانک اطلاعاتی LocalDB می سازد یک فایل با پسوند mdf (و یک فایل ldf منتاظر با آن) در مسیر مشخص شده ساخته خواهد شد که برای ارتباط با آن می توانید از ConnectionString بصورت زیر استفاده کنید (با فرض اینکه فایل شما در مسیر C:\MyData ذخیره شده است)
“Data Source=(localdb)\v11.0;Integrated Security=true;AttachDbFileName=C:\MyData\MyDatabase.mdf”
وقتی برنامه ای با استفاده از یک Provider سمت سرویس گیرنده  قصد اتصال به LocalDB را داشته باشد، provider ابتدا وضعیت نمونه LocalDB برای کاربر جاری را بررسی می کند، اگر در حال اجرا باشد، به آن متصل خواهد شد در غیر اینصورت ابتدا آن را برای کاربر جاری اجرا می کند و سپس به آن متصل خواهد شد.

*نصب خاموش (Silent Installation) اغلب برای اجرا در زمان نصب یک نرم افزار بکار می رود. در این صورت کاربر فایل نصبی برنامه را اجرا می کند و متوجه نصب LocalDB نخواهد شد.
منابع:

بیست نظریه برنامه نویسی جنجال برانگیز

دیشب قبل از خواب فیدهای جدیدو مطالعه می کردم به این پست برخوردم که خوندنش برای همه دست اندرکاران برنامه نویسی خالی از لطف نیست!
بسیاری از این نظرات (اگه نخوام بگم همه نظرات) در مورد اغلب برنامه نویسهای ایرانی هم صدق می کنه. از مطالعه اون واقعا لذت بردم. شما هم مطالعه کنید.

 

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

پی نوشت ۲: تصمیم دارم یه سری پست در رابطه با نکاتی که کمتر در برنامه نویسی .NET استفاده می شود بنویسم به نام نکات پنهان در .NET که سعیم بر این است که بصورت پستهای مینیمالیستی باشند

نکات پنهان در دات نت –نکته ۱ – متد ForEach

یک Extension Method است که عملیات تعیین شده action را برای هر آیتم موجود در List<T> انجام میدهد. حالت کلی به این شکل است:

List<T>.ForEach(Action<T> action);

قطعا شما در بسیاری از کدها از حلقه ها استفاده کردید بخصوص حلقه foreach که در پیمایش لیستها کاربرد زیادی دارد. به جای استفاده از حلقه foreach می توانید از متد ForEach استفاده کنید. به مثال زیر توجه کنید:

foreach(Foo foo in foos)
{
statement involving foo;
}

به جای کد فوق می توانید از این کد استفاده کنید:

 

foos.ForEach((Foo foo)=>{ statement involving foo; });

یا:

foos.ForEach(
    delegate(Foo foo)
{
    statement involving foo;
});

اما با توجه به تستهایی که انجام شده است سرعت اجرای کدهای IL تولید شده برای متد ForEach بالاتر از حلقه foreach است (البته بجز در آرایه ها). علاوه بر آن خوانایی ForEach بالاتر و نگهداری کدهای آن ساده تر است. برای مطالعه بیشتر می توانید به این منابع مراجعه کنید:

نکات پنهان در دات نت – نکته ۲ – انواع داده Nullable

Null یک مقدار کاربردی در برنامه نویسی است که همه برنامه نویس ها با آن آشنا هستند. همه میدانیم که وقتی یک متغیر تعریف می کنیم مقدار پیش فرض آن null است وقتی هم یک نمونه ای از یک کلاس تعریف می کنیم می توانیم آن را با مقدار null مقدار دهی کنیم. اما مشکل اصلی در مورد انواع داده عددی و struct هاست که نمی توانیم به آنها مقدار null بدهیم و یا مقدار آنها را با null مقایسه کنیم! این مسئله در کار با بانکهای اطلاعاتی که فیلدها قابلیت null بودن دارند بیشتر خودش را نشان میدهد.
Nullable ها انواع داده ای هستند که علاوه بر محدوده قابل قبول معمولی می توانند null را هم به عنوان مقدار بپذیرند و طبیعتا در شرطها با مقدار null مقایسه شوند. نحوه تعریف انواع داده Nullable بدین شکل است:

Nullable<T> variableName;

مثال ۱:

Nullable<int> iNull;

مثال ۲:

public struct MyStruct()
{
    public void foo()
    {
        //Do Anything
    }
}
static void Main(string[] args)
{
   Nullable<MyStruct> myStruct=null;
   if(myStruct==null)
    {
       //Do Anything
    }
}

راه ساده تر برای تعریف متغیرهایی Nullable استفاده از علامت ? است:

int? iContentType = null;

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

نکات پنهان در دات نت – نکته ۳ – ناحیه کد

نکته شماره ۳ مربوط به مدیریت بهتر کدها در Visual Studio است. حتما مجبور به خواندن کدهای بسیاری شده اید که بسیار بی نظم و درهم ریخته نوشته شده اند و همین بی نظمی باعث صرف زمان بیشتر برای پیدا کردن و بررسی کدهای مورد نظر شده است. برای رفع این مشکل در Visual Studio می توانید از Region استفاده کنید.
با استفاده از #region شما می توانید ناحیه های مختلفی از کدها را تعریف کنید. فراموش نکنید که این یک تقسیم بندی تاثیری در نحوه اجرا و عملکرد کدهای شما ندارد. به مثال زیر توجه کنید:

#region RegionName
// this is your code
#endregion

 مثال:

#region properties
        public int PersonId { get; set; }
        public int FirstName { get; set; }
        public string LastName { get; set; }
#endregion

پس از استفاده از #region در Visual Studio در کنار آن یک علامت + نمایش داده میشود که با استفاده از آن می توانید ناحیه کد مورد نظر را بسته و یا باز کنید.
چند ناحیه پیشنهادی برای کدهای شما:

  • #region Properties
  • #region Private Methods
  • #region Public Methods
  • #region Constructors
  • #region Handlers

 

نکات پنهان در دات نت – نکته ۴ – دیباگ کنترل شده

به طور خلاصه در صورت استفاده از DebuggerStepThrough ( که یک attribute است) برای متد یا خواص کلاس، دیباگر در زمان دیباگ وارد آن نخواهد شد.
از این Attribute می تونید برای متدها، Property Accessor ها، کلاسها و structها استفاده کنید.
مثال:

[DebuggerStepThrough]
Private void Initialize()
{   
//Your Code;
}

آشنایی با Generic Handler در ASP.NET

حتما برای شما هم پیش آمده است که در حین ساخت وب سایت بخواهید صفحه را بصورت پویا بسازید، در این موارد نیازی به ساخت فرم وب نیست و بجای آن می توانید از Generic handler یا فایلهای ASHX استفاده کنید. هر کاری که باید انجام شود در یک فایل ashx نوشته می شود. با فراخوانی url فایل ashx کار مورد نظر انجام شده و محتوای مورد نیاز تولید می شود.
برای آشنایی با نحوه ساخت Generic Handler ها مراحل زیر را انجام دهید:

  • یک پروژه از نوع ASP.NET بسازید. منوی Add-> New Item را انتخاب کنید تا پنجره Add New item نمایش داده شود. آیتم Generic Handler را انتخاب کنید و نام آن را وارد نمایید (در این مثال نام آن MyHandler انتخاب شده است). پس از انتخاب کلید Add فایل MyHandler.ashx به پروژه شما اضافه خواهد شد.

 

  • همانطور که در کد مشاهده می کنید، کلاس MyHandler اینترفیس IHttpHandler را پیاده سازی کرده است. مهمترین عضو آن متد ProcessRequest است که بطور پیش فرض در کد پیاده سازی شده است. هر زمان که تقاضایی برای فایل ashx موجود باشد این متد اجرا خواهد شد. در این مثال با رسیدن تقاضا برای MyHandler.ashx یک تصویر نمایش داده خواهد شد. برای این کار ابتدا فایل تصویر مورد نظر را در پروژه اضافه نمایید. سپس کد زیر را در متد ProcessRequest بنویسید:
public void ProcessRequest(HttpContext context)
{
      context.Response.ContentType = "image/jpg";
      context.Response.WriteFile("~/Ferrari.jpg");
}

در این متد ابتدا نوع محتوایی که تولید و ارسال خواهد شد تعریف شده است و سپس با استفاده از متد WriteFile فایل تصویر مورد نظر به عنوان محتوا ارسال شده است. برای دیدن نتیجه این کد پروژه را اجرا کرده و سپس در قسمت آدرس مرورگر فایل MyHandler.ashx را درخواست نمایید.

  • در ادامه این مثال را بسط خواهیم داد و آن را کاربردی تر خواهیم کرد. در مثال جدید یک پارامتر را با استفاده از QueryString به فایل ashx ارسال می کنیم و بر اساس آن تصمیم گیری خواهیم کرد که تصویر یک فراری نمایش داده شود یا یک لامبورگینی هرچند که در هر شرایطی من فراری را ترجیح می دهم!
    متد ProcessRequest را به شکل زیر تغییر دهید:
        public void ProcessRequest(HttpContext context)
        {
            HttpResponse response = context.Response;
            response.ContentType = "image/jpg";
            string carType = context.Request.QueryString["cartype"];
 
            if(carType=="Ferrari")
                response.WriteFile("~/Ferrari.jpg");
            else
                response.WriteFile("~/Lamborgini.jpg");
        }

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


دلایل استفاده از Generic Handler به جای Web Form

  1. سادگی  استفاده: Generic Handlerها ساختار ساده ای دارند و برنامه نویس را با تعداد زیادی رویداد و متد درگیر نمی کنند. Web Form ها از کلاس Page ارث بری دارند بنابراین تعداد زیادی از اعضای Page را به ارث می برند که برای بسیاری از کارها به آنها نیازی ندارید.
  2. کارایی: اجرای بیش از ده رویداد در زمان مدیریت تقاضای یک Web Form در مقابل اجرای فقط یک رویداد در زمان تقاضای Generic Handler ها، باعث افزایش کارایی فایلهای ashx شده است.


نحوه انتخاب Web Form یا Generic Handler
شما باید Web Form ها را انتخاب کنید اگر:

  • می خواهید صفحات ساده html طراحی کنید
  • می خواهید از کنترلهای سفارشی ASP.NET استفاده کنید
  • می خواهید صفحات پویا طراحی کنید

 

شما باید Generic Handler ها را انتخاب کنید اگر:

  • می خواهید با فایلهای باینری کنید (به عنوان مثال با فایلهای تصویری)
  • می خواهید با XML کار کنید (به عنوان مثال با Rss ها)
  • کارایی صفحات وب برای شما بسیار اهمیت دارد و می خواهید صفحات وب مینیمال طراحی کنید.

برخی کاربردهای رایج Generic Handler

  • ساختن Rss Feed برای سایت
  • ساختن تصاویر در اندازه مورد نیاز و ارسال آن برای تقاضا کننده
  • ساخت تصاویر امنیتی (captcha)
  • نمایش متنهای طولانی ذخیره شده در بانک اطلاعاتی
  • تبدیل متون به PDF

 

منابع برای مطالعه بیشتر:

مقایسه IEnumerable و IQueryable

مقدمه
در Query های LINQ برای دسترسی به داده های بانک اطلاعاتی یا مجموعه ها، از IQueryable و IEnumerable استفاده می شود. اینترفیس IQueryable اینترفیس IEnumerable را به ارث برده است. هر دو برای دسترسی به داده ها و کار با آنها مهم و پر کاربرد هستند. در ادامه امکانات هر دو و راهکارهای بالا بردن کارایی استفاده از هر کدام را بررسی می کنیم.

آشنایی با IEnumerable

  • IEnumerable در فضای نام System.Collections قرار دارد
  • در IEnumerable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IEnumerable بهترین انتخاب برای query گرفتن از داده های ذخیره شده در مجموعه های موجود در حافظه مانند List و Array است.
  • وقتی یک query روی بانک اطلاعاتی انجام می شود، IEnumerable ابتدا آن query را سمت Server اجرا کرده، داده ها را در سمت کلاینت در حافظه بارگذاری و سپس آنها را فیلتر می کند.
  • IEnumerable برای استفاده در query های Linq2Object و Linq2Xml مناسب است.
  • IEnumerable از امکان Deferred Execution پشتیبانی می کند (بدین معنی که query تا زمان اولین درخواست بصورت یک عبارت در حافظه نگهداری می شود)
  • IEnumerable از Custom Query ها پشتیبانی نمی کند.
  • IEnumerable از بارگذاری دیرهنگام (Lazy Loading) پشتیبانی نمی کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب نیست.


مثال از کاربرد IEnumerable:

MyDataContext dc = new MyDataContext ();
IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

عبارت SQL متناظر با مثال بالا برابر است با:

SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

توجه داشته باشید که عمل فیلتر کردن (۱۰ آیتم آخر) در سمت کلاینت انجام می شود و معادل آن SQL تولید نشده است.

آشنایی با IQueryable

  • IQueryable در فضای نام System.Linq قرار دارد.
  • در IQueryable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IQueryable بهترین انتخاب برای کار با مجموعه های خارج از حافظه مانند بانکهای اطلاعاتی و سرویس هاست.
  • وقتی یک query روی یک بانک اطلاعاتی اجرا شود، IQueryable دستور select آن را به همراه همه فیلترها در سرور اجرا می کند.
  • IQeryable برای query های Linq 2 SQL مناسب است.
  • IQeryable از امکان Deferred Execution پشتیبانی می کند.
  • IQueryable از Custom Query ها با استفاده از متدهای CreateQuery و Execute پشتیبانی می کند.
  • IQueryable از بارگذاری دیرهنگام پشتیبانی می کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب است.


مثال از کاربرد IQueryable:

MyDataContext dc = new MyDataContext ();
IQueryable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

عبارت SQL متناظر با مثال بالا برابر است با:

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

منبع:

مقادیر Null در اندروید

اگه در Sqlite فیلدی دارید که مقدار null قبول می کنه برای مقداردهی و یا خوندن مقدارش یه کمی کدنویسی بیشتر نیاز دارید.

برای مقداردهی این فیلدها به null باید از متد putNull از کلاس ContentValues استفاده کنید. تنها پارامتر اون نام فیلد مورد نظره که باید با null مقداردهی بشه

ContentValues values=new ContentValues();
values.putNull("price");

برای خوندن مقادیر این فیلدها باید ابتدا از متد isNull استفاده کنیم و مقدار آن فیلدو بررسی کنیم. به مثال زیر توجه کنید:

String sDescription="";
if(!cursor.isNull(cursor.getColumnIndex("Description"))){
    sDescription=cursor.getString(cursor.getColumnIndex("Description"));
}

آشنایی با Transaction در Android

فرض کنید در برنامه اندروید مورد نظر ما دو جدول به نامهای A و B داریم که پس از ثبت رکورد در جدول A رکورد یا رکوردهای مرتبط با آن در جدول B ثبت خواهند شد. برای ما ارتباط بین رکوردهای ثبت شده در این جداول مهم است یعنی در صورتی که ثبت رکورد در جدول A موفقیت آمیز باشد اما ثبت رکورد در جدول B با شکست مواجه شود، باید مقادیر ثبت شده در جدول A هم ملغی شود. در این مورد باید از Transaction در برنامه استفاده کنیم.

برای استفاده از Transaction در برنامه های اندروید باید از متدهای کلاس SQLiteDatabase استفاده کنید. شبه کد زیر را همه آنچه را که باید در رابطه با Transaction بدانید به شما نشان داده است:

DbManager dbHelper=new DbManager(this);
SQLiteDatabase db= dbHelper.getWriteableDatabase();
db.beginTransaction();
try{
	//Insert into Table A
	//Insert into Table B
	Db.setTransactionSuccessful();
} catch{
//Error in insert data
} finally{
	Db.endTransaction();
}

در این مثال ابتدا یک شی از کلاس DbManager تعریف شده است. کلاس DbManager پیاده سازی کلاس SQLiteHelper است. سپس با فراخوانی متد getWriteableDatabase یک شی SQLiteDatabase به نام db ساخته شده است.
فراخوانی متد beginTransaction باعث می شود که Transaction آغاز شود. پس از ثبت اطلاعات مورد نیاز در دو جدول A و B با فراخوانی متد setTransactionSuccessfull به شی SQLiteDatabase اعلام می کنیم که مجموعه عملیات مورد نظر که در Transaction قرار گرفته اند با موفقیت انجام شده است. در بخش finally متد endTransaction فراخوانی شده است که با فراخوانی آن پایان Transaction اعلام می شد. در صورت رخ دادن هر خطایی در بخش try متد setTransactionSuccessfull فراخوانی نخواهد شد و در صورتی که متد endTransaction بدون فراخوانی این متد اجرا شود همه تغییرات roll back خواهند شد.

تست برنامه Microsoft Live Writer

تصمیم گرفتم یه دستی به سرو گوش وبلاگ بکشم ولی برای این کار باید اول راهی برای ساده تر شدن فرآیند آپدیت بلاگ پیدا میکردم. تو وبلاگ اسکات هنسلمن برنامه Microsoft Live Writer رو معرفی کرده بود و خیلی هم ازش تعریف کرده بود. به همین خاطر گزینه اول همین برنامه انتخاب شد. تا اینجای کار که عملکردش خیلی خوب بود و براحتی با مکانیزم وبلاگ من کنار اومد. این پست هم علاوه بر معرفی این برنامه یه جورایی تست اونم هست. نتیجه رو هم که خودتون می بینید!

1464008_783034638378374_220801857_n

رفع یک اشکال قدیمی در اندروید استودیو

بعد از مدتها گوگل در نسخه جدید Android Studio یعنی ۰٫۴٫۶ یک اشکال قدیمی و ساده رو برطرف کرد. در حقیقت بیشتر شبیه به یه سوتی بود تا اشکال.

زمانی که شما یه پروژه جدید می ساختید وقتی نوع Activity را Blank Activity انتخاب می کردید یه Activity با یه fragment خالی در اختیار شما میذاشت و هیچ گزینه ای هم برای ساخت یک Activity خالی واقعی نداشت.

در نسخه ۰٫۴٫۶ شما میتونید خودتون انتخاب کنید که Blank Activity ساده برای شما ساخته بشه یا Blank Activity شامل یک Blank Fragment

no-fragment

پی نوشت: بعد از نصب این نسخه نیاز به بروزرسانی Gradle خواهید داشت و همیچنین باید نسخه Build Tools مورد استفاده را حداقل به ۱۹٫۰٫۰+ تغییر دهید در غیر اینصورت با دریایی از خطاها مواجه خواهید شد

متاسفانه در صورتی که از نسخه های پایینتر Build Tools استفاده می کنید این بروزرسانی آن را تغییر نمی دهد و شما خودتون باید نسخه اونو بروز کنید. برای انجام این کار باید فایل build.gradle پروژه رو اصلاح کنید

نکاتی در مورد یه ایمیل درخواست پروژه

یکی از بازدیدکنندگان وب سایتم یه ایمیل برای من فرستاده که من یه برنامه می خوام چنین و چنان با فلان مشخصات و بهمان امکانات! از ظاهر ایمیل میشه فهمید که منظور ایشون یه پروژه دانشجویی بوده. در این مورد ۲ نکته به ذهنم رسید که بهشون اشاره می کنم:

– پروژه دانشجویی برای بالا بردن توانایی های دانشجو بهش داده میشه و باید خودش انجام بده. اینو همیشه بهش معتقد بودم و هستم و نه هیچ پروژه ای رو در زمان دانشجویی خودم به کسی دادم و نه هیچ پروژه دانشجویی کسی رو انجام دادم. اما در صورتی که دوستان سوال و یا مشکلی داشته باشن در حد توان راهنمایی کردم و خواهم کرد. فراموش نکنیم که این مدرک ما نیست که در آینده تو بازار کار برای ما پول درمیاره بلکه دانش و تجربه ماست (البته حساب کسانی که پول و پارتی دارن جداست).

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

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

واچک

بصورت کاملا تصادفی به واچک برخوردم، اسمش یه جوری بود که نمیشد کلیک نکنم و سر ازش درنیارم!

واچک چی هست؟

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

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

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

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

سایت واچک یه ربات تلگرام هم داره که از اون طریق هم میتونید از سایت استفاده کنید.

در حال حاضر که این متن رو مینویسم ۱۰ واژه نامه، ۱۷۵۶ واژه و ۲۶۰۷ معادل در این سایت ثبت شده.

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

 

نقد انیمیشن “کشتی نجات” ARK

نقد انیمیشن “کشتی نجات” ARK

چند وقت پیش پسرعموم صادق ازم خواست که یه انیمیشن رو ببینم و نظرم رو در موردش بگم. ظاهرا این انیمیشن که اسمش ARK هست و به نام “کشتی” ترجمه شده و خیلی هم معروف شده بین اهالی هنر، براش جالب بود و می خواست نظر من هم در این مورد جویا بشه. منم این چند خط رو در مورد این انیمیشن براش نوشتم که بعد از ارسال دیدم بد نیست بصورت عمومی منتشرش کنم. واقعا خوشحال میشم اگه کسی از اینورا رد شد و در مورد این نقد (یا هر اسمی که می خواید روش بذارید) نظرشو نوشت. اول شمارو به دیدن انیمیشن دعوت می کنم:

 

اول اینو بگم که اسم انیمیشن ARK هست که ترجمه تحت اللفظیش میشه “کشتی” اما تو زبان انگلیسی به کشتی میگن Ship و ARK فقط به کشتی نجاتی میگن که حضرت نوح ساخت و پیروان و حیوانات رو برای نجات سوار کشتی کرد. کلمه ARK در کتب عهد عتیق (تورات و انجیل) به عنوان کشتی نجات نوح استفاده شده!

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

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

اما چرا تفنگها رو بصورت دستگیره در می بینیم؟ این نشون میده که اینا توهم اون شخص و اشخاصی مثل اون بوده و در حقیقت دستگیره رو به شکل تفنگ میدیده

و بعد هم متوجه میشیم که شخص اصلی یه پیرمرده که روی یه ساختمان بلند شبیه به کشتی رفته و در آخر که دوربین به سمت در و تابلوی بالای در اون ساختمون حرکت میکنه (معلومه اسم اون ساختمون خیلی اهمیت داره) از ظاهر امر پیداست که یه جور آسایشگاه روانی برای کسانی هست که فکر می کنن تو اون کشتی نجات گیر افتادن. معنی تابلوی بالای در میشه “آسایشگاه کشتی” که منظورش از کشتی همون کشتی نجاته

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

انیمیشن با نوشته ای از یکی از نمایشنامه های شکسپیر (مکبث) هست که معنیش میشه این:

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

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

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

 

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

نرم افزار WinToUsb و فلش Bootable

نرم افزار WinToUsb و فلش Bootable

هفته گذشته شرایطی پیش اومد که نیاز به فلش Bootable پیدا کردم. بعد از جستجو راههای متعددی برای ساخت اون پیدا کردم ولی نهایتا ساده ترین و سریعترین روش به نظرم استفاده از نرم افزار WinToUSB بود.

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

  • Image To USB: یک فلش Bootable از روی یک فایل Image ویندوز می سازد. هم فایل ISO و هم فایلهای VMWare را پشتیبانی می کند
  • CDROM To USB: از روی CD/DVD ویندوز یک فلش Bootable برای شما می سازد
  • Physical To USB: از روی ویندوز نصب شده فعلی، یک فلش Bootable می سازد

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

  • بعد از دانلود آخرین نسخه باید نرم افزار را نصب کنید. در این مورد اگر خود نرم افزار Portable بود قطعا بهتر بود!
  • بعد از نصب نرم افزار، فلش مورد نظر را به سیستم متصل کنید. فلشی که برای این کار استفاده می کنید باید حداقل ۱۶ گیگ و فرمت NTFS باشد.
  • برنامه را با دسترسی Administrator اجرا کنید. از سمت چپ بالاترین گزینه که آیکون آن به این شکل است  انتخاب کنید. با انتخاب گزینه Image To USB می توانید با استفاده از آیتمهای سمت راست برنامه فایل Image ویندوز را انتخاب کنید. بعد از انتخاب فایل Image اگر بیش از یک ویندوز توی فایل باشد لیست آنها را به شما نمایش میده و باید ویندوز مورد نظرتون رو انتخاب کنید. بعد از انتخاب ویندوز مورد نظر کلید Next را بزنید

  • تو مرحله جدید اول درایو فلش را انتخاب کنید و بعد در قسمت پایین پنجره پارتیشن های سیستم و بوت را باید تعیین کنید. میتونید برای هر دو یک پارتیشن را انتخاب کنید. بعد از انتخاب اونها کلید Next را کلیک کنید.

  • مرحله آخر، مرحله ساخت فلش Bootable است و شما کاری جز صبر ندارید.

 

راهنمای خرید و نگهداری گربه ماهی اتو (otocinclus)

راهنمای خرید و نگهداری گربه ماهی اتو (otocinclus)

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

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

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

حتما نظرات و تجربیات خودتون رو با من در میون بذارید.

 

دانلود مقاله راهنمای خرید و نگهداری گربه ماهی اتو (Otocinclus)