این یه تجربه پراکنده دیگه!

یه جاهایی لازم میشه که شما یه سری داده رو بین دوتا کامپیوتر ارسال کنی و یا یه فانکشن رو صدا بزنی. یکی از معمول ترین روش‌های این کار اینه که شما یه وب سرویس بالا بیاری و با json یا xml یا yaml اطلاعات رو ارسال کنی. اما این روش دوتا ایراد داره. اول اینکه مجبوری از پروتکل وب استفاده کنی یعنی یه وب سرور همیشه اجرا هست. همچنین parse کردن html تقریبا کار پرهزینه‌ای هست. پس شرکت‌های بزرگ مثل گوگل و فیسبوک به این نتیجه رسیدن که داده‌ها رو به یه فرمت استاندارد serialize کنن و بعد ارسال کنن و در نظر داشته باشن که این پروتکل‌های ارتباطی در طول زمان کامل میشن پس باید ماشین‌ها بتونن با نسخه‌های قدیمی تر با نسخه‌های جدید تر حرف بزنن. به همین خاطر یه سری کتابخانه ایجاد کردن که شما با اونها می‌تونید پروتکل خودتون رو طراحی کنید و توی زبان‌های مختلف ازش استفاده کنید. اینجا من سعی میکنم لیست این کتابخانه‌ها و یه توضیح تو دل برو غیر دقیق ازشون ارائه بدم تا اگه نیاز داشت سرنخ رو بگیره و ادامه بده!

  1. protocol buffer: این کتابخانه در گوگل طراحی شده و استفاده میشه که خروجی به زبان‌های c++ و جاوا و پایتون داره. به زبان‌های دیگه هم پورت شده اما حجم زیاد کد تولید شده و بهینه نبودن مصرف حافظه ایراد‌هایی هست که بهش میگیرن
    1. nanopb: یک پیاده‌سازی مجدد هست که سعی کرده حجم کد تولید شده کوچک باشه
  2. thrift: این کتابخانه در فیسبوک طراحی و استفاده شده. این کتابخانه خیلی شبیه protocol buffer هست با این تفاوت که لایه ارسال و دریافت این اطلاعات رو هم شامل میشه
  3. cap’n proto: این کتابخانه توسط نویسندگان کتابخانه گوگل که فکر کنم دیگه توی گوگل کار نمیکنن باز طراحی شده که در طراحیش سعی شده بسیار سریع باشه
  4. flatbuffers: این کتابخانه باز اخیرا توسط گوگل طراحی شده که مشکلات سرعت و مصرف حافظه protocol buffer رو نداشته باشه. همچنین بسیار سریع باشه که خودشون ادعا میکنن توی نوشتن بازی هم به درد میخوره
  5. apache avro: کتابخانه‌ای هست که برای ارتباط بین نود‌های hadoop طراحی شده

امیدوارم این سرنخ کوتاه به درد دیگران هم بخوره!

همین!

اینم یه تجربه پراکنده دیگه!

سر کار اخیرا نیاز شد که یه سیستم با قابلیت virtualization نصب کنیم. خوشبختانه همکارمون که مسئول این کار بود از من در این مورد مشورت گرفت. توی کارهای خیلی جدی شرکت معمولا از vmware ESXi استفاده میشه اما اینجا من و این دوستمون علاقه‌مند شدیم که از یه تکنولوژی دیگه استفاده کنیم. هر دومون با kvm و linux آشنایی داشتیم پس مطمئن بودیم که میتونیم در بدترین حالت با استفاده از لینوکس مشکل رو حل کنیم. پس من پیشنهاد دادم بریم سراغ smartos. یه شرکت به نام joyent از این سیستم عامل پشتیبانی میکنه که اسپانسر nodejs و چیزهای دیگه هم هست. همونطور که قبلا هم گفته بودم این سیستم عامل یه مدته «چشم من رو گرفته» دلایلش هم ایناست

  1. ریشه اش به سولاریس برمیگرده که سیستم عامل بسیار خوبیه!
  2. از zfs پشتیبانی میکنه که اون هم سیستم فایل محشریه!
  3. از kvm به عنوان مجازی ساز سخت افزار استفاده میکنه
  4. از zone های سولاریس به عنوان مجازی سازی سبک(مراجعه کنید به این و این) پشتیبانی میکنه

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

نکات جالب در برخورد من با این سیستم عامل اینهاست

  1. کل سیستم نیاز به نصب نداره! و فقط کافیه که روی هارد بتونه سیستم فایل zfs رو تشخیص بده. پس بروز رسانی در حد خاموش و روشن کردن سیستم هزینه داره. از اون سمت با استفاده از pxe میشه سیستم رو بوت کرد که یعنی کل هاردهای سرور جهت ذخیره سازی اطلاعات بکار میره
  2. از json برای توصیف ماشین‌های مجازی و zone هاش استفاده میکنه. که این قضیه برنامه نویسی کردن برای اون رو به شدت ساده میکنه

نکات قابل توجهی که من در حین کار بهش برخوردم اینا بود

  1. کارت شبکه mainboard یکم مشکل داشت و smartos هم درست ازش استفاده نمیکرد
  2. مدت زمان لازم برای reboot شدن ماشین مجازی pfsense زیاد بود(حدود ۵ دقیقه)
  3. نمیشد از توی pfsense سیستم رو reboot کرد
  4. نصب واسط گرافیکی برای راحت‌تر کار کردن لینوکس و یونیکس نابلدها با سیستم به نظر پر دردسر میرسید!

علی الحساب همین تا باز هم بیشتر باهاش کار کنم و نتایج رو بهتون بگم!

اینم یه تجربه پراکنده دیگه!

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

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

  1. ‍یک سرور dns عادی
  2. یک واسط وب برای تعریف آدرس سایت
  3. یک واسط وب برای آپدیت سریع آدرس ip

استفاده این سرویس هم برای اینه که اونهایی که آدرس ip ایستا ندارند بتونن یه دامنه به خودشون اختصاص بدن و بتونن از بیرون به روتر و شبکه داخلیشون دسترسی داشته باشن!

خب یکی از این سرویس ها https://freedns.afraid.org/ هست یه چنین سرویسی ارائه میکنه. حالا بعد از گرفتن آدرس از این سایت اگه بخوایم این سیستم رو روی pfsense تنظیم کنیم روندش خیلی ساده است!

  1. ثبت دامنه پویا در سرویس freedns.afraid.org
  2. رفتن به منوی services -> dynamic dns
    Menu_031
  3. اضافه کردن یک مورد جدید
    Selection_032
  4. وارد کردن اطلاعات دامنه
    Selection_033
  5. گرفتن اطلاعات از سایت freedns
    Selection_034

    Selection_036

همین امیدوارم به درد خورده باشه!

اینم یه تجربه پراکنده دیگه!

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

اون موقع تازه نارنجی رو تعطیل کرده بودند اما هنوز سایت سرجاش بود. به علت کیفیت خوب کار دوستان توی نارنجی هم تگ‌هایی که به مطالب داده بودن به عنوان لیست کلمات کلیدی قابل اعتماد بود. پس من به این نتیجه رسیدم که یه سری اسکریپت بنویسم که این کلمات رو استخراج کنم. یکم توی اینترنت گشتم و ابزارهای مربوط به استخراج اطلاعات از صفحات وب(web scraping) رو بررسی کردم. آخرش به این نتیجه رسیدم که پایتون و beautiful soup رو پیدا کردم و به کمک اون اسکریپ رو نوشتم.

خب اول از همه تابع استخراج تمامی url های تمام پست‌های نارنجی هست

 

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

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

برای اینکه تعداد Thread ها زیاد نشه از یه صف استفاده کردم که الان یادم نیست. همچنین از مجموعه‌های پایتون برای حذف کلمات تکراری استفاده کردم.

پس اگه بخوام کل اسکریپت بصورت یکجا بیارم میشه:

 

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

همین!

اینم یه تجربه پراکنده دیگه!

همه اونهایی که با برنامه‌نویسی شبکه آشنا هستند می‌دونند که ما در لایه انتقال از دو تکنولوژی TCP و UDP استفاده می‌کنیم. مهمترین تفاوتی که این دوتا پروتکل دارند که تقریبا همه باهاش آشنا هستند اینه که TCP مبتنی بر اتصال هست و رسیدن پکت‌ها و ترتیب پکت‌ها رو تضمین میکنه اما UDP بدون اتصال هست و رسیدن و ترتیب پکت‌ها رو تضمین نمیکنه.

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

tcppacket

udppacket

 

همینطور که می‌بینید  توی TCP قبل از بخش دیتا تقریبا ۱۹۲ بیت هدر وجود داره و این هدر توی UDP تنها ۶۴ بیت! که توی پهنای بایت در حد ۱۰ کیلو بیت بر ثانیه تفاوت واضحی از خودش نشون میده.

همین!

 

اینم یه تجربه پراکنده دیگه!

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

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

لیست این کتابخانه‌های اینا هستن:

  • Boost.Asio: این کتابخانه یه کتاب‌خانه سریع و خوب برای کار با سوکت‌هاست و شما به سوکت بصورت مستقیم دسترسی داری
  • ACE: از دل دانشگاه در اومده و به نظر خوب میاد. سوکت‌ها بصورت مستقیم در دسترس هستند اما عملیات‌های سطح بالاتر مثل message routing رو پشتیبانی میکنه
  • C++ Network Library: تا اونجایی که نمونه‌های و مستنداتش رو بررسی کردم این کتابخانه برای کارهای سطح بالا تر مثل http نوشته شده
  • POCO: این کتابخانه مجموعه ای از ابزارهای سطح بالا برای برنامه نویسی در اختیار شما قرار میده که شبکه و سوکت‌های یکی از اونهاست
  • Qt: این کتابخانه هم مجموعه بسیار بزرگی از ابزارها داره که یکی از اونها شبکه و سوکت هست
  • Raknet: یه کتابخانه کار با شبکه است که هم توی pc و هم توی کنسولهای بازی کاربرد داره
  • ZeroMQ: این کتابخانه بیشتر از اینکه یه کتابخانه شبکه باشه یه کتابخانه message queue هست که به شما کمک میکنه ارتباط بین چندتا اپلیکیشن رو بصورت قابل اعتمادی ایجاد کنید
  • nanomsg: این کتابخانه هم بیشتر به عنوان message queue طراحی شده
  • libevent: اصالتا یه سیستم برای پشتیبانی از سیستم‌های async هست که در جاهای بسیاری استفاده شده و بخشی از اون هم کارهای شبکه و سوکت رو انجام میده
  • Apache APR: یکی دیگر از کتابخانه‌های عموی با پشتیبانی از سوکت است
  • yield: یک کتابخانه نوشتن نرم‌افزارهای تحت وب است
  • wvstreams: یک کتابخانه قدیمی برای کار با شبکه است که سال‌هاست بروزرسانی نشده
  • libcurl: یک کتابخانه بسیار قوی برای کار با پروتکل‌های شبکه نه سوکت‌هاست که بیشتر پروتکل‌های معمول رو پشتیبانی میکنه
  • libuv: یک کتابخانه برای کار با async IO بوده که از شبکه و سوکت هم پشتیبانی میکنه. جالبه بدونید که توی nodejs هم از این کتابخانه استفاده شده.
  • SFML’s Network Module: این کتابخانه هم مثل qt یک کتابخانه چند منظوره است که از سوکت‌ها و شبکه هم پشتیبانی میکنه.

من خودم به شخصه تنها از Boost.Asio استفاده کردم و انشاا… اگه عمری بود بیشتر در مورد این کتابخانه و نمونه کدها و ویژگی‌های دیگشون مینویسم.

همین!