Some 64 bit Windows notes

چند نکته درمورد ویندوز 64 بیتی

  • نرم افزارهای 32 بیتی در مسیر c:\Program Files (x86)\company name نصب خواهند شد و نرم افزار های 64 بیتی در مسیر c:\Program Files\company name.
  • مسیر windir\System32 برای کتابخانه های 64 بیتی در نظر گرفته شده و کتابخانه های 32 بیتی در پوشه SysWOW64 قرار خواهند گرفت. عبارت WoW64 یعنی Windows 32-bit on Windows 64-bit (ویندوز 32 بیتی در ویندوز 64 بیتی).
  • مسیر HKEY_LOCAL_MACHINE\SOFTWARE در رجیستر برای نرم افزار های 64 بیتی در نظر گرفته شده و وقتی برنامه 32 بیتی در آدرس بالا بنویسد، به صورت خودکار در مسیر  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node نوشته خواهد شد. برای خواندن هم اگر برنامه 32 بیتی از آدرس اول بخواند، از آدرس دوم برای او خوانده خواهد شد. 

\.Chehre

Access Shared Folders in a VirtualBox Ubuntu Virtual Machine

دسترسی به Shared Folderهای تعریف شده در Oracle VirtualBox از Ubuntu

Shared Folderها پوشه هایی (فولدر هایی) هستند که بین PC شما و سیستم عامل مجازی که در ماشین مجازی نصب نموده اید به اشتراک گذاشته می شوند. به عنوان مثال، می خواهیم یک فایل بزرگ که اسمش X هست رو به سیستم عامل مجازیمون بفرستیم. در سیستم عامل خودمون فایل X را در پوشه ای که تعریف کردیم قرار میدیم و از اون طرف، در ماشین مجازیمون، فایل را از پوشه ای که در اونجا تعریف کردیم، برمیداریم. دقیقا مثل درایو های Share و Map شده در شبکه، که تو یکی از کامپیوتر ها، فایلی رو در پوشه Share شده میریزیم و در کامپیوتر دیگر، فایل را از پوشه Share شده بر میداریم.

شاید شما هم مثل من از Shared Folder در VMware خیلی استفاده کرده باشید. اما تعریف و استفاده از Shared Folder در Ubuntu نصب شده در Oracle VirtualBox زیاد ساده به نظر نمیرسه، برای همین مراحل کار را اینجا مینویسم.
 قبل از هر چیز این نکته رو باید عرض کنم که من از Light Ubuntu نسخه 13.04 استفاده می کنم. و در زیر نتیجه دستور lsb_release –a در Terminal اوبونتوی  من رو میبینید:
ahmad@lubuntu-vm:~$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 13.04
Release:    13.04
Codename:    raring

هدف اینه که من پوشه ای که در مسیر D:\Share در PC خودم دارم را در سیستم عامل مجازیم، یعنی همون LUbuntu ببینم و بتونم از اون استفاده کنم.

مراحل اشتراک گزاری:

انتخاب پوشه

برای شروع از منوی Devices ، Shared Folders رو انتخاب کرده و پوشه دلخواه خود را با نام دلخواه خود برای به اشتراک گذاری معرفی می نماییم. به عنوان مثال پوشه بنده در مسیر D:\Share قرار داره و با نام winshare معرفی نموده ام.

نصب Guest Additions

ابتدا باید بگم که Guest Additions  یک پکیج نرم افزاری هست که در زبان ساده میشه گفت که ارتباط بین سیستم عامل مجازیتون و Oracle VirtualBox رو تسهیل می بخشه و سرعت و یکپارچگی رو به ارمغان میاره. سه مورد از توانایی های Guest Additions رو برای مثال در ادامه مینویسم و شما میتونید همه توانایی های Guest Additions را در اینجا با توضیحات بخونید.
-    یکپارچگی موس و صفحه کلید بین سیستم عامل و ماشین مجازی.
-    پشتیبانی بهتر از کارت گرافیک
-    اشتراک پوشه بین سیستم عامل و ماشین مجازی
-    و ...
خوب برای نصب Guest Additions از منوی Devices ، Install Guest Additions را انتخاب می کنیم. با این عمل یک دیسک مجازی در لینوکسمان Mount خواهد شد. آدرس این دیسک در سیستم بنده به صورت زیر است:
/media/ahmad/VBOXADDITIONS_4.2.12_84980

در خط فرمان به پوشه مورد نظر رفته و فایل VBoxLinuxAdditions.run را اجرا می نماییم:
cd /media/cdrom
sudo ./ VBoxLinuxAdditions.run

خروجی دستور بالا در سیستم بنده به صورت زیر بود و همینطور که میبینید با خطا مواجه شده:
ahmad@ahmad-VirtualBox:~$ cd /media/ahmad/VBOXADDITIONS_4.2.12_84980
ahmad@ahmad-VirtualBox:/media/ahmad/VBOXADDITIONS_4.2.12_84980$ sudo ./VBOXLinuxAdditions.run
[sudo] password for ahmad:
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.2.12 Guest Additions for Linux............
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox non-DKMS kernel modules ...done.
Building the VirtualBox Guest Additions kernel modules
The make utility was not found. If the following module compilation fails then
this could be the reason and you should try installing it.
The gcc utility was not found. If the following module compilation fails then
this could be the reason and you should try installing it.
Building the main Guest Additions module ...fail!
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions ...done.
Installing the Window System drivers
Installing X.Org Server 1.13 modules ...done.
Setting up the Window System to use the Guest Additions ...done.
You may need to restart the hal service and the Window System (or just restart
the guest system) to enable the Guest Additions.
Installing graphics libraries and desktop services components ...done.
ahmad@ahmad-VirtualBox:/media/ahmad/VBOXADDITIONS_4.2.12_84980$


اگر شما هم با خطای بالا برخورد کردید، میتونید بسته virtualbox-guest-x11 را نصب کنید تا خطا برطرف بشه:
sudo apt-get install virtualbox-guest-x11

البته این دستور هم در سیستم من با خطا مواجه شد و پیغام  Unable to locate package برای من نمایش داده شد. این خطا به خاطر این بود که من در هنگام نصب، اینترنت ماشین مجازی را قطع کرده بودم و Package Manager  و چند برنامه دیگه آپدیت نشده بود. پس برای برطرف کردن خطا اول از دستور sudo apt-get update استفاده کردم و بعد دستور بالا رو اجرا کردم.
خوب بعد از برطرف شدن خطا دوباره دستورات بالا را برای نصب Guest Additions اجرا می کنیم.
sudo ./VBoxLinuxAdditions.run

تخصیص دسترسی به کاربر

برای اینکه بتونیم پوشه خود را سوار (Mount) کنیم، ابتدا باید کاربری خود را در گروه vboxsf قرار بدیم. برای این کار از دستور زیر استفاده می کنیم:
sudo usermod -aG vboxsf ahmad

در این دستور به جای ahmad نام کاربری خود را وارد کنید.

سوار(Mount) کردن پوشه

برای مانت کردن پوشه ابتدا یک پوشه در مسیر /media ایجاد می نماییم و سپس پوشه خود را سوار می کنیم.
 sudo mkdir /media/vboxshared
sudo mount -t vboxsf winshare /media/vboxshared

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

حالا میتونید فایل ها و برنامه های مورد نظرتون رو در پوشه ای که در ویندوز به اشتراک گذاشتید بریزید (برای بنده همون پوشه D:\Share) و در سیستم عامل مجازیتون (اوبونتو) از مسیر /media/vboxshared اون ها رو ببینید.
\.Chehre

Migrate a project from Delphi 7 or Delphi XE2 to Delphi XE4

امروز می خواستم یک پروژه که از Delphi 7 به Delphi XE2 ارتقاء داده بودم رو به Delphi XE4 ارتقاء بدم. اما با خطای زیر مواجه شدم :
E2003 Undeclared identifier: ' ShortDateFormat'

خوب اینجور که از سایت شرکت Embarcadero معلوم هست، متغیر هایی مثل ShortDateFormat، DateSeparator، CurrencyString و ... در FormatSettings مجتمع شدن و برای استفاده از اون ها باید به شکل زیر در برنامه نوشته بشن:

FormatSettings.ShortDateFormat := 'dd/MM/yyyy';

اگر هنوز نرم افزارهایی دارید که از Delphi 7 برای برنامه نویسی اون ها استفاده می کنید و اگر در فکر ارتقاء اون ها هستید باید چند نکته رو بدونید:

  • در Delphi 2009 پشیبانی از Unicode به این زبان اضافه شده، و اگر با اون آشنایی ندارید، احتمالا به مشکل بر خواهید خورد. برای اطلاعات بیشتر یا از اینجا White Paper: Delphi and Unicode را دانلود کنید و بخونید و یا بخش اول کتاب Delphi 2009 Handbook رو مطالعه کنید. البته چند لینک مفید هم در آخر معرفی میکنم.
  • اگر از متغیر هایی مثل ShortDateFormat' استفاده می کردید، باید مثل مثال بالا ازشون استفاده کنید.
  • Namespace ها هم به دلفی اضافه شدن. مثلا به جای SysUtils باید و بهتره که بنویسید System.SysUtils و بهتر هست که از این قابلیت در کلاس ها و یونیت های خود استفاده کنید.
  • اگر در شرط هاتون از مجموعه ای از کاراکتر ها (Sets of Characters) استفاده میکردید، به خاطر اینکه قبلا کاراکتر ها Ansi بودن و هر کاراکتر نمایانگر یک بایت بوده میتونستید از شرط زیر استفاده کنید:
if C in ['a'..'z', 'A'..'Z'] then


اما الان چون کاراکتر ها WideChar تعریف شده اند، باید از دستور CharInSet به صورت زیر استفاده کنید:


if CharInSet(C, ['a'..'z', 'A'..'Z']) then

  • و در آخر اگر از کامپوننت های قدیمی استفاده می کنید، به احتمال قوی اون ها از Unicode و توابع جدیدی که به دلفی اضافه شدن، پشتیبانی  نمیکنن و اون ها رو باید ارتقاء بدید.

چند لینک درباره Unicode در دلفی:


\.Chehre

Calculate MD5, SHA1 and other hashes of files

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

محاسبه کدهای Hash یک فایل در Command Line ویندوز

برای چک کردن MD5 یا SHA1 و ... در ویندوز میتونید از File Checksum Integrity Verifier استفاده کنید. نحوه استفاده از این برنامه خیلی راحت هستش و شما با نوشتن دستور زیر در Command Line ویندوز میتونید مقدار MD5 و SHA1 فایل مورد نظرتون رو بدست بیارید:

FCIV -md5 -sha1 path\filename.ext

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

محاسبه MD5 یک فایل در PowerShell

اگر از PowerShell به عنوان خط فرمان پیش فرض ویندوز استفاده می کنید، برای محاسبه کد MD5 میتونید از دستورات زیر استفاده کنید:

$someFilePath = "C:\foo.txt"
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))

در این کد کافیه آدرس فایل خود را در متغیر someFilePath  بریزید و بعد از اجرای دستورات، کد MD5 فایل خود رو میتونید مشاهده کنید.
البته در اینجا قطعه کدی به همراه مثال نوشته شده که با استفاده از اون میتونید به سادگی کدهای SHA1 و MD5 یک فایل را حساب کنید.

محاسبه کدهای Hash یک فایل در Shell های لینوکس

خوشبختانه به دست آوردن کدهای Hash تو لینوکس خیلی راحت هستش و دیگه نیازی به دانلود پکیج خاصی نیست و به طور پیش فرض، این دستورات در لینوکس وجود دارن. و یا حداقل در توزیع هایی که من استفاده کردم اینطور بوده.
برای محاسبه MD5 یک فایل از دستور md5sum filename استفاده می کنیم و به جای filename اسم فایل را قرار میدهیم.
و همینطور برای SHA1 از دستور sha1sum filename استفاده می کنیم.
- برای دیدن بقیه دستوراتی که با sha شروع میشن، حروف sha رو در Shell بنویسید و دو بار کلید Tab را بزنید تا دستورات بقیه کدها Hash که با sha  شروع میشن نمایش داده بشن.

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

\.Chehre

SQL Server Native Client for Connecting to Microsoft SQL Server

اگر برای اتصال در برنامه از  SQL Server Native Client استفاده کرده باشید، برای اینکه برنامتون در کلاینت ها (سیستمی غیر از سرور) به اجرا در بیاد، باید بر حسب نیازتون یکی از بسته های  SQL Server Native Client را نصب کنید.
در زیر لینک دانلود نسخه های مختلف به همراه توضیحات هرکدام گذاشته شده:

دانلود SQL Server 2012 Native Client  از Microsoft SQL Server 2012 Feature Pack
توضیحات:
Microsoft SQL Server Native Client (SQL Server Native Client) is a single dynamic-link library (DLL) containing both the SQL OLE DB provider and SQL ODBC driver. It contains run-time support for applications using native-code APIs (ODBC, OLE DB and ADO) to connect to Microsoft SQL Server 2005, 2008, 2008 R2, and SQL Server 2012. 


 دانلود SQL Server 2005 Native Client  از Microsoft SQL Server 2008 R2 Feature Pack .
 توضیحات:
Microsoft SQL Server 2008 R2 Native Client (SQL Server Native Client) is a single dynamic-link library (DLL) containing both the SQL OLE DB provider and SQL ODBC driver. It contains run-time support for applications using native-code APIs (ODBC, OLE DB and ADO) to connect to Microsoft SQL Server 2000, 2005, or 2008.


دانلود SQL Server 2005 Native Client  از Microsoft SQL Server 2005 Feature Pack.
توضیحات:
Microsoft SQL Server Native Client (SQL Native Client) is a single dynamic-link library (DLL) containing both the SQL OLE DB provider and SQL ODBC driver. It contains run-time support for applications using native-code APIs (ODBC, OLE DB and ADO) to connect to Microsoft SQL Server 7.0, 2000 or 2005.

و در آخر برای نصب SQL Server Native Client  یا sqlncli.msi با Inno Setup میتونید از کد زیر استفاده کنید:
پارامتر passive باعث میشه که کاربر فقط روند نصب رو مشاهده کنه!

[Run]
Filename: "msiexec.exe"; Parameters: "/i ""{app}\sqlncli.msi"" /passive"; Check: "not IsWin64";
Filename: "msiexec.exe"; Parameters: "/i ""{app}\sqlncliX64.msi"" /passive"; Check: IsWin64;


\.Chehre

Unobtrusive Ajax stopped working after update jQuery to 1.9.1

چند وقت پیش سعی کردم که یکی از پروژه ها رو از  MVC3 به MVC4 ارتقاء بدم. jQuery را هم به نسخه 1.9.1 ارتقاء دادم اما با خطای زیر مواجه شدم:

Error when entering login page:
Unhandled exception at line 115, column 5 in http://localhost:63180/Scripts/jquery.unobtrusive-ajax.js
0x800a01b6 - Microsoft JScript runtime error: Object doesn't support property or method 'live'

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

Type Error: a(...).live is not a function
این بود که با IE برنامه رو تست کردم و خطای اول رو گرفتم.

تابع live در نسخه 1.9.1 حذف شده و نمیشه دیگه از اون استفاده کرد. سایت jQuery  درباره این تابع و تابع جایگزین اون یعنی تابع on اینطور گفته:

As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().
This method provides a means to attach delegated event handlers to the document element of a page, which simplifies the use of event handlers when content is dynamically added to a page. See the discussion of direct versus delegated events in the .on() method for more information. 

البته باید بگم که من فقط jQuery  رو به نسخه 1.9.1 ارتقاء داده بودم و jquery.unobtrusive-ajax رو هنوز ارتقاء نداده بودم. :)

برای حل این مشکل هم یا باید تمامی liveها رو به on تغییر میدادم و یا jquery.unobtrusive-ajax را هم ارتقاء میدادم. خوب بهترین راه حل همون آپدیت jquery.unobtrusive-ajax با nuget بود که منو از شر این خطا راحت کرد.

\.Chehre

How to use exclamation mark in git commit message

شاید برای شما هم پیش اومده باشه که بخواهید توی پیغام commit مربوط به  git از کاراکتر "!" (علامت تعجب) استفاده کنید. اما وقتی این کاراکتر رو استفاده کنید با پیغام خطایی مواجه خواهید شد که در زیر نشون دادم :
 
git commit -m "frmHelp added!"
bash: !": event not found

این به خاطر وجود شلی هست که دستورات git رو توی اون وارد میکنیم. درواقع وقتی از bash یا shell لینوکس استفاده میشه این اتفاق میفته.
اگر کاربر ویندوز باشید و Cygwin Terminal رو نصب کرده باشید و یا تو همون bash مربوط به git دستور زیر رو وارد کنید همون پیغام خطا رو خواهید گرفت:

 echo "hello!"

خوب برای استفاده از کاراکتر "!"  چند راه وجود داره:
استفاده از single quotes مثل دستور زیر
git commit -m 'frmHelp added!'
یا استفاده ادغام  single quotes و double quotes:
git commit -m "frmHelp added"'!'
یا استفاده از "\"  :
git commit -m "frmHelp added\!"

اگه بخواهیم که کلا از شر این کارا راحت بشیم باید چیکار کنیم؟
اول باید کمی درباره بعضی دستورات لینوکس توضیح بدم و با history شروع میکنم. دستور history باعث میشه که دستوراتی که در شل زدید رو بهتون نمایش بده. برای مثال دستور history در شل من به صورت زیر هستش :

Ahmad@Chehre ~
$ history
    1  pwd
    2  cd e:pwd
    3  cd e:pwd
    4  cd e:
    5  pwd
    6  ls
    7  exit
    8  pwd
    9  ls
   10  ps
   11  history

حالا اگر بخواهیم دستور شماره 5 دوباره اجرا بشه، خیلی راحت میتونیم از دستور زیر استفاده کنیم:
$ !5
یا برای اجرای دستور قبلی از دستور زیراستفاده میکنیم
$ !! 

این دو دستور نمونه هایی بودن از کاربردهای کاراکتر "!" در bash. خوب این امکانات رو  history expansion مربوط به bash برای ما به ارمغان میاره  و برای فعال کردن اون میتونید از از دستورات زیر استفاده کنید:
$ set -H
$ set -o histexpand

البته histexpand به صورت پیشفرض فعال هست و در راهنمای bash اینطور گفته شده:

-H  Enable ! style history substitution. This option is on
    by default when the shell is interactive.

برای غیر فعال کردن هم میتونید از دستورات زیر استفاده کنید:
$ set +H
$ set +o histexpand

در آخر برای اینکه تست کنیم که ببینیم حالا میتونیم از کاراکتر "!" استفاده کنیم، از دستور زیر استفاده می کنیم:

echo "hello!"

و در آخر باید بگم که خود من روش اول رو میپسندم چون نمیخوام امکانات history expansion رو از دست بدم.

Undoing git reset


همین دیروز بود که دیدم یک قسمتی از برنامه ای که نوشتم کار نمیکنه. اول فکر کردم شاید اشکال از آپدیت پکیج های برنامه باشه، چون آخرین کاری که انجام دادم همین کار بود. تنها کاری که باید انجام میدادم این بود که پروژه رو به قبل از آپدیت برگردونم.خوب این هم کاری نداشت برای کسی که از Version Control استفاده میکنه. و چون من از Git استفاده میکردم دستور زیر رو تو شل وارد کردم:
git reset --hard HEAD
بله، با همین دستور بود که کل برنامه رو فرستادم رو هوا چون در آخر دستور از HEAD استفاده کردم و Git هم نامردی نکرد و کاملا منو به 3 هفته پیش که پروژه رو استارت زده بودم برگردوند!
خوب از اونجا که خود Git همه کار ها رو لاگ میکنه حتی همین ریست کردن رو، پس کافی بود تا با دستور git reflog کامیت ها و ریست های خودم رو ببینم.
قسمتی از نتیجه reflog برای پروژه من:
$  git reflog
1eb15db HEAD@{0}: commit:
733bfe2 HEAD@{1}: commit:
023ef5d HEAD@{2}: reset:
13bfb8c HEAD@{3}: commit:
ce6557e HEAD@{4}: commit:
023ef5d HEAD@{5}: reset:
f99c553 HEAD@{6}: reset:
023ef5d HEAD@{7}: commit:
f99c553 HEAD@{8}: commit:
968f297 HEAD@{9}: commit
خوب حالا راحت میشه با دستور زیر
$ git reset --hard 1eb15db
همه چی رو به آخرین کامیت برگردوند و من هم همین کار رو انجام دادم :)

جستجو