درختی که آخر شهریور کاشتند، امروز میوهای گلدرشت داد…
پ.ن: مطمئنم چند سال دیگر هیچکس نمیداند امروز چه اتفاقی افتاد.
درختی که آخر شهریور کاشتند، امروز میوهای گلدرشت داد…
پ.ن: مطمئنم چند سال دیگر هیچکس نمیداند امروز چه اتفاقی افتاد.
گاهی اوقات لازم داریم تا متغیرهای ورودی در یک فرم را کمی دستکاری کنیم؛ مثلا رمز عبور دریافتی از کاربر را تبدیل به یک رمز برگشتناپذیر کنیم که MD5 یکی از معروفترین آنهاست. جاوا اسکریپت به صورت پیشفرض دستوری برای این کار ندارد اما با افزودن این تابع به کدها میتوانید این قابلیت را اضافه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
function md5(inputString) { var hc="0123456789abcdef"; function rh(n) {var j,s="";for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} function ad(x,y) {var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} function rl(n,c) {return (n<<c)|(n>>>(32-c));} function cm(q,a,b,x,s,t) {return ad(rl(ad(ad(a,q),ad(x,t)),s),b);} function ff(a,b,c,d,x,s,t) {return cm((b&c)|((~b)&d),a,b,x,s,t);} function gg(a,b,c,d,x,s,t) {return cm((b&d)|(c&(~d)),a,b,x,s,t);} function hh(a,b,c,d,x,s,t) {return cm(b^c^d,a,b,x,s,t);} function ii(a,b,c,d,x,s,t) {return cm(c^(b|(~d)),a,b,x,s,t);} function sb(x) { var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i<nblk*16;i++) blks[i]=0; for(i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8); blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; } var i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d; a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819); b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426); c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416); d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162); a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290); b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632); c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691); d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848); a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961); b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784); c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558); d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556); a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632); b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222); c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487); d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651); a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905); b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606); c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359); d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649); a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259); b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd); } return rh(a)+rh(b)+rh(c)+rh(d); } |
هوا بدجوری بوی پاییز میدهد. دوباره یاد پاییز و مهر و مدرسه افتادهام، به خصوص شهید قدوسی و سال آخرش!
یاد اتاق SQR و ربات و ماجراهایش…
الهی لیت شعری اناظر الی فی خلواتی ام معرض عنی…
همانطور که میدانید سیشارپ مفهومی به نام Queue یا صف دارد که میتوان آن را برای انواع متغیرها ساخت، در آن مورد جدیدی Enqueue کرد و سپس در یک چرخه تک تک Dequeue کرده و استفاده کرد؛ ساختار آن به صورت FIFO است.
در یکی از پروژهها نیاز داشتم تا اگر کاربر کاری را انجام داد تعدادی دستور یکی پس از دیگری انجام شود. ممکن بود کاربر پشت سر هم آن کار را انجام دهد و در این حالت نرم افزار تا پایان پردازش تمام دستورات قفل میکرد. در فکر این بودم که چقدر خوب بود اگر میشد به جای متغیر، دستورات یا همان متدها را وارد یک صف میکردیم تا یکی یکی اجرا شوند؛ کمی در موردش جستجو کردم که آیا میشود؟ و میشد 🙂
یکی از انواع متغیر در سیشارپ Action است. در توضیح آن آمده:
Encapsulates a method that has no parameters and does not return a value
یک متدی که پارامتری ندارد و مقداری را برنمیگرداند را در خود ذخیره میکند
حقیقا از اینکه دیدم سیشارپ چنین قابلیتی دارد هم به شدت تعجب کردم هم خوشحال شدم (سی یاد بگیر! با تو باید const char* رو هم دستی به char* تبدیل کنم! 😒). با کمی تلاش این فرمول به دست آمد:
1 |
Queue<Action> myQueue = new Queue<Action>(); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var myBW = new BackgroundWorker(); myBW.DoWork += (s, o) => { while (true) { if (myQueue.Count > 0) { Action action = myQueue.Dequeue(); // Get last action action(); // Calls that action } } }; myBW.RunWorkerAsync(); |
1 2 3 4 |
myQueue.Enqueue(() => { System.Threading.Thread.Sleep(1200); }); |
أَشَدُّ مِنْ يُتْمِ الْيَتِيمِ الَّذِي انْقَطَعَ عَنْ أُمِّهِ وَ أَبِيهِ يُتْمُ يَتِيمٍ انْقَطَعَ عَنْ إِمَامِهِ وَ لَا يَقْدِرُ عَلَى الْوُصُولِ إِلَيْهِ وَ لَا يَدْرِي كَيْفَ حُكْمُهُ فِيمَا يُبْتَلَى بِهِ مِنْ شَرَائِعِ دِينِهِ
سخت تر از یتیم جدا شده از مادر و پدر، یتیمی است که از امامش جدا شده و توانایی دستیابی به وی را ندارد. و حکم امامش را درباره مسائل دینی مورد ابتلا نمیداند…
1 2 3 |
Properties.Settings.Default[settingName] = Properties.Settings.Default.Properties[settingName].DefaultValue; Properties.Settings.Default.Save(); |
در حالت عادی یک سرور به گونهای تنظیم شده است که ارتباطات عادی HTTP را روی پورت 80 و HTTPS را روی پورت 443 ارائه دهد؛ مرورگرهای وب هم با همین پیشفرض کار میکنند و به همین دلیل اغلب اوقات آدرس وبسایتها چیزی شبیه به example.ir دیده میشود، نه example.ir:80 و نه https://example.ir:443 (در حالی که هر دو به یک آدرس اشاره دارند).
اما گاهی نیاز داریم تا از چند پورت در کنار هم استفاده کنیم و پورت HTTPS ما غیر از 443 باشد؛ در این صورت میتوانیم به صورت زیر عمل کنیم (سرور Ubuntu 22.04 LTS – آپاچی 2.4 و LetsEncrypt-CertBot):
ابتدا تنظیمات سایت در آپاچی را باز میکنیم:
1 |
sudo nano /etc/apache2/sites-enabled/000-default.conf |
حالا این بخش را به تنظیمات فعلی اضافه میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... <IfModule mod_ssl.c> <VirtualHost *:446> ServerName example.ir DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.ir/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.ir/privkey.pem </VirtualHost> </IfModule> ... |
سپس تنظیمات پورتها را باز میکنیم:
1 |
sudo nano /etc/apache2/ports.conf |
پورت دلخواهمان را در آن قرار میدهیم:
1 2 3 4 5 6 7 8 9 |
Listen 80 #Our Normal Port <IfModule ssl_module> Listen 470 </IfModule> <IfModule mod_gnutls.c> Listen 470 </IfModule> |
در انتها آپاچی را ریاستارت میکنیم:
1 |
sudo service apache2 restart |
تنظیمات یا Settings در پروژههای سیشارپ لیستی از متغیرها هستند که علاوه بر تنظیم اولیه، در صورت تغییر در حین برنامه به صورت ماندگار ذخیره میشوند و با بستن برنامه از بین نمیروند؛ به همین دلیل روشی سریع و آسان برای ذخیره تنظیمات کوچک برنامه هستند.
گاهی اوقات لازم است در (مثلا یک فرم ثبتنام) برنامه چند TextBox را طوری نمایش دهیم که چند متغیر در آنها دیده شود و کاربر بتواند آنها را ویرایش کند. همانطور که میدانید در رابط گرافیکی WPF مفهومی به نام BIND یا متصل کردن وجود دارد که به کمک آن بدون کدنویسی اضافه میتوان متغیرهایی را به عنوان محتوای یک عنصر قرار داد؛ برای اینکه یک Setting را در عنصر قرار دهیم کافیست این ویژگی را به Window اضافه کنیم:
1 |
xmlns:properties="clr-namespace:NAMESPC.Properties" |
دقت کنید که به جای NAMESPC نام namespace پروژه خودتان را قرار دهید.
حالا یک Source به نام properties:Settings.Default داریم که میتوانیم آن را bind کنیم؛ مثلا:
1 |
<TextBox x:Name="txt_address" Text="{Binding Source={x:Static properties:Settings.Default}, Path=set_serverAddress, Mode=TwoWay}"/> |
در Path نام تنظیم و در Mode حالت ارتباطی (که TwoWay یعنی اگر کاربر متن را تغییر داد آن تنظیم هم تغییر کند) قرار میگیرد.
دقت کنید که در صورتی که ارتباط دو طرفه استفاده میکنید حتما با دستور:
1 |
Properties.Settings.Default.Save(); |
از ذخیره شدن تنظیمات مطمئن شوید.