گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

حل مشکل ساعت اشتباه Windows Server حتی با تنظیم NTP و Timezone

نویسنده:
14 جولای 18

یکی از مشتری‌های قدیمی حسابی شاکی بود از اینکه چرا ساعت Server درست نیست و دچار مشکل شدن ، من که مطمئن بودم حتمی TimeZone گذاشتم و NTP هم تنظیم کردم که Automatic تاریخ و ساعت را Sync کنه و DST هم درست باید باشه بعد از Login و اطمینان از تنظیمات درست متوجه شدم ایشون درست میگن و چند دقیقه بعد از اینکه زمان درست Sync میشه ویندوز اتوماتیک زمان را بر میگردونه روی یک Timezone دیگری.

بعد از بررسی خیلی موارد که توی ویندوز بهش بر خورده بودم و تجربه داشتم ممکنه اختلال ایجاد کنه و حل نشدنش رفتم سراغ Google و با جستجو متوجه شدم روی سیستم‌های مجازی و VM گاهی تنظیمات به شکلی انجام میشه که سیستم عامل ساعتش را با مجازی ساز خودش Sync میکنه. البته برخی حالت‌های دیگه هم بود که مربوط به مشکلات سخت افزاری بود و من بعید میدونستم سخت‌افزار های چنین Data center معتبری مشکل داشته باشه.

بعد از کمی جستجوی بیشتر متوجه شدم باید NTP را تنظیم کنم که فقط از Manual Peer List زمان را Sync کنه و نه Domain Controller :

w32tm /config /manualpeerlist:"0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org",0x8 /syncfromflags:MANUAL
w32tm /config /update
net stop w32time
net start w32time
w32tm /resync /nowait

به این شکل مشکل حل شد و امیدوارم دیگه درگیر ویندوز نشم.

خطای Cannot connect to RDP server در نرم‌افزار Remmina Remote Desktop

نویسنده:
29 آگوست 15

من برای ارتباط Desktop با سرور های VPS مخصوصاً ویندوزی ها از Remmina استفاده میکنم. نرم‌افزار خیلی خوبیه و تنظیمات خیلی کاملی داره و قطعاً نیاز remote Desktop را توی محیط لینوکس کامل برآورده میکنه. اما بعضی مواقع شروع میکنه خطای Connect دادن در حالی که مثلاً تا همین دیروز به خوبی کار میکرده و این واقعاً اذیت میکنه.

این موضوع باعث شد نرم‌افزار های Remote Desktop دیگه را هم توی لینوکس چک کنم اما واقعاً نرم‌افزاری بهتر از Reminna پیدا نکردم. پس سعی کردم ببینم آیا کس دیگه ای هم با مشکل مشابه روبرو بوده یا نه؟! بعد از کمی بررسی و مطالعه راه حل‌ها متوجه شدم مشکل به خاطر Cache شدن تنظیمات سرورها و Certificate هاشون معمولاً به وجود میاد و با حذف دایرکتوری freerdp./~ و بارگزاری مجدد برنامه حل میشه.

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

مهاجرت به لینوکس | نصب اوبونتو در کنار ویندوز

نویسنده:
22 می 14

پیرو نوشته‌ای که با عنوان «مهاجرت به لینوکس | کدام توزیع ؟» منتشر کردم. در سومین مرحله و بعد از انتخاب Ubuntu به عنوان توزیع مورد نظر و دانلود اون از سایت سازنده ، در نظر دارم تا آموزش بدم چطور Ubuntu را در کنار ویندوز نصب کنیم. قطعاً مدتی زمان میبره تا شخص خودش را با سیستم عامل جدید وفق بده و به‌ قدری در استفاده از اون مهارت کسب کنه که سیستم عامل قبلی یعنی ویندوز را کلاً بی خیال بشه و شاید برای پشتیبانی از پروژه های قبلی اون را نگه داره یا توی یک VM (بخوانید ماشین مجازی) نصبش کنه.

توجه : من بار ها با همین روشی که توضیح خواهم داد سیستم عامل Ubuntu را در کنار ویندوز نصب کردم ، ولی از اونجا که نیازمند به تغییراتی در پارتیشن های هارد دیسک هست ، عقل سلیم حکم میکنه که یک Backup از اطلاعات مهم بگیرید.

خوب ما آخرین نسخه Ubuntu (ترجیحاً LTS یا همون «با پشتیبانی دراز مدت») را از سایتش دانلود کردیم و اون را روی یک CD یا DVD به قول معروف Write یا صحیح‌تر Burn کردیم. در این مرحله CD را توی Drive قرار میدیم و سیستم را ریست میکنیم. از اونجا که Ubuntu به صورت Bootable و Live CD هستش. سیستم عامل بدون نیاز به نصب اجرا میشه و سیستم بالا میاد. ما میتونیم بدون نصب سیستم عامل اون را تست کنیم و مطمئن بشیم که همه سخت‌افزار ما را شناخته و کلاً یک بررسی جامع قبل از نصب داشته باشیم.

مهمترین و اصلی‌ترین بخش از نصب Ubuntu ساماندهی پارتیشن ها هستش. به نظر من بهترین روش برای اختصاص پارتیشن های لینوکس حالت سه پارتیشنی هستش یعنی Root , Home , Swap (از چپ بخوانید!) که فایل‌های سیستمی لینوکس توی Root قرار میگیره ، فایل‌های برنامه‌ها ، فیلم ، موسیقی و غیره توی Home قرار میگیره و Swap هم که در موارد مرتبط با Ram مثل زمانی که Ram کم میاد و … (از حوصله این مطلب خارجه) کاربرد داره.

قطعاً سناریو های متفاوتی برای پارتیش های شما وجود داره و من نمیتونم برای تک به تک اونها مثال بزنم. اما فرض را بر این میگذاریم که شما کلاً میدونین پارتیشن های Primary و Extended و Logical چی هستند که اگه نمیدونین باید اول در مورد اونها کمی اطلاعات به دست بیارین. و فرض دوم هم بر این میگذاریم که شما دو تا پارتیشن دارین یکی پارتیشن مربوط به ویندوز یکی هم پارتیشن مربوط به فایل‌های مولتی مدیا مثل عکس و فیلم و بازی و موسیقی و غیره. ویندوز روی یک Primary پارتیشن نصب شده و پارتیشن مولتی مدیا شما یا روی Primary هست و یا روی Extended که شامل یک Logical پارتیشن شده. از اونجا که بیشترین فضا به پارتیشن مولتی مدیا شما اختصاص داده شده . ما نیاز داریم تا فضای مورد نیاز برای پارتیشن های لینوکس را که من مجموعا ۵۰ گیگ در نظر میگیرم (البته میتونید کم یا زیادش کنین) را از پارتیشن مولتی مدیا فعلی تأمین کنیم.

ما برای دستکاری پارتیشن ها از ابزار Gparted توی Ubuntu استفاده میکنیم. این ابزار را میتونید با زدن Ctrl-D و تایپ gparted و زدن Enter اجرا کنید.من قصد ندارم در حال حاضر ابزار Gparted را آموزش بدم و شاید در نوشته‌های آتی اون را معرفی و آموزش دادم.

اگر فرض را بر این بگذاریم که پارتیشن مولتی مدیا ویندوز از نوع Primary هستش کافیه با استفاده از Gparted اون را Shrink یا کوچیک کنیم تا فضای خالی مثلاً به اندازه ۵۰ گیگ آزاد بشه و بعدش توی اون فضای خالی یک پارتیشن ۵۰ گیگی از نوع Extended بسازیم و سه پارتیشن لینوکس را از نوع Logical توی اون پارتیشن Extended ایجاد کنیم.

اگر فرض را بر این بگذاریم که پارتیشن مولتی مدیا ویندوز از نوع Logical و توی یک Extended باشه. کافیه اون پارتیشن Logical را به اندازه مثلاً ۵۰ گیگ کوچیک کنیم و ۳ تا پارتیشن Logical مربوط به لینوکس را توی فضای خالی شده اون پارتیشن Extended ایجاد کنیم.

حجم پارتیشن های لینوکسی را میشه برای Root به اندازه ۱۰ گیگابایت ، برای Swap به اندازه Ram (مثلاً ۴ گیگ برای رم ۴ گیگی) ، مابقی هم برای Home در نظر بگیریم.حالا میتونید تغییرات را توی Gparted اعمال کنید و منتظر بشین تا عملیات کامل بشه.

حالا روی آیکون Install کلیک میکنیم تا پنجره نصب باز بشه. پس از انتخاب زبان باید برای برنامه نصب مشخص کنیم از کدام پارتیشن ها استفاده کنه. پس روی «انتخاب دستی پارتیشن ها» کلیک میکنیم. و نوع پارتیش ها را با انتخاب آن‌ها (Mount Point) تعیین میکنیم.(Root همون / هستش).

حالا با ادامه دادن به Wizard به راحتی Ubuntu را نصب می کنیم.

بعد از نصب Ubuntu به جای Windows Bootloader حالا Bootloader ی به نام Grub جایگزین شده تا انتخاب کنید کدام سیستم عامل Boot بشه. نصب که تمام شد با ریست کردن و انتخاب Ubuntu از Bootloader به راحتی Ubuntu بالا میاد و کار نصبش تموم شده.

حالا باید مطمئن بشیم که Windows هم به راحتی Boot میشه و بالا میاد. اما چرا ممکنه نیاد ؟ به خاطر اینکه بعد از Repartitioning احتمال داره که Filesystem مربوط به Windows دچار مشکل یا به هم ریختگی شده باشه که احتمالش هم کم نیست. پس اگه بعد از انتخاب Windows از منوی Grub خطایی گزارش شد و Windows بالا نیومد نگران نشین. کافیه CD مربوط به ویندوز را بگذارین توی Drive و پس از Boot شدنش به Setup برین و از گزینه Repair your system و در صورت عدم توفیق از دیگر گزینه های Repair And Recovery Tools استفاده کنید.

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

توجه : بسیاری از بخش‌های این نوشته به استناد از مطلب سایت Dedoimedo با عنوان How to install windows 7 and ubuntu side by side نوشته شده است. اگرچه موضوعات مطرح شده همگی تجربه شخصی و عملی این جانب می باشند.

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

اتصال و استفاده از پایگاه داده MSSQL در PHP

نویسنده:
25 آوریل 14

به نظرم خیلی اشتباهه که وقتی با PHP کار میکنیم کلاً از ویندوز و IIS استفاده کنیم که حالا اصلاً بحث استفاده از MSSQL هم مطرح بشه. ولی نمیشه زیاد گلایه کرد و خیلی‌ها هم هستند که با سرویس دهنده های ویندوزی به خاطر آشنایی بیشتر ، راحت‌تر هستند و ترجیح هم میدهند از MSSQL استفاده کنند. ولی قبل از خوندن این مطلب به شدت توصیه میکنم که تجدید نظر کنند و از MySQL یا Maria DB یا Postgre SQL استفاده کنند.

به طور کلی چندین روش برای اتصال به MSSQL وجود داره که من ۵ روش معمول را میگم و یکی را که توصیه میکنم توضیحات و کدش را میگذارم.

روش اول : تا نسخه ۵٫۳ خود php یک Extension به نام mssql داشت که هنوز مستنداتش هم توی سایت php.net موجوده ولی دیگه پشتیبانی نمیشه ، حالا اگه خیلی علاقه دارین میتونید از نسخه های قدیمی تر php استفاده کنید و از این extension استفاده کنید. البته قرار نیست مثلا همه امکانات SQL 2012 را هم پشتیبانی کنه و ممکنه خیلی bug داشته باشه. مستنداتش هم اینجاست.

روش دوم : مایکروسافت مثل اینکه خودش متوجه شده اگه دست به کار نشه توی php واقعا کسی با مشکلات driver های فعلی سراغ mssql نمیره و خلاصه آستین ها را بالا زدند یا سفارشش را دادند. خودش اومده یک extension برای php درست کرده که به نسخه ۳ هم رسیده و اینطور که پیداست خیلی امکانات خوبی داره و mssql را به خوبی پشتیبانی میکنه. مشکلش اینه که فقط روی windows قابل استفاده هست و برای لینوکس تا زمان نوشتن این مطلب وجود نداره. این سایتش و همه اطلاعات مربوطه برای علاقه مندان.

توجه : سه روش بعدی در مورد PDO هست.

روش سوم : یکی از Driver های PDO اسمش PDO_DBLIB هست که امکان اتصال و استفاده از MSSQL و Sybase را از طریق کتابخونه FreeTDS فراهم میکنه. این Extension از نسخه ۵٫۳ PHP به بعد برای ویندوز پشتیبانی نمیشه (وجود نداره) و فقط روی لینوکس قابل استفاده هستش. نکنه اینکه DB-LIB قدیمیه ، Thread un-safe هست و هزار مشکل دیگه که در زمان کار کردن بهش بر میخورین.

روش چهارم : یکی دیگه از driver های PDO اسمش PDO_SQLSRV هستش که شما باید همون extension که توی روش دوم اشاره کردم را بگیرید و با توجه به non thread safe یا thread safe بودن نسخه php با کپی کردن dll های مربوطه و اعمال تغییرات توی php.ini اون را نصب کنید. نکته اینکه فقط روی ویندوز هم جواب میده. اینجا طریقه نصب را بهتر توضیح داده.

روش پنجم : این روش که هم روی ویندوز و هم روی لینوکس جواب میده (بدیهی هست که باید ODBC روی سیستم عامل نصب باشه به همراه Extension مربوطه) از طریق PDO_ODBC هستش.

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

و اما کد :

try{
  $hostname = "host,port";
  $dbname = "database_name";
  $username = "username";
  $pw = "password";
       
  $pdo = new PDO ("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname; Uid=$username;Pwd=$pw;");
       
} catch (PDOException $e) {
  echo "Failed : " . $e->getMessage() . "\n";
  exit;
}
 
$query = $pdo->prepare("select field_name from table");
$query->execute();
 
for($i=0; $row = $query->fetch(); $i++){
  echo ($i + 1)." - ".$row['field_name']."";
}

نکته مهم : یکی از مشکلات اصلی دوستان درست set نکردن hostname$ هستش. متوجه باشین دادن ip یا ادرس FQDN (مثل mssql.mydomain.com) ممکنه خطای timeout بده. اونجاست که شما باید به دو نکته توجه کنید.پورت پیش فرض ۱۴۴۳ هست اما اگه شما چند تا instance داشته باشین اونوقت پورت ها به صورت رندوم اختصاص داده میشه و باید توی host$ از instance name استفاده کنید یا پورت بدین ، اینطوری :

$hostname = "{IP ADDRESS},6688"; // port version
$hostname = "{IP ADDRESS}\SQLEXPRESS"; // instance version

پس حتما از مسئول هاست بپرسین تنظیماتشون چیه و اگه خودتون نصب میکنید از instance name استفاده کنید. (توی SQL server Configuration Manager هست).