<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های hadi mirzaie</title>
        <link>https://virgool.io/feed/@hadimirzaie</link>
        <description>مسترربیت هستم برنامه نویس، طراح سایت، علاقه مند به بلاک چین  ... میخونم و گاهی مینویسم و شاید سخت ترین کار دنیا رو هم گاهی انجام بدم ... می اندیشم !!!!</description>
        <language>fa</language>
        <pubDate>2026-04-15 01:18:48</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1276525/avatar/7ASQwq.png?height=120&amp;width=120</url>
            <title>hadi mirzaie</title>
            <link>https://virgool.io/@hadimirzaie</link>
        </image>

                    <item>
                <title>رمزنگاری هیبرید در برنامه نویسی (hybrid cryptosystem)</title>
                <link>https://virgool.io/@hadimirzaie/hybrid-cryptography-in-php-zckqrdfz7m0b</link>
                <description>رمزنگاری هیبرید به گونه ای از رمزنگاری دو مرحله ای گفته می شود که با استفاده از  یک جفت کلید ثابت و کلیدهای متغیر، دست به رمزنگاری و رمزگشایی می زند.  روش انجامش چندان سخت نیست و موارد استفاده ش بسیاره. یکی از موارد استفاده این نوع رمزنگاری، استفاده در اپ های pwa هست. این اپ ها جهت افزایش امنیت، داده های ورودی اپ رو جهت لاگین، دریافت میکنند، رمزنگاری می شوند و به سمت سرور فرستاده می شود، در سمت سرور رمزگشایی می شود.تلاش میکنم مرحله به مرحله توضیحش بدم تا مبحث به خوبی براتون روشن بشه و دیگه نیازی به توضیحات طولانی گنگ و مبهم نباشه.تصور کنید یک صفحه لاگین دارید شامل شماره تلفن و رمزعبور. این موراد ابتدا دریافت می شود و در کنار همدیگر به شکل string قرار میگیرند:&quot;989123457675MyPassword&quot;حالا ما باید چنین ترکیبی رو رمزنگاری کنیم بفرستیمش سمت سرور. در رمزنگاری هایبرید، ما در دو مرحله رمزنگاری میکنیم، مرحله اول استفاده از public key هست. یعنی چی؟ یعنی با استفاده از یک کلید هش شده عمومی، یک کلید متقارن رندوم رو رمزنگاری میکنیم. یک مثال از php میزنم براتون:$private_key = openssl_pkey_new();

openssl_pkey_export($private_key, $private_key_pem);

$public_key_details = openssl_pkey_get_details($private_key);

$public_key_pem = $public_key_details[&#039;key&#039;];

$public_key = openssl_pkey_get_public($public_key_pem);

$symKey = random_bytes(16);

openssl_public_encrypt($symKey, $encryptedSymKey, $public_key);

return base64_encode($encryptedSymKey);
خب توی کد بالا ما اومدیم چکار کردیم؟ اومدیم ابتدا کلید خصوصی مون رو ساختیم، بر مبنای اون کلید خصوصی، به کلید عمومی دسترسی پیدا کردیم. سپس یک کلید متقارن (symmetric key) 16 بایتی رندوم رو ایجاد کردیم. با استفاده از کلید عمومی مون، کلید سیمتریک رو رمزنگاری کردیم. حالا در ادامه باید اطلاعات فرم لاگین رو رمزنگاری کنیم بفرستیمش سمت سرور:$data = &#039;989123457675MyPassword&#039;
$hybCrypto = openssl_encrypt($data, &#039;aes-128-ecb&#039;, $encryptedSymKey, 0);از کلید سیمتریک رمزنگاری شده باید اینجا به عنوان کلید جدید استفاده کنیم تا داده ها فرم لاگین ما رمزنگاری بشه. این روند در دو مرحله صورت گرفت: رمزنگاری کلید رندوم 16 بایتی سیمتریک با استفاده از کلید عمومیرمزنگاری داده های لاگین با استفاده از کلید جدیدحالا اگر بخواهیم همین فرایند را رمزگشایی کنیم، با استفاده از کلید خصوصی، ابتدا باید کلید سیمتریک را رمزگشایی کنیم و سپس با استفاده از کلید رمزگشایی شده، به رمزگشایی داده های لاگین دست بزنیم. ما قبلا با استفاده از این قطعه کد openssl_pkey_export($private_key, $private_key_pem) ، کلید خصوصی را منتشر کردیم، شما میتوانید آن را در یک فایل ذخیره کنید جهت استفاده در موارد بعد.مثال از رمزگشایی داده های لاگین:openssl_private_decrypt($encryptedSymKey, $decryptedSymKey, $private_key);

$decrypted = openssl_decrypt($hybCrypto, &#039;aes-128-ecb&#039;, $decryptedSymKey, 0);

return $decrypted;حالا شما باید بتوانید به مقادیر رمزگشایی شده لاگین دسترسی پیدا کنید.با استفاده از این الگوریتم، شما انعطاف بیشتری در رمزنگاری دارید و سطح امنیت داده های شما نسبت به حالت عادی رمزنگاری بالاتر می رود.اگر نکته ای به نظرتون رسید حتما برام کامنت کنید ^__^</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Tue, 31 Oct 2023 21:58:28 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم Memoization در php ( افزایش سرعت اجرا با استفاده از caching )</title>
                <link>https://virgool.io/@hadimirzaie/memoization-in-php-swzha4jgycbv</link>
                <description>memoization in php اگر مدتی برنامه نویسی کرده باشید احتمالا مفهوم به خاطرسپاری یا Memoization به گوشتان خورده. اگر هم نشنیدید اشکالی نداره، مفهوم چندان پیچیده ای نیست، این مفهوم زیر مجموعه caching محسوب میشه، یک متد جهت افزایش سرعت و بهینه سازی در برنامه نویسی هست. زمانی که یک پروسه در کامپیوتر، بارها و بارها تکرار بشه، حجم زیادی حافظه (memory) را اشغال و resource مصرف میکند. منطقی ترین کار یک برنامه نویس، بهینه سازی برنامه هایش است. کاری که ما باید بکنیم اینه که از تکرار رویه های برنامه که ضروری نیست جلوگیری کنیم. حالا بیایید در عمل بهتون نشون بدم چطور میشه مانع از تکرار پروسه های تکراری شد. دنباله فیبوناچی رو در ریاضی که یادتون هست، هر عدد از مجموع دو عدد قبل از خود حاصل می شود که البته آغازگر آن 0 و 1 است. چیزی شبیه این: 0,1,1,2,3,5,8,13 و الی آخر. محاسبه چنین پروسه ای در زبان php برابر است با کد زیر:&lt;?php

function fibonacci($n) {

          if ($n &lt; 2) {
                   return $n;
           }

        $memoization= fibonacci($n - 1) + fibonacci($n - 2);
         return $memoization;
     }
خب مطابق بر دنباله فیبوناچی، کد بالا ابتدا در یک شرط چک میکند که عدد مورد نظر ما 0 و 1 است یا خیر. سپس بر مبنای ورودی، تا n عدد، دنباله فیبوناچی را محاسبه میکند. مثلا اگر بخوایم دنباله را تا 6 عدد محاسبه کنیم، عدد 6 به عنوان متغیر ورودی n$ به تابع داده می شود، سپس به شکل یک loop، دنباله فیبوناچی تکرار و محاسبه می شود. علت استفاده از n - 1 و n - 2 ، جمع عدد قبل با عدد بعد از خود است. در نهایت عدد نهایی برگشت داده می شود. حالا تصور کنید این پروسه شامل محاسبه تمامی اعداد از عدد مورنظر یعنی 6 تا عدد 0 و جمع عدد قبل و بعد است. نتیجه می شود عدد 8.خب تا اینجا که چیز عجیبی نیست، یک محاسبه ساده فیبوناچی، اما اگر بر فرض بخواهم زمان اجرا این محاسبه را اندازه بگیرم، چه کار میتوانم بکنیم؟ به روش زیر:&lt;?php 

$start_time = microtime(true);   // شروع محاسبه زمان

 function fibonacci($n) {   

     usleep(10000);  // ایجاد یک دیلی زمانی 1 ثانیه ای    
     if ($n &lt; 2) {              
           return $n;         
   }        

   $memoization= fibonacci($n - 1) + fibonacci($n - 2);      
    return $memoization;     
 }

$time_taken = microtime(true) - $start_time;
fibb(6); 
print(&amp;quot\n&amp;quot . $time_taken);
حالا یک بار دیگر برنامه را اجرا کنید تا ببینید مدت زمان اجرای برنامه شما چقدر است. چیزی حدود 1.7 ثانیه می شود. 1 ثانیه آن دیلی است که برای ملموس تر شدن فاصله اجرا داده شده است. تا اینجا هم مشکل زیادی دیده نمی شود. مشکل زمانی است که بخواهیم دنباله های بیشتری را محاسبه کنیم به طور مثال:fibb(6);
fibb(8);
fibb(10);حالا زمان اجرا اسکریپت چطور است؟ چیزی حدود 2.4 ثانیه شد. با افزایش دنباله های فیبوناچی، زمان محاسبه دنباله ها رشد پیدا میکند. دلیل؟ محاسبه تمام اعداد در تکرار هر تابع، از ابتدا صورت میگیرد. ما باید از تکرار این پروسه در هر تابع جلوگیری کنیم. چطور؟ با استفاده از caching. کانسپت caching، اشکال مختلفی دارد، شما میتوانید اطلاعات تکراری خودتون رو به شکل های مختلف ذخیره کنید تا در پروسه های تکراری قابل استفاده مجدد باشند. به 3 شکل میتونید caching بگیرید:1_ ذخیره در فایل های روی disk 2_ ذخیره در سشن memory 3_ ذخیره در فایل های روی memory یا همان tmpfsخب قرار نیست در مورد تک تک این ها توضیح زیادی بدم، دم دستی ترین روش رو استفاده میکنیم که احتمالا خیلی هاتون باهاش آشنا هستید، اطلاعات مون رو میریزم داخل یه آرایه ( ذخیره نوع دوم در memory ) و از طریق کلیدهای آرایه، میتونیم داده های تکراری را بازخوانی کنیم. حالا تابع بالا را مطابق با آن، بازنویسی میکنیم:&lt;?php

function fibbmem($n, &amp;$memo)
{
            usleep(10000);
            if ($n &lt; 2) {
                    return $n;
           }
          if (isset($memo[$n])) {
                         return $memo[$n];
            }

            $memo[$n] = fibbmem($n - 1, $memo) + fibbmem($n - 2, $memo);
            return $memo[$n];
}

$memo = [ ]; // ساخت آرایه خالی

$result1 = fibbmem(6, $memo);
$result2 = fibbmem(8, $memo);
$result3 = fibbmem(10, $memo);

$time_takenmem = microtime(true) - $start_timemem;  // محاسبه زمان اجرا
print_r($memo);
حالا بیایید نگاهی به این تابع بازنویسی شده بندازیم. ما مجموع دو عدد قبل و بعد هر مرحله را در آرایه ذخیره کردیم و عدد n$ را برابر با کلید آن قرار دادیم. عدد n در هر مرحله، یک واحد کم میشود تا به 0 ختم شود. زمانی که تابع دوم و سوم فیبوناچی بخواهند اجرا شوند، دیگر مجبور نیستند محاسباتشان را از اول انجام دهند، به این دلیل که مقادیر کش شده در آرایه ذخیره شده است کافی است در قسمت شرط با استفاده از isset چک کنیم ببینیم آیا مقدار محاسبه شده ما در آرایه موجود هست و تنها در صورتی که کش آن موجود نباشد، محاسبه انجام می شود و مقدار محاسبه شده در آرایه کش ذخیره میگردد.حالا اسکریپت را اجرا کنید و تفاوت را بسنجید. برای من شد 0.3 ثانیه، بستگی به عوامل دیگر هم دارد و محاسبه زمانی، دقیق و کامل نیست اما حتی به صورت نسبی هم دیدید که چه اندازه سرعت اجرا بالا رفت. حالا تصور کنید که دنباله فیبوناچی به صورت تصاعدی، محاسبه اش تا چه اندازه رشد میکند یا در شرایط داشتن دیتابیس های حجیم، تا چه اندازه چنین روش هایی می تواند برای ما مفید باشد.اگر سوالی در این باره داشتید در کامنت ها ازم بپرسید، پاسخ میدم ^__^</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Sat, 29 Jul 2023 10:47:10 +0330</pubDate>
            </item>
                    <item>
                <title>لیست 10 NFT پرفروش با استفاده از PHP و Infura</title>
                <link>https://virgool.io/@hadimirzaie/%D9%84%DB%8C%D8%B3%D8%AA-10-%D8%A7%D9%86-%D8%A7%D9%81-%D8%AA%DB%8C-%D9%BE%D8%B1%D9%81%D8%B1%D9%88%D8%B4-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-php-%D9%88-infura-kqnxcr7kf0mk</link>
                <description>اگر مقالات قبلی بنده را خونده باشید، متوجه خواهید شید که ورژن قبلی کتابخونه NFT history logs از تابع لاگ top-selling (پرفروش ترین ها) پشتیبانی نمیکرد. اما در آپدیت اخیر، تنها با یک خط کد، می توان به لاگ پرفروش ترین nft های یک قرارداد هوشمند دسترسی پیدا کرد.شما در 3 مرحله به 10 nft پرفروش دسترسی پیدا میکنید:1- ثبت نام در وبسایت infura2- تنظیم پروایدر برای کتابخانه nft history logs3- لیست 10 nft پرفروش با یک خط کدخب حالا چرا infura؟ Infura یکی از مناسبت ترین آپشن ها برای ارتباط برقرار کردن با شبکه اتریوم است که 100 هزار درخواست در طول روز را پشتیبانی می کند و خب قطعا پلن های پرمیوم هم دارد منتها همین پلن رایگان براای ما کافیه.ابتدا در وبسایت Infura ثبت نام کنید:سپس یک کلید API بسازید:گزینه WEB3 API را انتخاب کنید و یک اسم برای پروژه خودتون تعیین کنید:لینک شبکه اصلی اتریوم را کپی کنید، حواستون باشه که کلید API خودتون رو با کسی به اشتراک نذارید:حالا وقتشه بریم سراغ معجزه اصلی، ابتدا کتابخونه NFT history logs  رو با استفاده از دستور زیر نصب کنید:composer require nfthistory/nfthistorylogs dev-masterسپس به این شکل آن را وارد کنید:&lt;?php

require &#039;vendor/autoload.php&#039;

use Nft\History\nftHistory;آدرس قرار دادهوشمند مورد نظر خود را به همراه لینک پروایدر که کپی کرده بودید ست کنید:$contractAddress = &#039;0x00B3e138c6e4b233e5DDed8CfeD200f0c82B536c&#039;;

$provider = &#039;https://mainnet.infura.io/v3/&lt;YOUR API KEY&gt;&#039;;حالا از کتابخانه یک شی بسازید:$nfthistory = new nftHistory($contractAdress, $provider);حالا تابع ()topSellNfts را فراخوانی کنید تا هر تعداد NFT پرفروش یک قرارداد هوشمند را بتوانید برگردانید:$NftHistory-&gt;topSellNfts(&#039;multiThread&#039;, 10);در کد بالا، ما 10 NFT پرفروش یک قرارداد هوشمند را با یک خط کد ساده برگرداندیم. همچنین گزینه mode را برابر با multiTread قرار دادیم تا سرعت دسترسی به لاگ را افزایش دهیم. گزینه دوم را 10 قرار دادیم به معنی این که 10 nft پرفروش را برگرداند. این اپشن می تواند بنا به دلخواه متغیر باشد. خروجی تابع بالا:array(10) {

[0]=&gt;
string(4) &#039;0.40&#039;

[1]=&gt;
string(4) &#039;0.25&#039;

[2]=&gt;
string(4) &#039;0.21&#039;

[3]=&gt;
string(4) &#039;0.19&#039;

[4]=&gt;
string(4) &#039;0.15&#039;

[5]=&gt;string(4) &#039;0.12&#039;

[6]=&gt;
string(4) &#039;0.11&#039;

[7]=&gt;
string(4) &#039;0.11&#039;

[8]=&gt;
string(4) &#039;0.10&#039;

[9]=&gt;
 string(4) &#039;0.09&#039;

}همانطور که میبینید ما موفق شدیم 10 nft پرفروش یک قرارداد هوشمند را بر مبنای فرمت ether برگردانیم آن هم تنها با استفاده از یک تابع ساده. فقط حواستون باشه وقتی mode رو برابر با multiTread  میذارید به دلیلی درخواست bulk یا همون حجیم، ممکنه پروایدر، دسترسی شما را محدود یا مسدود بکنه. خوشبختانه شبکه infura چنین برخوردی نداره ولی احتمالا در مابقی موارد به مشکل بر بخورید. به جاش میتونید از روش singleThread استفاده کنید که بسیار کندتر اما مطمئن تر است. برای دسترسی به مابقی توابع از اینجااگر سوالی داشتید در کامنت میتونید ازم بپرسید.امیدوارم براتون مفید بوده باشه ^__^</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Sat, 15 Apr 2023 15:21:51 +0330</pubDate>
            </item>
                    <item>
                <title>رتبه بندی NFT ها بر مبنای میزان فروش با php</title>
                <link>https://virgool.io/@hadimirzaie/ranking-nfts-using-php-z6spybjr3asc</link>
                <description>Bored Ape NFTخب ما میدونیم NFT ها در لاگ اتریوم، تراکنش های با توکن آیدی خاص هستند. یعنی چی؟ یعنی ما به ازای هر توکن آیدی در قرار داد هوشمند، یک تراکنش Transfer وجود دارد که حاوی اطلاعات مختلف مرتبط با آن توکن خاص است. هر توکن، شامل مجموعه ای از لاگ های تراکنش Transfer است که هر تراکنش، مجموعه ای از log ها با event های مختلف را شامل می شود. کل ساختار لاگ اتریوم، یک آرایه چند وجهی است که ما به ازای هر توکن، می توان به اطلاعات زیر مجموعه آن دست یافت. یکی از این اطلاعات، اطلاعات value تراکنش های هر توکن است. این value، در فرمت WEI است که متعاقبا می تواند آن را به اتر تبدیل کنید. برای دسترسی راحت تر به لاگ های اتریوم در php، از کتابخانه Nft History Log استفاده میکنیم.ابتدا با استفاده از دستور زیر، اقدام به نصب این کتابخانه کنید: composer require nfthistory/nfthistorylogs v0.0.1سپس کتابخانه را وارد کنید:&lt;?php

require &#039;vendor/autoload.php&#039;

use Nft\History\nftHistory;
آدرس قرارداد هوشمند مورد نظر خود را تعیین کنید:$contractAddress = &#039;0x00B3e138c6e4b233e5DDed8CfeD200f0c82B536c&#039;;
$provider = &#039;https://cloudflare-eth.com&#039;;بنده از قرارداد هوشمند 0x00B3e138c6e4b233e5DDed8CfeD200f0c82B536c استفاده کردم که متعلق به The Boy who lost his mind Open Edition by Boss Logic است. تعداد 82 عدد NFT بر روی این قرارداد هوشمند وجود دارد و در این مقاله، قصد داریم پر فروش ترین NFT های این قرارداد را لیست کنیم. The Boy who lost his mind Open Edition by Boss Logic پروایدری که استفاده کردم، یک پروایدر مجانی از کلودفلر است. می توانید پروایدر خاص خودتان را با  API KEY اختصاصی، جایگزین کنید. در این مرحله، از کلاس nftHistory، یک شی بسازید:$nfthistory = new nftHistory($contractAdress, $provider);سپس تابع ()getAllTransferTrxHashAndIds را فراخوانی کنید:$trxHash = $nfthistory-&gt;getAllTransferTrxHashAndIds();این تابع، لیستی از تراکنش هش های نوع Transfer به تفکیک توکن آیدی، به ما می دهد.خروجی این تابع چیزی شبیه آرایه زیر است:$filterData = array_map(function($log) use($nfthistory){

                      return array_map(function($logs) use($nfthistory){

                                 $result = $nfthistory-&gt;getTrxByHash($logs);

                                if($result[&#039;value&#039;] !== &#039;0x0&amp;quot){

                                                  $logs = $result[&#039;value&#039;];
                                                  return $logs;

                                 }
                      },$log);

},$trxHash);
حالا ما مجموعه از توکن آیدی ها را داریم که هر کدام حاوی تراکنش هش های نوع Transfer یک NFT خاص هستند. عدد 19400010233 همان توکن آیدی است و مقدار string به طول 66 کاراکتر با فرمت hexadecimal هم همان تراکنش هش است. حالا ما از طریق این تراکنش هش، باید به قیمت معامله شده هر  توکن آیدی در آن تراکنش خاص دست پیدا کنیم. سپس تمامی این مقادیر متعلق به هر NFT را با هم جمع بزنیم و آن ها را رتبه بندی کنیم.پس بیایید این آرایه خروجی گرفته را فیلتر کنیم:array(82){
[19400010074]=&gt;
 array(4) {
    [0]=&gt;
    NULL
    [1]=&gt;
    NULL
    [2]=&gt;
    NULL
    [3]=&gt;
    string(17) &amp;quot&#039;0x12dfb0cb5e88000&amp;quot
  }
  [19400010323]=&gt;
  array(2) {
    [0]=&gt;
   NULL
    [1]=&gt;
    NULL
  }
}
...                    if($result[&#039;value&#039;] !== &amp;quot0x0&#039;&#039;){

                                                  $logs = $result[&#039;value&#039;];
                                                  return $logs;

                                 }
                      },$log);

},$trxHash);
در کد بالا، ابتدا با استفاده از array_map ، آرایه خود را درون یک حلقه انداختیم تا فیلترینگ را به صورت خروجی گرفته شده بر روی آرایه اعمال کنیم. در درون این حلقه، باز از طریق array_map حلقه درونی ایجاد کردیم تا به مقدار هر تراکنش هش در زیر مجموعه تکون آیدی دست پیدا کنیم. سپس با استفاده از کتابخانه  Nft History Log، تابع ()getTrxHash را فراخوانی میکنیم تا بتوانیم به مقدار معامله شده هر تراکنش دست پیدا کنیم.خروجی این تابع، یک آرایه چند وجهی است. ایندکس value برای ما اهمیت دارد زیرا مقدار hex جا به جا شده در فرمت WEI است. یک شرط هم میگذاریم که آن مقادیر صفر (0X0) نادیده گرفته شوند. در این مرحله، شما باید چیزی شبیه زیر، می شود خروجی کار شما:array(82){
[19400010074]=&gt;
 array(4) {
    [0]=&gt;
    NULL
    [1]=&gt;
    NULL
    [2]=&gt;
    NULL
    [3]=&gt;
    string(17) &#039;0x12dfb0cb5e88000&#039;
  }
  [19400010323]=&gt;
  array(2) {
    [0]=&gt;
   NULL
    [1]=&gt;
    NULL
  }
}
...همانطور که میبینید، کلیدهای این آرایه همان توکن آیدی های ماست که حفظ شان کردیم و مقادیر آن برابر است با قیمت تراکنش هر توکن. آن هایی که NULL هستند به معنی این است که فروخته نشدند یا جا به جایی شان برابر با صفر اتر بوده!حالا این آرایه فیلتر شده که حاوی قیمت فروش هر توکن آیدی در هر تراکنش است را دوباره فیلتر میکنیم به این شکل:$res = array_map(function($log) use($nfthistory){

                       $sum = array_sum(array_map(&#039;hexdec&#039;,$log));

                                      $nftSumPrice = $nfthistory-&gt;weiToEther($sum);

                                      return $nftSumPrice;

},$filterData);
خب در قطعه کد بالا ما مقادیر قیمتی هر توکن را در صورتی که حاوی بیش از یک تراکنش فروش بودند را با هم جمع زدیم تا مجموع فروش هر توکن آیدی به دست بیاید. سپس با استفاده از تابع ()weiToEther ، جمع مقادیر را از فرمت WEI به فرمت Ether در آوردیم. مجموع قیمت را برگرداندیم.خروجی این کد چیزی شبیه این است:// output:

array(82) {
  [19400010233]=&gt;
  string(4) &#039;0.00&#039;
  [19400010322]=&gt;
  string(4) &#039;0.00&#039;
  [19400010042]=&gt;
  string(4) &#039;0.00&#039;
 [19400010113]=&gt;
  string(4) &#039;0.00&#039;
  [19400010074]=&gt;
  string(4) &#039;0.08&#039;
}

...حالا ما مجموعه ای از قیمت های فروش را داریم به علاوه آن هایی که اصلا فروش نرفتند. می توانیم مقادیر صفر را حذف کنیم اما ترجیح دادم جهت قیاس بهتر، آن ها را نگه دارم.حالا با استفاده از تابع زیر، این آرایه را از مقادیر بیشتر به مقادیر کمتر دسته بندی کنید:arsort($res);حالا خروجی بگیرید تا بتوانید پرفروش ترین NFT ها را شناسایی کنید:array(82) {
  [19400010142]=&gt;
  string(4) &#039;0.40&#039;
  [19400010060]=&gt;
  string(4) &#039;0.25&#039;
  [19400010127]=&gt;
  string(4) &#039;0.21&#039;
  [19400010159]=&gt;
  string(4) &#039;0.19&#039;
  [19400010303]=&gt;
  string(4) &#039;0.15&#039;
  [19400010055]=&gt;
  string(4) &#039;0.12&#039;
  [19400010429]=&gt;
  string(4) &#039;0.11&#039;
  [19400010236]=&gt;
  string(4) &#039;0.11&#039;
  [19400010400]=&gt;
  string(4) &#039;0.10&#039;
 [19400010136]=&gt;
 string(4) &#039;0.09&#039;
}

...خروجی بالا 10 خروجی پرفروش هستند. برای این که مطمئن شویم خروجی ما درست است کافی است که به این صفحه بروید تا اولین توکن آیدی (19400010142) را جست و جو کنیم. در بخش سرچ آن را جست و جو کنید تا تراکنش های معامله شده توکن ما را نمایش دهد. Transfer Trxs of a token idهمانطوری که از بخش تراکنش ها مشخص است، این توکن آیدی دو بار معامله شده است، روی هر کدام از تراکنش هش ها کلیک کنید در بخش value، مقدار معامله شده را می توانید ببینید. تراکنش نخست، 0.4 اتر است و تراکنش دوم 0 اتر. مجموع همانی است که در آرایه پرفروش ما آمده است. تلاش میکنم همان روش رو به مرور به عنوان تابع از پیش آماده، به کتابخونه اضافه کنم، در حال حاضر می توانید از همین روش استفاده کنید.مابقی توابع کتابخونه از اینجاممنون از توجهتون، اگر سوالی داشتید در کامنت پاسخگو هستم ^__^</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Mon, 13 Mar 2023 22:35:58 +0330</pubDate>
            </item>
                    <item>
                <title>دریافت لاگ تراکنش های NFT بر روی شبکه اتریوم با PHP</title>
                <link>https://virgool.io/@hadimirzaie/nft-history-logs-h6wdt6lccf50</link>
                <description>احتمالا براتون پیش اومده که وارد یک NFT مارکت شده باشید و دوست داشته باشید بدونید این ان اف تی خاص، بین چند نفر جا به جا یا Transfer شده است. برخی از مارکت ها اطلاعات ریز تراکنش های هر NFT را در همان وبسایت قرار می دهند اما برخی ها هم خیر. شاید یکی از دلایل آن، حجم بالای تراکنش های صورت گرفته روی هر قرارداد هوشمند است. گزینه دوم پیش روی شما وبسایت Etherscan.io هست. این وبسایت امکان track کردن قراردادهای هوشمند NFT را برای ما راحت تر میکند. ابزار بسیار قدرتمندی است اما کافی نیست. وقتی می خواهید یک NFT را با id خاص بررسی کنید  به مشکل میخورید گرچه امکان فیلتر کردن تراکنش ها را مبتنی بر event signature های خاص مثل Transfer یا Approve را فراهم میکند اما فیلترینگ جزیی تر را خیر! به خصوص اگر در فضای توسعه وب باشید و نیاز به ابزار غیر گرافیکی داشته باشید.راه سوم استفاده از کتابخانه web3 هست. متاسفانه اغلب کتابخونه های web3 php، استیبل نیستند و امکانات webjs رو ندارن.قطعا شما به دنبال راهی هستید تا هم لاگ های اتریوم را راحت تر دریافت کنید و هم با جزییات بیشتری به فیلترینگ اطلاعات آن بپردازید. کتابخونه Nft History Logs این امکان رو به شما میده که با استفاده از متد eth_getLogs ، با کمک endpoint هایی مثل alchemy یا infura یا هر شبکه ای که مورد نظر شماست، لاگ های یک آدرس خاص قرارداد هوشمند را دریافت کنید و بنا به event signature مورد نظر خودتون، فیلترینگ تراکنش ها را اعمال کنید. ممکنه پرسش کنید که چرا نباید از sdk هایی مانند sdk alchemy به جای این کتابخونه استفاده کنیم، به چند دلیل مشخص:1_ اغلب این sdk ها با جاوااسکریپت نوشته شدن2_ این sdk ها تنها با شبکه اختصاصی خودشون کار میکنند مثلا sdk alchemy فقط با شبکه alchemy کار میکند و شاید دلخواه شما نباشد و عملا اختیار را از شما میگیرد.3_ اغلب کتابخونه های web3 php استیبل نیستند و دارای مشکلات عدیده!برای شروع استفاده از این کتابخونه، دستور زیر را بزنید تا نصب شود: composer require nfthistory/nfthistorylogs v0 .0.1حالا کتابخانه را وارد کنید و یک شی از کلاس آن بسازید:&lt;?php

require &amp;quotvendor/autoload.php&amp;quot

use Nft\History\nftHistory;

$contractAdress = &amp;quot0x7F0159D3A639a035797e92861d9F414246735568&amp;quot

$provider = &amp;quothttps://cloudflare-eth.com&amp;quot

$NftHistory = new nftHistory($contractAdress, $provider);همانطور که میبینید این کلاس، دو متغییر پیش فرض در هنگام ساخت باید دریافت کند، یکی آدرس قرارداد هوشمند NFT مورد نطر شما و دیگری پروایدر یا همان Endpoint ای که می خواهید از آن استفاده کنید. هر دو باید از نوع string باشند. در اینجا من از این قرارداد هوشمند kuddle Koala #6466 استفاده کردم. آدرس قرارداد هوشمندانه آن 0x7F0159D3A639a035797e92861d9F414246735568 و آیدی توکن آن 6466 است. kuddle koala #6466این توکن در در واقع بین دو نفر (دو آدرس) جا به جا شده است و معنای این جا به جایی چیزی نیست جز فروش ان اف تی به شخص دیگر. ما میدونیم ان اف تی ها، موجودیت های منحصر به فردی هستند در نتیجه ما یک توکن کادل کوآلا با آی دی 6466 بیشتر نداریم، مابقی ان اف تی ها دارای آی دی های متفاوتی اند.با استفاده از شی ساخته شده خود و آی دی مورد نظر، تابع ()transferTrxById را فراخوانی می کنیم:$res = $NftHistory-&gt;transferTrxById(&#039;6466&#039;, &#039;0x0&#039;, &#039;latest&#039;);

var_dump($res);

//output:
Array
(
[0] =&gt; Array

        (

            [address] =&gt; 0x7f0159d3a639a035797e92861d9f414246735568

           [topics] =&gt; Array

                (

                  [0] =&gt; 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

                   [1] =&gt; 0x0000000000000000000000000000000000000000000000000000000000000000

                  [2] =&gt; 0x0000000000000000000000005b436b7cc93d246d3a62fc7a95339f6fac7d2a4a

                    [3] =&gt; 0x0000000000000000000000000000000000000000000000000000000000001942
                )
            [data] =&gt; 0x
           [blockNumber] =&gt; 0xcd2b8e

            [transactionHash] =&gt;
0xc95b6b17a8453526eba78592bf93b272f75e49b33487b986e81d19a1682eded6        

           [transactionIndex] =&gt; 0x1d

         [blockHash] =&gt;
0x69b72ae82a6e6f2de0750e23e30855cc727605b4c7b3c69814cbc0b3a51b19af

            [logIndex] =&gt; 0x23

            [removed] =&gt;
        )

    [1] =&gt; Array

        (

            [address] =&gt; 0x7f0159d3a639a035797e92861d9f414246735568

            [topics] =&gt; Array

                (

                    [0] =&gt; 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

                    [1] =&gt; 0x0000000000000000000000005b436b7cc93d246d3a62fc7a95339f6fac7d2a4a

                    [2] =&gt; 0x000000000000000000000000cf0b56dfefa3e0051a1772fc585b076a06487c53

                    [3] =&gt; 0x000000000000000000000000000000000000000000000000000000000000194
                )

            [data] =&gt; 0x

            [blockNumber] =&gt; 0xcd3716

            [transactionHash] =&gt; 0x62f59782cc17e5156fda51e27b121d5e9562b4f0d5455c5f04720aeb0a79eb07        

          [transactionIndex] =&gt; 0x10b

            [blockHash] =&gt; 0x8313bae0ff42ba4065bfb1524efb691a5c4c31cfe56defca4c095c803d4bbc3e

            [logIndex] =&gt; 0x210

            [removed] =&gt;

       )

    [2] =&gt; Array

       (

            [address] =&gt; 0x7f0159d3a639a035797e92861d9f414246735568

            [topics] =&gt; Array

                (

                    [0] =&gt; 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

                    [1] =&gt; 0x000000000000000000000000cf0b56dfefa3e0051a1772fc585b076a06487c53

                   [2] =&gt; 0x0000000000000000000000002e6469c5d4256c098ac51b9655dfb27d6f996a0c

                   [3] =&gt; 0x0000000000000000000000000000000000000000000000000000000000001942

               )

          [data] =&gt; 0x

           [blockNumber] =&gt; 0xe703b0
            [transactionHash] =&gt; 0x7b913e65751d493dc46746120e5c50587d183677a7e275535137995d017a438b        

            [transactionIndex] =&gt; 0x16

            [blockHash] =&gt; 0x4837a2daf412be2deebcae9b5c3ecb8a639f0b6e221193b56fe7f42ac79389a3

            [logIndex] =&gt; 0x58

            [removed] =&gt;
        )
)خب همانطور که دیدید، خروجی این کار، یک شی با 3 تراکنش بود که شامل تراکنش mint ان اف تی و دو تراکنش بعدی هم، تراکنش های جا به جایی NFT ما هستند که مابین 3 نفر جا به جا شده است.شما می توانید به هر کدام از property های این تراکنش ها دسترسی پیدا کنید و آن ها را تجزیه و تحلیل کنید.به طور مثال بخش data، شامل مقدار اتر جا به جا شده بین دو آدرس در طی جا به جایی NFT است که این جا 0x است به معنای صفر یعنی هیچ اتری انتقال داده نشده. حواستان باشد این عدد در فرمت WEI هست که باید به اتر تبدیلش کنید. البته توابع دیگری هم جهت راحتی دریافت مقدار اتر جا به جا شده وجود دارد به طور مثال:$transactionHash = &#039;0x62f59782cc17e5156fda51e27b121d5e9562b4f0d5455c5f04720aeb0a79eb07&#039;;
$eventName = &#039;OrdersMatched&#039;;
$etherAmount = $NftHistory-&gt;nftTrxWei($transactionHash, $eventName);

var_dump($etherAmount);

//output
array(1) {

  [&#039;value&#039;]=&gt;

  array(1) {

    [0]=&gt;

    array(3) {

      [&#039;buyHash&#039;]=&gt;

      string(66) &#039;0x0000000000000000000000000000000000000000000000000000000000000000&#039;

      [&#039;sellHash&#039;]=&gt;

      string(66) &#039;0243b8854fe6a9b124e13caed266c59d3cacc1ca4c3246a3cad5a094c53f6d0900&#039;

      [&#039;price&#039;]=&gt;

      string(62) &#039;0000000000000000000000000000000000000000000000009869529cdd4000&#039;
    }
 }
}خب همونطور که از کد بالا مشخصه ما بر اساس مقدار هش تراکنش ، به اطلاعات sale یا همان فروش این ان اف تی دست یافتیم. حواستان باشد گزینه eventName$ اختیاری است در واقع به جای دریافت تمامی مقادیر اتر صورت گرفته روی این تراکنش، تنها مقدار sale آن را برگرداندیم. به همین ترتیب، با مابقی توابع آن نیز می توانید کار کنید تا به نتایج دلخواه خود راحت تر دست پیدا کنید.توابع این کتابخانه از اینجاممنون از توجهتون، سوالی اگر داشتید در کامنت پاسخگو هستم ^__^</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 01 Mar 2023 09:33:03 +0330</pubDate>
            </item>
                    <item>
                <title>تغییر IP آدرس با استفاده از سرویس tor و پایتون</title>
                <link>https://virgool.io/@hadimirzaie/change-ip-with-tor-python-script-esmchydyqccf</link>
                <description>یکی از عزیزان از بنده درخواست کرد که جهت جلوگیری از خطای 429 چه کاری می شود انجام داد. این خطا توسط سرور به دلیل درخواست های مکرر که از یک آی پی مشخص فرستاده می شود رخ می دهد. سرور درخواست های مکرر را به عنوان اسپم شناسایی می کند و نتیجتا شما را به مدت زمان خاص، از ارسال درخواست منع می کند. تصمیم گرفتم یکی از راه های دور زدن چنین خطایی را براتون بگم (در نظر داشته باشید در حالت عادی اگر نیاز مبرم ندارید، بهتر است به ارور سرور احترام بگذارید زیرا سرور تحت فشار قرار میگیرد و درستش این است که اسپم نکنید)بریم سراغ آموزش، اولین کاری که لازم است انجام بدهید راه اندازی تور بر روی سیستم خودتان است. در واقع تور یک سیستم غیر متمرکز از نودهای داوطلبانه در حال اجراست. با استفاده از تور، شما می توانید آی پی خود را برای هر بار درخواست تغییر بدهید. در نظر داشته باشید همه سرورها قرار نیست با این روش، خطایشان دور زده شود زیرا احتمال بسیار بالایی متوجه خواهد شد که شما در حال تغییر آی پی های متعدد هستید.منطقی ترین روش جهت راه اندازی تور، استفاده از داکر tor است. در ترمینال یا CMD دستور زیر را وارد کنید:docker run --name=&#039;tor-privoxy&#039; -d 
-p 9050:9050 -p 9051:9051 
-p 8118:8118 dockage/tor-privoxy:latestاندکی فرصت بدهید تا ایمیج تور دانلود و کانتینرش راه اندازی شود. پورت 9050 پورتی است که تور از آن استفاده میکند و 9051 همان پورتی است که شما جهت ارتباط برقرار کردن و دریافت آی پی جدید از تور استفاده خواهید کرد. حالا از طریق دستور زیر وارد محیط شل داکر تور بشوید:در ویندوزdocker exec -it tor-privoxy shدر لینوکسdocker exec -it tor-privoxy bashحالا در محیط شل، با اجرای دستور tor مطمئن شوید تور در حال اجراست:/ # tor
Sep 08 21:47:12.582 [notice] Tor 0.3.4.11 (git-4fd31340f3355342) running on Linux with Libevent 2.1.8-stable, OpenSSL 1.1.1b, Zlib 1.2.11, Liblzma N/A, and Libzstd N/A.سپس برای سرویس تور خود یک پسورد تعیین کنید:tor --hash-password YOUR-PASSWORD-HEREدر پاسخ به این دستور، تور پسورد شما را هش میکند. شما باید این پسورد هش شده را در داخل فایل تنظیمات تور قرار بدهید. پس این پسورد را جایی یادداشت کنید. در همان محیط شل وارد مسیر : etc/tor/ بشوید و فایل تنظیمات تور را باز کنید:$ cd /etc/tor
$ sudo vi torrcآپشن HashedControlPassword را پیدا کنید و آن را از حالت کامنت در بیارید و پسورد خود را مقابل آن پیست کنید.حالا با زدن گزینه esc و نوشتن دستور wq: آن را ذخیره و از محیط ویرایش vi خارج شوید.حالا نیاز دارید 3 پکیج پایتونی را نصب کنید. در ترمینال یا CMD:pip install stempip install requestspip install pysocksپکیج اولی جهت ارتباط برقرار کردن با سرویس تور است. حالا کدهای زیر را در فایل پایتونی خود وارد کنید:import requests
import time 
from stem import Signal 
from stem.control import Controller 
        
def get_current_ip():    
            session = requests.session()  
            session.proxies = {}     
            session.proxies[&#039;http&#039;]=&#039;socks5h://localhost:9050&#039;    
            session.proxies[&#039;https&#039;]=&#039;socks5h://localhost:9050&#039;
            try:        
                r = session.get(&#039;http://httpbin.org/ip&#039;) 
            except Exception as e:       
                print str(e)    
            else:        
                return r.text  
       
def renew_tor_ip(): 
           with Controller.from_port(port = 9051) as controller:         
                controller.authenticate(password=&amp;quotپسورد&amp;quot)         
                controller.signal(Signal.NEWNYM)   
for i in range(5):        
    get_current_ip()       
    renew_tor_ip()    
    time.sleep(5)همینطور که میبینید ما 2 تابع تعریف کردیم که تابع نخست در واقع آپشن پروکسی را به ریکوئست ما اضافه میکند و تابع دوم، پس از هر درخواست، آی پی ما را تغییر می دهد. به همین سادگی شما می تونید با آیپی های متغییر، به سرور درخواست بدید. اگر راه های ساده تری هم به ذهنتون میرسه، واسم کامنت کنید  :)</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Fri, 09 Sep 2022 02:48:39 +0430</pubDate>
            </item>
                    <item>
                <title>نگاهی به amplication _ توسعه بی درد بک اند در NodeJs !</title>
                <link>https://virgool.io/Rocket/amplication-nodejs-typescript-et5txdfizfyf</link>
                <description>امپلیکیشن بنا به تعریف خودش یک ابزار توسعه nodejs است که دست به تولید ساختاری میزند که مد نظر شماست. شما با استفاده از یک وب اپ GUI، تمام بخش ها و الزامات مورد نیاز را تعیین میکنید و تولید آن به عهده amplication است. قرار نیست این برنامه رو با برنامه دیگری قیاس بزنم، صرفا دو روزی باهاش کار کردم و تجربه شخصیم رو به عنوان یک بک اند دولوپر میگم. 1_ داکیومنت برنامه خوبه، سرراست و واضحه و در عرض نیم ساعت، پی به ساختار کل برنامه می برید و خب برنامه هم چندان پیچیدگی عظیمی نداره. 2_ نحوه مدیریت درخواست هاش خیلی ساده و قابل فهمه ( مبتنی بر ساختار nestjs ). اگر تجربه کار با کنترلرها رو داشته باشید، در تایپ اسکریپت از دکوریترها جهت نسبت دادن پارامتر ها به کلاس استفاده می شود به طور مثال درخواست های GET یا POST به متدهای کنترلرتون منتقل میشه. به طور مثال:@Post(&amp;quotsignup&amp;quot)
         
   async signup(@Body() body: Credentials): Promise&lt;UserInfo&gt; {
                  
       return this.authService.signup(body);

}این دکوریتر، درخواست هایی از نوع Post که منتهی به signup است را دریافت میکند و متد signup را جهت ثبت نام کاربران بر میگرداند. 3_ کانسپت Entity: یکی از نقاط قوت این برنامه، راه اندازی سریع دیتابیس هست که تحت عنوان entity در نظر گرفته شده. وقتی می خواهید یک ساختار نسبتا پیچیده رو طراحی کنید، خیلی راحت می تونید انتیتی ها رو ایجاد کنید و سطح دسترسی رو برای هر کاربر مشخص کنید. سرعت تولید و راه اندازی این ساختار بسیار بالاست. مهم ترین بخش انتیتی ها اینه که میتونید ریلیشن بین تیبل ها رو مشخص کنید چون مشخصه که برنامه شما قرار نیست یه سری داده رو از یه سری تیبل مشخص به صورت مستقیم و ساده دریافت کنه، قراره این تیبل ها با هم در ارتباط باشن و شما با چندین تیبل مرتبط کار کنید. این روند رو برای شما بسیار تسریع میکنه.4_ به شخصه هیچ تجربه ای با تایپ اسکریپت نداشتم و تنها تجربیات من در این زمینه اندکی کار با نود جی اس بود و کمی کار با ری اکت. برای درک بهتر، نگاهی به داکیومنت تایپ اسکریپت هم انداختم. برام لذت بخش بود که تا چه اندازه میتونه به راه اندازی ساختار بک اند، سرعت بده و تنها لازمه تغییرات ریز مد نظر خودت رو اعمال کنی. تصور کنید یک برنامه نویس فرانت اند که تجربه زیادی در بک اند نداره، بنا به نیاز بخواد یک API راه اندازی کنه. ایجاد کل ساختار بک اند تا چه حد میتونه براش دشوار و طولانی باشه. من فک میکنم این مبحث هم میتونه یه نقطه قوت باشه، هم یک نقطه ضعف بزرگ. چرا نقطه ضعف؟ به این دلیل که ما باز هم در دام ساختارهای از پیش تعیین شده می افتیم. هرگونه ضعف در این ساختار، موجب ایجاد هدر رفت وقت از همان برنامه نویسی خواهد شد که به امید سرعت بالاتر به سمت این پروژه قدم برداشته. نه تنها باید وقت بگذاریم تا باگ ساختار را پیدا کنیم بلکه ساختار برنامه خود را به ساختار معیوب این برنامه پیوند زدیم. شاید این عنصر چندان مطلوب کسانی نباشد که از پایه در پی ایجاد یک ساختار پایدار اند. تجربیات تلخی که ساختارهای آماده یکپارچه مانند CMS ها به ما داده اند شاید نقطه دافعه چنین برنامه هایی باشد. گرچه این برنامه نه CMS است و نه فریم ورک. بلکه برنامه ای است جهت تولید ساختارهای از پیش آماده شده جهت توسعه برنامه های مبتنی بر نود جی اس. با اتوماتیک سازی ساختار، کار شما را راحت تر میکند.5_ به این نکته هم باید توجه کنید که این برنامه هم ساختار آن چنان عجیب غریبی خلق نمیکند در واقع همان محیط نود جی اس با محوریت تایپ اسکریپت ( مبتنی بر ساختار nestJs ) است همراه با اضافاتی مثل Controller و Authentication و چیزای دیگه. حالا ممکنه بگید خیلی از فریم ورک های مدرن، با چند کد خط فرمان، به راحتی می تونن برای شما کامپوننت هایی مثل Auth رو فراهم بیارن و اصلا به قول معروف &quot; ?what&#x27;s the point man &quot; .حقیقتش رو بگم، خودمم خیلی پوینت خاصی رو نگرفتم از این برنامه و نقد کاملا به جایی هست. 6_ این برنامه علاوه بر همه این ها، یک Admin UI هم براتون تولید میکنه که فرایند تولید و کنترل User ها رو براتون راحت تر میکنه. این کنترل پنل هم چندان چیز خاصی نداره جز کنترل کاربرها، تولید و ایجاد پرمیشن برای هر کدوم. این بخش گرافیکی هم بر مبنای ReactJs نوشته شده. 7_ طبق گفته های خودش رایگانه و قراره رایگان هم بمونه در کنار پلن های اینترپرایزش! اگه قراره پلن رایگانش در همین حد بمونه ( نظر شخصی خودم، ارزش چندانی نداره جز یه بار اضافه برای شرکت ها! ) خیلی ساده بخوام بگم گرچه امپلیکیشن، برای تولید محصولات شرکتی ایجاد شده، اما در این سطح هنوز مسیر طولانی ای جهت کسب رضایت یک توسعه دهنده دارد. ابتدا از خود بپرسید: چه کاری با امپلیکیشن می توانم انجام دهم که با مابقی فریم ورک ها و ابزارهای کامند لاین نمی توانم؟ پاسخ کمی تلخ است، حقیقتا هیچ! ( حداقل در حال حاضر )امپلیکیشن قرار است تا چه اندازه فرایند توسعه محصولات را تسریع کند؟ حقیقتا برای یک توسعه دهنده سطح میدل، شاید بسیار کارآمد باشد ( آن هم در توسعه ساختار دیتابیس و ریلیشن هایش) ولی تصور نمیکنم چندان کمک خاصی برای یک توسعه دهنده سنیور باشد. البته که باید در نظر داشت این برنامه در نسخه Beta قرار دارد و به محض عرضه نسخه اینترپرایزش، باید دید چه امکانات پیشرفته تری را رونمایی خواهد کرد. در این سطح که به نظر راضی کننده نمی آید ... .اگر از این برنامه استفاده کردید، حتما حتما واسم نظرتون رو بنویسید ...</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Sat, 20 Aug 2022 05:50:10 +0430</pubDate>
            </item>
                    <item>
                <title>نمایش آمار بازدید از صفحه وبسایت با php و Redis در لاراول _ مزایای آن؟</title>
                <link>https://virgool.io/@hadimirzaie/page-counter-with-redis-and-php-lb1vcoqbzy8r</link>
                <description>ردیس یک پایگاه داده غیر رابطه ای مبتنی بر ساختار کلید و مقدار است. یعنی شما مانند mysql با جداول سر و کار ندارید بلکه مشابه آبجکت json، یک کلید دارید که از طریق آن، به مقدار ذخیره شده اش دسترسی پیدا می کنید. این دیتابیس ۱۳ سال پیش برای سیستم عامل های یونیکس بیس ایجاد شد و از طریث WSL قابلیت نصب بر روی ویندوز را دارد.از ردیس می توان جهت ذخیره داده های موقتی و کچ ها نیز استفاده کرد. یکی دیگر از موارد استفاده از آن، شمارش تعداد بارهایی است که کاربر به صفحه سر زده. شاید از خودتان بپرسید چرا این داده ها را در mysql ذخیره نکنم؟ پاسخ واضح است، ردیس سریع تر است. در ادامه نحوه کار با ردیس و قیاس پاسخگویی ردیس و mysql را نشان تان خواهم داد.برای استفاده از ردیس در لاراول کافیست این دستور را در ترمینال یا CMD وارد کنید:composer require predis/predisبا رجوع به داکیومنت لاراول، می توانید تنظیمات مورد نیاز ردیس را مشاهده کنید. در فایل env. پورت ردیس را برابر با ۶۳۷۹ قرار دهید و هاست شما برابر با ۱۲۷.۰.۰.۱ است و اگر ردیس شما در داکر اجرا می شود هاست را برابر با نام کانتینر ردیس خود قرار دهید. پس از آن در controller خودتان، شی redis را وارد کنید تا بتوانید از آن جهت ارتباط با ردیس استفاده کنید: use Illuminate\Support\Facades\Redis;حالا کدهای زیر را وارد کنید:if(Auth::check()){

              $username = Auth::user()-&gt;name;

              $redis = Redis::connection();

              $redis-&gt;incr($username . &amp;quot_visits&amp;quot);

              dump($redis-&gt;get($username . &amp;quot_visits&amp;quot));

  }
خب در خط اول ابتدا چک میکنیم ببینیم کاربر مورد نظر ما وارد وبسایت شده یا خیر؟ if(Auth::check()){

      // some codes here

}در خط دوم چک می کنیم ببینیم نام کاربری کاربر وارد شده چیست. آن را در متغییری به نام username  ذخیره میکنیم.$username = Auth::user()-&gt;name;خط بعدی عنصر اصلی ردیس است. سعی میکنیم به کلاس Redis متصل شویم و به اصطلاح یک instance از آن را دریافت کنیم: $redis = Redis::connection();اما قسمت مهم تر ماجرا این قطعه کد است که مقدار عددی increment را در ردیس ایجاد میکند. اگر با ردیس آشنا باشید می دانید که ردیس مقادیری چون استرینگ، هش و غیره را برای ذخیره پشتیبانی می کند. این عدد به صورت خودکار توسط ردیس، افزایش می یابد و نیازی به دستکاری شما نیست.     $redis-&gt;incr($username . &amp;quot_visits&amp;quot);اما در دورن پرانتز ما آمدیم برای تعداد بازدیدهایمان یک نام برای کلید تعیین کردیم که از دو بخش تشکیل شده، یکی نام کاربر جهت تشخیص تعداد بازدیدهای کاربرمان و دیگری واژه visits بود. این نام می تواند به دلخواه توسط شما تعیین شود.در آخر هم مقادیر ذخیره شده در کلید بازدیدها را چاپ کردیم:   dump($redis-&gt;get($username . &amp;quot_visits&amp;quot));اما نگاهی داشته باشیم به پروسه انجام این کار و مدت زمان پاسخگویی سرور ردیس به ما و قیاس آن با mysql.کافیست به اول و آخر این کدها ، چند خط کد اضافه کنید جهت سنجش مدت زمان پاسخگویی:$time_start = microtime(true);

$username = Auth::user()-&gt;name;

$redis = Redis::connection();

$redis-&gt;incr($username . &amp;quot_visits&amp;quot);

dump($redis-&gt;get($username . &amp;quot_visits&amp;quot));

$time_end = microtime(true);

$execution_time = ($time_end - $time_start);

dump($execution_time);

این قطعه کدهای اضافه شده، مدت زمان پاسخگویی ردیس و انجام عملیات را می سنجند.در طی این سنجش، عموما مدت زمان پاسخگویی، چیزی بین ۰.۰۰۲ ثانیه تا ۰.۰۰۴ ثانیه بود:همین عملیات را زمانی که با mysql انجام میدهید متوجه می شوید بسیار بیشتر است:$time_start = microtime(true);

$username = Auth::user()-&gt;name;

$table = User::where(&amp;quotname&amp;quot,$username)-&gt;first();

$db = User::all();

if($db-&gt;where(&amp;quotname&amp;quot,$username)){

        foreach ($db as $user) {

                  $table-&gt;visits = $user-&gt;visits + 1;
                   $table-&gt;save();
                  echo($user-&gt;visits);
              }
      }

$time_end = microtime(true);

$execution_time = ($time_end - $time_start);

dump($execution_time);

در این حالت مدت زمان انجام عملیات چیزی بین ۰.۲ ثانیه تا ۰.۴ ثانیه است که تفاوت زمانی بسیار فاحشی است:قطعا در چنین مواردی  که نیازمند پاسخگویی سریع تر است، ردیس بسیار بهتر و کاربردی تر است. یکی از علل آن این است که در mysql  کل جدول بررسی می شود سپس به شما پاسخی داده می شود. اما در ردیس، مسیر مشخص است و همین عدم پیچیدگی موجب می شود سریع تر به پاسخ برسید. قطعا ردیس برای کارهای پیچیده مناسب نیست اما در چنین مواردی برتری دارد. </description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 08 Jun 2022 19:02:47 +0430</pubDate>
            </item>
                    <item>
                <title>پدیده سطحی نگری در نظامِ لایک محورِ تولید محتوا</title>
                <link>https://virgool.io/@hadimirzaie/%D9%BE%D8%AF%DB%8C%D8%AF%D9%87-%D8%B3%D8%B7%D8%AD%DB%8C-%D9%86%DA%AF%D8%B1%DB%8C-%D8%AF%D8%B1-%D9%86%D8%B8%D8%A7%D9%85%D9%90-%D9%84%D8%A7%DB%8C%DA%A9-%D9%85%D8%AD%D9%88%D8%B1%D9%90-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D9%85%D8%AD%D8%AA%D9%88%D8%A7-oq3jpmzmktvb</link>
                <description>شاید بهتر باشد این مقاله را به این شکل شروع کنم، بازار آزاد، سلیقه عوام را در اولویت قرار میدهد. بهره وری سیستم در نظام ارزش گذاری بازار، بر مبنای قیمت تعیین می شود.نظام لایک محور vs نظام اِکسپند محور آنچه که مشخص است پلتفرم های مدرن مجازی، برخلاف پدران خود یعنی فوریوم ها و وبلاگ ها، بر نظامی استوار شده اند که آن را نظام لایک محور می خوانم. در این نظام، الگوریتم ها از شما می خواهند برای بهتر دیده شدن، ابتدا لایک کنید و سپس تمرکز خود را بر محتوا بگذارید. تولید کننده محتوا از مخاطب خودش می خواهد قبل از دیدن ادامه ویدیو، حتما این کار را انجام دهد تا زحماتش بر باد نرود. حتی در مورد اخیر، اینستاگرام لایک را به استوری ها اضافه کرد تا شما از قافله سیستم لایک محوری که به آن معتاد شدید، عقب نمانید و در افراطی ترین حالت ممکن، لایک کنید و به مخاطب خود بگویید تا چه اندازه علاقه دارید به محتوایش!اما اجازه دهید چنین نظامی را با ساختار وبلاگ های مدرنی مانند Hackernoon قیاس بزنم که دارای نظام اکسپند محور اند. در این سیستم، عمده توجه شما به سمت تیتر مطالب است و برای مطالعه بیشتر، روی تیتر کلیک میکنید یا آن را اکسپند میکنید تا به محتوای کامل دسترسی پیدا کنید. عادت هایی که در این نظام تشویق و پروموت می شوند از جنس همان عادت هایی هستند که در مواجه با یک کتاب با آن رو به رو هستیم، عادت توجه به کلمات کلیدی و خاص، عادت خلاصه خوانی و یا حتی تند خوانی جهت احاطه بر متن و ... .عادتی به نام لایک کردن مکررشاید همین شرح کوتاه تا به اینجا، مزیت های نظام دوم را به خوبی آشکار کرده باشد اما سوال مهم تر: سطحی نگری چیست و از چه جهت نظام نخست را باید سطحی نگر دانست؟بخش دوم مقاله را با این مبحث آغاز میکنم که اصولا در پلتفرم های مدرن موبایل، مانند اینستاگرام، تشویق به تولید محتوای تصویری، موجب می شود که خود به خود افراد از مقوله تولید ساختارهای واژگانی دور شوند. محتوای تصویری هزینه بر است. هم هزینه زمانی دارد و هم هزینه اقتصادی بالا. به عبارتی ما با نظامی رو به رو هستیم که بنیانش بر هزینه ایجاد شده. پس به عبارتی بر اساس همان اصل بازار آزاد، تنها کسانی اقدام به تولید محتوا در این عرصه خواهند کرد که به معنای واقعی کلمه به دنبال بهره وری اقتصادی لازم باشند. گرچه حداقل توقعی که در چنین بازاری داریم، ختم شدن به خلقِ تولید کنندگان محتوای حرفه ای است اما در عمل چنین اتفاقی نمی افتد زیرا که مخاطب از همان ابتدا در جهتی غیر از تمرکز بر واژه سوق داده شده است. خوشحالی های لحظه ای و سطحیآرمان هایی که در ذهن مخاطب نشسته از جنس کنکاش ذهنی نیست بلکه به اشتراک گذاشتن روزمرگی ها و فان ترین لحظات زندگی است چنان که هدف اینستاگرام در مراحل اولیه، پلتفرم به اشتراک گذاری عکس بود. زمانی که هزینه بر بودن تولید محتوای تصویری را با اهداف اولیه چنین پلتفرم هایی و سیستم لایک محور بودن آن کنار هم بگذارید متوجه می شوید چرا در چنین فضاهایی، مخاطب ها اغلب حرفه ای نیستند و تولید کنندگان هم میلی به تولید محتوای حرفه ای ندارند. یک رابطه دو سویه اینجا شکل گرفته چیزی مانند خلقت مرغ و تخم مرغ، هرگونه تلاش برای متهم کردن دو سمت، راه به جایی نمی برد زیرا در هر دو سمت، اثری از کنکاش ذهنی دیده نمی شود. زمانی ما از سطحی نگری صحبت میکنیم منظورمان درگیر نشدن مخاطب و نداشتن کنکاش ذهنی است. میزان چسبندگی بین تولید کننده محتوا و مصرف کننده، به حدی نیست که تحول خاصی ایجاد کند، زیرا محتوای ارائه شده تنها لایه های خاصی از مغر را درگیر میکند که مرتبط با روزمرگی هایمان است. همانطور که به آب خوردن فکر نمیکنیم و نوعی رفلکس طبیعی بدن است، به لایک کردن محتوای اینستاگرامی هم فکر نمیکنیم بلکه ادای وظیفه روزانه مان به عادتی است که عمق چندانی ندارد. چرا به چنین روزمرگی هایی فکر نمیکنیم؟ زیرا اصلا نیازی نیست خود را با سطح زندگی دیگران درگیر کنیم، مگر فرد با گفته هایش بتواند لایه های عمیق تر مغز ما را فعال کند! انفجار در تولید محتواشاید عمده تصورات و درک ما از بازار بر مبنای یک رابطه یک سویه عرضه و نهایتا تقاضای کالا یا محتوا باشد اما این طور نیست. این رابطه قطعا دو سویه است و هزاران عامل در نحوه کشش و قیمت گذاری نظام بازار موثراند. آن چه که مشخص است فلسفه شکل گیری سوشیال مدیاها، رفع نیازهای سطحی انسان بوده، نیازهایی که به کنش ذهنی کمتری نیاز دارند و بیشتر جسمانی اند، مانند کشش جنسی، رقص، نور و ... . تمام این موارد چندان هم فکر شده نبوده بلکه در راستای بازار آزاد شکل گرفته. چطور؟ رفع نیازهای سطحی و جسمانی انسان عموما سهل الوصول تراند، این بدان معناست که تولید کننده محتوا راحت تر میتواند توجه شما را جلب کند. هرچند این جذب، عمق ندارد اما آسان تر حاصل می شود. مورد دوم این است که این نیازها خیلی سریع تر در جسم شما تمدید می شوند. مثالی میزنم: یک انسان دائم الخمر خیلی زودتر به الکل نیاز پیدا میکند تا یک انسان تحصیل کرده به کتاب! قطعا رفع نیازهای جسمانی شما راحت تر و سریع التمدیدتر است. هرچند سطحی تر و دارای عمق کم تری باشد. در همین مسیر شاهد هستیم که تولید کنندگان محتوا در چنین بازاری، راه رفع نیازهای جسمانی افراد را برگزیدند. از آن جایی که این نوع محتواها، عمق چندانی ندارند و مخاطب دچار چسبندگی بالایی به آن ها نمی شود، مرتب باید محتوا تولید شود که این منجر به انفجاری در تولید محتوا شد.نتیجه گیریبنده نمی خواهم منکر وجود استثنائات شوم، حتی نمی خواهم روند آتی چنین پلتفرم هایی را به تصویر بکشم، بلکه شرایط جاری شان را تبیین کردم که ناشی از شرایط تاریخی شکل گیری شان بود. سطحی نگری در پلتفرم هایی چون اینستاگرام، یک اصل الزامی در جهت حفظ حیات و بهره وری کامل اقتصادی است و جای تعجب نیست که چرا در این فضا، هیچکس علاقه ای به اندیشیدن خارج از الگوهای حاکم را ندارد. زیرا صرفه اکوسیستم از دست می رود.</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Tue, 31 May 2022 22:46:03 +0430</pubDate>
            </item>
                    <item>
                <title>پروژه لاراولی خودت رو در یک چشم به هم زدن، داکر سازی کن</title>
                <link>https://virgool.io/laravel-community/%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84%DB%8C-%D8%AE%D9%88%D8%AF%D8%AA-%D8%B1%D9%88-%D8%AF%D8%B1-%DB%8C%DA%A9-%DA%86%D8%B4%D9%85-%D8%A8%D9%87-%D9%87%D9%85-%D8%B2%D8%AF%D9%86-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%B3%D8%A7%D8%B2%DB%8C-%DA%A9%D9%86-qubhebdmlx20</link>
                <description>همانطور که می دانید، Docker از مجموعه ای از کانتینرها تشکیل شده که مستقل از همدیگر عمل میکنند. علت محشر بود داکر این است که تمام اعضای تیم می توانند روی آیتم های یکسان کار کنند. داکر می تواند برای شما سیستم عامل را شبیه سازی و تمامی پکیج های مورد نظر را گردآوری کند. وقتی از داکر صحبت میکنیم، منظور ما اجرای یک برنامه با تنظیمات اختصاصی ماست. ما این تنظیمات را می توانیم  در فایل داکر مشخص کنیم. مزایای استفاده از داکر چیست؟ممکن است قبل از این، شما از آپاچی سرور برای اجرای برنامه های خود استفاده میکردید که البته گزینه خوبی است اما مناسب و راحت نیست. داکر به این دلیل خوب است که:۱- تمامی اعضای تیم به پکیج های یکسان دسترسی دارند.۲- تمامی افراد می توانند تغییرات دیگران را ببینند.۳- تمامی تنظیمات و ورژن ها یکسان است.حالا با تمام این مزایا، می توانیم به سراغ آموزش برویم. فرض را بر این میگیرم که شما بر روی سیستم لینوکسی خود، Docker نصب کردید و با لاراول آشنایی دارید.نصب لاراول ۱- یک پوشه ایجاد کنید و نام آن را به دلخواه بگذارید.۲- در همان دایرکتوری، ترمینال یا CMD خود را باز کنید و این کد را تایپ کنید:composer create-project laravel/laravel example-app۳- زمانی که لاراول نصب شد به فولدر لاراول بروید. ساختار لاراول شما چنین است:۴- به فولدر public بروید و تمام فایل های آن جا را cut کنید.۵- به روت (ریشه ) پروژه خود بروید یعنی خارج از فولدر لاراول.۶- تمام فایل ها را اینجا paste کنید.۷- خب ما این کارها را کردیم تا مجبور نشویم برای اجرای لاراول از دستور php artisan serve استفاده کنیم.در واقع هدف این بود که که مسیر ریشه رو به سمت دسترسی به تمام فایل های پروژه هدایت کنیم.داکر سازی لاراول۸- حالا فایل index.php را باز کنید و به شکل زیر آن را ویرایش کنید:خب ما واژه &quot;لاراول&quot; را ( که نام پروژه تان هست ) در همه مسیرها قرار دادیم. ۹- در مسیر ریشه پروژه تان، یک فایل Dockerfile ایجاد کنید و تمام. حواستان باشد، دقیقا حرف اول آن باید D بزرگ باشد.۱۰- حالا کدهای زیر را در فایل Dockerfile وارد کنید و آن را ذخیره کنید:FROM php:7.4-apacheCOPY ./php.ini /etc/php/7.4/apache2/php.iniRUN a2enmod rewriteWORKDIR /var/www/htmlRUN docker-php-ext-install mysqliحواستان باشد که می توانید ورژن PHP دلخواهتان را تعیین کنید. دستور RUN a2enmod rewrite برای دسترسی به فولدرهای زیر مجموعه سرور آپاچی صورت میگیرد. WORKDIR همان تعیین مسیر روت آپاچی سیستم شماست. در ویندوز این مسیر برابر با C:\HTTPD\Apache24\htdocs است و در لینوکس برابر با var/www/html/ ۱۱- در ریشه پروژه خود، یک فایل بسازید تحت عنوان php.ini و همینطور خالی ذخیره اش کنید.حالا زمان داکر سازی پروژه مان است.۱۲- در ریشه پروژه تان، جایی که Dockerfile قرار دارد، ترمینال را باز کنید و کد زیر را وارد کنید:docker build -t laravel:01دستور docker build  برای ایجاد  یک ایمیج در داکر استفاده می شود. دستور t- برای دادن نام تگ دلخواه شما استفاده می شود. نقطه ( . ) به معنی در بر گرفتن تمامی فولدرها و زیر فولدرهای پروژه شما جهت ایجاد image است. ۱۳- حالا برای کسب اطمینان از ساخته شدن ایمیج مورد نظر تان، این دستور را در ترمینال وارد کنید:docker imagesحالا نوبتی هم باشد ، نوبت ایجاد container است . همانطور که ممکن است بدانید، کانتینر در واقع محلی برای ذخیره و اجرای ایمیج های داکر است. برای ایجاد و اجرای کانتینر  دستور زیر را در ترمینال خود وارد کنید:docker run -d -p 84:80 -name apachelaravel -v &amp;quot$PWD&amp;quot:/var/www/html laravel:01خب دستور docker run که کاملا واضح است که قصدش ایجاد و اجرای کانتینر است. دستور p- برابر با سِت کردن پورت ۸۴ بر روی پورت واقعی ۸۰ سیستم آپاچی شماست. برای این که بدانید آیا کانتینر شما ایجاد شده یا خیر، دستور زیر را در ترمینال وارد کنید:docker container ls -aحالا مرورگر خود را باز کنید و بنویسید : http://localhost:84اگر با ارور زیر مواجه شدید اصلا نگران نباشید به راحتی قابل حل است:برای حل آن ابتدا وارد پوشه laravel بشوید و ترمینال را آن جا باز کنید. کافی است سه دستور زیر را به ترتیب وارد کنید:chmod -R gu+w storagechmod -R guo+w storagephp artisan cache:clearاین دستورات در واقع اجازه دسترسی سرور مجازی  به دایرکتوری storage را می دهد. حالا صفحه مرورگر خود را ریفرش کنید و تمام:لاراول شما بدون مشکل نصب شد. به همین سادگی ...این مقاله، برگردان فارسی از مقاله انگلیسی بنده در وبسایت Hackernoon می باشد:dockerize your laravel  project in a jiffy</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Sun, 17 Apr 2022 12:07:44 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی شی Set در Javascript</title>
                <link>https://virgool.io/Solidity/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%B4%DB%8C-set-%D8%AF%D8%B1-javascript-enliueqinzjt</link>
                <description>شی Set یکی از اشیا از پیش ساخته شده و معرفی شده در جاوااسکریپت است که به دلیل ارائه طیف نسبتا مناسبی از متدها، بسیار کاربردی و مفید محسوب می شود. این شی به شما اجازه میدهد مجموعه ای از مقادیر غیر تکراری و منحصر به فرد را ذخیره کنید. از ورژن ES6 دارای ترتیب شد و به ترتیب مقادیر وارد شده در آن، قابل فراخوانی است. تعریف شی Set: یک شی از پیش ساخته شده که به شما اجازه میدهد هر مقداری را با هر تایپی در آن ذخیره کنید. ۱ـ نحوه ایجاد شی Set: let car = new Set();با استفاده از دستور new، یک شی از نوع Set ساختیم به نام car.برای تزریق داده به شی Set دو راه دارید:الف) تزریق مستقیم:let car = new Set(1);        // نتیجه:  1 ب) استفاده از متد add:car.add(1);         // نتیجه:  1 به خاطر داشته باشید بلافاصله پس از نسبت دادن داده به شی، به آن دسترسی نخواهید داشت و باید آن را در حلقه بندازید.انواع داده هایی که میتوانید به شی Set نسبت بدید برابر است با:car.add( 1 );       //  عدد 
car.add( &amp;quotxmrrabbitx&amp;quot );       //  رشته متنی 
car.add( [1, 2, 3, 4, 5] );       //  آرایه 
car.add( { name:&amp;quotxmrrabbitx&amp;quot,  age:27 } );       //  شی جاوااسکریپتی
car.add( true );       //   true  false   یا همان   boolean مقدار 
car.add( null );       //   null مقدار   
car.add( undefined );       //   undefined  مقدار و همچنین داده های ۸ بیتی و سمبل ها را هم می شود نسبت داد اما از همه مهم تر می شود رفرنس یک شی دیگر را هم نسبت داد. به طور مثال:const tesla = { type:&amp;quotx19&amp;quot, price:129000 };car.add( tesla );            
// خروجی:  { type:&amp;quotx19&amp;quot, price:129000 }خب همانطوری که دیدید رفرنس شی جاوااسکریپتی tesla را به شی Set دادیم تا به داده های قبل اضافه اش کند. و اما می رویم به سراغ نمایش داده های ذخیره شده در آن. به راحتی از طریق حلقه for می توانید به آن ها دسترسی داشته باشید. به طور مثال:for ( let item of car ) console.log( item );
// output: 1, &amp;quotxmrrabbitx&amp;quot, [1,2,3,4,5], {name:&amp;quotxmrrabbitx&amp;quot, age:27}, true, null,    
                           undefined,  {type:&amp;quotx19&amp;quot,price:129000}خب همانطور دیدید خروجی حلقه ما حاوی تمام مقادیری بود که از ابتدای این مقاله به شی Set اضافه کردیم.حالا تصور کنید من میخواهم یک مقدار خاص رو در این شی جست و جو کنم و از وجود داشتن آن اطمینان حاصل کنم. این شی، متد has را در اختیار ما قرار میدهد:if ( car.has(&amp;quotxmrrabbitx&amp;quot) )   {        return true;     }
// output: trueهمانطور که از کد بالا مشخص است ما شرطی را نوشتیم و با استفاده از متد از پیش آماده شده has ، وجود داشتن رشته متنی xmrrabbitx را در آن چک کردیم و پاسخ true بود.بر همین منوال متد دیگری در اختیار داریم به نام delete جهت حذف کردن یک داده:car.delete( [1,2,3,4,5] )         // آرایه مورد نظر حذف شد   اما چه می شود اگر بخواهیم مقادیر دو شی Set را با هم مقایسه کنیم. فرض کنید دو شی Set داریم به شکل زیر:const mySet1 = new Set( [1, 2, 3, 4] );const mySet2 = new Set( [1, 2, 3, 4, 7, 8, 9] );حالا می خواهیم ببینیم اعداد مشترک در این دو شی کدامند. برای قیاس این دو ابتدا باید هر دو شی را به آرایه تبدیل کنیم:[...mySet2];همانطور که دیدید از طریق  کد  ساده بالا، شی دوم را به آرایه تبدیل کردیم. ادامه می دهیم:const vehicle = new Set([...mySet1].filter(x =&gt; mySet2.has(x)))
// output : [1,2,3,4]سپس شی سوم از نوع Set ساختیم به نام vehicle در درون آن همان عملی را انجام دادیم که برای شی دوم انجام دادیم یعنی تبدیل شی اول به آرایه. سپس از متد filter استفاده کردیم تا بتوانیم دو شی را با هم قیاس بزنیم. در آخر از متد has استفاده کردیم تا ببینیم موارد شی دوم در درون شی اول هستند یا خیر. هر تعداد که بودند را متد filter جدا سازی میکند و سرانجام ما در قالب شی vehicle از آن خروجی میگیریم. شی Set جایگزینی برای Array نیست: در بخشی از صحبت ها می شنوم برخی از دوستان می گویند که شی Set می تواند جایگزینی برای آرایه باشد که اینطور نیست. برخی از دوستان برنامه نویس هم بسیار تلاش دارند پرفورمنس آرایه را با Set مقایسه کنند که به نظرم به دلیل ماهیت متفاوت و نحوه منحصر به فرد بودن داده ها در شی Set چندان قیاس درستی نیست. به هر شکل به دلیل این که شی Set ، متدهای مناسبی پیش پای ما میگذارد تا با داده های منحصر به فرد که می خواهیم ذخیره شان کنیم، سر و کله بزنیم، می تواند بسیار مفید باشد. امیدوارم این آموزش براتون مفید بوده باشه.لینک داکیومنت شی Set جاوااسکریپت: Set Object </description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 16 Mar 2022 04:50:59 +0330</pubDate>
            </item>
                    <item>
                <title>مقاله م توسط hackernoon پذیرفته شد: چطوری؟ ذکر یه سری نکات  مفید ...</title>
                <link>https://virgool.io/@hadimirzaie/publishing-in-hackernoon-ipyuxkkrzspq</link>
                <description>سلام هادی هستم با نام مستعار مسترربیت. چند روز پیش مقاله م توسط وبسایت Hackernoon پذیرفته شد و منم قاعدتا خیلی خوشحال بودم و به هر حال &quot;dude ... it&#x27;s Hackernoon&quot; . خلاصه که گفتم بیام تجربه ام رو با شما هم در میون بذارم و خیلی خودمونی هم صحبت میکنم انگار نشستیم جلوی همدیگه داریم گپ و گفت میکنیم. نزدیک به یک سالی بود عضو وبسایت hackernoon  شده بودم و گزینه ارسال مقاله ش خیلی واسم خودنمایی میکرد ولی اصلا اعتماد به نفس فرستادن نوشته ها و ایده های انگلیسیم رو نداشتم. معمولا زیاد مینویسم ولی جایی نمی فرستمشون چون غلط ادبی زیاد داره. خلاصه که یک ماهی روی یک عنوان کار میکردم تا این که به سرم زد برم و بفرستمش. مقاله ام بعد از دو هفته بررسی، رد شد و ادیتور برام یه سری نکات نوشت و گفت رفع شون کن. خیلی ناامیدانه مشکلات رو رفع کردم و اصلا احتمال نمی دادم بخواد تاییدش کنه ولی خب مقاله رو با دقت نوشته بودم و شدیدا توی ذوقم خورد که ردش کرد. بعد از یک ماه مقاله بالاخره تایید شد. چند نکته ای که توی این مدت فکر میکنم اهمیت داره ذکر بشه رو اوردم:۱) از نوشتن نترسید. مهم نیست در چه سطحی از مهارت رایتینگ انگلیسی هستید فقط شروعش کنید. تا کاری رو شروع نکردید، نمی دونید حدود مهارت و تسلط شما چقدره و تا چه حد از پسش بر میایید. ۲) از اکستنشن هایی مثل Grammarly برای رفع غلط های املایی یا حتی ادبی استفاده کنید. این اکستنشن خیلی به من کمک کرد تا بتونم به استانداردهای آکادمیک نزدیک بشم. ۳) متن تون حتما سکشن بندی داشته باشه. شما قرار نیست یه داستان رو از اول تا آخرش تعریف کنید. عین یه مقاله علمی باهاش برخورد کنید. از یه مقدمه شروع کنید برید به سمت تاپیک های مختلف و در آخر یه نتیجه گیری از کل بحث تون داشته باشید.۴) برای حرف هاتون مدرک کافی داشته باشید. حتما حتما به صورت هایپرلینک، ارجاع به موضوعات مهم و منابع معتبر بدید که شدیدا ادیتور براش مهمه. بدون مدرک کافی با ضن و گمان صحبت نکنید و لحن تون مطمئن باشه. اگر هم حرفی رو شک دارید در متن ذکر کنید از واژه &quot;احتمالا&quot; استفاده کنید و حتی در احتمالات هم نسبت به مخاطب شفافیت داشته باشید. شفافیت و صداقت در کلام برای ادیتور خیلی مهمه چون بنیان این وبسایت بر مبنا شواهد علمی و ارجاعات معتبر صورت گرفته.۵) هر چی متن شما فنی تر باشه، راحت تر پذیرفته میشه. اگر متن شما آموزشی باشه چه بهتر. متن های نظری به دلیل طرح نظریات کلی تر و مناقشه برانگیزتر، قضاوت ریزبینانه تری در موردشون صورت میگیره در نتیجه خیلی سخت پذیرفته میشن یا در دو مرحله مورد قضاوت قرار میگیرند. ۶) ادیتور استفاده از روایت سوم شخص رو بیشتر ترجیح میده تا اول شخص. این چیزیه که در قوانین وبسایت هم اومده که سوم شخص ترجیح اصلی وبسایت هست. پس حواستون باشه. همین دیگه نکات بیشتری به ذهنم نمیرسه امیدوارم این تجربه براتون مفید بوده باشه. هر سوالی در این مورد داشتید حتما کامنت کنید واسم ☺️ ☺️مقاله من رو هم از طریق این لینک میتونید بخونید: Could Blockchain Voting Be the Savior of True Democracy in Elections?</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Mon, 14 Mar 2022 02:38:58 +0330</pubDate>
            </item>
                    <item>
                <title>یک قدم مانده به دموکراسی حقیقی: چرا بلاکچین میتواند ناجی انتخابات ریاست جمهوری باشد؟</title>
                <link>https://virgool.io/@hadimirzaie/%DB%8C%DA%A9-%D9%82%D8%AF%D9%85-%D9%85%D8%A7%D9%86%D8%AF%D9%87-%D8%A8%D9%87-%D8%AF%D9%85%D9%88%DA%A9%D8%B1%D8%A7%D8%B3%DB%8C-%D8%AD%D9%82%DB%8C%D9%82%DB%8C-%DA%86%D8%B1%D8%A7-%D8%A8%D9%84%D8%A7%DA%A9%DA%86%DB%8C%D9%86-%D9%85%DB%8C%D8%AA%D9%88%D8%A7%D9%86%D8%AF-%D9%86%D8%A7%D8%AC%DB%8C-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8%D8%A7%D8%AA-%D8%B1%DB%8C%D8%A7%D8%B3%D8%AA-%D8%AC%D9%85%D9%87%D9%88%D8%B1%DB%8C-%D8%A8%D8%A7%D8%B4%D8%AF-doavo0lip8np</link>
                <description>انتخابات برخلاف ظاهرش، یکی از قدیمی ترین اکت های بشری است. دقیقا از همان زمانی که قبایل نئاندرتال، ۴۰ هزارسال قبل، احتمالا جایی در دشت های قفقاز، جهت بقا، با تصمیم جمعی، نقشه ای هوشمندانه برای شکار یک ماموت غول آسا گرفتند، آره دقیقا همان زمان انتخابات خلق شد. انتخابات یک حرکت جمعی است.  همه ما توافق میکنیم تا نتیجه ای حادث شود. در انتخابات آن چه که اهمیت دارد، نظر اکثریت است یعنی همان چیزی که ما امروزیی ها به آن دموکراسی میگوییم. انتخابات یا رای گیری یکی از راه های رسیدن به دموکراسی است. این روزها هم شاید در جریان باشید که انتخابات ریاست جمهوری فرانسه در جریان است. مارین لوپن، بانوی ملی گرای فرانسه در مقابل امانوئل مکرون در حال رقابت است و رقابتشان هم بسیار سنگین و نزدیک به هم است. فرانسه در واقع اولین کشوری بود که به شیوه مدرن، جمهوریت را راه اندازی کرد و دموکراسی را در قالب یک انتخابات همه گیر، رسمیت بخشید.از همان قرن ۱۸ که انقلاب خونین فرانسه به راه افتاد، تا به امروز، تمام هم و غم سیستم های دموکراسی خواه، حفظ امنیت و شفافیت انتخابات بوده است. در ساختارهای سنتی انتخابات، هر برگه رای، حاوی نام و نام خانوادگی شخص و امضای او است. تنها راه نظارت و کنترل بر چنین انتخابات هایی، حضور افراد ناظر از احزاب رقیب در محل شمارش آرا است تا صندوق های رقیب شان را تحت کنترل داشته باشند که مبادا تقلب یا جعلی صورت بگیرد.رای گیری الکترونیک هم تعریف چندانی ندارد و چندان هم همه گیر نیست. یک بخشی از مشکلات این نوع رای گیری، در دسترس نبودن زیرساخت های اینترنت در تمام حوزه های کشوری است. بسیاری از مناطق روستایی به اینترنت دسترسی ندارن و در نتیجه رای گیری سنتی یا کاغذی اولویت دارد. رای گیری الکترونیک دو حالت دارد:۱ـ شخص به شعبه اخذ رای می رود، به جای امضا کاغذی، با نظارت ناظران، به شکل الکترونیکی، هویتش را در سیستم ثبت کرده  و رای ش اخذ میشود.۲ـ  شخص در خانه خود نشسته، برگه رای را که از طرف دولت به شکل پستی دریافتش کرده، پر میکند و احتمالا اسکنش رو در سیستم ثبت کرده و میفرستد.میدانیم حالت دوم امنیتش بسیار پایین است به این دلیل که کسی نمی تواند تضمین کننده امنیت انتقال داده ها به پایگاه داده باشد. شاید بپرسید &quot; خب دولت تضمین کننده ست نه؟ &quot; باگ دموکراسی آنجایی است که نهاد دولت، ناظر بر انتخاباتی است که به نفع خودش تمام می شود! مشخص است که اگر بخواهد تقلبی صورت بگیرد، توان دولت و احزاب ذی نفوذ دولتی بیشتر از مردم است. این دقیقا در تضاد با منافع ملی و ذات دموکراسی و جمهور اکثر است. دولت قدرتمندترین نهاد هر کشور تشریف دارد و دستش برای تقلب بسیار بازتر است. پس چطور می تواند تضمین کند که پایگاه داده را دستکاری نمیکند. من پاسخ آن را می دهم: نمیتواند! دولت نمیتونواند شفافیت داشته باشد، تا زمانی که مجبور نشود، شفافیت نخواهد داشت.نمونه ای از این تقلب های گسترده در انتخابات رو بخواهم مثال بزنم، انتخابات سال ۲۰۲۰ آمریکا بود که نهایتا منجر به ریاست جمهوری بایدن شد. گرچه حزب دموکرات احتمال تقلب را رد کرد ولی نهادهای مستقل زیادی بودند که تقلب را تایید کردند. حتی یادم است آن سال که انتخابات را دنبال میکردم خیلی جالب بود بریام که یکی از ایالت های جنوبی آمریکا با استفاده از هویت یک سری آدم مرده، جعل رای کرده بودند و داخل سیستم به عنوان رای دهنده برای حمایت از بایدن استفاده از آن ها استفاده کرد بودند. معمولا  چنین اتفاقاتی داخل شهرهای کوچیک میوفتد که نظارت احزاب رقیب چندان نیست. یک جورایی نقطه کور محسوب میشود و خلاصه یک آش شلم شوربایی از دموکراسی بود آن سال. در برخی موارد مکزیکی های مهاجر غیر قانونی را به جای رای دهنده آمریکایی جا زده بودند. ببینید باگ جمهوریت و رای گیری همین چیزاست. همه میگویند: نه ... مشکل از نظارت نادرسته!آخه قربونت بشوم وقتی ناظر، دولت بر سریر قدرت باشد، خب معلوم است که هیچ وقت به انتخابات شفاف نمیرسید.تازه این ها یک بخشی از  مشکلات رای گیری سنتی است: مواردی مثل گم شدن برگه رای گیری، دزدیده شدن برگه ها، دستکاری در برگه ها، ناخوانا بودن امضا یا نام افراد، تکراری ثبت شدن نام افراد و کلی چیزهای دیگه ...اما از این حاشیه ها دور بشویم و برویم  به سراغ بلاکچین و نقشش در شفافیت و امنیت رای گیری و انتخابات.  ما میدونیم بلاکچین یک ساختار به هم پیوسته ست که هر بلاک داده، مقدار آدرس هش بلاک قبلی خودش را دارد. یک زنجیره ای از اطلاعات که بهم متصل اند. بلاک جلویی بدون حضور و تایید بلاک قبلی قابل خواندن نیست. یعنی اگر من میخواهم به محتوای بلاک ب برسم باید حتما بلاک آ یی در کار باشد که تایید کند بلاک ب ، ادامه من بوده و نگران نباش برو جلو. ساختار یک کم پیچیده تر از این حرف زدن چاله میدونی بنده ست، ولی خب گفتم که بدونید در ساختار بلاکچین، همه چیز به هم پیوسته است. دومین ویژگی بلاکچین، غیر متمرکز بودنش است. به زبون ساده بخواهم بگویم به جای این که داده های بانکی شما دست بانک ملی باشد که هر غلطی دوس داشتند با آن بکنند و تازه دو قورت و نیم شون هم باقی باشد که منِ دولت لطف میکنم پولت رو نگه میدارم و اگر ناراضی ای  برو خارج همون جاهایی که رفاه و اینا هست، جاش داده های من به شکلی غیر متمرکز در اختیار مجموعه ای از بلاک ها قرار میگیرد که به دلیل عدم تمرکز، امکان حمله هکری یا دستکاری، عملا ناممکن میشود.حالا تمام این ها تعریف بلاکچین در ساختار مالی بود و مطمئنا شما پیش خودتون میگویید ربطش به رای گیری چیست؟. شاید برای ما بلاکچین رو بد تعریف کردند و احتمالا دلیلش در مملکت ما این است که ما ایرانی ها   به لطف دوستان انقلابی، ۴۰ سالی هست که ورشکسته ایم و همین مسئله موجب هایپ بازار و کشش ایرانی ها به سمت بازار رمزارز جهت جلوگیری از ورشکستگی شد. در واقع دیفالت فکری ما ایرانی ها نسبت به تعریف بلاکچین، همان چیزیی است که جهت بقا  برایش تلاش میکنیم و به همین دلیل است که کاربردهای دیگر آن به حاشیه رفته است. ببینید بلاکچین محلی برای معاملات رمزارز نیست، بلاکچین محلی برای ذخیره داده های منحصر به فرد به شکل غیر متمرکز است، به گونه ای که شفافیت داشته باشد یعنی داده ایکس از محل فعلی به محل مقصد برسد و همه بتوانند ان را ببینند. بلاکچین را اگر بخواهم در دو کلمه خلاصه  کنم: امنیت و شفافیت.  به عبارتی: &quot; خوراکه خود انتخاباته البته نه به نفع دولت ها ! &quot;حالا شاید پیش خودتان بگویید: &quot; نه بابا، فک نکنم کسی توی این فکرا باشه که بخواد دنبال ایجاد ساختار بلاکچینی برای انتخابات باشه &quot;. بله در مملکت ما که اُم الفساد بشریت است، به تنها چیزی که فکر نمیکنند شفافیت است، ولی در ممالک خارجه، همانجاهایی که به قول زینب خانوم رفاه و این ها هست، موسسات خصوصی خیلی جدی بر روی این مسئله کار میکنند. شرکتی به نام horizone state یکی از همین شرکت هااست. دیدگاه این شرکت بسیار جالب است، ببینید وقتی ما از رای گیری صحبت میکنیم لزوما منظورمون انتخابات نیست. این روزها رای گیری در همه پلتفرم ها وجود دارد. شاید خیلی توجه نکرده باشید ولی عمده تصمیمات انسان امروزی بر مبنای همین رای گیری های مهمل و غیر قابل اعتماد صورت میگیرد.  خب بیایید این گونه فرض بگیریم: &quot; آغا وقتی میرید داخل گوگل پلی که یک اپ دانلود کنید، به اولین چیزی که توجه میکنید چیه؟ معلومه دیگه نمره ش ... آره همون ۵ ستاره بالای اپلیکیشن. از کجا معلوم این سیستم رای گیری فیک نباشه؟ مطمئنی میشه به این رای گیری اعتماد کرد؟  یه کم روش فکر کن .... &quot;وارد دیجیکالا شدید میخواهید ببینید کدام محصول رنک بالاتری گرفته که در واقع نشان از رضایت بیشتر مشتری ها دارد. چطور میتوانید به رنک بالاتر  اعتماد کنید! از طرفی سیستم رای گیری دیجیکالا اصلا جامعه آماری را نشان نمی دهد مثلا نوشته ۴ و نیم از ۵. خب چه تعدادی رای دادند که شده ۴ و نیم از ۵. ۱۰ نفر رای دادند؟ هزار نفر رای دادند؟  یا چی  ....این شرکت هوریزن استیت دقیقا  چنین کاری میکند،  خدمات رای گیری یا رنکینگ بلاکچینی را برای شرکت ها فراهم میکند تا جایگزین این سیستم رای گیری غیر قابل اعتماد بشود. پس دیدید که بلاکچین محدود به رای گیری  انتخابات ریاست جمهوری نیست و اتفاقا ابعاد اقتصادی هم دارد. در مورد انتخابات هم میتواند دارای بُعد اقتصادی باشد چنان که دولت می تواندپول در اختیار یک  یا چند شرکت خصوصی قرار دهد تا مسئول پیاده سازی سیستم بلاکچینی رای گیری انتخابات شوند. شفافیت آرا در طول این سیستم، هم توسط مردم و اشخاص و هم توسط سازمان های ناظر به راحتی قابل پیگیری است، بدون درد و خونریزی ...حالا جالبه بدونید، از منظر هزینه مالی پیاده سازی این سیستم بخواهم به قضیه نگاه کنم، هزینه پیاده سازی رای گیری سنتی که شامل کاغذ و حمل و نقل و حقوق ناظرها و میزان انرژی الکتریسیته ای که در این چند وقت هزینه میشود را حساب کردند ، بابت هر رای بین ۷ تا ۲۵ دلار به صورت میانگین هزینه میشود. همین را  قیاس زدند با رای بلاکچینی و هزینه ش چیزی حدود نیم دلار شده است به علاوه مزیت امنیت و شفافیتی که دارد. حالا تصورش را بکنید که در ساختار بلاکچینی نه دیگر خبری از ترافیک خودرو و صف های طولانی اول صبح تا شب برای رای گیری هست، نه خبری از آلودگی محیطی، نه خبری از ناظران امنیتی و درگیر شدن پلیس ها در خیابان برای کنترل جمعیت هست. حالا شما هزینه این ارگان ها را در این روزها  حساب کنید و  ببینید چه اوضاعی است ! بله دموکراسی هزینه دارد و بلاکچین این چرخه هزینه بر را به حداقل می رساند. بسیاری  از ترس شفافیت تن به رای گیری بلاکچینی نمیدهند و بسیاری از ترس قطع شدن هزینه پول پاشی دولت !حالا که تا اینجای متن آمدید ممکن است به خودتان بگویید: &quot; این بابا یه کم زیادی به مسائل دنیا، ساده نگاه نمیکنه &quot;. دوست عزیز، جهان مجموعه ای از معادلات شفاف است، پیچیده انگاری راهی برای لاپوشانی فساد سیستماتیک است. معمولا طرح های شفافیت به دلیل نداشتن صرفه اقتصادی خیلی زود شکست میخورند.اما بلاکچین تنها سیستم قابل اتکایی است که در کنار شفافیت، برای تمام دنیا سود اقتصادی هم به همراه دارد.دیر و زود دارد ولی سوخت و سوز ندارد، &quot;یک قدم مانده به دموکراسی حقیقی&quot; ...</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 09 Feb 2022 11:43:02 +0330</pubDate>
            </item>
                    <item>
                <title>پلتفرم TRUTH: بهشت جمهوری خواهان یا حقیقت تلخ !</title>
                <link>https://virgool.io/@hadimirzaie/truth-app-ciwranfpkqni</link>
                <description>دقیقا در ژانویه 2021 بود که ترامپ، رییس جمهور سابق آمریکا از توییتر برای همیشه بن شد و دیگر حق حضور در این پلتفرم فضای مجازی را نداشت. گرچه بن شدن ترامپ از یک پلتفرم مجازی جهانی، خلاف اصل آزادی بیان بود اما در واقع امری خلاف قانون صورت نگرفت. توییتر یک شرکت خصوصی است و این حق را دارد که بنا به سلیقه خود و پالیسی های تعریف شده شرکت، هر کس را که صلاح دانست بن و حذف کند. وارد مباحث ریز آزادی بیان نمی شوم چون موضوع این مقاله چیز دیگریست. از همان روزهای نخست بن شدن، ترامپ نیز در فکر ایجاد پلتفرم مجازی خود بود تا بتواند دیدگاه های خود را فارغ از مصلحت جویی های چپگرایانه، به راحتی نشر دهد. نتیجه این امر چیزی نبود جز پلتفرمی به نام Truth یا حقیقت. اما بیایید از بُعد فنی و تخصصی به ماجرا نگاه کنیم که آیا پلتفرم ترامپ موفق می شود که طیف وسیعی از مخاطبان را در سر تا سر جهان با شعار آزادی بیان و آزادی محتوا حداکثری، جذب کند یا خیر؟ تلاش بنده در این قیاس این است که درگیر جناح بندی های سیاسی نشوم و نقد منصفانه فنی داشته باشم. پس فارغ از طرفداری حزبی، خود اپ بررسی می شود.مشکلات عمده:ابتدا بیایید نگاهی به ریخت و قیافه این اپلیکیشن بندازیم. همانطوری که می دانید هنوز این اپ در حالت پیش نمایش است و در اپ استور منتشر نشده و گفته می شود در تاریخ 21 فوریه یعنی تقریبا یک ماه دیگر قرار است منتشر شود.خب همه ما میدونیم که عموم پلتفرم های مبتنی بر متن تقریبا تم مشابه توییتر دارند. آن چه که از عکس های این پلتفرم منتشر شده به لحاظ ui و ux، نشان از تقلید از سبک و ساختار توییتر دارد. هرچند تغییرات جزیی در طراحی آن را می پسندم و کمی از خشکی ظاهر توییتر دور شده است. استفاده از رنگ قرمز روشن در ترکیب با رنگ سفید، جذابیت بیشتری به آن داده است. بقیه ساختارهایش آنچنان که از ظاهر بر می آید تفاوت خاصی با توییتر ندارد. پس در بحث رابط کاربری، نمی توان انتظار تحول خاصی را داشت و در واقع چیز جدیدی قرار نیست به ما ارائه داده شود. اگر بخواهم یک سیستم نمره بندی فرضی برای خودم در نظر بگیرم در بخش ui و خلاقیت بصری، قطعا از من یک نمره منفی ( 1- ) خواهد گرفت. نه به این دلیل که زیبا نیست بلکه به دلیل نداشتن خلاقیت نوین بصری. گرچه هنوز منتشر نشده و باید از نزدیک آپشن هایش را دید و نظر داد.مبحث بعدی که بررسی خواهم کرد جامعه هدف یا طیف مخاطبین این اپ و پتانسیل رشد آن در آینده است. این اپ با شعار آزادی بیان برای تمامی طیف های سیاسی قرار است روی کار بیایید ولی حقیقت ماجرا را بخواهید باید بگویم عمده سرمایه گذاری این اپ و اپ های مشابه، بر روی طیف راست گراهای آمریکا یعنی حزب جمهوری خواه است. علت؟ ترامپ ! ... سازنده این اپ شرکتی است به نام TMTG که مخفف گروه تکنولوژی و رسانه ای ترامپ است. همین موضوع خود موید این است که به لحاظ سیاسی افرادی به سمت این اپ کشیده خواهند شد که دارای مواضع مشترک سیاسی با ترامپ هستند. اما آیا این اپ توان جذب مخاطبین خارج از حزب جمهوری خواه را دارد یا خیر؟برای بررسی این امر شاید بهترین کار، بررسی تجربه های پیشین اپ های مشابه باشد. یکی از این اپ ها  Gettr است. بعد از آن تجربه تلخ بن شدن ترامپ، جیسون میلر سوشیال مدیایی را ایجاد میکند که هدف آن جذب مخاطبینی است که توسط کمپانی های بزرگ تکنولوژی، اصطلاحا دیپلتفرم شده اند یعنی دسترسی آن ها به پلتفرم های رایج فضای مجازی محدود یا مسدود شده است. دقیقا در همان روزهای نخست توانست روزانه ۴۰۰هزار یوزر را جذب کند و در حال حاضر ۴ میلیون کاربر دارد. سرمایه گذار این پروژه بیلیونر معروف تبعیدی چینی به نام آقای گوو ونگویی و جمع دیگری از سرمایه گذاران است. افراد مشهوری چون جو روگان به این پلتفرم پیوستند و اصطلاحا آن را هایپ کردند. جذب ۴ میلیون یوزر در مدت زمان کوتاه یک سال، موفقیت بزرگی بود. هرچند این پلتفرم با مشکلاتی چون انفجار محتوای پورن غیر قانونی و هک شدن برخی از اکانت ها نیز مواجه شد. طبیعی هم بود انتظار چنین حجمی از استقبال نمی رفت و به همین دلیل اصلا برنامه مناسبی برای کنترل آن نداشتند. پس می توان از همین تجربه نتیجه گرفت که احتمالا پلتفرم حقیقت ترامپ به پشتوانه محبوبیت رییس جمهور سابق آمریکا، بتواند طیف وسیعی از مخاطبان راست گرا حتی به مراتب بیشتر از پلتفرم Gettr را جذب کند. اما هیچ تجربه ای یافت نمی شود که نشان دهد چنین پلتفرم های سیاسی، توانایی جذب مخاطب های با تفکرات مختلف را داشته باشند. ضعف عمده پلتفرم های این چنینی که بر آزادی بیان تاکید دارند در همین قسمت است. تاکید بیش از اندازه بر یک اصل اجتماعی به نام آزادی بیان که عموما تعریفی نامشخص دارد و پیوند آشکارش با سیاست، تاثیر مثبتی در جذب مخاطبان عمومی نخواهد داشت و اگر ترامپ می خواهد پلتفرم موفق و همه گیری داشته باشد باید از تاکیدات سیاسی پلتفرمش  دور شود زیرا مردم، سوشیال مدیا را زندگی میکنند و سیاست بخش کوچکی از زندگی شان است. سیاست عموما تصویری ترسناک دارد و مخاطبان جوان و نوجوان علاقه ای به این مباحث ندارند. نگاهی بیندازید به موفقیت پلتفرم چینی تیک تاک و محبوبیت آن در میان نوجوانان و اهمیت رقص و نور در این پلتفرم. به نوجوانان حق میدهم که علاقه داشته باشند چالش های رقص تیک تاکی را دنبال کنند تا این که بخواهند در یک پلتفرم به شدت سیاسی، انواع سلاح های سرد و گرم را به چشم ببینند.باز بر میگردیم به سیستم نمره دهی فرضی خودمان و به این بخش هم یک نمره منفی ( 1- ) می دهم. این پلتفرم شاید در بخش حزبی ـ سیاسی آمریکا بتواند موفق عمل کند اما در ابعاد جهانی، میلیون ها سال نوری با واقعیت های سئو و مارکتینگ بازار آزاد فاصله دارد. ذکر این مشکلات لزوما به معنی شکست این پلتفرم نیست بلکه حیات و زیست سوشیال مدیا مانند ساختمان سازی که حرفه اصلی ترامپ است، نیست و باید به مثابه جامعه، چند بُعدی و منعطف با آن برخورد کرد و به مرور مشکلات را رفع و تلاش برای کسب اعتماد حداکثری نمود. ضدیت با همه یا همه در مقابل او:در تعریف هدف کمپانی TMTG ترامپ آمده که این گروه به دنبال ایجاد مجموعه ای از تکنولوژی های رسانه ای مانند سوشیال مدیا، رسانه های تلویزیونی و خبری است. با توجه به تسلط بیگ تک ها بر تمامی اعصار و وجوه زندگی بشر، این گروه هدف خود می داند تا مجموعه ای را ایجاد کند که قابل کنسل شدن یا همان تبعید رسانه ای را نداشته باشد. تمام این حرف ها در ظاهر زیباست و کاملا هم درست است زیرا بیگ تک ها بیش از آن چه که باید، بر زندگی بشر مسلط شده اند و حتی در حال هدایت جریان های سیاسی و اجتماعی در کشورهای مختلف به نفع گروه های سیاسی خاص یا دولت ها هستند. منطقی است که در مقابل این ساختار سرکوب کننده، ساختاری برای مقابله با آن نیز به وجود بیاید. اما مسئله ای که در رابطه با این اپلیکیشن وجود دارد این است که سوشیال مدیا، همانطوری که بارها ذکر کردم، یک موجود زنده است و برای زنده ماندن نیاز به فاکتورهای مختلف دارد. وابستگی های زیستی متنوعی دارد که باید رفع شوند. پس وقتی این گروه از خودکفایی کامل نسبت به بیگ تک ها صحبت میکند صرفا با یک فرانت ساده رو به رو نیستیم بلکه باید سرورهای هاستینگ خودش را جهت خودکفایی فراهم کند. دلیل‌؟ سرورها همان جایی هستند که محتوای اپ و یوزرها در آن جا نگهداری می شوند. بهتر است اشاره ای به قطع دسترسی اپلیکیشن پارلر ( یک اپ محافظه کار آمریکایی ) به سرورهای آمازون توسط شرکت آمازون بکنم که نشان از همین امر دارد. اگر در آینده این اپلیکیشن نتواند استانداردهای حداقلی پالیسی های سرورها را رعایت کند به سرنوشت اپلیکیشن پارلر دچار می شود. حالا تصور کنید که بخواهد خودش سرورهای خودش را میزبانی کند. سه راه برای ادامه این مسیر دارد:۱- سرورهای اختصاصی خود را با مارکتینگ قوی به سرور عمومی و قابل فروش بدل کند.۲- گزینه سرور اختصاصی را کنار بگذارد و پالیسی های محتوایی خود را سخت گیرانه تر تعیین کند که اصل آزادی بیان را به صورت اتوماتیک زیر سوال میبرد.۳- ابتدا با پالیسی های سخت گیرانه و سرورهای اختصاصی، به یک اپ محبوب بدل شود و سپس مانند تلگرام به سمت آزادی بیان گام بردارد. از آن جایی که TMTG آمده که با چنین سختگیری هایی در پالیسی های بیگ تک ها مبارزه کند، احتمالا گزینه اول محتمل تر است منتها باید دید که کار به کجا می کشد. نتیجه گیری:گرچه تفکر مبارزه با بیگ تک ها، تفکر ارزشمندی است اما باید در نظر داشت فضای سوشیال مدیا، یک فضای زیستی زنده است که با شعار خودکفایی کامل، آن هم در ساختار بازار آزاد حاصل نمی شود. برای رهایی از تسلط بیگ تک ها و حیات تفکر آزادی بیان برای تمامی طیف ها، ترامپ و گروهش بهترین کاری که می توانند بکنند، حرکت به سمت ساختارهای بلاکچینی و اپ های مبتنی بر شبکه اتریوم و وب ۳ است. در این حالت اطمینان لازم به تمام رقبا داده می شود که:۱- این ساختار جدید، ارزش سرمایه گذاری دارد.۲- تمرکز معکوس وجود نخواهد داشت.تمرکز معکوس چیست؟ برای دست یابی به آزادی بیان مطلوب جمهوری خواهان، باید به تمامی یوزرها اطمینان بدهیم که فرصت برابر برای تمامی اقشار با دیدگاه های سیاسی متنوع وجود دارد و این امر از طریق یک تمرکززایی جدید حاصل نمی شود بلکه باید به سمت عدم تمرکز حرکت کرد. ایده ترامپ ارزشمند است اما راهش چندان موفقیت آمیز نخواهد بود. همانطور که قبلا هم گفتم، در مقیاس کوچک شاید سودآور و موفق باشد عموما در سطح ملی، اما در سطوح جهانی، چه از جنبه سیاسی و چه اجتماعی، نه به صرفه است و نه جذاب !بهتر است تعبیر پایانی ام را از این پلتفرم این گونه ابراز کنم: اپلیکیشن TRUTH، منجر به حقیقتی تلخ خواهد شد !</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Mon, 31 Jan 2022 20:11:28 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش ساخت ویجت آب و هوا با php و open weather map api</title>
                <link>https://virgool.io/@hadimirzaie/openweathermapapi-nbstqlpcafug</link>
                <description>خب ابتدا با معرفی open weather map شروع میکنم. این وبسایت خدمات جالبی در زمینه هواشناسی ارایه میده، از اطلاعات آب و هوا گرفته تا نقشه های زمین شناسی، دما و نقشه های مرتبط با زمین های کشاورزی. در این پست قصد دارم به معرفی api این وبسایت بپردازم.این وبسایت Api های مختلفی داره و اغلب این Api ها پلن رایگان دارند و در صورت نیاز به خدمات بیشتر نیاز به سابسکرایب پولی هست. این Api خوبه چون: ۱- رایگانه۲ـ از زبان فارسی پشتیبانی میکنه.وارد وبسایت openweather.org بشید. ثبت نام کنید و از طریق ایمیلی که براتون ارسال می شه، حساب کاربری تون رو فعال کنید. پس از ورود به وبسایت، وارد بخش API KEYS  از منو بالا  بشید:در این بخش همون طوری که میبینید به صورت دیفالت یک api key بهتون داده که میتونید برای درخواست ازش استفاده کنید ولی علاوه بر این کلید، کلی کلید دیگه هم میتونید بسازید و نام دلخواه براش بذارید. ما به این کلید برای درخواست دادن به سرور و متعاقبا دریافت پاسخ نیاز داریم. خب حالا بیایید بریم سراغ کدهامون، یه فایل ایجاد کنید به نام weather.php و کدهای زیر رو داخلش بنویسید:$appkey = &quot;your API KEY&quot;; $cityname = &quot;Tehran&quot;;$urlapi = &quot;api.openweathermap.org/data/2.5/weather?q=&quot; . $cityname . &quot;&amp;lang=fa&amp;units=metric&amp;appid=&quot; . $appkey ;خب بذارید این قسمت از کد رو بهتون توضیح بدم در این قسمت ما ساختار لینکی که قراره بهش درخواست بدیم رو ایجاد کردیم بر اساس همون دستور عمل های خود وبسایت. کلید Api مون رو در یک متغییر تعیین کردیم و یک متغییر هم نام شهر مون رو مشخص کردیم، میتونه نام کشور یا هر منطقه قابل جست و جو باشه. اگر توجه کرده باشید لینک ما دو تا پارامتر اضافی هم داره یکی lang که برابر با fa قرار گرفته همون زبان فارسی خودمونه که بهش میگیم هر مقدار از نوع استرینگی رو که بر میگردونی به زبان فارسی بر گردون و پارامتر دوم units هست که برابر قرارش دادیم با  metric ، اینجوری مقادیر رو بر مبنای متریک حساب میکنه و بر میگردونه واسه ما یعنی مثلا وزش باد رو بر مبنای کیلومتر بر میگردونه و  دما رو بر مبنای سانتی گراد بر میگردونه، نه فارنهایت !!!در همین فایل کدها رو ادامه میدیم:$ch = curl_init();curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);curl_setopt($ch, CURLOPT_URL, $urlapi );$response = curl_exec&#40;$ch&#41;;curl_close($ch);$data = json_decode($response);خب قسمت بعدی کدهای ما اینه که با استفاده از یک اکستنشن در زبان php بیاییم به لینک مورد نظرمون درخواست از نوع HTTP ارسال کنیم. این اکستنشن نامش Curl  هست. خب بیایید ببینیم چکار کردیم، خط اول در واقع یک سشن کرل ایجاد کردیم برای استفاده. در خط دوم برای سشن کرل، آپشن در نظر گرفتیم آپشن نخست ما مقدار برگشتی رو به شکل استرینگ بر میگردونه ، آپشن دوم لینک رو بهش نسبت میدیم، و در نهایت از طریق curl_exec به اجراش میذاریم و سشن کرل رو میبندیم. از طریق jeson_decode مقدار برگشتی رو کدشکنی میکنیم تا به شکل یک شی قابل استفاده در php در بیاد. در نهایت متغییرهای خودتون رو تعیین کنید و از شی برگشتی data برای دسترسی به داده های مورد نظر خودتون استفاده کنید:$cityname = $data-&gt;name;$status = $data-&gt;weather[0]-&gt;description;$humidty = $data-&gt;main-&gt;humidity;$wind = $data-&gt;wind-&gt;speed;$temp = $data-&gt;main-&gt;temp;$feels = $data-&gt;main-&gt;feels_like;خب همینجور که میبینید ما از طریق شی data به مقادیر مورد نظرمون دسترسی پیدا کردیم اگر میخواهد کلیت شی رو ببینید کافیه print_r($data) رو بنویسید تا شی و مقادیر برگشتی رو بهتون نشون بده و به هر مقداری که خواستید دسترسی پیدا کنید. حواستون باشه ما api keys رو امن سازی نکردیم. میتونید از طریق یک پکیج به نام dotenv در php اقدام به امن سازی کلیدهای خود یا هر داده حساس دیگه بدون ایجاد استثنا در فایل htaccess  بکنید. اگر علاقه مند به امن سازی هستید میتونید آموزش تصویری همین پست رو از طریق لینک زیر در یوتیوب مسترربیت ببینید:کلیک کنید. در پایان ویدیو، شیوه امن سازی کلید API رو توضیح دادم. ممنون از این که تا پایان این آموزش با من همراه بودید ....</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 29 Dec 2021 08:24:20 +0330</pubDate>
            </item>
                    <item>
                <title>از دعوت نشدن به هاگوارتز تا پیام های تهدید به مرگ: ماجرای جی کی رولینگ</title>
                <link>https://virgool.io/@hadimirzaie/j-k-rowling-i2pkwhnyefqi</link>
                <description>دقیقا یک هفته پیش خبر رسید که در شب سال نو میلادی، دورهمی هاگوارتز به میزبانی شبکه اچ بی او مکس، قرار است برگزار شود. این دورهمی در واقع یک تجدید دیدار بازیگران و عوامل اجرایی مجموعه فیلم های هری پاتر با طرفدارانش است. خبر خوشحال کننده بود تا جایی که شنیدیم جی کی رولینگ، خالق داستان هری پاتر دعوت نشده است. پس از پرس و جو مشخص شد که عامدانه به این مراسم دعوت نشده و پاسخ شبکه به خبرنگارها این بود:‌ &quot; به دلیل نگرانی های بخشی از جامعه نسبت به اظهارات جی کی رولینگ، او را دعوت نکردیم &quot;.خب اولین سوالی که در ذهن شما می آید این است که مگر جی کی رولینگ چی گفته که باعث نگرانی جامعه شده‌؟؟جی کی رولینگ، نویسنده داستان های هری پاترماجرا از سال 2019 شروع شد درست زمانی که شخصی به نام مایا فراستریتر با منتشر کردن چند توییت علیه ترنس ها، از شغل خود اخراج شد ... عملی ناعادلانه از سوی دولت بریتانیا. حالا چرا ناعادلانه؟  زیرا خانم مایا فراستریتر از حق آزادی بیانش استفاده کرده و ارتباط چند توییت به شغلش یعنی ایجاد کردن هزینه برای ابراز عقیده که خود نوعی نقض اصل آزادی بیان محسوب می شود. در پی این ماجرا، خانم جی کی رولینگ متعاقبا از خانم مایا دفاع و به دولت بریتانیا بابت اخراج این شخص انتقاد کرد. پس از این ماجرا بود که ترنس ها و گروه های با تفکر چپ، خانم رولینگ را متهم به ضدیت با ترنس ها یا به اصطلاح ترنسفوبیک کردند آن هم صرفا به خاطر دفاع از حق آزادی بیان یک شخص دیگر !!!اما ماجرا به همینجا ختم نشد و در سال 2020 در بحبوحه همه گیری کرونا ، سازمان بهداشت جهانی طرحی را برای کمک به زنان آفریقایی شروع کرد و در عنوان خبری این طرح تیتر جنجال برانگیزی را زد: &quot; کمک به کسانی که دچار قاعدگی می شوند در دوران کووید 19&quot;. نکته این طرح چیزی نبود جز حذف واژه زنان و استفاده از یک جمله توصیفی برای جایگزینی عنوان زن بود. خانم رولینگ این بار در توییتر خودش با انتقاد از روند فکری سازمان بهداشت جهانی به طعنه نوشت:&quot; میشه بهم بگید کسانی که دچار قاعدگی میشن اسم شون چیه؟؟ &quot;طرح سازمان بهداشت جهانیطعنه خانم رولینگ به همین حذف واژه زن بود. در واقع این گروه های با تفکر چپ که این روزها بر سازمان های جهانی چنبره زدند راه برابری را در پوپولیست فکری و بازی با کلمات میدانند، امری که برای خانم رولینگ مضحک آمده و برابری را در نه در حذف واژه زن و مرد بلکه در عمل میبیند.پس از این ماجرا، پروژه تبعید اجتماعی خانم رولینگ یا به اصطلاح cancel culture  او شروع شد تا به طور کامل او را از جامعه و ارتباطات رسانه ای و شغلی حذف کنند. ما هنوز تا پایان سال 2021، به ابعاد این تبعید پی نبرده بودیم تا این که متوجه شدیم دعوت نشدن به مراسم هاگوارتز، در واقع ترکش های همان مجموعه فعالیت های فعالین چپ بوده است. اما این فعالین و گروه های افراطی با تفکر چپ، هنوز از این ماجرا راضی نبودند و جنجال تازه ای به پا کردند. شخصی به نام هالی استارز که خود را فعال حقوق ترنس ها می نامد چند نفر را در بریتانیا اجیر کرد تا از خانه و آدرس خانم رولینگ عکسی بگیرند و برایش ارسال کنند. متعاقبا، هالی استارز آدرس خانه را در توییتر خود منتشر میکند و به صورت تلویحی مردم بریتانیا را به خشونت و حمله فیزیکی علیه جی کی رولینگ دعوت می کند. نتیجه چیزی نبود جز موج پیام های تهدید آمیز، قتل، تجاوز به خانم رولینگ ، دخترش و دیگر اعضای خانواده اش !!!!هالی استارز، فعال حقوق ترنس هاخانم رولینگ به پلیس اسکاتلند شکایت میکند و پرونده سریع به جریان میوفتد تا اشخاص خاطی شناسایی شوند. خانم استارز که میبیند شرایط از کنترل خارج شده عکس را پاک میکند اما همچنان در توییتر خودش را حق به جانب اعلام میکند. شرکت توییتر در یک حرکت باورنکردنی که انتظارش نمیرفت اکانت هالی استارز را به جرم دعوت به خشونت دیلیت میکند. گرچه اقدام مناسبی بود اما کافی نبود زیرا همچنان رسانه های اصلی در دستان چنین افرادی هستند که به خودشان اجازه میدهند نه تنها حق آزادی بیان دیگران را سرکوب کنند بلکه حتی پا را از این هم فراتر گذاشته و به تهدید و تجاوز هم دست بزنند.مخلص کلام این که ماجرای رولینگ ریشه در تفکر سوسیالیست هایی دارد که در لباس فعالین اقلیت های جنسی، دست به سرکوب و تهدید میزنند !!!باشد که دنیا به فضایی سالم تر و امن تر تبدیل شود ... !!!</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Fri, 26 Nov 2021 19:24:56 +0330</pubDate>
            </item>
                    <item>
                <title>ویدیو سلفی اینستاگرام _ ورژن آمریکاییِ سیستم تشخیص چهره چین یا یک احراز هویت ساده ؟</title>
                <link>https://virgool.io/fboard/video-selfie-instagram-gnnehpyjjmtj</link>
                <description>روز دوشنبه سال  1400 خورشیدی، بر روی اسکرین تعدادی از کاربران اینستاگرام پیامی ظاهر شد با این مضمون: &quot; ما به یک ویدیو سلفی از شما نیاز داریم از زوایای مختلف تا بتوانیم هویت شما را تایید کنیم و مطمئن شیم شما انسان هستید  !!!! &quot;video selfie پس از گرفتن ویدیو، پیام دیگری ظاهر می شود که می گوید: &quot; این ویدیو پس از 30 روز پاک می شود و برای موارد مرتبط با سیستم تشخیص چهره و جمع آوری داده های بایومتریک استفاده نخواهد شد !!! &quot;.خب اصلا بیایید ببینیم منظور از تشخیص چهره و داده های بایومتریک چیه؟ سیستم تشخیص چهره در واقع یک سیستم هوشمند شناسایی ابعاد و ویژگی های منحصر به فرد صورت انسان است که توانایی احراز هویت اشخاص را به صورت اتوماتیک بدون نیاز به شخص ثالث به ما میدهد. داده های بایومتریک در واقع مجموع ویزگی های منحصر به فرد انسان است که قابلیت جمع آوری و تحلیل دارند. مثلا اثر انگشت که یک عنصر منحصر به فرد است، الگوی صدای اشخاص و نهایتا تلاش برای رسیدن به یک تحلیل روانشناسیِ رفتاری بر مبنای چنین داده هایی !!!! منظور اینستاگرام از این پیام این بود که تمامی این ویدیو ها به صورت دستی توسط کارکنان فیسبوک چک می شوند و در طی این پروسه، از هوش مصنوعی برای تشخیص چهره استفاده نخواهد شد و داده های بیومتریک جمع آوری نخواهد شد !!!! تصورش رو کنید میلیون ها ویدیو سلفی باید توسط کارکنان فیسبوک به صورت دستی چک شوند، یا دارند ما رو دست میندازند یا واقعا اینقدر ابله تشریف دارند !!!این اقدام زمانی جالب تر می شود که بدانیم این قابلیت در واقع از یک سال پیش در حال توسعه بوده و قرار بوده به صورت همگانی برای تمام کاربران فعال شود که بنا به دلایلی ناکام مانده است و به صورت محدود بر روی برخی از اکانت ها تست شده است. پس این ماجرا سر درازی دارد و ماجرای یک روزه و دو روزه هم نیست.حالا بیایید یه فلش بک بزنیم به دو هفته پیش زمانی که خبری منتشر شد مبنی بر احتمال تعطیلی پروژه سیستم تشخیص چهره فیسبوک. در آن زمان جروم سنتی رییس بخش هوش مصنوعی شرکت متا ( همون فیسبوک خودمون ) اعلام میکند که با توجه به نگرانی های اجتماعی مرتبط با سیستم های تشخیص چهره، به دنبال راهی هستیم که بین اجرایی کردن آن و جامعه یک بالانس ایجاد کنیم. او در ادامه همچنان این سیستم را یک ابزار قدرتمند میداند که پتانسیل بالایی دارد. شرکت Metaحالا مشخص تر شد که فیسبوک با فعال کردن این سیستم در اینستاگرام برای چه پروژه ای جا باز میکند. در واقع اینستاگرام فیک بودن یوزرها را هدف نگرفته بلکه مبحث &quot;ناشناس&quot; بودن یا همان حق anonymity برای نشر عقیده را هدف گرفته است. ناشناس بودن یک حق شهروندی برای تمام مردم دنیاست. برای این که بدونید دقیقا از چه مسئله هولناکی صحبت میکنم میتونم اشاره کنم به سیستم تشخیص چهره چین که مسلمانان اویغور را از ترس شورش یا اتحاد مورد شناسایی قرار داده تا بتواند الگوی رفتاری و رفت و آمد آن ها را شناسایی کند. در این حالت نقشه ای رفتاری از هر شخص ترسیم خواهد شد که محدوده روابط او با دیگران مشخص می شود. عناصر به اصطلاح خطرناکی که دولت تشخیص میدهد از این طریق قابل شناسایی و برخورد خواهد بود !!!!حالا در چنین فضایی، فیسبوک سیستمی مشابه را قصد دارد در سایه یک ساختار متوهمانه خصوصی به خورد ما بدهد. در این سیستم شما توهم اراده و اختیار دارید ولی در عمل به دلیل نیاز مبرم اقتصادی_اجتماعی تان به شبکه های مجازی تن به احراز هویت میدهید و ناشناس بودن تان از بین می رود. مطمئنا در سیستم های دیکتاتوری، این مسئله می تواند منجر به خطر افتادن جان فعالینی شود که به ارائه اطلاعات حساس می پردازند، سیستم های بسته ای مثل چین یا روسیه !!!!در نهایت باید گفت این مسئله به شدت نگران کننده است و بار دیگر نیازِ به داشتن فضاهای اینترنتی غیر متمرکز را بیشتر و بیشتر کرد. به امید روزی که بتوان در فضایی برابر با آسودگی فعالیت کرد .... !!!! </description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Thu, 18 Nov 2021 08:24:13 +0330</pubDate>
            </item>
                    <item>
                <title>باگ اسکرولِ بوت استرپ _ تداخل jquery با bootstrap</title>
                <link>https://virgool.io/@hadimirzaie/%D8%A8%D8%A7%DA%AF-%D8%A7%D8%B3%DA%A9%D8%B1%D9%88%D9%84%D9%90-%D8%A8%D9%88%D8%AA-%D8%A7%D8%B3%D8%AA%D8%B1%D9%BE-%D8%AA%D8%AF%D8%A7%D8%AE%D9%84-jquery-%D8%A8%D8%A7-bootstrap-dsypt5juz3bk</link>
                <description>یکی از باگ هایی که اخیرا بهش برخوردم مربوط به اسکرول بوت استرپ بود ( باگ جدیدی نیست !!! ) ولی خب زیاد با بوت استرپ کار نکرده بودم. زمانی که می خوام از اسکرول جی کوئری استفاده کنم مثلا کد زیر که از w3school برش داشتم:کد بالا به من یه اسکرول smooth  اصطلاحاً میده ، منتها زمانی که بوت استرپ رو به پروژه اضافه میکنم این اسکرول در مرورگرهای کروم بیس مثل brave از کار میوفته. علت چیه؟علت ویژگی  اسکرول اسموث واقع  در مسیر  bootstrap/css /bootstrap.css  است:اگر نگاهی به پرسش و پاسخ های فوریوم های مرتبط بندازید احتمالا به جوابی اینچنینی میرسید: &quot;بوت استرپ برای رع نیازهای css شما طراحی شده و اگر میخواهید اسکرول اسموث ایجاد کنید بهتره از بوت استرپ استفاده کنید و بخش اسکرول جی کوئری رو حذف کنید&quot;. یک جواب ابهانه  !!!!معلومه که دلم نمیخواد چیزی رو حذف کنم. من چیزی رو استفاده میکنم که صرفه ش از دیگری بیشتر باشه نه این که صرف تداخل، ارجح بدونم که یه چیزی رو نگه دارم و دیگری رو حذف کنم. پس در نتیجه به عنوان یک راهکار موقت می توانید smooth رو در بوت استرپ به auto  تغییر دهید. بله مطمئنا کسانی که این مقاله رو میخونند خواهند گفت که جی کوئری چیه که کله پاچه ش چی باشه که بخواییم سر این داستان این همه سختی بکشیم، بحث سختی کشیدن نیست، بحث تلاش برای بهتر کردن ساختاری هست که هنوز نمرده !!! پس بهتره با دید باز نسبت به حتی کم اهمیت ترین باگ های دنیا پیش به جلو حرکت کنیم ... .</description>
                <category>hadi mirzaie</category>
                <author>hadi mirzaie</author>
                <pubDate>Wed, 10 Nov 2021 23:50:41 +0330</pubDate>
            </item>
            </channel>
</rss>