۱۳۹۱/۰۶/۱۱

تجربه سفر به آفریقای جنوبی، شهرهای ژوهانسبورگ و کیپ تاون

مقدمه


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

معرفی آفریقای جنوبی


جمهوری آفریقای جنوبی کشوری در جنوب آفریقا و در سواحل دو اقیانوس اطلس و هند است. این کشور سه پایتخت متفاوت دارد. قوهٔ مجریه در پرتوریا، پارلمان در کیپ تاون و قوهٔ قضائیه در بلوم فونتین مستقر است. پرجمعیت‌ترین شهر آن نیز ژوهانسبورگ است. به دلیل مهاجرت آفریقای جنوبی از لحاظ نژادی بسیار متنوع است. بزرگ‌ترین جمعیتهای دورگه و اروپایی و هندی در آفریقا در این کشور مستقر هستند. سیاه‌پوستان آفریقای جنوبی کمتر از ۸۰ درصد جمعیت این کشور را تشکیل می‌دهند.
آفریقای جنوبی ۱۱ زبان رسمی دارد؛ ۹ زبان از زبان‌های آفریقایی خانوادهٔ بانتو و دو زبان اروپایی؛ یکی زبان آفریکانس که از هلندی ریشه گرفته و زبان اکثریت سفیدپوستان و دورگه‌های این کشور است و دیگری زبان انگلیسی که در تجارت و عرصهٔ عمومی استفاده زیادی دارد.
به علت تنوع نژادی در کشور آفریقای جنوبی، فرهنگ «واحدی» در این کشور نمی‌توان یافت. امروزه تنوع غذایی در این کشور که متأثر از فرهنگ‌های مختلف حاضر در آن است باعث شده جهانگردان و حتی به سرمایه گذاری در تهیه آن دست بزنند. علاوه بر غذا، موسیقی و رقص هم از نمادهای فرهنگی این کشور هستند.
این کشور از معدود کشورهای آفریقایی است که در آن هیچ وقت کودتا نشده و انتخابات منظم در طول یک سده اخیر در آن برگزار شده‌است. با این حال اکثریت سیاهپوستان تا سال ۱۹۹۴ دارای حق رای نبود.
اين كشور بزرگ‌ترين صادر كننده طلا , كه معمولا حدود ۴۰% صادرات افريقاي جنوبي را تشكيل مي‌دهد – در جهان است و از توليد كنندگام عمده اورانيوم، كروميت، سنگ سرمه، پلاتين و زغال سنگ (كه سه چهارم نياز كشور به انرژي را تأمين مي‌كند) است. بخش صنعتي شامل صنايع شيميايي، غذايي، نساجي، وسايل نقليه موتوري و مهندسي برق است. كشاورزي و دامداري يك سوم صادرات افريقاي جنوبي راتشكيل مي‌دهد و توليدات آن شامل ميوه، شراب، پشم و ذرت است. سطح زندگي در اين كشور در قاره افريقا بالاترين است ولي توزيع آن ميان سفيدپوستان و غير سفيدپوستان بسيار نابرابر است.

آفریقای جنوبی از نگاه توریستی


تور آفريقا جنوبي يكي از مهيج ترين و جذاب ترين تورهاي خارجي موجود در عرصه خدمات گردشگري و مسافرتي ايران است. چندي نيست كه اين تور در ميان ايرانيان شناخته شده است و در سال هاي اخير مسافران بسياري را به خود جذب كرده است. اين كشور پس از پايان يافتن آپارتايد يا نظام تبعيد نژادي و رهبري نلسون ماندلا به شهرت جهاني رسيد و از آن سال ها مقصد بسياري از گردشگران در سراسر دنيا قرار گرفته است. علاوه بر امكان تاريخي اين كشور بيشتر از نظر طبيعت حائز اهميت است جنگل هاي زيبا و مراتع وسيع با گونه هاي جانوري بسيار جذاب ترين مناظر اين كشور است از همه اين ها گذشته موقعيت جغرافيايي آفريقاي جنوبي نيز بسيار جالب است. جنوبي ترين نقطه قاره آفريقا و در مرز دو اقيانوس بزرگ هند و اطلس موقعيت خاصي به اين كشور داده است. به ويژه شهر كيپ تاون كه درست در مرز اين دو اقيانوس قرار دارد. اگر به آفريقاي جنوبي مي رويد فراموش نكنيد كه در فصلي برويد كه در ايران هوا سرد است زيرا در آفريقاي جنوبي به دليل بودن در نيمكره جنوبي آب و هوا و فصول آن دقيقاً عكس ايران است.

توصیه‌های عمومی برای مسافرت به آفریقای جنوبی


در صورتی که تصمیم گرفتید به آفریقای جنوبی سفر کنید، لطفا موارد زیر را حتما در نظر بگیرید:

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

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

  • همانند مراکز توریستی، رستوران‌ها نیز زودتر از زمانی که ما توقع داریم تعطیل می‌شوند. بین ساعت ۹ تا ۹:۳۰ شب زمان تعطیلی بیشتر رستوران‌ها می‌باشد.

  • تا جایی که می‌توانید به صورت دسته‌جمعی به گردش بپردازید. از جابجایی مقدار زیاد پول نقل و در معرض دید قرار دادن آن شدیدا بپرهیزید.

  • برای حمل و نقل تا جایی که می‌توانید فقط از Gautrain استفاده نمایید.

  • کمتر از ۵٪ مردم آفریقای جنوبی مسلمان هستند. با این حال برای تهیه گوشت حلال می‌توانید از مراکز معتبر اقدام نمایید. مانند سایر کشورها، شعبات مک‌دولاند و KFC اقدام به ارائه غذا با گوشت حلال نیز می‌نمایند.

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



شهرهای مقصد سفر


ژوهانسبورگ (Johannesburg) و کیپ‌تاون (Cape Town) مهم‌ترین شهر‌های توریستی آفریقای جنوبی هستند. هر دو این شهرها مراکز توریستی زیبایی دارند ولی از نظر طبیعت شهر کیپ‌تاون بسیار فوق العاده است. فاصله بین این دو شهر حدود ۱۴۰۰ کیلومتر است. برای مسافرت بین این دو می‌توانید از شرکت‌های هواپیمایی داخلی آفریقای جنوبی استفاده نمایید.

مراکز دیدنی و توریستی ژوهانسبورگ (Johannesburg)


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





در زیر فهرست مهم‌ترین جاذبه‌های توریستی شهر ژوهانسبورگ را مشاهده می‌فرمایید:

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



  • باغ وحش. البته باغ وحش شهر پرتوریا بسیار دیدنی‌تر و بزرگ‌تر است. پرتوریا حدود ۴۰ دقیقه با ژوهانسبورگ فاصله دارد.

  • مراکز خرید. مهم‌ترین مرکز خریدی که در کشور آفریقای جنوبی هستند عبارتند از:


  • میدان نلسون ماندلا

  • تور و روستای فرهنگ‌شناسی Lesedi: در این روستای زندگی مردم آفریقای جنوبی قبل از مهاجرت سفیدپوستان به صورت قبیله‌های سنتی به نمایش درآمده است.

  • مرکز تفریحی Gold Reef City: این مرکز تفریحی شامل شهربازی، تور معدن طلا، کازینو و.. می‌باشد.

  • موزه Apartheid

  • مرکز انسان‌های اولیه Origins Centre: این مرکز که در داخل دانشگاه Witwatrersand قرار دارد، محل نگهداری استخوان‌هایی از انسان‌های اولیه، نقاشی‌های مردم غارنشین و مواردی از این قبیل است.

  • بنای یادبود Voortrekker: متاسفانه ما نتوانستیم از این بنا بازدید کنیم ولی اگر شما فرصت کردید حتما از این شاهکار هنری بازدید نمایید.




مراکز دیدنی و توریستی کیپ تاون (Cape Town)


شهر کیپ تاون بیشتر دارای جاذبه‌های طبیعی می‌باشد. آب و هوای این شهر ساحلی شرجی نبوده ولی از جوی ناپایدار برخوردار است. سواحل کیپ تاون به دلیل داشتن موج‌های قوی و وزش باد مناسب برای ورزش‌هایی مانند موج سواری فوق العاده می‌باشند. غذاهای دریایی تازه در کیپ‌تاون بسیار خوشمزه و لذت هستند. این شهر در کنار ساحلی بودن، یک شهر کوهستانی نیز می‌باشد. مهم‌ترین جاذبه کیپ‌تاون کوه تیبل (Table Mountain) است.

در زیر فهرستی از مهم‌ترین مناطق توریستی شهر کیپ تاون را مشاهده می‌فرمایید:

  • کوه تیبل (Table Mountain): کوه تیبل که در لغت به‌معنای کوه میز است در کیپ غربی در آفریقای جنوبی واقع شده و ۱٬۰۸۷ متر ارتفاع دارد. قلهٔ مسطح این کوه که گستره‌ای ۳ کیلومتری را در بر می‌گیرد، اغلب توسط ابر یا مه سفید غلیظی موسوم به «رومیزی» که به هنگام وزش باد از سمت جنوب شرقی ایجاد می‌شود پوشیده شده‌ است. برای بالا رفتن از این کوه می‌توانید به صورت پیاده و یا توسط تله کابین مجهز آن اقدام نمایید.

  • جزیره رابن (Robben Island): جزیره رابن بدلیل زندانی کردن مخالفان آپارتاید در آن مشهور است. نلسون ماندلا و احمد کاظیم (از فعالان شیعه آفریقای جنوبی) در آن زندانی بودند. زندان‌های این جزیره هم اکنون تبدیل به موزه شده و گردشگران فراوانی از آنها بازدید می‌نمایند.

  • منطقه تفریحی Victoria & Alfred Waterfront: این منطقه که به واتر فرانت (Waterfront) مشهور است، شامل مراکز خرید، رستوران‌ها، صنایع دستی، تور هوایی با بالگرد، تور دریایی با کشتی‌های تفریحی، ورزش‌های ساحلی و... می‌باشد.

  • ساحل پنگوئن‌ها (Boulders Penguin Colony): در این ساحل تعداد بسیاری پنگوئن آفریقایی زندگی می‌کنند. این پنگوئن‌ها به صورت آزاد در دریا و سواحل اطراف آن وجود دارند و شما می‌توانید توسط مسیری که میان لانه‌ها و محل زندگی آنها تا ساحل وجود دارد، از نزدیک نحوه فعالیت آن‌ها را مشاهده فرمایید.

  • مزرعه شترمرغ‌ها (Cape Point Ostrich Farm): این مزرعه محل نگهداری شترمرغ‌عا و عرضه محصولات آنها می‌باشد. با توجه به قرارگیری از مزرعه در مسیر دماغه امید نیک، پیشنهاد میکنم که حتما سری به این مزرعه بزنید.

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

  • آکواریم دو اقیانوس (Two Oceans Aquarium)

  • قلعه امید نیک (Castle of Good Hope)

  • دماغه امید نیک (Cape of Good Hope): این دماغه پایین ترین نقطه آفریقا و نزدیکترین منطقه آفریقا به قطب جنوب است. این دماغه و سواحل اطراف آن بسیار دیدنی است.




تصاویر


من ۵۰ تصویر از آفریقا جنوبی را در سایت فلیکر به اشتراک گذاشته ام. در زیر اسلاید شو این تصاویر را مشاهده می‌فرمایید. در صورتی که این تصاویر را نمیبینید، به احتمال قوی به خاطر فیلتر بودن سایت به اشتراک گذاری تصویر فلیکر است!






پیوندها و منابع




سفر خوبی داشته باشید :)

۱۳۹۱/۰۴/۰۴

پارتیشن بندی اطلاعات در پایگاه داده

سلام،
مطلب امروز در ابتدا به معرفی امکان پارتیشن بندی (Partitioning) در پایگاه‌های داده می پردازند و سپس نحوه استفاده از آن را در پایگاه داده MySQL آموزش می دهد.

پارتیشن بندی پایگاه داده چیست؟

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

معیارهای دسته‌بندی اطلاعات برای پارتیشن‌بندی

در نوع پایگاه‌های داده رابطه‌ای معیارها و ضوابط گوناگونی جهت تقسیم پایگاه داده وجود دارد. برای این منظور، ابتدا یک کلید پارتیشن‌بندی (Partitioning Key) را تعریف کرده و سپس بر اساس آن و معیارهای مشخص داده‌ها را پارتیشن‌های مختلف تقسیم می‌کنند. عمومی‌ترین معیارها عبارتند از:

پارتیشن‌بندی محدوده‌ای (Range partitioning)

انتخاب پارتیشن براساس محدوده آن و کلید داده شده صورت می‌پذیرد. فرض کنید که اطلاعات کدپستی ده رقمی در پایگاه داده در ۹ دسته ۱۰۰۰۰۰۰۰۰۰ تقسیم شده اند. در صورتی که کلید داده شده در یکی از این ۹ محدوده باشد، فقط اطلاعات موجود در آن محدوده مورد بررسی قرار خواهند گرفت. به عنوان مثال کلید (کدپستی) ۶۸۹۵۶۳۲۶۵۳ مشخص می کند که فقط محدوده ۶۰۰۰۰۰۰۰۰۰ تا ۶۹۹۹۹۹۹۹۹۹ بررسی شود. یعنی تقریبا ۱/۹ کل اطلاعات جدول مورد نظر.

پارتیشن‌بندی فهرست‌وار (List partitioning)

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

پارتیشن‌بندی درهم (Hash partitioning)

در این نوع پارتیشن‌بندی، داده‌ها بر اساس یک کلید و تابع درهم‌سازی (hash function) به پارتیشن‌های مختلف تقسیم می‌شوند.

پارتیشن‌بندی کلیدی (Key partitioning)

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

پارتیشن‌بندی ترکیبی (Composite partitioning)

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


روش‌های ذخیره اطلاعات پارتیشن‌بندی شده

پارتیشن‌بندی، اطلاعاتی مانند کل پایگاه داده و یا جداول، ردیف‌ها و... را تقسیم کرده و در قطعات کوچک‌تر ذخیره می‌کند. برای تقسیم کردن ردیف‌های موجود در یک جدول مي‌توان به صورت افقی (Horizontal) و عمودی (Vertical) عمل کرد.
در حالت افقی (Horizontal) ردیف‌های مختلف در جدول‌های جداگانه ذخیره می‌شوند. به عنوان مثال در جدول مشتریان، افرادی که کدپستی آنان کمتر از 50000 باشد در جدول مشتریان شرقی (CustomerEast) و باقی افرادی که دارای کدپستی بالای 50000 می‌باشند در جدول مشتریان غربی (CustomerWest) ذخیره می‌شوند. همچنین برای دستیابی به تمامی مشتریان می توان با استفاده از UNION یک VIEW ایجاد کرد که شامل تمامی ردیف‌ها باشد.
در حالت عمودی (Vertical) ستون‌های کمتری در جدول اصلی قرار می‌گیرند و بقیه ستون‌ها به صورت متناظر در جدول‌های دیگر قرار می‌گیرند. عمومی‌ترین کاربرد این روش جداکردن ستون‌هایی با اطلاعات نسبتا ثابت و ستون‌هایی با اطلاعات متغیر است. نسخه فعلی MySQL 5.6 از حالت عمودی پشتیبانی نمی‌شود.


چه زمانی و چرا به پارتیشن‌بندی پایگاه داده نیاز داریم؟

در موارد زیر استفاده از پارتیشن‌بندی به افزایش محسوس بازدهی می‌انجامد:
  • داده‌های خیلی زیاد
  • کمبود حافظه RAM
  • داده‌هایی با دسته‌بندی‌های مشخص
هنگام اجرای کوئری (Query) در صورتیکه جدول مورد نظر پارتیشن‌بندی نشده باشد، دستور بر روی کل جدول اجرا می‌شود. مانند:






حال اگر جدول مورد نظر را پارتیشن‌بندی نمایید، هنگام اجرای Query، محدوده‌ی بررسی فقط پارتیشن(های) مرتبط را شامل می‌شود. دستورات قبلی با فرض پارتیشن‌بندی جدول، محدوده‌های مشخص شده زیر را بررسی می‌نماید:






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

پیاده‌سازی پارتیشن‌بندی در MySQL


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

نحوه ساخت پارتیشن محدوده‌ای (Range partitioning)

CREATE TABLE t1 (
id int 
) ENGINE=InnoDB
# or MyISAM, ARCHIVE
PARTITION BY RANGE (id)
(
PARTITION P1 VALUES LESS THAN (10),
PARTITION P2 VALUES LESS THAN (20)
)

نحوه ساخت پارتیشن فهرست‌وار (List partitioning)

CREATE TABLE t1 (
id int 
) ENGINE=InnoDB
PARTITION BY LIST (id)
(
PARTITION P1 VALUES IN (1,2,4),
PARTITION P2 VALUES IN (3,5,9)
)

نحوه ساخت پارتیشن درهم (Hash partitioning)

CREATE TABLE t1 (
id int not null primary key
) ENGINE=InnoDB
PARTITION BY HASH (id)
PARTITIONS 10;

نحوه ساخت پارتیشن کلیدی (Key partitioning)

CREATE TABLE t1 (
id int not null primary key
) ENGINE=InnoDB
PARTITION BY KEY ()
PARTITIONS 10;

در تمامی موارد بالا پارتیشن توسط ستونی از نوع عدد (INTEGER) مشخص شده است. با این حال شما می‌توانید به جای این ستون با رعایت موارد زیر پارتیشن‌بندی را بسط دهید:

  • اگر ستونی از به صورت Unique Key یا Primary Key تعریف شده باشد، پارتیشن‌بندی باید این ستون در بر گیرد.
  • در ساخت پارتیشن می توانید به جای یک ستون، از عبارت (شامل توابع MySQL) استفاده نمایید. با این شرط که عبارت مورد نظر مقدار عددی را بازگرداند.
  • در صورت ندانستن محدود عددی می توانید از عبارت MAXVALUE برای بازه بالا استفاده نمایید.
  • حداکثر تعداد پارتیشن‌ها 210=1024 می باشد.

برای درک بیشتر موارد بالا با نحوه ساخت پارتیشن در جدول های t1 و t2 در زیر توجه فرمایید:
CREATE TABLE t1 (
d date
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(d))
(
PARTITION P1 VALUES 
LESS THAN (1999),
PARTITION P2 VALUES 
LESS THAN (2005),
PARTITION P3 VALUES 
LESS THAN (2010),
PARTITION P4 VALUES 
LESS THAN (MAXVALUE)
)
CREATE TABLE t2 (
d date
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(d))
(
PARTITION P1 VALUES 
LESS THAN (TO_DAYS('1999-01-01')),
PARTITION P2 VALUES 
LESS THAN (TO_DAYS('2005-01-01')),
PARTITION P3 VALUES 
LESS THAN (TO_DAYS('2010-01-01')),
PARTITION P4 VALUES 
LESS THAN (MAXVALUE)
)

پارتیشن‌بندی چقدر در سرعت اجرای دستورات تاثیر دارد؟


برای بررسی تاثیر پارتیشن‌بندی نیاز به یک پایگاه داده با مقدار قابل توجهی اطلاعات داریم. برای این منظور از پروژه MySQL Employees Test Database که شامل حدودا ۴ میلیون رکورد در ۶ جدول است استفاده کرده‌ایم. در زیر ساختار این پایگاه داده را مشاهده می‌کنید:


به جستار (Query) زیر و زمان اجرای آن توجه فرمایید:
SELECT COUNT(*) FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '1999-12-31';
+----------+
| COUNT(*) |
+----------+
|   260957 |
+----------+
1 row in set (1.07 sec)
و همان دستور بعد از پارتیشن‌بندی:
SELECT COUNT(*) FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '1999-12-31';
+----------+
| COUNT(*) |
+----------+
|   260957 |
+----------+
1 row in set (0.32 sec)

برای مشاهده عملکرد پارتیشن‌بندی برای افزایش سرعت حذف اطلاعات به جستار (Query) زیر و زمان اجرای آن توجه فرمایید:
DELETE FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '1999-12-31';
Query OK, 247489 rows affected (10.57 sec)
و همان دستور حذف بعد از پارتیشن‌بندی:
ALTER TABLE salaries DROP PARTITION p15;
Query OK, 0 rows affected (1.35 sec)

نحوه پارتیشن‌بندی جدول salaries در پایگاه داده employees

در زیر دستور پارتیشن‌بندی جدول حقوق‌ها (salaries) به صورت محدوده‌ای (RANGE) بر اساس تاریخ سال from_date مشاهده می‌فرمایید:
ALTER TABLE salaries 
PARTITION BY RANGE (YEAR(from_date))
(
PARTITION p1 VALUES LESS THAN (1985),
PARTITION p2 VALUES LESS THAN (1986),
PARTITION p3 VALUES LESS THAN (1987),
PARTITION p4 VALUES LESS THAN (1988),
PARTITION p5 VALUES LESS THAN (1989),
PARTITION p6 VALUES LESS THAN (1990),
PARTITION p7 VALUES LESS THAN (1991),
PARTITION p8 VALUES LESS THAN (1992),
PARTITION p9 VALUES LESS THAN (1993),
PARTITION p10 VALUES LESS THAN (1994),
PARTITION p11 VALUES LESS THAN (1995),
PARTITION p12 VALUES LESS THAN (1996),
PARTITION p13 VALUES LESS THAN (1997),
PARTITION p14 VALUES LESS THAN (1998),
PARTITION p15 VALUES LESS THAN (1999),
PARTITION p16 VALUES LESS THAN (2000),
PARTITION p17 VALUES LESS THAN (2001),
PARTITION p18 VALUES LESS THAN (2002),
PARTITION p19 VALUES LESS THAN (2003),
PARTITION p20 VALUES LESS THAN (MAXVALUE)
)

اگر با خطای Cannot delete or update a parent row: a foreign key constraint fails مواجه شدید، با دستور زیر کلید خارجی salaries_ibfk_1 را حذف نمایید:
ALTER TABLE salaries DROP FOREIGN KEY salaries_ibfk_1;


منابع و اطلاعات بیشتر


شاد و موفق باشید.

۱۳۹۱/۰۲/۲۹

مهم‌ترین اشتباهات رایج در محیط خط فرمان

سلام :)

خط فرمان (Command Line) یکی از قدرتمندترین بخش‌های سیستم عامل های شبه یونیکس (Unix-like) و یونیکسی (Unix) است. مانند بسیاری از ابزارهای دیگر، در صورت استفاده نادرست از آن ممکن است که صدمات جبران ناپذیری به سیستم و در حالت کلی به سطح کاری شما وارد نماید. این مقاله قصد دارد تا با معرفی مهم‌ترین این اشتباهات، شما را از انجام دادن غیرعمدی آنها آگاه سازد. در انتهای مقاله نیز راه حل هایی جهت رفع ایرادات احتمالی معرفی است.

دستور userdel


این دستور به صورت پیش فرض فقط کاربر را حذف می کند و اثری بر روی فایل‌های کاربر ندارد. ولی در صورتی که در فایل تنظیمات /etc/deluser.conf حذف فایل‌ها نیز فعال شده باشد، با حذف کاربر، تمامی اطلاعات مربوط به آن نیز حذف می شود و ممکن است فایل های موجود در دایرکتوری وی مهم و ضروری باشد. این قضیه بیشتر بر روی سرورها و هنگام عوض شدن مدیرسیستم (SysAdmin) بروز پیدا می کند. پس قبل از پاک کردن کاربر از تنظیمات فایل /etc/deluser.conf و نیز مهم نبودن فایل‌های کاربر مورد حذف مطمئن شوید.

خراب کردن محتوای فایل با استفاده نادرست از > و >>


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

استفاده نادرست از پارامتر c به جای x


در صورتی که شما قصد استخراج کردن محتوای یک فایل فشرده را با دستور tar داشته باشید، باید از این دستور مانند زیر استفاده نمایید:
[bash]
tar -zxvf FILE.tar.gz DICRECTORY
[/bash]
حال اگر به جای x اشتباها از c استفاده نمایید، بدون هیچ اخطاری محتوای DIRECTORY جایگزین محتوای فعلی فایل بایگانی شما می شود!

اشتباهی گرفتن خط فرمان‌ها


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

استفاده از * در دستور rm


دستور rm برای حذف فایل و دایرکتوری‌ها استفاده می‌شود. همچنین * نشان دهنده تمامی این عناصر است. گاهی اوقات ممکن است که این دو با یکدیگر و به صورت اشتباه استفاده شوند. در زیر نمونه‌هایی از این اشتباهات ارائه شده اند.
وجود فاصله بین * و آدرس دایکتوری مورد نظر بار حذف:
[bash]
rm /foo/ *
[/bash]

استفاده از .* و پارامتر -R:
[bash]
rm -R .*
[/bash]
اشتباه دستور با در این مورد است که در دایرکتوری جایی .. به دایکتوری پدر (parent) اشاره دارد و استفاده همزمان از .* و پارامتر -R باعث می‌شود که دستور rm از پایین به بالا (درون به بیرون) تمامی اطلاعات شما را حذف نماید!

استفاده نادرست از / و . و .. در آدرس‌دهی به پارامترهای دستورات


اگر با خط فرمان و آدرس دهی فایل‌ها آشنا باشید می دانید که / به دایرکتوری ریشه و . به دایرکتوری جاری و .. به دایرکتوری پدر (parent) اشاره دارند. برای عوض کردن دسترسی دایرکتوری جاری در صورتی که در همان دایکتوری باشید باید دستوری مانند زیر را وارد نمایید:
[bash]
chmod -R 755 ./
[/bash]
حال فرض کنید که لازم است از sudo استفاده نمایید و دستور را اشتباها به یکی از صورت‌های زیر وارد کنید. به عدم وجود . قبل از / و فاصله بین . و / دقت نمایید:
[bash]
sudo chmod -R 755 /
sudo chmod -R 755 . /
[/bash]

آدرس دهی اشتباه سخت افزار در دستور dd


دستور dd برای رونوشت برداشتن (کپی) از اطلاعات در سطح پایین استفاده می‌شود. به عنوان مثال برای رونوشت برداشتن از یک فایل و ذخیره آن باید از دستوری مشابه دستور زیر استفاده نمایید:
[bash]
dd if=big_null_file of=/dev/sdb
[/bash]
که به نظر شما /dev/sdb آدرس سخت افزار مورد نظر مانند فلش مموری است، حال اگر /dev/sdb آدرس دومین هارد شما باشد، تمامی اطلاعات آن از دست رفته و شما فقط یک big_null_file دارید!


برای جلوگیری از این صدمات چکار کنیم؟


روش‌ها و کارهای زیادی برای جلوگیری از اتفاق افتادن این اشتباهات و رفع آن‌ها وجود دارد. در زیر فهرست اساسی‌ترین مواردی که حتما باید در نظر داشته باشید آمده است:

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

  • قبل از اجرای دستورات اساسی مانند rm، mv و chmod حتما یکبار دیگر آن را بازخوانی نمایید.

  • دستور rm را همیشه با پارامتر -i اجرا نمایید.

  • به جای حذف مستقیم اطلاعات توسط rm آن ها را به سطل آشغال منتقل نمایید. برای انجام اینکار در اوبونتو مقاله Make "rm" Move Files To Trash Instead Of Completely Removing Them را مطالعه نمایید. روش های مشابهی نیز در سایر سیستم عامل ها وجود دارد.




منابع و اطلاعات بیشتر




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

۱۳۹۱/۰۱/۲۶

معرفی و آموزش پیاده‌سازی Apache Lucene

سلام،
Apache Lucene
Apache Lucene
حدود یک سال و نیم قبل در مطلبی به معرفی خزنده‌های وب (Web crawlers) و آموزش راه اندازی یک خزنده وب ساده به زبان جاوا پرداختم. در طول این مدت افراد بسیاری در مورد خزنده‌های وب با من تماس گرفتند و سوالات مختلفی در مورد این خزنده‌ها داشتند. در این مطلب به معرفی و آموزش Apache Lucene که به منظور جستجو فایل‌های متین استفاده می شود، می پردازم. همچنین در آینده به بررسی ۳ محصول Hadoop, Apache Solr و Apache Nutch خواهم پرداخت.

Apache Lucene


آپاچی لوسن کتابخانه ای برای راه اندازی موتورهای جستجوی متن می باشد. این کتابخانه آزاد بوده و تحت لایسنس Apache Licene 2.0 منتشر می شود. این کتابخانه به زبان جاوا (Java) نوشته شده و سپس به زبان های Delphi, Perl, C#, C++, Python, Ruby, و PHP پیاده سازی (پورت) شده است.
این کتابخانه این امکان را برای شما فراهم می آورد تا هر نوع موتور جستجوی متنی مانند موتور جستوی وب، لوکال (محلی) ویا فقط ویژه یک وب سایت را ایجاد نمایید. در نظر داشته باشید که Apache Lucene فقط برای جستجو استفاده می‌شود و برای جمع‌آوری اطلاعات و تحلیل آن‌ها نیاز به ابزارهای دیگری مانند Solr و Nutch دارید.
برای دریافت این کتابخانه به صفحه دانلود آپاچی لوسن مراجعه نمایید. همچنین می توانید نسخه فعلی (۳.۶.۰) را از آدرس زیر دریافت نمایید:
دانلود کتابخانه آپاچی لوسن نسخه ۳.۶.۰

استفاده از کتابخانه Apache Lucene


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

مرحله اول: ایندکس کردن اطلاعات


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



 Index 

Document 1
Field A (name/value)

Field B (name/value)



Document 2
Field A (name/value)

Field B (name/value)




بعد از آماده سازی Document باید توسط کلاس IndexWriter، ایندکس را ذخیره می کنیم. پارامتر اول در فراخوانی IndexWriter دایکتوری ذخیره‌سازی ایندکس را مشاهده می‌کند.
با کدهای زیر چند عبارت را در حافظه دسترسی تصادفی (RAM) ذخیره کردیم:
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);

IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action");
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
w.close();
متد addDoc رشته‌ها را به ایندکس اضافه می کند:
private static void addDoc(IndexWriter w, String value) throws IOException {
Document doc = new Document();
doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}
}

مرحله دوم: ایجاد کوئری (Query)


در این برنامه ما عبارت مورد نظر برای جستجو را از ورودی (stdin) دریافت می‌کنیم:
String querystr = args.length > 0 ? args[0] : "lucene";
Query q = new QueryParser(Version.LUCENE_36, "title", analyzer).parse(querystr);

مرحله سوم: انجام جستجو


در این مرحله کوئری (جستار؟) ساخته شده را بر روی ایندکس جستجو می کنیم. همچنین از کلاس TopScoreDocCollector برای بدست آوردن ۱۰ نتیجه مرتبط‌تر استفاده کرده ایم:
int hitsPerPage = 10;
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

مرحله چهارم: مشاهده نتایج


در انتها نتایج بدست آمده را نمایش می‌دهیم:
System.out.println("Found " + hits.length + " hits.");
for(int i=0;i < hits.length;++i) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get("title"));
}
همین!

کلاس HelloLucene


در زیر کلاس HelloLucene را یکجا مشاهده می فرمایید:
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene {
public static void main(String[] args) throws IOException, ParseException {
// 0. Specify the analyzer for tokenizing text.
//    The same analyzer should be used for indexing and searching
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);

// 1. create the index
Directory index = new RAMDirectory();

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);

IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action");
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
w.close();

// 2. query
String queryStr = args.length > 0 ? args[0] : "lucene";

// the "title" arg specifies the default field to use
// when no field is explicitly specified in the query.
Query q = new QueryParser(Version.LUCENE_35, "title", analyzer).parse(queryStr);

// 3. search
int hitsPerPage = 10;
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

// 4. display results
System.out.println("Found " + hits.length + " hits.");
for (int i = 0; i < hits.length; ++i) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get("title"));
}

// searcher can only be closed when there

// is no need to access the documents any more.

searcher.close();
}

private static void addDoc(IndexWriter w, String value) throws IOException {
Document doc = new Document();
doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}
}

منابع


شاد و پیروز باشید :)

۱۳۹۰/۱۰/۲۹

راهنمای سریع جاوا اسکریپت

جاوا اسکریپت
جاوا اسکریپت

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

مقدمه

جاوااسکریپت زبانی است که توسط NetScape تولید شده است. هدف از این زبان پویانمایی اشیا داخل صفحات HTML می باشد. جاوا اسکریپت کاملا با زبان برنامه نویسی جاوا فرق دارد. اگر چه ساختار این زبان به سی پلاس پلاس و جاوا شباهت دارد؛ که این امر برای سهولت یادگیری در نظر گرفته شده است. از همینرو دستورهای متداول مانند if, for, try..catch و ... در این زبان هم یافت می‌گردند. کاربرد گسترده این زبان در سایتها و صفحات اینترنی می‌باشد و به کمک این زبان می‌توان به اشیاء داخل صفحات HTML دسترسی پیدا کرد و آنها را تغییر داد. به همین علت برای پویا نمایی در سمت کاربر، از این زبان استفاده می‌شود.

نحوه نگارش مستقیم کدهای جاوا اسکریپت در HTML

کدهای جاوا اسکریپت در صفحات HTML داخل تگ script قرار می گیرند. از خصیصه type برای مشخص کردن زبان اسکریپت نوشه شده استفاه می شود. <script type="text/javascript"> محل شروع کدهای جاوا اسکرپیت و </script> محل پایان کدهای جاوا اسکریپت را مشخص می کنند. مانند:





خروجی کد بالا نوشته‌ی !Hello World می باشد.

اسکریپت خارجی

گاهی اوقات شما نیاز به اجرای یک کد جاوا اسکریپت در صفحات مختلف (بدون نگارش در تک تک صفحات) دارید. و یا کد شما بسیار طولانی است و هنگام کد نویسی در صفحه html شما را دچار مشکل می کند. در این صورت با استفاده از اسکریپت خارجی مشکل شما حل می شود. برای نگارش اسکریپت خارجی ابتدا یک فایل با فرمت js. ایجاد کنید. می توانید پسوند یک فایل txt را به js. تغییر دهید. سپس این فایل را توسط یک ویرایشگر متن مانند Notepad باز کنید. کدهای جاوا اسکریپت خود را بدون تگ <script> در آن قرار دهید و سپس فایل را ذخیره کنید (با پسوند js.) برای فراخوانی اسکریپت خارجی از خصیصه src تگ <script> استفاده کنید. مانند زیر که xxx.js آدرس فایل جاوا اسکریپت است:







سمی‌کالن (;)، فضاهای سفید و حساس به حروف (Case Sensitive)

در جاوا اسکریپت دستورات اجرایی با سمی‌کالن (Semicolon) یا همان ; از هم جدا می شوند. با وجود اینکه استفاده از سمی‌کولن، در صورتی که دستورات در خطوط جداگانه نوشته شده باشند، اختیاریست، نوشتن آن بسیار توصیه می شود. بد نیست مطلب «معاهده‌های کدنویسی» را مطالعه کنید. فضاها سفید در جاوا اسکرپیت مانند اغلب زبان‌های برنامه نویسی هنگام اجرا در نظر گرفته نمی شوند. مگر اینکه مقدار یک متغیر رشته ای (String) باشند. زبان جاوا اسکریپت به کوچکی و بزرگی حروف حساس می باشد. به عنوان مثال bgColor با bgcolor برای نیست.

توضیحات (Comments)

توضیحات می توانند به صورت تک خطی و یا چند خطی باشند. مانند:
// این یک توضیح یک خطی است!

/*
این یک توضیح
چند خطی است.
*/

متغیرها (Variables)

برای تعریف متغیر کافیست نام دلخواه خود را بنویسید. استفاده از کلمه var قبل از نام متغیر اختیاری است، مگر در موارد زیر:
  • زمانی که نام یک متغیر محلی در داخل یک تابع با نام یک متغیر سراسری (Global) یکی باشد، متغیر محلی باید با var تعریف شود. در این مواقع شما در داخل تابع خود دسترسی به متغیر سراسری ندارید. هم چنین متغیرهای محلی فقط در داخل خود تابع قابل دستیابی می باشند.
  • در توابع بازگشتی استفاده از var الزامیست.

نمونه تعریف متغیر در جاوا اسکریپت

x = 42
var x = 42

انواع داده‌ها در جاوا اسکریپت

شما می تواند داده‌هایی از نوع زیر را در جاوا اسکریپ تعریف کنید:
  • شی (Object)
  • تابع (Function)
  • رشته (String)
  • عدد (Number)
  • نوع داده منطقی (Boolean)
در صورتی که متغییری تعریف نشده باشد، نوع آن متغیر undefined است. برای دستیابی به نوع یک متغیر می توانید از تابع typeof استفاده کنید. در زیر نمونه تعریف متغیرها و استفاده از تابع typeof را مشاهده می کنید:
var aDate = new Date()
var aPowerFunc = new Function("x", "return x * x")
var aString = "I am a string"
var aNumber = 42
var aBoolean = true

alert(typeof aPowerFunc); // typeof aPowerFunc is object
alert(typeof aDate); // typeof aDate is object
alert(typeof aString); // typeof aString is string
alert(typeof aNumber); // typeof aNumber is number
alert(typeof aBoolean); // typeof aBoolean is boolean
alert(typeof nonExistVar); // typeof nonExistVar is undefined
alert(typeof Date); // typeof Date is function. predefined object Date

آرایه ها (Arrays)

روش‌های مختلفی برای تعریف آرایه در جاوا اسکریپت وجود دارد. در زیر نمونه‌هایی از تعریف آرایه‌ها ارائه شده است:
beans = ["Java beans","Coffee beans","Cacao beans"];
myCars = new Array("Jaguar", "Mercedes", "Rolls Royce");
noOfEntries = myCars.length; // طول آرایه
myCD = new Array(42) // تعریف آرایه ای به نام myCD با 42 عضو
myCD[0] = "Queen" //اولین عنصر آرایه
myCD[1] = "Carlos Santana"
myCD[2] = "Mozart"
myCD[3] = "Chopin"
...
myCD[41] = "Shubidua" //آخرین عنصر آرایه
// تعریف آرایه با کلیدهای مشخص - Associative Array ویا همان Property Maps
assoarr = {color1: "green", color2: "yellow", color3: "white"};

اشیا (Objects)

تعریف یک شی مانند تعریف یک تابع می باشد. مانند:
function objDef(name) {
this.objvar = name
}
// creation of an instance of the above defined object "class" myObj = new objDef("Saeid")

متدها و خصوصیات (Methods, Properties)

متد همان تابع تعریف شده در یک شی و خصیصه، مقادیر متغیرهای آن می‌باشد. مانند:
//Property 
//objectName.propertyName = value
//Method
//objectName.methodName = function

function calcArea(radius) {
return(radius * radius * Math.PI);
}

function circle(color, radius) {
this.fillColor = color;
this.area = calcArea(radius);
}

var myCircle = new circle('green', 2);
alert(myCircle.fillColor);
alert(myCircle.area);

عملگرها در جاوا اسکریپت

در زیر عملگرها بر اساس نوع عملیات و داده مورد استفاده دسته‌بندی شده‌اند.
انواع عملگرها برای اعداد
عملگر توضیحات
+ جمع
- تفریق
++ افزایش مقدار متغییر به اندازه یک واحد
-- کاهش مقدار متغییر به اندازه یک واحد
* ضرب
/ تقسیم
% باقیمانده
انواع عملگرها برای رشته‌ها
عملگر توضیحات
+ الحاق دو یا چند رشته
+= الحاق محتوای یک رشته با یک یا چند رشته و اختصاص دادن مقدار به رشته اول
انواع عملگرهای منظقی
عملگر توضیحات
&& و (AND)
|| یا (OR)
! خِلاف (NOT)
== مساوی با (equal)
!= نامساوی با (not equal)
=== دقیقا مساوی با (از نظر مقدار و نوع داده)
!== نامساوی با (از نظر ارزش) ویا نامساوی (از نظر نوع)
> بزرگتر از
>= بزرگتر از ویا مساوی با (بزرگترمساوی)
< کوچکتر
<= کوچکتر از ویا مساوی با (کوچکتر مساوی)
انواع عملگرها برای تخصیص
عملگر توضیحات
= اختصاص دادن یک مقدار به متغیر
+= الحاق محتوای متغیر سمت چپ عملگر با یک متغیر و اختصاص دادن مقدار به متغیر سمت چپ
-= تفریق یک متغیر از متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
*= ضرب یک متغیر در متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
/= تقسیم متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
%= تقسیم متغیر سمت چپ عملگر و اختصاص دادن باقیمانده تقسیم به متغیر سمت چپ
سایر عملگرها
عملگر توضیحات
new ایجاد یک شی
delete حذف یک شی
this اشاره به شی جاری
typeof دستیابی به نوع متغیر عملوند
void ارزیابی یک عبارت بودن بازیابی مقدار آن

عبارت‌های شرطی (Conditional Statements)

در زیر نحوه نگارش عبارت‌های شرطی با if و switch ارائه شده است.

عبارت شرطی با if

// if ساده
if (condition) {
 statements
}

// if همراه با else
if (condition) { statements
} else {
statements
}

// if خلاصه یک خطی
condition ?  expr1 :  expr2

عبارت شرطی با switch

switch (expression){ case label:
statement;
  break;
 case label2:
statement;
  break;
 default :  statement;
}

حلقه ها (Loops)

در جاوا اسکریپت امکان نوشتن حلقه ها به چهار صورت امکان پذیر است.

حلقه for

for(var i=0; i < array.length; i++){
 ...
}

حلقه do ... while

var i=0; do {
i+=1;
} while (i < 5)

حلقه while

n=8
while( n > 0) {
n--
}

حلقه while

این حلقه بر روی خصوصیات یک شی اعمالی را انجام می دهد:
student1 = new Student("Hans Christian", "Andersen", 1805); for (props in student1) {
  document.write(student1.props)
}

دستور break و continue

مانند سایر زبان‌های برنامه‌نویسی دستور break حلقه را قطع کرده و برنامه را به بعد از حلقه منتقل می‌کند. دستور continue نیز مانند break حلقه جاری را قطع می‌کند و در ادامه دور بعدی حلقه را اجرا می کند. مانند:
while(i > 0){ if(a[i]=="Orange")
break; i--;
}
while(i > 0){
 if(a[i]!="Orange")
  continue;
oranges++;
}

معرفی بعضی از اشیا موجود در جاوا اسکریپت

مهمترین آبجکت‌های جاوا اسکریپت عبارتند از:
Date
Array
Boolean
Function
Math
Number
RegExp
String
در ادامه تعدادی از این اشیا بررسی شده اند.

شی Date

برخی از متدهای شی Date
متد توضیحات
getDate() بازیابی روز ماه جاری (۱-۳۱)
getDay() بازیابی شماره روز هفته جاری (۰-۶)
getYear() سال جاری دو رقمی بین ۰ تا ۹۹ برای سالهای قبل از ۱۹۹۹ و چهار رقمی برای سال‌های بعد از آن
getFullYear() سال جاری چهار رقمی
getHours() ساعت (۰-۲۳)
getMonth() ماه (۰-۱۱) - این شماره از ماه جاری یک ماه کمتر است.
getSeconds() ثانیه جاری (۰-۵۹)
getTime() تعداد میلی‌ثانی‌های گذشته از تاریخ ۱ ژانویه ۱۹۷۰
setDate(), setHours(), . . . مقداردهی به تاریخ و زمان مورد نظر
parse() دستیابی به زمان طی شده از ۱ ژانویه ۱۹۷۰ تا زمان مورد نظر در واحد میلی‌ثانیه
toString() تبدیل تاریخ به رشته
برای استفاده از شی Date می توانید مانند زیر عمل کنید:
now = new Date // تاریخ جاری 
nowDay = now.getDay() // (0-6) 
nowHour = now.getHour() // (0-23)

شی Boolean

استفاده از شی Boolean بسیار ساده می باشد. در زیر نمونه تعریف آن آمده است:
x = true; // مقدار منطقی true
y = false; // مقدار منطقی false
z = new Boolean(false); // مقدار این شی false است.
z2 = new Boolean("false"); // مقدار ای شی true است! دقت کنید که هر رشته ای که به شی Boolean پاس شود مقدار ای شی را true می کند.
z3 = new Boolean(true); // مقدار این شی true است.

شی Math

همانطور که از اسم این شی مشخص است، کاربرد آن بیشتر در محاسبات و عبارت‌های ریاضی است.
برخی از متدهای شی Math
متد یا عبارت توضیحات
abs قدرمطلق
sin, cos, tan acos, asin, atan توابع مثلثاتی
min, max بدست آورن کمترین و بیشترین مقدار
round گردکردن مقدار
sqrt بدست آوردن جذر یک عدد
pow توان. اولین مقدار، پایه توان و دومین مقدار نمای آن می باشد. به عنوان مثال Math.pow(x,y) برابر است با xy
random ایجاد یک عدد رندوم بین صفر و یک.
Math.E مقدار ثابت عدد e (فرمول اولر یا اویلر) حدود ۲,۷۱۸
Math.PI مقدار ثابت عدد پی. حدود ۳,۱۴۱۵۹
نمونه استفاده از آبجکت Math:
a = Math.PI * r*r; with(Math){
a = PI * r*r;
x = sin(y);
}

شی String

برخی از متدهای شی String
متد توضیحات
bold مانند تگ <bold> رشته را درشت‌تر می‌کند.
italics مانند تگ <i> عمل می کند.
concat الحاق ۲ یا چند رشته
charAt دستیابی به کاراکتر از طریق ایندکس (اندیس) آن در رشته
fontcolor مانند تگ <font> به صورت <font color=color> عمل می‌کند.
fontsize مانند تگ <font> به صورت <font size=size> عمل می‌کند.
indexOf پیدا کردن اولین محل یافت شده از یک رشته در رشته دیگر. در صورتی که این جستجو نتیجه‌ای در بر نداشته باشد، مقدار بازگردانده خواهد شد.
lastIndexOf مانند indexOf با این تفاوت که آخرین محل یافت شده در جستجو را نشان می‌دهد.
length طول رشته را نشان می‌دهد.
link برای ایجاد لینک مانند تگ <a>
big مانند تگ <big>
small مانند تگ <small>
strike مانند تگ <strike>
sub مانند تگ <sub>
substring دستیابی به یک زیررشته از رشته مورد نظر.
toLowerCase تبدیل رشته به حروف کوچک
toUpperCase تبدیل رشته به حروف بزرگ
replace برای جایگزینه یک رشته در رشته دیگر کاربرد دارد.
split برای جداکردن رشته بر اساس یک الگو (جداکننده) کاربرد دارد.
مثال‌هایی از استفاده شی String و متدهای آن در زیر ارائه شده است:
var message = "Simple String";
message[0]; // مقدار "S" باز می‌گرداند.
document.write(message.bold()); // محتوای متغییر را به صورت درشت چاپ می‌کند.
message.charAt(0); // همان message[0] می‌باشد.
message.concat(" enhanced"); // مقدار "Simple String enhanced" را باز می‌گرداند.
message.length; // طول عبارت که همان عدد ۱۳ می باشد را باز می‌گرداند
message.indexOf("Simple"); // عدد ۰ را باز می‌گرداند.
message.lastIndexOf("String"); // عدد ۷ را باز می‌گرداند.
message.substring(2,5); // رشته "mple" را باز می‌گرداند.
document.write(message.replace("Simple", "Complex")); // مقدار "Complex String" را باز می‌گرداند.

رویدادها (Events)

منظور از رویداد، انتفاقی است که در سمت کاربر و براساس فعالیت‌های آن رخ می‌دهد. در زیر تعدادی از رویدادها مهم ارائه شده‌اند. دقت نمایید که فراخوانی آن‌ها در تگ‌های خاصی امکان پذیر است. به عنوان مثال رویداد onSubmit در تگ <form> فراخوانده می‌شود.
تعدادی از رویدادهای مهم در جاوا اسکریپت
رویداد زمان رخ دادن و فراخوانی
onSubmit هنگام ثبت شدن فرم
onReset هنگام زدن دکمه reset فرم
onChange هنگام تغییر یک مقدار
onSelect هنگام انتخاب یک متن در تگ <input> یا <textarea>
onBlur هنگام خارج شدن از فوکوس یک فیلد
onFocus هنگام فوکوس (انتخاب) یک فیلد
onKeydown هنگام فشردن یک کلید به پایین
onKeyup بعد از فشردن و رها کردن یک کلید
onKeypress هنگام فشردن یک کلید (مجموع onKeydown و onKeyup)
onMouseover زمانی که نشانگر ماوس بر روی منطقه تگ مورد نظر می رود.
onMouseout هنگامی که نشانگر ماوس از منطقه تگ مورد نظر خارج می شود.
onMousemove هنگام حرکت دادن نشانگر ماوس در یک منطقه
onClick هنگام کلیک کردن
onDblclick هنگام دابل کلیک کردن
onLoad هنگام بارگزاری صفحه
onUnload هنگام بستن صفحه مورد نظر
onResize هنگام تغییر دادن سایز صفحه (پنچره) مورد نظر
onError هنگام رخ دادن یک خطا جاوا اسکریپتی

پی‌نوشت

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

منابع

شاد و پیروز باشید :)

۱۳۹۰/۱۰/۲۶

نظارت همزمان بر چند فایل و دستور (MultiTail)

سلام،

بعد از مدت‌ها دوباره مطلبی در مورد برنامه‌های مفید موجود در لینوکس (و یونیکس) آماده کردم. در این مطلب به معرفی دستورات head، tail و نرم‌افزار MultiTail که برای نظارت (مونیتورینگ) دستورات و فایل‌ها به کار گرفته می شوند، پرداخته ام.


دستور head


این دستور برای بدست آوردن اطلاعات ابتدایی (خطوط) بالایی فایل و خروجی های پایپ شده کاربرد دارد. دستور head به صورت پیش فرض ۱۰ خط از اطلاعات را نمایش می دهد. نحوه استفاده از این دستور به صورت زیر است:
[bash]
head [options] <file_name>
[/bash]
و یا:
[bash]
command | head
[/bash]
مانند:
[bash]
ls -tl | head -n5
total 72
drwxr-xr-x+ 12 saeid staff 408 Jan 15 21:22 Desktop
drwx------+ 9 saeid staff 306 Jan 15 11:23 Downloads
drwx------@ 59 saeid staff 2006 Jan 11 23:05 Library
drwxr--r--+ 23 saeid staff 782 Jan 4 18:52 Documents
[/bash]

دستور tail


این دستور کاملا شبیه به دستور head است با این تفاوت که به جای خطوط ابتدایی، اطلاعات خطوط انتهایی را نمایش می دهد. مانند:
[bash]
man ls | tail -n15
SEE ALSO
chflags(1), chmod(1), sort(1), xterm(1), compat(5), termcap(5),
symlink(7), sticky(8)

STANDARDS
The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

HISTORY
An ls command appeared in Version 1 AT&T UNIX.

BUGS
To maintain backward compatibility, the relationships between the many
options are quite complex.

BSD May 19, 2002 BSD
[/bash]

پارامتر -f دستور tail


پارامتر -f دستور tail باعث می شود که این دستور به صورت زنده (live) باقی مانده و اطلاعات اضافه شده به فایل را در لحظه نشان دهد. این پارامتر بیشتر در بررسی فایل های لاگ استفاده می‌شود. مانند:
[bash]
tail -f -n5 /var/log/apache2/access_log
127.0.0.1 - - [15/Jan/2012:22:30:12 +0330] "GET /~saeid/ HTTP/1.1" 200 -
127.0.0.1 - - [15/Jan/2012:22:30:27 +0330] "GET /~saeid/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524
127.0.0.1 - - [15/Jan/2012:22:30:26 +0330] "GET /~saeid/phpinfo HTTP/1.1" 200 78141
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo HTTP/1.1" 200 78412
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524
127.0.0.1 - - [15/Jan/2012:22:31:11 +0330] "GET /~saeid/phpinfo.php?=SUHO8567F54-D428-14d2-A769-00DA302A5F18 HTTP/1.1" 200 2813
[/bash]
* برای خروج از tail -f از ترکیب Ctrl+C استفاده نمایید.

نرم‌افزار MultiTail


این بسته نرم‌افزاری در محیط خط فرمان اجرا شده و به منظور نظارت دستورات و فایل‌ها مورد استفاده قرار می گیرد. مهم‌ترین مزیت MultiTail امکان بررسی هم‌زمان چند فایل و دستور در یک ترمینال است.

نصب MultiTail


برای نصب در اوبونتو/دبیان دستورات زیر را در خط فرمان اجرا نمایید:
[bash]
sudo apt-get update; sudo apt-get install multitail
[/bash]

برای نصب در مک با استفاده از MacPorts دستور زیر را وارد نمایید:
[bash]
sudo port install multitail
[/bash]

نحوه استفاده از MultiTail


برنامه MultiTail بسیار انعطاف‌پذیر بوده و قابلیت‌های بسیاری دارد. به عنوان دستور زیر را در نظر بگیرید:
[bash]
multitail -l 'ping google.com' -l 'ping zebardast.ir'
[/bash]
تصویر زیر خروجی این دستور را نشان می دهد:

* برای خروج از MultiTail از ترکیب Ctrl+C استفاده نمایید.

حال در کنار این دو Ping یک فایل را نیز به صورت زنده (live) بررسی می کنیم:
[bash]
multitail -l 'ping google.com' -l 'ping zebardast.ir' /var/log/apache2/access_log
[/bash]
خروجی دستور بالا:


همچنین می توانیم به جای نمایش جدا از هم اطلاعات، آن‌ها را ترکیب کرده و با هم نمایش دهیم. در زیر خروجی دو دستور پینگ را در یک ترمینال نشان داده ایم:
[bash]
multitail -l 'ping google.com' -L 'ping zebardast.ir'
PING zebardast.ir (79.175.162.75): 56 data bytes
PING google.com (173.194.69.105): 56 data bytes
64 bytes from 79.175.162.75: icmp_seq=0 ttl=54 time=87.961 ms
64 bytes from 173.194.69.105: icmp_seq=0 ttl=41 time=456.322 ms
64 bytes from 79.175.162.75: icmp_seq=1 ttl=54 time=97.724 ms
64 bytes from 173.194.69.105: icmp_seq=1 ttl=41 time=416.464 ms
64 bytes from 79.175.162.75: icmp_seq=2 ttl=54 time=96.657 ms
[/bash]

از جمله ویژگی‌های MultiTail امکان فیلتر کردن نتایج است. دستور زیر همانند دستور قبلی می باشد با این تفاوت که عبارت 64 bytes from را از خروجی دستور دوم حذف می کند:
[bash]
multitail -l 'ping google.com' -ke "64 bytes from" -L 'ping zebardast.ir'
PING google.com (173.194.69.105): 56 data bytes
PING zebardast.ir (79.175.162.75): 56 data bytes
64 bytes from 173.194.69.105: icmp_seq=0 ttl=41 time=463.806 ms
79.175.162.75: icmp_seq=0 ttl=54 time=45.223 ms
64 bytes from 173.194.69.105: icmp_seq=1 ttl=41 time=442.254 ms
79.175.162.75: icmp_seq=1 ttl=54 time=84.238 ms
64 bytes from 173.194.69.105: icmp_seq=2 ttl=41 time=442.263 ms
79.175.162.75: icmp_seq=2 ttl=54 time=98.428 ms
64 bytes from 173.194.69.105: icmp_seq=3 ttl=41 time=400.113 ms
79.175.162.75: icmp_seq=3 ttl=54 time=81.723 ms
[/bash]

پیشنهاد می‌کنم برای مشاهده مثال‌های بیشتر به صفحه Example سایت MultiTail مراجعه کنید.

پیوندها




شاد و پیروز باشید :)

۱۳۹۰/۱۰/۱۷

معاهده‌های کدنویسی (Coding conventions)


سلام،

معاهده‌های کدنویسی (Coding conventions) به مجموعه استانداردها و روش‌های کدنویسی یک زبان برنامه نویسی گفته می شود که معمولا توسط توسعه دهنده آن زبان معرفی می شود. این مقاله به معرفی مهم ترین معاهده‌های برنامه نویسی می پردازد. در انتها فهرستی از معاهده‌های کدنویسی مهم‌ترین زبان‌های برنامه‌نویسی ارائه شده است.

مقدمه


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

نگهداری نرم‌افزار


کم‌کردن هزینه نگهداری نرم‌افزار (Software Maintenance) مهم‌ترین دلیل پیروی از معاهده‌های برنامه نویسی است. شرکت سان مایکروسیستمز در معرفی معاهده‌های کدنویسی زبان جاوا چهار عامل زیر را دلیل ارائه معاهده‌های کدنویسی معرفی کرده است:


  1. ۸۰٪ از هزینه طول عمر یک نرم‌افزار صرف تعمیر و نگهداری آن می شود.


  2. معمولا برنامه‌نویس نرم‌افزار در طول عمر نرم‌افزار عوض شده و ثابت باقی نمی‌ماند.


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


  4. در صورتی که شما کد منبع خود را به عنوان یک محصول عرضه می‌نمایید، باید از صحیح، مرتب و یکسان بود کد‌های خود در محصولات مختلف‌تان مطمئن باشید.


کیفیت


در فرایند توسعه نرم‌افزار مرحله‌ای با عنوان ارزشیابی همتایان (Peer review) وجود دارد که در طی آن شخص انجام دهنده یک کار، تکلیف صورت گرفته را همراه با یک یا چند تن از همکاران خود ارزیابی می کند. هدف از این مرحله بررسی منظم محصول به منظور یافتن مشکلات احتمالی و رفع ایراد آن‌ها می‌باشد. نام انگلیسی این مرحله (Software peer review) است.
Software peer review غالبا به بررسی کدها منبع می‌پردازد. در صورتی که کد منبع از معاهده‌های زبان مورد نظر پیروی کرده باشد، علاوه بر افزایش کیفیت کد منبع موجب می شود تا مشاهده، بررسی و رفع ایرادات برای تیم ارزشیابی بسیار آسان‌تر شود.
با انجام صحیح ارزشیابی همتایان، بسیاری از مشکلات احتمالی حال و آینده رفع خواهد شد. به عنوان مثال در صورت مراجعه مجدد به کدمنبع در آینده فهمیدن و درک کدی که درست ارزشیابی شده و از معاهده‌ها پیروی کرده است راحت‌تر بوده و زمان کمتری را نیاز خواهد داشت.

تغییر در ساختار کد (Refactoring)


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


اتوماسیون وظایف (Task automation)


رعایت معاهده‌های کدنویسی باعث می‌شود تا بتوان فرایندهایی غیر از کامپایل و اجرای نرم‌افزار را به آسانی انجام داد. از جمله مهم‌ترین این فرایندها می توان به ساخت و انتشار خودکار مستندات برنامه اشاره کرد. به عنوان مثال شما می توانید با نوشتن برچسب‌های author، version، param و... در توضیحات کدمنبع به صورت خودکار مستندات فنی نرم‌افزار خود را ایجاد کنید. به کد جاوای زیر توجه کنید:
[java]
/**
* Simple calculator operation.
* @author <a href="mailto:me@my.com">Me</a>
* @version 1.0
*/
public interface Operation {
/**
* Perform a single calculation.
* @param operand the operand to use for calculation.
*/
public void calculate(double operand);

/**
* Get the current result.
* @return the current result. If no calculations were
* performed the result is undefined.
*/
public double getResult();
}
[/java]
تصویر زیر خروجی HTML تولید شده با نرم‌افزار Javadoc را نشان می دهد:



برخی از معاهده‌های کدنویسی مهمترین زبان‌های برنامه نویسی


در زیر پیوندهایی به تعدادی از معاهده‌های کدنویسی ارائه شده است:



منابع




منبع تصویر: onlinedegrees.org

شاد و پیروز باشید :)