حروف عربی/فارسی که با هم اشتباه گرفته می‌شوند

در برنامه‌نویسی رایانه و کار با داده‌ها و پایگاه‌های داده (از دیتابیس‌های ساده مانند اکسل تا داده‌های عظیم کشوری) یکی از چالش‌ها برای زبان فارسی، این است که تعدادی حرف با شکل نمایشی یکسان یا مشابه اما با شناسه یونیکد متفاوت وجود دارد که ممکن است به جای یکدیگر استفاده شوند.

یکی از مثال‌های معروف آن «ي» و «ی» هستند که اولی یای عربی است و چون زودتر از یای فارسی وارد کدپیج‌های سیستم‌عامل‌ها و چینش کیبوردها شده است، تقریبا در تمام داده‌های قدیمی به جای آن به کار رفته است. متاسفانه بعد از معرفی یونیکد 1.1 (ژوئن 1993) هم که هر دو حرف در آن معرفی شدند، به دلیل آنکه بعضی فناوری‌های قدیمی مثل فلش و جاوا هیچگاه درست یای فارسی را پشتیبانی نکردند، بسیاری از داده‌ها با این حرف ثبت شده است یا می‌شود.

و حالا مشکل این به‌کارگیری جابجای حروف هم‌شکل چیست؟ خب، متاسفانه یا خوشبختانه منطق رایانه شباهت ظاهری را نمی‌فهمد و حروف مشابه را از هم کاملا جدا می‌داند. حالا فرض کنید یک پایگاه داده از نام و نام خانوادگی افراد دارید و می‌خواهید کاربر نامی را به نرم‌افزار بدهد و در پایگاه داده جستجو کند. کاربر می‌نویسد «علی» و آن را جستجو می‌کند اما هیچ نتیجه‌ای پیدا نمی‌شود! چرا؟ چون کارمندی که نام‌ها را وارد کرده بود از یک سیستم پنتیوم با ویندوز 98 و فارسی‌ساز پارسا 99 استفاده می‌کرده که کیبورد فارسی آن فقط «ي» داشته 😂 پس «علی» نداریم بلکه «علي» داریم که از نظر حروفی با هم فرق دارند…

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

ادامه‌ی مطلب

تبدیل String عدد ممیزدار به Int و بلعکس در سی‌شارپ

برای تبدیل متغیر Stringای که حاوی یک عدد است از دستور int.parse()‎ استفاده می‌کنند؛ اما اگر عدد حاوی تعدادی ممیز (یا کاما) باشد این دستور خطا خواهد داد.

برای تبدیل اعداد ممیزدار، می‌توان پارامتر NumberStyles.AllowThousands را به دستور int.parse()‎ اضافه کرد.

حالا اگر بخواهیم یک متغیر عددی را به صورت متنی ممیزدار نمایش بدهیم چه؟ برای این کار می‌توان از دستور String.Format()‎ و قالب {0:N0} استفاده کرد تا عدد به صورت 3 رقم 3 رقم ممیزدار شود.

 

چرا SSID و رمز مودم DLink M920 بعد از ریست فکتوری شبیه مشخصات پشت مودم نیست؟

یک مودم DLink DWR-M920 به دستم رسید که نیاز به ریست فکتوری و تنظیم دوباره داشت. بعد از ریست فکتوری دیدم که نام وای‌فای شبیه مشخصات برچسب پشت مودم نیست و به «dlink-m920-96c1» تبدیل شده است. با کمی بررسی متوجه شدم این نام SSID، عمومی این سری از مودم‌های دی‌لینک (و رمز آن 1234567890) است که می‌توانید با این مشخصات متصل شوید.

برای ورود به پنل تنظیمات هم از طریق 192.168.0.1 با نام کاربری و رمز عبور «admin» وارد شوید (رمز عبور ممکن است خالی یا «password» هم باشد).

شاید شما به JQuery نیاز نداشته باشید!

طراحان وب اغلب با کتابخانه‌ی JQuery آشنا هستند؛ این کتابخانه با آماده کردن دستوراتی بسیار کوتاه در زبان جاوا اسکریپت، به طراحان وب کمک می‌کند تا بدون نیاز به نوشتن دستورات پیچیده، وب‌سایت‌های پویا و غیر ثابت طراحی کنند.

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

در همین زمینه وب‌سایت You Might Not Need jQuery با ارائه‌ی جایگزین‌های بومی هر دستور جی‌کوئری در زمینه‌های مختلف (AJAX، افکت‌ها و…)، به توسعه‌دهندگان کمک می‌کند تا وب‌سایت خود را سبک‌تر طراحی کنند.

 

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

جی‌کوئری لازم نیست (nojquery.ir)

استفاده از رایانه‌ی دیگر در شبکه برای پردازش نرم‌افزار (معرفی و کار با RemoteApp)

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

RemoteApp چیست؟

RemoteApp اولین‌بار توسط مایکروسافت و در ویندوزهای Windows 7 و Windows Server 2008 R2 معرفی شد. این قابلیت بر مبنای RDP یا همان پروتکل ریموت دسکتاپ معروف ویندوز طراحی شده و به کاربران یک شبکه این امکان را می‌دهد تا به جای اتصال به دستگاه دیگر و نمایش تمام‌صفحه، یک نرم‌افزار را در آن دستگاه باز کرده و پنجره‌ی آن را مانند یک نرم‌افزار محلی در دستگاه خود ببیند و با آن کار کند.

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

راه‌اندازی RemoteApp برای نرم‌افزارها

در صورتی که از ویندوز سرور در یک فضای کاری استفاده می‌کنید، می‌توانید طبق آموزش موجود در وب‌سایت مایکروسافت شروع به کار کنید؛ برای این کار میبایستی ابتدا یک سرور RD Web Access را راه‌اندازی کرده باشید.

روش ساده‌تر، استفاده از RemoteApp Tool

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

روند کاری بسیار ساده است؛ ابتدا با زدن دکمه‌ی «+» یک نرم‌افزار را وارد لیست کنید و سپس با زدن دکمه‌ی «Create Client Connection» یک میانبر RDP ایجاد کنید. با اجرای میانبر در رایانه‌های هدف، نام کاربر در رایانه‌ی اصلی پرسیده شده و چندبار هشدار امنیتی داده می‌شود (که چیز مهمی نیست). در نهایت کمی منتظر بمانید تا نرم‌افزار اجرا شود…

نکته‌ی جالب اینکه در این نرم‌افزارها، هم درایوهای سرور و هم کلاینت (به صورت Map Drive شده) در لیست درایوها مشاهده می‌شوند.

 

ویندوز قابلیت جالب دیگری به نام MultiPoint دارد؛ یادم باشد که آن را هم بررسی کنم…

تبدیل پیام‌های ماژول سیم‌کارت به متن عادی با جاوا اسکریپت

در قسمت ۱۸+۱ از مجموعه آموزشی آردوینو با محوریت اینترنت اشیاء یاد گرفتیم که پیام‌ها در استاندارد GSM (مانند پیامک و پاسخ‌های کدهای دستوری USSD) به صورت پیش‌فرض با رمزگذاری ASCII هفت بیتی رد و بدل می‌شوند. در صورتی که از حروف دیگری در پیام‌ها استفاده شود، میبایستی به وسیله دستورات AT مربوطه، وضعیت کدپیج را روی حالت دیگری تنظیم کرد تا پیام به درستی منتقل شود.

مناسب‌ترین کدپیج ماژول‌های سیم‌کارت در حال حاضر برای حروف یونی‌کد، UCS-2 است. UCS-2 در واقع همان UTF-16 است که (مثل اوایل ایجاد UTF-16) به صورت ۲ بایتی ثابت، ۶۵,۵۳۶ حرف ابتدایی جدول یونی‌کد را پوشش می‌دهد.

ماژول‌های سیم‌کارت پیام‌های یونی‌کدی را به صورت Hex می‌گیرد و ارسال می‌کند؛ یعنی مثلا «0645» به جای «م» در جدول یونی‌کد.

در پروژه‌ای نیاز بود تا میزان شارژ از طریق USSD گرفته شده و (از آنجایی که هر اپراتور متن تصادفی خودش را نشان می‌دهد 😄) متن پاسخ در صفحه وب به کاربر نمایش داده شود. تابع زیر که به زبان جاوا اسکریپت نوشته شده، ورودی Hex را به متن عادی تبدیل می‌کند:

نکته مهم در این تبدیل این است که محتوای هگزی که ماژول‌های سیم‌کارت بر می‌گردانند به صورت غیر Byte-Swap است (بایت سواپ یعنی بایت‌ها جابجا هستند؛ یعنی اگر هر حرف ۲ بایت باشد، ابتدا بایت دومی و سپس بایت اولی قرار می‌گیرد). مثلا در تبدیل متن زیر:

064506270646062F0647002006270639062A0628062706310020062F06310020063306270639062A003A002006F006F9003A06F406F2000D000A06F106F006F006F006F006F00020063106CC062706440020000D000A06F1002D062E063106CC062F00200634062706310698000D000A000D000A06F906F9002D06280627063206AF0634062A

در صورتی که رمزگشایی به صورت Byte-swap باشد تبدیل خراب خواهد شد:

‘䔆✆䘆⼆䜆 ✆㤆⨆⠆✆ㄆ ⼆ㄆ ㌆✆㤆⨆㨀 句㨀ഀ਀ ㄆ찆✆䐆 ഀ਀ⴀ⸆ㄆ찆⼆ 㐆✆ㄆ順ഀ਀ഀ਀句句ⴀ⠆✆㈆꼆㐆⨆’

در حالی که حالت غیر Byte-Swap به صورت صحیح رمزگشایی می‌شود:

مانده اعتبار در ساعت: ۰۹:۴۲

۱۰۰۰۰۰ ریال

۱-خرید شارژ

 

۹۹-بازگشت

 

یک ترفند: اگر نمی‌دانید ماژول سیم‌کارت پیام را به صورت ASCII می‌فرستد یا یونی‌کد، باقیمانده تقسیم تعداد حروف پیام بر ۴ را بگیرید؛ اگر ضریب ۴ بود احتمال قوی یونی‌کد است و اگر نبود ۱۰۰٪ یونی‌کد نیست!

تبدیل JSON به XLS در جاوا اسکریپت

با استفاده از این تابع می‌توان ورودی JSON با عمق 2 شئ داخلی را به یک پرونده XLS (همان TAB Separated Values) تبدیل و دانلود کرد:

 

چطور با جاوا اسکریپت، یک svg را به صورت png دانلود کنیم؟

در یکی از پروژه‌ها نیاز بود تا کاربر بتواند یک تصویر svg را به صورت png دانلود کند (! نیازه دیگه چه میشه کرد!😁)؛ با مقداری تحقیق و بررسی و ترکیب تعدادی کد با یکدیگر به این کد رسیدم:

روش کار کد به صورت خلاصه این است که ابتدا svg در یک متغیر ذخیره شده و سپس یک canvas نامرئی ساخته می‌شود؛ در ادامه تصویر svg درون canvas رسم شده و در نهایت با ترفندِ ساخت لینک مخفی و کلیک مصنوعی، تصویر برای کاربر دریافت می‌شود.

  • ابعاد canvas بر مبنای ابعاد svg تنظیم می‌شود. برای اینکه تصویر زیادی کوچک نباشد، عرض و ارتفاع تصویر در 5 ضرب شده است که می‌توانید آن را تغییر دهید.
  • برای اینکه پس‌زمینه تصویر نهایی نامرئی نباشد، ابتدا یک مستطیل سفید در ابعاد کل canvas رسم شده (
    ctx.fillRect) و سپس تصویر svg رسم می‌شود.

چگونه در CSS فقط به عناصر RTL استایل بدهیم؟

گاهی اوقات نیاز داریم تا در یک صفحه HTML که هم عناصر راست به چپ (RTL) و هم چپ به راست (LTR) از یک نوع وجود دارند، به هر دسته ویژگی خاصی بدهیم؛ مثلا دو جدول داریم که یکی باید از سمت راست نمایش دهد و دیگری از سمت چپ.

در این حالت می‌توانیم مانند مثال زیر که برای کلاس table است، حالت خاص را در ادامه‌ی ذکر نام Class آن عنصر ذکر کنیم:

دقت کنید که direction ممکن است به صورت “direction: rtl” و یا “direction:rtl” نوشته شود، پس نوشتن هر دو حالت برای جلوگیری از مشکل در آینده توصیه می‌شود (چرا واقعا خودش تشخیص نمیده؟ 🤔)

نصب داکر روی اوبونتو ‎22.04 LTS

همانطور که می‌دانید (یا شایدم نمی‌دانید 😁) مخزن اصلی سرویس Docker ایران و تعدادی از کشورهای دیگر را تحریم کرده و امکان نصب مستقیم از آن وجود ندارد؛ با این حال کسی با این مسخره‌بازی‌ها نمی‌تواند جلوی ماها را بگیرد ?. من دو روش برای رفع این مشکل پیدا کرده‌ام:

  1. استفاده از مخزن‌های آینه (یا موازی یا همان Mirror): با گشتن mirrorهای سرور داکر می‌توان چیزهای خوبی پیدا کرد؛ مثلا اینجا مخزن خودش را با آموزش قدم به قدم ارائه داده.
  2. استفاده از سرویس «شکن»: «شکن» نام یک سامانه دورزننده‌ی سایت‌های تحریم شده است که از طریق DNS «فقط» سایت‌های تحریم شده را دور زده و مثل سایت‌های عادی ارائه می‌دهد. پیش از این یک نسخه غیررسمی برای ویندوز آن را ساخته بودم اما اینجا لینوکس است و کار به همین راحتی نیست! مخصوصا اگر رابط گرافیکی‌ای در دسترس نباشد (مثل سرورها)…

بعد از مقداری گشتن متوجه شدم که ابزاری به نام NMTUI و NMCLI در بعضی از توزیع‌ها (مثل اوبونتو) وجود دارد که نسبتا کار را راحت کرده.

تعویض DNS با nmtui

1- ابتدا وارد nmtui شوید:

2- گزینه «Edit a connection» را انتخاب کنید:

3- اتصال موردنظر (که معمولا همان تک گزینه‌ی زیرمجموعه Ethernetهاست) را انتخاب کنید، به سمت راست بروید و Edit را انتخاب کنید:

4- بخش «IPv4 CONFIGURATION» را «show» کنید، به بخش «DNS servers» بروید و DNSهای شکن را «Add» کنید. در نهایت از پایین صفحه «OK» را بزنید و به صفحه قبلی برگردید:

5- حالا برای اعمال تغییرات:

اگر به صورت مستقیم به دستگاه متصل هستید به صفحه اصلی برگردید و با وارد شدن به بخش «Activate a connection» و انتخاب شبکه، آن را یکبار «غیرفعال» و دوباره «فعال» کنید:

هشدار: اگر از راه دور به دستگاه وصلید، روش بالا باعث می‌شود که اتصال شما قطع شده و دیگر شبکه‌ای در کار نیست که بخواهید از طریق آن، آن را وصل کنید (شنیدید میگن یکی بر سر شاخه بُن می‌بُرید؟ 😂)! در این حالت مرحله آخر روش nmcli را ببینید.

تعویض DNS با nmcli

1- ابتدا لیست ارتباطات شبکه را گرفته و UID شبکه مورد نظر را کپی می‌کنیم:

2- حالا dnsهای شکن را تنظیم می‌کنیم:

3- می‌توانیم دریافت dns خودکار را خاموش کنیم (برای من خیلی فرقی نداشت):

4- حالا باید شبکه را خاموش و دوباره روشن کنیم. برای اینکه به مشکل قبل نخوریم می‌توانیم از دستور زیر استفاده کنیم:

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

ارتباط SSH قطع شده و بعد از چند ثانیه دوباره قادر به ارتباط خواهیم بود…

برای اطمینان از تنظیم DNS، می‌توان دستور زیر را اجرا کرد: