پسرم!
اگر بخواهم نتیجه چند سال فعالیت در زمینه الکترونیک (مشخصا این یک سال و خورده ای) را در یک جمله به تو بگویم، این است که: “منبع تغذیه (آداپتور) ارزان نخر پشیمان میشوی!”
پسرم!
اگر بخواهم نتیجه چند سال فعالیت در زمینه الکترونیک (مشخصا این یک سال و خورده ای) را در یک جمله به تو بگویم، این است که: “منبع تغذیه (آداپتور) ارزان نخر پشیمان میشوی!”
دستگاه به سفارش یکی از دوستان طراحی و نصب شد؛ احتیاج داشتند تا با عبور مشتری از درب اصلی، دستگاه زنگ را که در فاصله ۶-۷ متری از مکان اصلی قرار دارد را به صدا در بیاورد تا مشتری برای باز شدن درب داخلی معطل نشود.
دوستان ما نباید فرصتهای گرانبهای زندگی و وقت ارزشمند خود را به دشمنی با یکدیگر تلف کنند.
امام رضا (ع)
فلانی، غیبت همان واقعیت است. اگر واقعیت نبود که تهمت بود!
فرض کنید داخل پرونده Xaml تان دو SolidColorBrush تنظیم کرده اید و قصد دارید در طول برنامه سی شارپتان رنگ پس زمینه یک عنصر را بین آن دو جابجا کنید؛ اگر در اینترنت مقداری بگردید، اکثرا این کد را به شما پیشنهاد می کنند:
1 |
myElement.Background = this.Resource[key]; |
اما این کد باعث می گردد تا مقدار آن SolidColorBrush تنها در لحظه محاسبه شده و تنظیم گردد؛ در حالی که ما نیاز داریم تا اگر مقدار SolidColorBrush را تغییر دادیم رنگ اجزای استفاده کننده از آن نیز به صورت خودکار تغییر کنند.
پس از مقداری جستجو به کد های زیر رسیدم:
در XAML:
1 |
<Grid x:Name="myElement" Background="{DynamicResource key}"/> |
در C#:
1 2 |
myElement.SetResourceReference(Grid.BackgroundProperty, "key"); // Grid صفت عنصر ماست (Border,Button,...) |
گاهی اوقات قصد داریم تا پرونده ای را از یک نشانی خشک فراخوانی کنیم (مثل C:/Folder/File.jpg)؛ گاهی اوقات پرونده ما در کنار فایل exe برنامه قرار گرفته که آن هم روش خودش را دارد اما گاهی اوقات می خواهیم از پرونده هایی که در خود سلوشن قرار داده ایم استفاده کنیم.
کد زیر را چندین بار به دست آورده بودم اما فراموش می کردم؛ با شما به اشتراک می گذارم تا خودم هم فراموش نکنم:
1 2 |
myImage = new BitmapImage(new Uri(@"pack://application:,,,/" + Assembly.GetCallingAssembly().GetName().Name + ";component/" + "pics/bahar.jpg", UriKind.Absolute)); img_sidebar.ImageSource = myImage; |
ویرایش ۲۳ خرداد ۱۴۰۱: اگر در اسم پروژه از فاصله استفاده شده باشد آن GetName کار نمیکند! فعلا اسم پروژه را دستی وارد کردم…
ویژوال استدیو 2019 پس از چندین ماه در دوم آوریل 2019 به صورت رسمی منتشر شد و هم اکنون قابل دریافت می باشد.
جهت فعالسازی نسخه های Professional و Enterprise آن می توانید از شماره سریال های زیر استفاده نمایید:
Visual Studio 2019 Enterprise
BF8Y8-GN2QH-T84XB-QVY3B-RC4DF
Visual Studio 2019 Professional
NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y
بروزرسانی:
Visual Studio 2022 Enterprise
VHF9H-NXBBB-638P6-6JHCY-88JWH
Visual Studio 2022 Professional
TD244-P4NB7-YQ6XK-Y8MMM-YWV2J
اگر مقداری درگیر فعالیت های کامپیوتری شده باشید (غیر از بازی کردن! ?) نیازی به گفتن نیست که بسیاری از سرویس های مطرح اینترنتی و یا وبسایت های آنها اجازه ی ورود به ما نمی دهند و به اصطلاح تحریممان کرده اند! بعضی سایت ها مانند اوراکل یا ادوبی که حتی زحمت نکشیده اند صفحه ی اعلام عدم اجازه عبور درست کنند و کلا صفحه ی سفید نشانمان می دهند!
خلاصه، برای دور زدن تحریم ها هر کسی کاری می کند؛ یکی سرور خارجی می خرد، یکی چیز پی ان(!)، یکی قند-#شکن! و…
اما جدیدا با سرویسی آشنا شده ام که علاوه بر رایگان بودن، سرعت بسیار بالایی هم دارد انگار که اصلا دور زدنی در کار نیست!
شکن، نام این سرویس جالب ایرانی است که تنها با تنظیم دو آدرس DNS در تمامی دستگاه ها فعال شده و در آدرس های خاصی که از پیش گزارش شده اند تحریم را مثل آب خوردن دور می زند! نکته مثبت آن این است که غیر از تنظیم DNS احتیاج به تنظیم پرا-کسی در نرم افزار های همان سرویس های تحریم کننده ندارد (مثل نرم افزار مدیریت اس دی کی اندروید)…
چند وقتی بود که دنبال ساخت نرم افزاری برای تنظیم و پاک کردن DNS های شکن بودم. هرچند تنظیم DNS کار ساده ایست اما هربار تنظیم و برداشتن آن زمانبر است؛ خصوصا که مسیر بسیار بد دستی هم دارد (?) و میانبری هم با جستجو در استارتِ ویندوز10 بالا نمیآید. به همین خاطر دست به کار شدم تا نرم افزاری بسازم که با استفاده از C# و رابط کاربری WPF امکان تغییر DNS را به کاربر بدهد.
در این نرم افزار که به رایگان در گیت هاب منتشر شده است (و میتواند برای افرادی که به دنبال کد های تغییر dns در ویندوز به وسیله C# wpf هستند بسیار مفید باشد)، میتوانید با فشردن یک کلید DNS ویندوز خود را بر روی آدرس های شکن قرار داده با با فشردن دوباره همان کلید آنها را پاک کرده و به حالت اول برگردانید.
صفحه ی برنامه در آزمایشگاه ابر
روبی ویتا
یادم می آید از زمانی که روی ربات روبی کار میکردم به فکر ساخت نسخه ای کودکانه برای آن بودم؛ شایدم هم نه، از قبل تر! زمانی که آقای نیرومند به من گفت:
…خلاصه، میخوام بگم اون زحمتی که میخوای بکشی شاید کاربرد زیادی نداشته باشه.
اما چیزی که پیشنهاد میکنم انجام بدی، طراحی Robi هست که در مطلب اخیر صحبت کردم.
اگر بتونی اون رو در حد یک روبات ۱۰ سانتی متری کوچیکش کنی و چیزی شبیه به عروسک نمادِ آندروید کنی، عالی میشه.
به خصوص اگر بتونی حداقل در مراحل بعد یک ماژول Wi-Fi هم روش بذاری که بتونه بیسیم دستور بگیره، دیگه فوقالعاده میشه.
ما میخواهیم Robi روباتی باشه که از یک خط فرمان، دستوراتی رو که ضمیمه کردم (و منتشرش نکن) دریافت و اجرا کنه.
میتونی این پروژه رو پیگیری کنی؟
و من در جوابش فرستاده ام:
برای روبی هم، راستش من خودم برای خودم داشتم روی یه برد ایرانی آردوینویی کار میکردم با یه محیط برنامه نویسی شبیه اسکرچ به نام ماجراجو؛ ولی روبی هم چیز خوبیه و میتونم روش کار کنم.
چند وقتی بود که در فکر ساخت یک محیط برنامه نویسی ساده شده بودم؛ شبیه اسکرچ کودکان؛ با الهام از خط زمانِ برنامه های تدوین فیلم که تکه ها در یک خطر قرار می گیرند و به ترتیب اجرا می شوند. نمونه ی اولیه خیلی افتضاح بود 😀 به قدری که هنوز خط زمان را تکمیل نکرده پاکش کردم!
در حین کار روی نسخه بتای روبی، روی رابط کاربری نسخه ای خاص از محیط برنامه نویسی ماجراجو (محیطی که با سیشارپ برای برنامه نویسی و اجرای دستورات ساده و مخصوص روبی روی آن به وسیله بلوتوث ساخته بودم) که مناسب برای کودکان باشد. با الهام از سادگی دستورات ماجراجو، دستورات ماجراجو کودکان (نسخه پرتقال ?) هم ساده تنظیم شد و برای آنکه هر دستور برای کودکان به راحتی قابل شناسایی باشند از کلمات در آن استفاده نشد (این اتفاق برای استفاده از بازی در زبان های دیگر هم این مزیت را به بار می آورد).
این طرحی بود که 30 شهریور 96 (یک روز مانده به محرم) موقع تحویل روبی به آقای نیرومند نشان دادم و خوششان آمد:
بعد از اتمام روبی بتا کار روی ساخت نسخه کودکان آن شروع شد؛ برآورد اولیه این بود که بازی تا بهمن ماه به انتشار برسد. طراحی نوار زمانی که چینه ها را روی آن بتوان چید کار سختی بود که تابحال انجام نداده بودم و چالش من در طراحی بازی بود…