غواصی در اعماق: systemd socket activation

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

امروز داشتم توی وب میگشتم و در مورد docker میخوندم که چشمم به این پست خورد که چطور توی pantheon تونستن با استفاده از تکنولوژی‌های مرتبط به container تونستن یه بیزنس بسیار جذاب برای ارائه یه نوع هاستینگ خاص مرتبط با drupal و wordpress بسازن. اما نکته‌ای که داشت این بود که یکی از نکاتی که منجر به خفن شدن سیستم اونها شده بود استفاده از یه ویژگی systemd به نام socket activation بود. که من یکم در موردش خوندم و بسیار ازش لذت بردم و گفتم ازش بنویسم.

قصه از اینجا شروع میشه که توی سیستم‌های مبتنی بر یونیکس از قدیم الایام یه چیزی وجود داشته با نام SysV که قدمهای مرتبط با boot سیستم توی اونجا انجام میشده. یعنی اینکه فرض کنید برای اینکه لینوکس بطور کامل بالا بیاد نیاز به داره که ۱۰ تا سرویس اجرا بشه و هر کدوم از اونها یه سری وابستگی دارن که این سیستم این قدم‌ها رو با توجه به وابستگی‌هاش اجرا میکنه. نحوه اجرا شدن این قدم‌ها توی SysV بصورت ترتیبی است که این روند باعث افزایش زمان مورد نیاز برای boot شدن سیستم میشه. توی MacOs از سیستم به نام launchd برای کاهش زمان boot پیاده‌سازی شده. همچنین توی لینوکس  راه حل‌هایی برای اجرای موازی سرویسهایی که به همدیگه وابسته نیستن مثل upstart اوبونتو توسعه پیدا کرده. اما مشکل سرعت کم boot بصورت کامل رفع نشده. به همین خاطر systemd پیاده‌سازی شده و از ساز و کاری به اسم socket activation ایجاد شده که سرویس‌ها هم بتونن با سرعت لود بشن هم مشکلی بوجود نیاد.

تقریبا همه چیز در لینوکس معمولا این سرویسها ارتباطشون از طریق socket ها ایجاد میشه و از socket به عنوان IPC استفاده میشه. حالا ایده اینه که بجای اینکه کل پروسس مربوط به یک سرویس بالا بیاد و بعد اون بیاد و سرویس رو ایجاد کنه، systemd بجای پروسه اصلی سوکت رو ایجاد کنه و هر وقت اولین درخواست به این سوکت رسید سرویس اجرا بشه و سوکت باز شده هم در اختیار پروسس این سرویس قرار بگیره. خوبی این روش هم اینه که تقریبا تمام سرویس‌های متونن همزمان اجرا بشن و خب در صورتی که یه سرویس زودتر از یه سرویس دیگه اجرا بشه و به سرویس کند نیاز داشته باشه درخواست‌هاش رو به سوکت مربوطه میفرسته تا زمانی که این سوکت بتونه چیزی دریافت کنه-لازمه بگم که هر سوکت میتونه به حجم محدودی اطلاعات رو توی خودش نگه داره- پس از اون کرنل دخالت میکنه و برنامه‌ یا برنامه ‌هایی که میخوان به اون سوکت بنویسن رو بصورت موقت متوقف میکنه. تا سرویس دهنده اجرا بشه و بیاد به درخواست‌ها پاسخ بده و سوکت با امکان نوشته شدن داشته باشه. این ایده جدید نبوده و توی inted ملقب به superserver هم برای سرویس دهنده‌های اینترنتی مثل ftp مورد استفاده قرار گرفته. اما systemd ایده رو توسعه داده و بجای سوکت‌های اینترنتی از همه نوع سوکتی پشتیبانی میکنه. این روش سود‌های دیگه‌ای هم داره:

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

همین!

منابع:

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

  1. این سایت اصلیه که کلی اطلاعات جذاب توش داره.
  2. این سایت نویسنده یا یکی از نویسندگان اصلی systemd هست
  3. اگه برنامه نویس هستید و میخواد با این مفهوم بیشتر آشنا بشید این مطلب و این یکی رو هم بخونید

 

لذت برنامه نویسی! در C متغیرها کجا تعریف می‌شوند

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

من مدت‌هاست که به عنوان یکی از کارهای اصلی به زبان C برای سیستم‌های Embeded برنامه می‌نویسم. یعنی یه دستگاه محدود رو آماده میکنم که یه کار خاص رو انجام بده.

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

اگه با اسمبلی آشنا باشید هر برنامه از سه قسمت Data, Code, Stack تعریف میشه. که خود  Data Segment هم از سه بخش Heap, Data, BSS تشکیل میشه. که توضیح هرکدوم این بخش‌ها داستان متفاوتی داره. حالا توی شبه کد پایین توضیح میدم که  اینها با هم چه تفاوتی داره

توی این شبه کد متغیر global به نام a وجود داره که توی data و یا ‌BSS تعریف میشه. متغیر b چون یک متغیر محلیه توی stack تعریف میشه. متغیر c یک متغیر محلی استایتک هست و به دلیل استاتیک بودنش توی data و یا ‌BSS تعریف میشه.  پوینتر d همه به یه آدرس توی heap اشاره میکنه چون این متغیر بصورت داینامیک تعریف شده و متغیر داینامیک در heap درست میشه. تفاوت data و BSS در اینه که متغیرهایی که مقدار اولیه غیر صفر دارن توی data تعریف میشن و متغیرهایی که مقدار اولیه ندارن و یا صفرن توی BSS تعریف میشن.

حالا مشکلی که وجود داشت اینه که من متغیرهای بزرگی توی متن تابع هام داشتم که باعث میشد حجم محدود stack موجود پر بشه و نرم افزار به خطای زمان اجرا بر بخوره. که با تغییر اونها به متغیرهای static محل نگهداری اونها به BSS یا Data تغییر مکان پیدا کرد و مساله حل شد.

همین!

استفاده از pfsense در محیط تجاری/عملیات

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

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

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

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

از نظر ویژگی‌ها هم کارهای بسیار خوب زیادی میشه باهاش انجام داد. که من لیست کارهایی که باهاش کردم رو مینویسم:

  • سر هم کردن دوتا اینترنت برای افزایش پهنای باند و افزایش ثبات
  • راه اندازی یک captive portal برای احراز هویت کاربران برای دسترسی به اینترنت
  • استفاده از ویژگی NAT برای تخصیص پورتهایی به یکی از سیستم‌های داخلی
  • پشتیبانی از سیستم تلفنی مبتنی بر IP به نام Asterisk
  • پشتیبانی از محدود کردن پهنای باند و ترافیک کاربران
  • محدود کردن دسترسی عده‌ای یا گروهی از کاربران به اینترنت
  • پشتیبانی از squid‌به منظور افزایش کارایی استفاده از اینترنت
  • امکان بررسی ترافیک عبوری و ویروسیابی آن
  • امکان اعمال سیاستهای تضمین کیفیت

این کارهایی که من انجام دادم اکثرا توسط پکیج‌های جانبی این سیستم انجام شده و اگه عمری بود سناریوی اجرای تک تک این قسمت‌ها رو میگم

همین!

فیلدهای استاندارد iso 8583 قسمت اول

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

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

اولین و مهمترین بخش فیلدها، فیلد مشخصه پیغامه که یک عدد ۴ رقمیه که معنای هریک از رقم ها به این صورته که:

  • اولین رقم (۰xxx) : نشان دهنده نسخه استاندارده
  • دومین رقم (x1xx) : دسته پیغام رو نشون میده
  • سومین رقم (xx0x): نوع پیغام که درخواست یا پاسخ باشه رو نشون میده
  • چهارمین رقم(xxx0): نشان دهنده اینه که این پیغام رو چه کسی فرستاده (شروع کننده تراکنش، پاسخ دهنده تراکنش و …)

دسته پیغام های مهم هم عبارتند از :

  • پیغام احراز هویت(۱): مثلا وقتی که نام صاحب کارت توی انتقال کارت استعلام میشه
  • پیغام مالی (۲): مثلا وقتی شما از دستگاه خرید میکنید
  • پیغام فایل(۳): مثلا وقتی قرار فایلهای دستگاه کارتخوان بروزرسانی بشن
  • پیغام تسویه(۵): وقتی که تراکنش موفق بوده و دستگاه میخواد اعلام کنه پول رو به فروشنده تحویل بدید
  • پیغام شبکه(۸): وقتی دستگاه میخواد اطلاعات مرتبط با اتصالش به شبکه از قبیل شماره تلفن و … رو از سرور مرکزی که همون سوئیچ بانکی باشه بگیره استفاده میشه

فعلا همین تا اگه عمری بود یکم دیگه در این مورد بنویسم

استاندارد iso 8583

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

من یه مدت توی سیستم بانکی این مرز و بوم کار میکردم و برنامه نویس  پایانه‌های فروش بودم. از اونجا بود که یه استاندارد بانکی به نام iso ۸۵۸۳ بود آشنا شدم که یه استادارد برای تراکنش‌های مبتنی بر کارت است. این استادارد سه تا نسخه ۸۵ و ۹۱ و ۰۳ داره که در سالهای ۱۹۸۵ و ۱۹۹۱ و ۲۰۰۳ استاندارد شده که هرکدوم تفاوت‌هایی دارند.

درسهای زیادی برای یادگرفتن از این پروتکل وجود داره و مهمترینش اینه که سعی کن «کم گوی و گزیده گوی» باشی و پیشنهاد میده بسته تراکنش‌های مالی بایستی کمتر ۱۰۲۴ بایت باشه تا موفقیتش به میزان زیادی تضمین بشه.

پیاده‌سازی‌های متن باز بسیاری هم از پروتکل در زبان‌های مختلف وجود داره که لیست اونها در پایین اومده:

  • پیاده سازی به زبان c معروف به سندرسون
  • پیاده سازی به زبان java معروف به jpos
  • دوتا پیاده سازی محیط .net هم داره که توی اینجا و اینجا پیدا میش

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

لذت برنامه نویسی یا برنامه نویسی بر بال ابرها با openshift

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

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

سرویس openshift که توسط غول دنیای متن باز redhat تاسیس شده و اتفاقا یه سرویس اولیه مجانی هم داره سعی میکنه بستر برنامه نویسی مورد نیاز رو در اختیار برنامه نویسان قرار بده و بعدش برنامه نویسی بتونن با استفاده از git نرم افزارهاشون بدون نگرانی در مورد بستری که قرار این نرم افزار رو اجرا کنه مورد آزمایش و تست قرار بدن.

اتفاقا پلتفرمهای پشتیباین شده تقریبا کامل هستند node.js، j2ee، python، django، perl، ruby، ruby on rails رو پشتیبانی میکنه و پایگاه داده‌هایی هم که داره  mySql، postgreSql و monogoDB هست. که تقریبا ۹۰ درصد نیازهای یک برنامه نویس رو پشتیبانی میکنه. اتفاقا چون از git هم برای نصب و راه‌اندازی  هر برنامه استفاده میشه نسخه‌های قبلی اون هم  نگه داشته میشه و این خودش بسیار خوبه.

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

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

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

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

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

خب راه حل‌های گوناگونی برای اینکار وجود داره. یکی از راه استفاده از سخت افزارهایی هست که برای این کار ساخته شده. mikrotik یا مسیریاب‌های اختصاصی شرکتهای دیگه که قابلیت loadbalancing رو دارند و معمولا با سام تجاری loadbalancing router شناخته میشن این قابلیت رو داره.

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

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

خب راه حل هایی که من باهاشون مستقیما کار کردم zeroshell و pfSense هست که یکیشون یه لینوکسه یک دیگش هم یه freeBSD  هست. اما دیدم دوستان با استفاده از kerio و محصولات cisco اینکار رو انجام دادن. هردوی zeroshell و pfSense امکاناتی دارند که به راحتی کانفیگ میشن و این کار انجام میشه.

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

نسخه جدید pfSense منتشر شد

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

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

  • بروزرسانی نسخه freebsd به نسخه ۸.۳
  • پشتیبانی از نسخه ۶ پروتکل IP
  • بهبود واسط کاربری وب
تصویر

Persian Code Pages And An Open source converterمبدلهای فرمتهای فارسی با یک برنامه کدباز

با سلام

یکی از بزرگترین مشکلاتی که من در برنامه نویسی فارسی در زبان سی داشتم تبدیل کدپیجهای مختلف فارسی به یکدیگر است. معروفترین کدپیج همان ایرانسیستم است و مشکل وقتی پیش می آید که قرار است تبدیل از یونیکد و ویندوز ۱۲۵۶ به ایرانسیستم یا واژه نگار انجام شود. دلیل نیاز به این تبدیل عدم پشتیبانی زبان سی استاندارد از کارکترهای دو بایتی برای زبان فارسی(یونیکد) است. حالا در سیستم عاملهای جدید معمولا این مشکل با معرفی نوع داده ای wchar حل شده ولی این مشکل وقتی با سخت افزار خاصی که تنها از سی استاندارد پشتیبانی میکند بیشتر میشود.

یکی از راه حلها استفاده از روشهای گوسفندی(Brute-Force) است. یعنی تبدیل با نوشتن حجم زیادی کد برای رفع این مشکل. تفریبا هیچ راه حل دیگری وجود ندارد اما نرم افزار کد بازی به زبان جاوا وجود دارد که حجم زیاد از کد را نوشته و تنها نیاز به تبدیل کد از جاوا به سی است.

این نرم افزار(فارسیدو) را میتوان از سایت آقا هومن برادران دانلود کرد. آدرس این سایت در زیر آمده است.

http://farsido.hoomanb.com/

پ.ن. دیدن خود سایت آقای برادران هم خالی از لطف نیست