بلاگ

جستجوی فایل ها در لینوکس با دستور Find

در این مطلب قصد داریم نحوه جستجو در ترمینال لینوکس را براساس معیار های مختلف مثل حجم، نام ، پسوند، سطح دسترسی، تاریخ و … را تشریح کنیم، دستور find با سوئیچ های مختلفی که دارد امکان سرچ  در لینوکس را بسادگی فراهم می کند.

جستجوی فایل ها براساس نام

جهت سرچ براساس نام نیاز است از دستور find  با سوئیچ -name استفاده کنید، البته اگر می خواهید بحروف بزرگ و کوچک حساس نباشد بجای -name  از -iname استفاده کنید.

بطور مثال اگر می خواهید فایلی بنام test.jpg را در دایرکتوری جاری سرچ کنید. دستور بصورت زیر می شود.

جهت سرچ کلیه فایل ها در دایرکتوری /home و با نام test.txt لازم است دستور زیر را اجرا کنید :

بعنوان مثال در تصویر زیر فایل هایی با نام passwd در دایرکتوری / سرچ شده و خروجی بصورت زیر مشاهده شده است:

 

جستجوی پوشه ها براساس نام

ساختار دستور بصورت زیر می باشد:

بعنوان مثال برای جستجو تمام پوشه های بنام backup در /home دستور بصورت زیر تغییر می کند:

یا بطور مثال برای پیدا کردن فایل های مخفی در /home/aban/public_html/ از دستور زیر استفاده کنید:

بعنوان مثال در تصویر زیر پوشه هایی با نام  public_html در دایرکتوری / سرچ شده و خروجی بصورت زیر مشاهده شده است:

 

 

جستجوی فایل ها با پسوند خاص

ساختار دستور بصورت زیر می باشد:

بطور مثال جهت سرچ فایل هایی با پسوند .php در مسیر جاری دستور بصورت زیر تغییر می یابد:

 

جستجوی فایل ها با سطح دسترسی خاص

ساختار دستور بصورت زیر می باشد:

بطور مثال  برای پیدا کردن کلیه فایل ها با سطح دسترسی ۷۷۷ از دستور زیر می توانید استفاده کنید.

 

 

جستجوی دایرکتوری ها با سطح دسترسی خاص

ساختار دستور بصورت زیر می باشد، بصورت کلی type  با سوئیچ f برای فایل ها وبا سوئیچ d برای دایرکتوری/پوشه ها استفاده می شود.

بطور مثال  برای پیدا کردن کلیه پوشه ها با سطح دسترسی ۷۷۷ از دستور زیر می توانید استفاده کنید.

با استفاده از !  در دستور FIND  می  توانید عملیات جستجوی معکوس را انجام دهید.

بعنوان مثال جهت جستجوی تمام فایل ها موجود در /home که پرمیژن آن ۷۷۷ نیست از دستور زیر استفاده کنید:

جستجوی فایل ها و دایرکتوری های خالی

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

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

 

 

جستجوی فایل های یک یوزر خاص

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

بطور مثال برای جستجو تمام فایل هایی که متعاق به یوزر aban و در مسیر /home/admin  است، دستور بصورت زیر می باشد:

 

جستجوی فایل ها بر اساس حجم

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

بعنوان مثال جهت جستجوی فایل ها با حجم بیشتر از ۵۰ و کمتر از ۱۰۰  مگابایت  دستور بصورت زیر تغییر می کند:

بعنوان مثال در تصویر زیر فایل های لاگ موجود در سرور با حجم بیشتر از ۱۰ مگابایت سرچ شده و در خروجی نمایش داده می شود:

 

 

کاربرد -exec در دستور find

با -exec شما می توانید مشخص کنید چه عملیاتی بر روی خروجی دستور اجرا شود.

بطور مثال سطح دسترسی کلیه فایل ها  موجود در یک مسیر را از ۷۷۷ به  ۶۴۴ تغییر دهید.

کلیه فایل های .mp3 در مسیر جاری را حذف نمائید.

لیست کلیه فایل های لاگ با حجم بیشتر از ۱۰۰ مگ را مشاهده کنید.

 

جستجوی فایل ها بر اساس ساعت و تاریخ

 جستجو کردن فایل هایی  که در روزهای قبل ویرایش شده اند.

بعنوان مثال جهت جستجوی فایل هایی که در ۵۰ روز پیش در مسیر / تغییر کرده اند از دستور زیر استفاده نمائید.

جستجوی کردن تمام فایل هایی که در  مسیر / در ۵۰ روز پیش به آن ها دسترسی پیدا شده است، مشاهده شده اند.

جستجوی تمام فایل هایی که در یک ساعت اخیر تغییر داده شده اند.

جستجوی تمام فایل هایی که در یک ساعت اخیر ویرایش شده اند.

newerXy : این گزینه در صورتی قابل استفاده است که timestamp X فایلی که در جستجوی آن هستیم از timestamp Y آن جدیدتر باشد. بجای X و Yمیتوان هر یک از حروف زیر را استفاده کرد :

a: این سوئیچ زمان دسترسی فایل میباشد.

B :این آپشن زمان ایجاد فایل میباشد.

m: زمان تغییر فایل

t: با استفاده از این سوئیچ میتوانید مستقیما در دستور یک تاریخ را درج کنید.

بعوان مثال در دستور زیر تنها فایل هایی که در تاریخ ۲۰۱۶-۱۲-۰۶ در مسیر جاری تغییر داده شده اند جستجو میشوند:

 

maxdepth

با این آپشن میتوانید حداکثر عمق جستجو را با عنوان یک level مشخص کنید، که تا چندین level از subdirecotry های موجود از دایرکتوری جاری و یا دایرکتوری مورد جستجوی بررسی و search را انجام دهد.

جهت درک بهتر تصویر زیر را مشاهده کنید:

 

نوشته جستجوی فایل ها در لینوکس با دستور Find اولین بار در ایران سرور پدیدار شد.

گردآوری توسط ایده طلایی

پای بیلبوردهای تبلیغاتی به آسمان هم کشیده خواهد شد [تماشا کنید]

ممکن است ستاره‌ها نیز رقیب پیدا کنند. یک کمپانی روسی با نام StartRocket در حال کار روی ساخت بیلبوردهایی درخشان برای قرار گرفتن در آسمان است.

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

کمپانی StartRocket اعلام کرده که آن‌ها می‌توانند تبلیغات را به مدت زمان ۶ دقیقه به نمایش بگذارند در حالی که ماهواره‌های کوچک مربوط به این کار در فاصله ۴۰۰ الی ۵۰۰ کیلومتری سطح زمین قرار خواهند گرفت.

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

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

نوشته پای بیلبوردهای تبلیغاتی به آسمان هم کشیده خواهد شد [تماشا کنید] اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

آی پی ثابت اینترنتی چیست و چرا نباید از آن استفاده کرد؟

تقریباً تمامی شرکت های ارائه دهنده خدمات اینترنت (ISP) گزینه آی پی عمومی را با قیمتی در حدود ۵ تا ۱۰ هزار تومان در هر ماه در اختیار کاربران قرار می دهند. البته ممکن است این گزینه را با نام های دیگری از جمله آی پی استاتیک، آی پی عمومی و یا آی پی ایستا هم دیده باشید. شاید در اختیار گرفتن آدرس ثابت با این قیمت نسبتاً ارزان روی اینترنتی که در اختیار دارید گزینه ای جذاب به نظر برسد اما در این مطلب قصد داریم خطرات آن را بررسی کنیم و احتمالاً با خواندن این مطلب از خرید آی پی ثابت پشیمان خواهید شد.

در ادامه مطلب مفهوم واژه های «آی پی عمومی» و «آی پی ثابت» مشابه و منظور آی پی ثابت اینترنتی است و نه آدرسی که در هر شبکه محلی به صورت دستی روی کارت شبکه خود تنظیم می کنید.

آدرس آی پی چیست و چگونه کار می کند؟

اگر بخواهید برای دوستتان نامه ای بفرستید، نیاز به آدرس او دارید. بدون آدرس قطعا اداره پست قادر به ارسال نامه نخواهد بود. اینترنت هم تقریباً به همین صورت کار می کند. تمامی کارهایی که در فضای آنلاین انجام می شود، از جمله بررسی کردن ایمیل ها، مشاهده ویدیوی یک گربه و … نیاز به تبادل داده بین دستگاه مورد استفاده شما و سرور میزبان آن اطلاعات دارد. هر مشارکت کننده در این فرایند هم نیاز به آدرس ویژه خود دارد.

آی پی عمومی

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

این آدرس ها در واقع همان آدرس های IP هستند که به صورت ۴ عدد از ۰ تا ۲۵۵ نوشته شده و با نقطه جدا می شوند. به عنوان مثال ۷۹٫۱۷۵٫۱۳۳٫۲۲۲ یک آدرس آی پی (در IP نسخه ۴) است. این روش آدرس دهی ترکیب بیش از ۴ میلیارد آدرس را ایجاد می کند که البته بسیار کمتر از تعداد دستگاه های متصل به اینترنت در سراسر جهان است.

چگونه مشکل آدرس های آی پی محدود حل می شود؟

برای ذخیره آدرس های آی پی نسخه ۴ با تعداد محدود یکی از راه ها استفاده از NAT است که در واقع روشی است که برای برگرداندان آدرس های شبکه استفاده می شود. به طور ساده باید گفت شرکت های تأمین کننده اینترنت می توانند یک (یا چند) آدرس IP عمومی یا ثابت برای تمامی کاربران خود داشته باشند. این همان آدرسی است که در اینترنت یکتا است، اما علاوه بر آن در شبکه داخلی که به کاربران خود ارائه می دهند آدرس محلی دیگر برای هر کاربر دارند.

کاری که NAT انجام می دهد این است که برای کاربران روی شبکه محلی امکان دسترسی به اینترنت با استفاده از یک آدرس آی پی عمومی ایستای مربوط به شرکت ارائه دهنده را فراهم می کند.

این سیستم بسیار مشابه با تلفن های داخلی شرکت ها است. هر شرکت یک (یا چند) شماره تلفن دارد (مشابه با یک آی پی عمومی ارائه دهنده خدمات اینترنت) ولی داخل شرکت چندین دستگاه تلفن قرار دارد. تمامی این دستگاه های تلفن تنها با همان یک شماره تلفن عمومی شرکت با بیرون تماس می گیرند. شماره های داخلی به صورت مستقیم از بیرون قابل دسترس نیستند و به این منظور یک منشی یا سیستم های تلفن داخلی خودکار (مشابه با NAT) باید اقدام به وصل کردن ارتباط به دستگاه های تلفن داخلی کنند.

آی پی عمومی

در این مثال یک سرور NAT (به عنوان مثال یک روتر) در میان راه اینترنت و شبکه داخلی قرار گرفته. سرور NAT می تواند مربوط به یک شرکت فراهم کننده اینترنت باشد که به کاربران (کامپیوترهای سمت چپ) خدمات اینترنت را با آی پی های خصوصی ارائه می دهد. در سناریویی دیگر می توانید سرور NAT را یک روتر در اداره در نظر بگیرید که از طریق آی پی ثابت به ارائه دهنده اینترنت متصل است.

مکانیزم NAT می تواند به صورت تو در تو پیاده سازی شود. به عنوان نمونه روتر وای فای که در منزل دارید هم می تواند خود یک فراهم کننده NAT باشد تا اتصال دستگاه های داخلی شما با آی پی های خصوصی را به شبکه اینترنت با آی پی عمومی ممکن کند.

چرا به آدرس آی پی ثابت نیاز داریم؟

NAT یک راهکار عالی برای دسترسی به اینترنت برای دستگاه های شبکه داخلی از جمله در شرکت ها یا منزل است؛ البته تا آن جایی که درخواست های ارتباط با اینترنت از سمت شبکه داخلی به بیرون انجام شود. به عبارت دیگر تا زمانی که می خواهید یک فایل دانلود کنید، وبسایتی را باز کنید و یا ویدیوی آنلاینی تماشا کنید می تواند به کارتان بیاید و نیازی هم به خرید آدرس آی پی ثابت از ISP ندارید.

اما اگر قرار باشد از اینترنت به دستگاه های شبکه داخلی خود دسترسی داشته باشید، با وجود NAT امکان این کار وجود ندارد؛ چرا که بسته های داده که به سمت آدرس آی پی ثابت ارائه دهنده اینترنت شما می آیند، مقصد نهایی خود را به دقت پیدا نمی کنند. دلیل این است که آدرس مقصد آنها در شبکه محلی و از دید بسته ها نا مشخص است.

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

آی پی عمومی

اما شاید باز هم این سوال برایتان پیش آید که اساساً برای چه کاربردهایی باید آی پی ثابت در اختیار داشته باشم؟ برای دسترسی به فایل های روی کامپیوتر خود از مکانی دیگر باید در سمت اینترنت کامپیوتر، آی پی ثابت داشته باشید. البته بحث دسترسی به فایل ها روی فضای ابری مورد دیگری است که در این مطلب به آن نمی پردازیم.

آدرس های آی پی ثابت همچنین بین گیمرهایی که می خواهند سرورهای ویژه با قوانین، نقشه ها و مادهای خود را داشته باشند بسیار محبوب است. برای دوربین های نظارتی و سایر سیستم های امنیتی یا برخی از تجهیزات خانه های هوشمند خصوصا مدل های قدیمی تر، نیاز به آی پی ثابت دارید.

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

خطرات آی پی عمومی

اصلی ترین خطر آی پی های عمومی دقیقاً مشابه مهمترین مزیت آن است: دسترسی مستقیم همه از طریق اینترنت به دستگاه شما و از هر کجای دنیا. در بین این «همه» باید مجرمان سایبری را هم در نظر بگیرید. می توان این گونه گفت که در صورتی که آی پی عمومی داشته باشید، به محض اتصال به اینترنت، تمامی اینترنت هم به طور مستقیم و تقریباً بی واسطه به شما وصل می شوند. مجرمان سایبری در این شرایط می توانند با سوء استفاده به فایل های شما دسترسی پیدا کنند.

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

هکرها چگونه هدف های با آی پی های عمومی خود را پیدا می کنند؟

هکرها برای شروع از سرویس هایی استفاده می کنند که معمولاً در دسترس عموم هستند؛ به این طریق آدرس های آی پی عمومی را اسکن می کنند تا آسیب پذیری هایی را در تجهیزاتی متصل به اینترنت با این آدرس ها بیابند. تنها با یک بررسی سریع می توانند هزاران آسیب پذیری ناشی از باگ ها، بی دقتی در تنظیمات، یا قدیمی بودن تجهیزات را پیدا کنند.

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

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

چگونه با داشتن آی پی عمومی از خود محافظت کنیم؟

قطعاً مهمترین روش محافظت عدم استفاده از آی پی ثابت است؛ خصوصاً اگر مطمئن نیستید که به آن نیاز دارید. شاید بسیاری از کارهایی که نیاز به آی پی های ثابت دارند را بتوانید با سرویس های دیگر جایگزین کنید. به عنوان مثال می توانید از تجهیزاتی که سرویس های خود را روی فضای ابری ارائه می دهند بهره ببرید.

اما اگر مجبور به استفاده از آی پی عمومی هستید باید به شدت برای حفاظت از خود تلاش کنید. اولین قدم این است که پسوردهای پیش فرض روتری که آی پی ثابت اینترنت روی آن تنظیم شده است و البته سایر روترها (در صورت وجود) را عوض کنید. البته باید توجه داشته باشید که این مورد برای محافظت از حمله به روتر کافی نیست اما می تواند جلوی نفوذ هکرهای کم تجربه تر را بگیرد.

روترهای خانگی یا اداری با اینکه ممکن است از دید کاربران عادی پیشرفته به نظر برسند اما انتخاب ایده آلی برای اتصال به اینترنت با آی پی عمومی نیستند.

همچنین تلاش کنید از روترهایی استفاده کنید که باگ ها و مشکلات آنها برای هکرها کمتر شناخته شده هستند. فرم ویر روتر خود را باید مرتباً به روز نگه دارید. توجه داشته باشید که روترهایی که برای خانه یا ادارات کوچک (SOHO) طراحی شده اند شاید انتخاب چندان مناسبی نباشند اما قطعاً وجوشان بهتر از اتصال مستقیم یک دستگاه یا کامپیوتر به آدرس آی پی عمومی است. علاوه بر این استفاده از نرم افزارها یا سخت افزارهایی برای تغییر دادن آدرس آی پی می تواند شما را تا حدودی از دید هکرها پنهان کند.

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

نوشته آی پی ثابت اینترنتی چیست و چرا نباید از آن استفاده کرد؟ اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

اولین تجربه برنامه نویسی با کاتلین

یکی از ویژگی های من که هم خوبه هم بد این که دوست دارم همه چیز تست کنم خوب قاعدتا دنیای کامپیوتر و برنامه نویسی هم از  .این قاعده مثتسنی نیست

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

اولین کاری که من کردم باز کردن اندروید استادیو بود و زدن تیک استفاده از کاتلین در پروژه!

و همینجا بود که من به مشکل خوردم ! هیچی درست کار نکرد

برای رفع این مشکل من مجبور شدم مثل سابق یک پروزه اندرویدی با جاوا ایجا کنم و بعد یک اکتیویتی بسازم و اون جا تیک استفاده از کاتلین بزنم!!!!

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

اما خوب حالا پروژه کاتلینی ایجاد کردم اما مشکل این بود که کاتلین بلد نبودم پس رفتم به سایت

kotlinlang.org

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

اما تفاوت ها ساختار for , while و switch  که حتما باید بهش نگاه بندازید .

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

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

لامبدا بسیار کاربدیه اما یه مقداری درکش سخت شده چون حالت های متفاوتی داره و خیلی کامله حتما با دقت بخونیدش بعدش لذت بخش می شه

به جای اینترنفیس های تک متدی می تونید یک تابع به عنوان متغییر تعریف کنید ( مثل c++ زمانی که از اشاره گر ها استفاده می کنید یا حتی php ) و با لامبدا تابع تعریف کنید  که ساختار جالبی می شد و از نظر عملکرد تفاوت با اینترفیس تک تابعی نداره فقط کد نویسی کمتری داره.

یکی دیگه از ویژگی خوبش ولی اذیت کنندش Nullable safe بودنش  که راه حل های متفاوتی برای یک مشکل ارایه داده ( که هر کدوم باید به جای خودش استفاده بشه) اما واقعا یکی از مشکلات برنامه نویسی من حل کرد که مرتب در ازتباط با سرور باید نال بودن چک می کردم ( برای این کار من با استفاده از ارث بری که کلاس والد برای اکتیویتی درست می کردم که کد کمتری بنویسم ولی کاتلین اینم نداشت.)

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

یکی دیگه از ویژگی های کاتلین هوش اندریود استادیو بود ( می دونم ربطی به هم ندارن)!!!!! اما این سازگاری کار براتون خیلی راحت می کنه.

اما نتیجه گیری :

در کل استفاده از کاتلین حس خوبی بهم داد همون حس استفاده ار وسایل نو  که همه ما تجربه اش کردیم.
فعلا قصد دارم از این ابزار نواستفاده کنم که ببینم ایا جاوا شامل این ضرب المثل می شه که می گه :
نو بیاد به بازار کهنه می شه دل آزار

اگر دل آزار شد بهتون می گم!

اگر خواستید نظر بدید و عضو ویرگول نبودید می توانید در وبلاگ من بدون عضویت نظرتون بگید

http://karimiblog.ir/blog/2019/01/اولین-تجربه-برنامه-نویسی-با-کاتلین/

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

گردآوری توسط ایده طلایی

ناحیه نوآوری دانشگاه شریف به سیلیکون ولی ایران مبدل خواهد شد

در حاشیه رویداد «ناحیه نوآوری شریف» که با حضور سورنا ستاری معاون علمی و فناوری رئیس جمهور، پیروز حناچی شهردار تهران و محمود فتوحی رئیس دانشگاه صنعتی شریف برگزار شد، سه تفاهم نامه همکاری در راستای اهداف پارک علم و فناوری دانشگاه صنعتی شریف امضا شد. ستاری در این رویداد تاکید داشت که حضور استارت آپ‌ها در سطح شهر می‌تواند منجر به هوشمندسازی شهرها بشود و این اکوسیستم زندگی‌ها را تغییر خواهد داد و ناحیه نوآوری دانشگاه شریف می‌تواند نوعی سیلیکون ولی ایرانی باشد.

ناحیه نوآوری دانشگاه شریف

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

«دانش تنها می تواند زمینه ساز شکل گیری اقتصاد دانش بنیان باشد بلکه باید تمامی زنجیر‌های این حلقه به هم درصت وصل شود تا ایده‌ها شکل بگیرند و کارآمد شوند.»

ناحیه نوآوری دانشگاه شریف

ستاری باور دارد که سرمایه گذاری و دخالت‌های مالی دولتی نمی‌تواند در این اکوسیستم تاثیر چندان مثبتی بگذارد و باید به بخش خصوصی بیشتر تکیه کرد چرا که ساختار و مفهوم دولت در همه جای دنیا؛ ساز و کارهای لازم برای این دست پژوهش ها را در اختیار ندارد. او باور دارد که نیازی به صدقه در اکوسیستم حس نمی‌شود و خود ایده‌ها اگر ناب باشند و سرمایه درستی پشتشان قرار بگیرد، می‌توانند ثروت آفرینی کنند.

ناحیه نوآوری دانشگاه شریف

زبان فارسی نهمین زبان غالب اینترنت است

ستاری معتقد است که سیستم‌های آموزشی و شهروندنشینی جهانی در حال تغییر است و حالا شهرها و ارکان‌ها و نهادهای شهری بزرگترین آموزش‌ها را به شهروندان خود می‌دهند و استارت آپ‌ها در این راه نقش مهمی را ایفا خواهند نمود. به گفته معاونت علمی ریاست جمهوری  ایران به عنوان شانزدهمین کشور دنیا از حیث جمعیت نیمی از ترافیک اینترنت خاور میانه را برعهده گرفته و زبان فارسی با وجود اینکه جمعیت کشورهای عرب‌زبان به مراتب بیشتر است؛ سهم بیشتری از اینترنت را دارد: «زبان فارسی نهمین زبان غالب اینترنت است.»

سورنا ستاری ایمان دارد که شتابدهنده‌های امروزی می‌توانند اختراعات جوانان و نسل مبدع کنونی را طوری هدایت کنند که همه آنها دیده شوند. ایده‌های خلاقانه زیادی که از ذهن جوانان بیرون آمده و بسیاری از آنها هم در سایت معاونت علمی در دسترس است: «در حال حاضر هزاران ایده را که تجربه‌هایی در حل مشکلات اجتماعی و مسائل شهری و کلان بوده است در قالب کتاب منتشر کرده ایم که می تواند دستمایه خوبی برای افراد دارای انگیزه و خلاق برای راه اندازی استارتاپ ها باشد.»

ناحیه نوآوری دانشگاه شریف

شهردار تهران: طرفدار استارت آپ‌ها هستیم

دکتر حناچی، شهردار تهران نیز در ادامه این مراسم با اشاره به اینکه فضای ساخته شده در پایتخت ایران، محصول توجه به سه محور سرمایه‌گذاران، مدیریت شهر و منافع شهروندان است افزود:

«ما طرفدار حرکت‌های نوآورانه هستیم و کاملاً از این پویش‌ها حمایت می‌کنیم. عدم تمرکز و کوچک شدن دولت‌ها، خروج صنعت از شهرها و توسعه بخش خصوصی سه تحول عمده ایست که از آن‌ها به عنوان رنسانس شهری نام می‌برند.»

ناحیه نوآوری دانشگاه شریف

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

در پایان تفاهم نامه سومی هم با محوریت عقد توافقنامه تاسیس مرکز نوآوری توسعه فناوری های شهری و ساختمان شرکت سرمایه آب-خاک و توسعه و پارک علم و فناوری میان دفتر نوآوری و فناوری توسعه فناوری های ساختمان و شهر با همکاری شرکت سرمایه گذاری دانایان پارس و پارک علم و فناوری دانشگاه صنعتی شریف منعقد شد.

نوشته ناحیه نوآوری دانشگاه شریف به سیلیکون ولی ایران مبدل خواهد شد اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

اضافه شدن ویژگی امنیتی جدید در ویندوز ۱۰ برای محافظت از حافظه‌ی SSD

اگر از رمزگذاری برای محافظت از داده‌های خود در حافظه‌ی SSD ویندوز ۱۰ استفاده می‌کنید، باید این نکته را بدانید که مایکروسافت با پیاده سازی یک تغییر در نسخه‌ی پیش نمایش سیستم عامل خود، از این پس از ابزار بیت لاکر به عنوان نرم افزار پیش فرض رمز گذاری حافظه‌های SSD استفاده خواهد کرد.

ابزار بیت لاکر پیش از این توسط مایکروسافت به صورت سخت افزاری نسبت به کدگذاری حافظه‌ی SSD اقدام می‌کرد که سال گذشته‌ی میلادی مشکلات زیادی را به وجود آورده بود.

خرداد ماه امسال آسیب پذیری کدگذاری خودکار حافظه‌ی SSD در ویندوز ۱۰ توجه برخی از متخصصان را به خود جلب کرد و مشخص شد که این نوع رمزگذاری می‌تواند به راحتی با استفاده از فلش کردن مجدد فرم ویر درایو دور زده شود.

محافظت از حافظه‌ی SSD

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

تابستان امسال، مایکروسافت به خاطر مشکلات یاد شده از کاربرانش خواست تا برای حفظ اطلاعات خود و جلوگیری از آسیب‌پذیر بودن حافظه‌های SSD کدگذاری را از حالت سخت افزاری به نرم افزاری تغییر دهند.

حالا غول نرم افزاری دنیا در آخرین ارزیابی‌های خود در نسخه‌ی پیش نمایش ویندوز ۱۰ -که توسط برخی از افراد مورد ارزیابی قرار می‌گیرد- تصمیم گرفته تا به صورت پیش فرض کد گذاری سخت افزاری را به نرم افزاری تغییر دهد تا جلوی آسیب پذیر بودن حافظه‌ی SSD را بگیرد.

لازم به یادآوری است همانطور که پیش‌تر اعلام کردیم، این امکان فعلا در نسخه‌های پیش نمایش ویندوز ۱۰ مورد ارزیابی قرار می‌گیرد و در حال حاضر کدگذاری حافظه‌‌های SSD به صورت پیش فرض در حالت سخت افزاری قرار دارد.

برای بررسی این که آیا حافظه‌ی SSD‌ کامپیوترتان آسیب پذیر است یا خیر می‌توانید با باز کردن Command Prompt با سطح دسترسی ادمین در ویندوز و وارد کردن دستور manage-bde.exe -status از این موضوع اطمینان حاصل نمایید. اگر در بخش Encryption Method حافظه‌تان خبری از Hardware Encryption نبود، SSD از رمز گذاری نرم افزاری استفاده می‌کند و آسیب پذیر نخواهد بود.

مایکروسافت در تلاش است تا نسخه‌ی بعدی ویندوز ۱۰ را با چند ویژگی جدید ارائه دهد. از این بین می‌توانیم به امکان مدیریت رمز عبور و ویندوز سند باکس اشاره کنیم.

نوشته اضافه شدن ویژگی امنیتی جدید در ویندوز ۱۰ برای محافظت از حافظه‌ی SSD اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

این سوپرمارکت آنلاین محصولات را به درب خانه شما می‌آورد [تماشا کنید]

سوپرمارکت Stop & Shop اعلام کرده به زودی پروژه‌های خودران خود را آزمایش خواهد کرد.

این محصولات شامل ماشین‌های باربری، فروشگاه‌های غیرنقد و ارسال بسته‌های گوشت با استفاده از پهپادها می‌شود. این برنامه با همکاری استارتاپ شناخته شده دیگری با نام Robomart انجام می‌شود که در ساخت محصولات ذکر شده به Stop & Shop کمک خواهد کرد. خودروی الکترونیکی از کنترل کننده دما بهره می‌برد تا تمام محصولات تازه باقی بمانند. در ضمن، مشتریان می‌توانند با استفاده از نرم افزاری مانند اوبر، سوپرمارکت نزدیک به خود را فرا بخوانند.

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

در کل به نظر می‌رسد که Stop & Shop برنامه زیادی برای استفاده از روبات‌ها طی سال جاری میلادی دارد. برای مثال یکی از روبات‌های این کمپانی با نام مارتی در اطراف فروشگاه‌ها به دنبال تمیز کردن و ریختن مواد غذایی می‌گردند. این دستگاه‌ها به سنسورهای مجهز هستند تا هیچ قفسه‌ای دست نیافتنی نباشد و همه کارها با دقت کامل انجام بگیرند.

در کل به نظر می‌رسد که انسان‌ها به زودی شغل تحویل کالا و فروشندگی را برای همیشه از دست خواهند داد. پیش از این هم آمازون ارسال کالا با استفاده از پهپادها را آغاز کرده بود.

نوشته این سوپرمارکت آنلاین محصولات را به درب خانه شما می‌آورد [تماشا کنید] اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

۹ مشکل آزاردهنده اینترنتی که با افزونه‌ ها برطرف می‌شوند

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

اما همیشه برای هر مسئله‌ای یک راه حل نیز وجود دارد. در این مطلب قصد داریم ۹ مشکل آزار دهنده‌ی اینترنتی -که هیچکس با آن‌ها بیگانه نیست- را با استفاده از افزونه‌ها حل کنیم. با ما همراه باشید.

۱) لو رفتن داستان فیلم‌ها و سریال‌ها

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

راه حل: برای جلوگیری از نمایش اینگونه مطالب، تنها کاری که باید انجام دهید نصب یک افزونه‌ی ساده به نام Spoiler Protection است. افزونه‌ی اینترنتی یاد شده برای هر دو مرورگر فایرفاکس و کروم در دسترس قرار دارد و با استفاده از آن می‌توانید به صورت دستی نام فیلم و سریال مورد نظر خود را وارد کنید تا دیگر همه‌ی اطلاعات مربوط به آن‌ها محو شود. این موضوع در وبسایت‌های مهمی مثل Google News، فیسبوک، توییتر و چندی دیگر اتفاق خواهد افتاد.

علاوه بر این می‌توانید از طریق تنظیمات، فیلتر کردن اسپویلرها را تنها برای صحنه‌های خاصی از فیلم و یا سریال اعمال نمایید.

دانلود افزونه Spoiler Protection (کروم و فایرفاکس) 

۲) پنجره‌های پاپ‌آپ

مشکل: در حالت ایده‌آل، وقتی به یک وبسایت سر می‌زنید صفحه نمایش‌تان پر از پنجره‌های اضافی نخواهد شد. اما در دنیای حقیقی برخی از وبسایت‌ها به صورت سرسام آوری به باز کردن صفحات پاپ‌آپ می‌پردازند که حتی محافظ‌های درونی مرورگر‌ها هم قادر به متوقف کردنشان نیستند.

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

دانلود افزونه Pop-Up Blocker (گوگل کروم)

۳) کوکی‌ها و ترکرها

مشکل: پلتفرم‌ها و وبسایت‌های تبلیغاتی به خاطر زیر نظر گرفتن فعالیت‌های آنلاین کاربران بدنام شده‌اند. دو مورد از کلیدی‌ترین اجزای سازنده‌ی این فرایند ترکر‌ها و کوکی‌ها هستند. هر دو مورد یاد شده بخش‌های کوچکی از اطلاعات محسوب می‌شوند که با زیر نظر گرفتن حساب‌های کاربری شما سعی دارند حتی بدون لاگین شدن هم مطالبی را به نمایش بگذارند که بیشتر به آن‌ها علاقه دارید. موضوعی که به هر ترتیب برای کاربران خوشایند نیست.

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

دانلود افزونه Ultrablock (گوگل کروم)

۴) تصاویر ناخوشایند و نامناسب

مشکل: گاهی در حین گشت و گذار در صفحات اینترنتی -حتی توییتر یا فیسبوک- ممکن است به تصاویری برخورد کنید که مناسب و خوشایند نباشند.

راه حل: برای حصول اطمینان از اینکه این تصاویر ناخوشایند نمایش داده نشوند، بهتر است از افزونه‌ی شخص ثالث vRate استفاده کنید. این افزونه به صورت خودکار تصاویر را ارزیابی کرده و در صورتی که متوجه شود دارای محتوای ناخوشایند و نامناسبی است، از نمایش آن جلوگیری خواهد کرد.

دانلود افزونه vRate (گوگل کروم)

۵) اخبار دروغ

مشکل: حجم بسیاری از اخبار منتشر شده در فضای مجازی دروغ است و به ندرت پیش می‌آید که با مشاهده‌ی یک خبر بتوان به راحتی به آن اطمینان کرد. متاسفانه حصول اطمینان از صحت یک خبر به همین سادگی‌ها نیست.

راه حل: در حالی که هیچ راه حل نهایی و قابل اطمینانی برای این مشکل وجود ندارد، اما می‌توان با استفاده از برخی افزونه‌های اینترنتی تا حدی جلوی حجم وسیع این معضل را گرفت. افزونه‌ی ZenMate SafeSearch که برای مرورگر کروم در دسترس قرار گرفته است به شما این امکان را می‌دهد تا به سرعت متوجه شوید که آیا خبری که مشاهده می‌کنید نمونه‌ی مشابهی در منابع مورد تایید خبری Google News دارد یا نه.

دانلود افزونه ZenMate SafeSearch (گوگل کروم)

۶) فراموشی رمز عبور سایت‌ها

مشکل: صفحات مجازی زیادی در اینترنت وجود دارند که برای هرکدام رمز عبور و نام کاربری متفاوتی داریم. به خاطر سپردن همه‌ی رمز‌های عبور مورد استفاده و مدیریت آن‌ها کار ساده‌ای نیست. خصوصا این روز‌ها که توصیه می‌شود برای هر حساب کاربری در فضای مجازی از رمز عبور متفاوتی استفاده کنید.

راه حل: خوشبختانه افزونه‌ای برای مرورگر‌های کروم و فایرفاکس وجود دارد که می‌توان با استفاده از آن به مدیریت رمز عبور پرداخت. این افزونه LastPass نام دارد و به شما اجازه می‌دهد تا رمز عبوری منحصر به فرد برای هر حساب کاربری داشته باشید و بدون تایپ کردن آن‌ها وارد حساب کاربری خود شوید. افزونه‌های مدیریت رمز عبور زیادی برای مرورگر‌ها در دسترس قرار گرفته‌اند اما LastPass یکی از بهترین‌ها محسوب می‌شود. افزونه‌ی یاد شده کاملا رایگان است و همه‌ی ویژگی‌های مورد نیاز را ارائه خواهد داد و از طرفی با همه‌ی سیستم عامل‌ها سازگار است.

دانلود افزونه LastPass برای کروم و فایرفاکس

۷) حجم زیاد تصاویر، ویدیوها و مقالات برای چک کردن

مشکل: اینترنت پر شده از حجم بسیار زیاد از تصاویر، ویدیو‌ها و مقالات که نمی‌توانید همه را چک کنید.

راه حل: اینجا جاییست که سرویس «ذخیره برای بعد» یا Save for Later کارایی خود را نشان می‌دهد. این سرویس این امکان را فراهم می‌کند تا همه‌ی لینک‌ها را ذخیره سازی کنید تا بعدا و زمانی که وقت کافی داشتید به مشاهده و بررسی آن‌ها بپردازید. در حالی که افزونه‌های زیادی برای این امر در دسترس قرار دارند اما Pocket -که تنها برای کروم عرضه شده- می‌تواند یکی از بهترین گزینه‌ها باشد چرا که با بیشتر پلتفرم‌ها سازگاری دارد. علاوه بر این Pocket با استفاده از هوش مصنوعی و ارزیابی فعالیت‌هایتان می‌تواند لینک‌هایی که احتمالا به آن‌ها بیشتر علاقمند هستید را به شما پیشنهاد دهد.

دانلود افزونه Pocket (گوگل کروم) 

۸) مصرف بالای دیتا و تمام شدن بسته‌ اینترنتی

مشکل: با گرافیکی تر شدن وبسایت‌ها حجمشان نیز بیشتر می‌شود و در صورتی که به طور مداوم به آن‌ها سر بزنید، احتمالا به زودی حجم اینترنت یا بسته‌ی اینترنتی مورد استفاده‌تان به پایان خواهد رسید.

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

۹) جستجو در تاریخچه مرورگر

مشکل: اگر ندانید که به دنبال چه صفحه‌ای می‌گردید، حتی گشت و گذار در بخش تاریخچه‌ی مرورگر هم فایده‌ای ندارد.

راه حل: برای این مشکل استفاده از افزونه‌ی History Search را توصیه می‌کنیم. افزونه‌ای برای مرورگر‌ها که همه‌ی صفحاتی که به بررسی‌شان پرداخته‌اید را وارد لیست می‌کند. راهنمای جستجو به شما این اجازه را می‌دهد تا به طور مستقیم از میان محتوای وبسایت‌های لیست شده به دنبال صفحه‌ی مورد نظرتان بگردید. این افزونه تقریبا با هر نوع وبسایت و مرورگری سازگاری دارد. البته به یاد داشته باشید که اگر می‌خواهید تا حد امکان امنیت و شخصی سازی را در مرورگر‌تان حفظ کنید استفاده از این مرورگر (به خاطر مکانیزم انجام وظیفه‌اش) خیلی مناسب نخواهد بود.

دانلود افزونه History Search (کروم، فایرفاکس، اپرا، اج، سافاری)

نوشته ۹ مشکل آزاردهنده اینترنتی که با افزونه‌ ها برطرف می‌شوند اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

آموزش زبان برنامه‌نویسی Rust – قسمت۸: Borrowing

با مالکیّت، مهم‌ترین و خاص‌ترین ویژگی زبان Rust، در جلسه‌ی پیش آشنا شدیم. حالا می‌خواهیم ببینیم که چطور می‌توانیم مقادیر را به توابع ارسال کنیم، بدون اینکه مالکیّت آن‌هارا منتقل کنیم.
در این جلسه می‌خواهیم درمورد referencing صحبت کنیم. یکی از پرکاربردترین بخش‌ها در هر برنامه‌ی کامپیوتری که مشکلات کار با آن بیشترین زحمت و زمان‌را از برنامه‌نویس‌ها می‌گیرید.
مشکلاتی که می‌خواهیم با کمک Rust برای همیشه حلشان کنیم.

مشکل چیست؟

آخرین چیزی که در جلسه‌ی پیش دیدیم کد زیر بود:

fn main() {
    let mut a = String::from("hello");
    a = i_am_owner(a);
    println!("a in main function: {}", a);
}
fn i_am_owner(input: String) -> String {
    println!("The input value is: {}", input);
    return input;
}

دیدیم که با دادن متغیّر a به تابع i_am_owner به عنوان پارامتر ورودی،‌ مالکیّت (Ownership) این متغیّر به آرگومان ورودی تابع منتقل می‌شود و ما دیگر نمی‌توانیم از آن در scopeی که تابع فراخوانی شده است استفاده کنیم.
برای رفع این مشکل، همانطوری که در تکّه کد بالا می‌بینید، در پایان تابع i_am_owner دوباره همان String را خروجی داده‌ایم و درون تابع main، متغیّر a را برابر خروجی این تابع قرار داده‌ایم تا مالکیّت داده را دوباره به آن بازگرداینم.
حالا می‌خواهیم ببینیم که چطوری می‌توانیم بدون انتقال مالکیّت یک مقدار، امکان استفاده از آن‌را به یک تابع بدهیم.

به مالکیّت من دست نزن!

بیایید کد بالا را کمی تغییر بدهیم. کد زیر را با دقّت نگاه کنید:

fn main() {
    let a = String::from("hello");
    i_am_owner(&a);
    println!("a in main function: {}", a);
}
fn i_am_owner(input: &String) {
    println!("The input value is: {}", input);
}

در اینجا ۴ تا تغییر رخ‌داده است:
۱-متغیّر a لازم نیست دیگر تغییر کند. به همین خاطر با پاک‌کردن mut در تعریف آن دوباره این متغیّر را immutable کرده‌ایم. (اگر مفاهیم mutable و immutable را فراموش کرده‌اید، با کلیک روی این نوشته به قسمت مربوط به آن بروید و خیلی سریع این مفاهیم را به‌خاطر بیاورید.)
۲)نوع ورودی تابع i_am_owner را تغییر داده‌ایم. حالا به جای String، پارامتر input از نوع String& است.
۳)هنگام فراخوانی i_am_owner در خط دوم تابع main، دیگر a را برابر خروجی این تابع قرار نداده‌ایم. چون در این کد دیگر مالکیّت مقدار آن به تابع منتقل نشده است که لازم باشد آن‌را پس‌بگیریم.
۴)به جای اینکه a را به عنوان ورودی به تابع بفرستیم، مقدار a& را واردش می‌کنیم. اینطوری دیگر مالکیّت این متغیّر به پارامتر ورودی تابع منتقل نمی‌شود. امّا چرا؟ بیایید دقیق‌تر نگاه‌کنیم.

Reference

وقتی که علامت & پشت یک نوع یا متغیّر قرارمی‌گیرد، یعنی داریم از یک reference صحبت می‌کنیم.
در حقیقت reference به یک مقدار اشاره می‌کند.
یک کارت ویزیت را تصوّر کنید. روی آن کارت، آدرس محل کار کسی که کارت‌را به شما داده است نوشته شده است. این کارت یک رفرنس به آن محل کار است.
ما ورودی تابع i_am_owner را از String به String& تغییر داده‌ایم. پس از حالا به بعد این تابع به جای اینکه کل یک String را به عنوان ورودی بگیرد، یک رفرنس به آن‌را قبول می‌کند. بنابراین مالکیّت String ورودی دیگر به آن منتقل نمی‌شود و رفرنس گرفته شده هم با تمام شدن scope این تابع، بدون هیچ مشکلی پاک می‌شود.
اینطوری مقدار اصلی دست‌نخورده باقی می‌ماند و همچنان متعلّق به متغیّر اصلی است (اگر مفهموم scope در Rust را فراموش کرده‌ای، با کلیک روی این نوشته یک نگاه سریع به آن بیندازید و بعد برگردید).
هروقت که پشت یک مقدار &را بگذاریم، یک رفرنس به آن می‌گیریم. حالا می‌توانیم بدون هیچ مشکلی آن رفرنس را به عنوان ورودی به هر تابعی بدهیم.
پارامتر ورودی تابع، یعنی input، یک رفرنس به متغیّر a است.
اتّفاقی که با دادن رفرنس a به تابع i_am_owner به عنوان ورودی می‌افتد شبیه شکل زیر است (تصویر از این آدرس برداشته شده است):

پارامتر ورودی تابع، یعنی input، یک رفرنس به متغیّر a است. متغیّر a هم، همانطوری که در قسمت قبل دیدیم، خودش یک اشاره‌گر به بخشی از حافظه در heap است.
بنابراین می‌بینید که drop شدن input پس از پایان‌یافتن scope تابع، آسیبی به متغیّر a و مقدارش نمی‌زند.

Dereferencing

متضاد رفرنس دادن، dereferencing نامیده می‌شود. یعنی به مقداری که reference دارد به آن اشاره می‌کند دسترسی پیدا می‌کنیم.
برای دسترسی به مقدار یک رفرنس، باید قبل از آن علامت * را قرار بدهیم. البته همانطوری که دیدید ما اینجا این کار را نکردیم. چون خود rust به خاطر ویژگی Smart pointers می‌تواند تفاوت استفاده از یک رفرنس یا مقدارش‌را تشخیص بدهد.
بعداً مفصلاً به این ویژگی خواهیم پرداخت، فعلاً کافی است بدانید که می‌توانستیم تابع‌را به شکل زیر هم بنویسیم و فعلاً این دوتا با هم تفاوتی ندارند:

fn main() {
    let a = String::from("hello");
    i_am_owner(&a);
    println!("a in main function: {}", a);
}
fn i_am_owner(input: &String) {
    println!("The input value is: {}", *input);
}

خب حالا دیدید که چگونه از رفرنس‌ها برای عدم انتقال مالکیّت استفاده کردیم؟ به این کار در Rust اصطلاحاً borrowing یا همان قرض‌گرفتن می‌گویند.
همانطوری که ما در دنیای واقعی وقتی چیزی می‌خواهیم آن‌را «قرض»می‌گیریم، در اینجا هم وقتی بخش دیگری از برنامه به یک مقدار نیاز دارد، آن مقدار را به او قرض می‌دهیم.
وقتی که ماشینتان‌را به کسی قرض می‌دهید، همچنان شما مالک آن ماشین هستید. اینجا هم مالک آن مقدار همچنان متغیّر اصلی است و دیگران صرفاً به صورت قرضی دارند از آن مقدار استفاده می‌کنند.
خب حالا بیایید ببینیم اگر بخواهیم مقداری که قرض‌گرفته‌ایم را تغییر بدهیم چه اتّفاقی می‌افتد؟

fn main() {
    let a = String::from("hello");
    i_am_owner(&a);
    println!("a in main function: {}", a);
}
fn modifier(reference: &String) {
    reference.push_str(" a new string to push to the old one");
}

اینجا درون تابع modifier می‌خواهیم یک string دیگر را به String اوّلیّه که به عنوان ورودی گرفته‌ایم اضافه کنیم.
وقتی که می‌خواهیم برنامه‌را کامپایل کنیم با ارور زیر مواجه می‌شویم:

error[E0596]: cannot borrow immutable borrowed content `*reference` as mutable
 --> src/main.rs:8:5
  |
۷ | fn modifier(reference: &String) {
  |                        ------- use `&mut String` here to make mutable
۸ |     reference.push_str(" a new string to push to the old one");
  |     ^^^^^^^^^ cannot borrow as mutable

همانطوری که در متن ارور نوشته شده است، ما نمی‌توانیم از یک رفرنس immutable به عنوان یک رفرنس mutable استفاده کنیم.
یعنی نمی‌توان مقداری که به عنوان مقدار immutable قرض‌گرفته شده است را به عنوان یک مقدار mutable استفاده کرد و آن‌را تغییر داد.
اگر دوباره به مثال ماشین برگردیم، یعنی شما نمی‌توانید تودوزی ماشینی که صرفاً برای یک مسافرت یک روزه قرض‌گرفته‌اید را تغییر دهید.
خب حالا اگر بخواهیم مقدار منتسب به یک رفرنس‌را تغییر بدهیم باید چه کار کنیم؟

ساخت رفرنس mutable

یادتان هست برای اینکه بتوانیم یک متغیّر را تغییر بدهیم چه کار می‌کردیم؟ با افزودن کلمه‌ی کلیدی mut به تعریف آن متغیّر، آن‌را تبدیل به یک مقدار mutable می‌کردیم.
حالا برای اینکه بتوانیم مقداری که یک رفرنس به آن اشاره می‌کند را تغییر بدهیم، احتمالاً باید کاری مشابه انجام بدهیم.
بیایید اوّل ببینیم اگر صرفاً خود متغیّر اوّلیّه را mutable کنیم، آیا امکان تغییردادن داده‌ی آن با استفاده از رفرنسی که از آن داریم وجود دارد یا نه؟
کد زیر را ببینید:

fn main() {
    let mut a = String::from("hello");
    modifier(&a);
    println!("a in main function: {}", a);
}
fn modifier(reference: &String) {
    reference.push_str(" a new string to push to the old one");
}

در این کد صرفاً کلمه‌ی کلیدی mut را به تعریف متغیّر a اضافه‌کرده‌ایم تا این متغیّر mutable شود و بتوانیم مقدار آن‌را تغییر بدهیم.
اگر این کد را کامپایل کنیم، کامپایلر Rust به ما warning و ارور زیر را برمی‌گرداند:

warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
۲ |     let mut a = String::from("hello");
  |         ----^
  |         |
  |         help: remove this `mut`
  |
  = note: #[warn(unused_mut)] on by default

error[E0596]: cannot borrow immutable borrowed content `*reference` as mutable
 --> src/main.rs:9:5
  |
۷ | fn modifier(reference: &String) {
  |                        ------- use `&mut String` here to make mutable
۸ |
۹ |     reference.push_str(" a new string to push to the old one");
  |     ^^^^^^^^^ cannot borrow as mutable

اوّل از همه برویم سراغ warning. این اخطار می‌گوید که لزومی ندارد که متغیّر a را mutable کنیم. به علاوه به عنوان راهنمایی از ما می‌خواهد که کلمه‌ی mut را از تعریف آن حذف کنیم.
چرا چنین چیزی را از ما می‌خواهد؟ چون هیچ‌کجا مقدار این متغیّر تغییر نکرده است. پس انگار تغییری که ما می‌خواستیم روی رفرنس آن بدهیم مورد قبول Rust نیست.
در اروری که بعد از آن اخطار به ما داده شده است، همان چیزی تکرار شده که در مرحله‌ی قبل دیدیم. یعنی هنوز هم رفرنس ما immutable است، هرچند که خود متغیّر را mutable کردیم.
حالا بیایید یک راه دیگر را امتحان کنیم. این بار به جای اینکه متغیّر را mutable کنیم، رفرنس آن‌را mutable می‌کنیم:

fn main() {
    let a = String::from("hello");
    modifier(&mut a);
    println!("a in main function: {}", a);
}
fn modifier(reference: &mut String) {
    reference.push_str(" a new string to push to the old one");
}

برای اینکه یک رفرنس mutable داشته باشیم، کافی است بعد از علامت & کلمه‌ی mut را اضافه کنیم و بعد از آن type یا نام متغیّر را قرار دهیم.
حالا اگر بخواهیم این برنامه‌را کامپایل کنیم چه اتّفاقی می‌افتد؟

error[E0596]: cannot borrow immutable local variable `a` as mutable
 --> src/main.rs:3:19
  |
۲ |     let a = String::from("hello");
  |         - consider changing this to `mut a`
۳ |     modifier(&mut a);
  |                   ^ cannot borrow mutably

باز هم به ارور خوردیم.
همانطوری که در خط اول ارور گفته شده است، ما نمی‌توانیم یک متغیّر immutable را به عنوان یک متغیّر mutable قرض بدهیم. به همین خاطر کامپایلر از ساخته‌شدن چنین رفرنسی جلوگیری می‌کند.
امّا وسط پیام ارور، کامپایلر برای ما یک راهنمایی قرار داده است. کامپایلر از ما خواسته است که متغیّر a را هم به عنوان یک متغیّر mutable تعریف کنیم. از آنجایی که هیچ پیام خطایی درمورد اضافه بودن رفرنس mutable وجود ندارد، پس احتمالاً نیمی از راه را دست آمده ایم.
بیایید این بار بدون اینکه رفرنس‌را تغییر بدهیم، صرفاً متغیّر a را mutable کنیم:

fn main() {
    let mut     a = String::from("hello");
    modifier(&mut a);
    println!("a in main function: {}", a);
}
fn modifier(reference: &mut String) {
    reference.push_str(" a new string to push to the old one");
}

حالا بیایید این کد که در حقیقت ترکیبی از دو تلاش قبلیمان است را کامپایل و اجرا کنیم:

a in main function: hello a new string to push to the old one

برنامه به خوبی کامپایل شد و بدون مشکل خروجی ای که می‌خواستیم را تولید کرد.
بنابراین برای اینکه بتوانیم از طریق رفرنس‌دهی یک مقدار را تغییر دهیم، باید از رفرنس‌های mutable استفاده کنیم. خلاصه‌ی همه‌ی کارهایی که در این بخش برای ساخت یک رفرنس mutable کردیم می‌شود:
۱)متغیّر اصلی باید mutable باشد.
۲)خود رفرنس هم باید mutable باشد. برای این کار باید بعد از علامت & کلمه‌ی mut را قرار دهیم.
خب حالا که دیدیم چطوری می‌توان یک رفرنس mutable ساخت، ببنیم که چطوری می‌شود به یک مقدار چندین رفرنس داد.

رفرنس‌دهی چندگانه

امیدوارم که عنوان این بخش به اندازه‌ی کافی ترسناک باشد تا حواستان‌را کامل به این مبحث جمع کنید. چیزی که می‌خواهیم ببینیم خیلی ساده است، امّا موقع نوشتن برنامه خیلی‌هارا به دردسر می‌اندازد و زمان می‌برد تا برنامه‌نویس به این مفهموم عادت کند.
بیایید اوّل یک برنامه‌ی خیلی ساده را درنظر بگیریم.
در این برنامه ما می‌خواهیم یک String را همراه با دو متن مختلف نمایش بدهیم. برای هرکدام از این شیوه‌های نمایش هم یک تابع جداگانه داریم.
همانطوری که بالاتر دیدیم، برای این کار باید از رفرنس‌ها استفاده کنیم تا مالکیّت مقدار اوّلیّه منتقل نشود و بتوان آن را به تابع‌های دیگر هم داد.
کد زیر چیزی است که داریم:

fn main() {
    let a = String::from("hello");
    let reference1 = &a;
    let reference2 = &a;
    ali(reference1);
    hossein(reference2);
    println!("a in main function: {}", a);

}

fn ali(original_text: &String) {
    println!("Ali says: {}", original_text);
}

fn hossein(text: &String) {
    println!("{} hossein", text);
}

اگر این برنامه‌را کامپایل و اجرا کنیم، بدون هیچ مشکلی خروجی‌ای که انتظارش را داریم تولید می‌شود:

Ali says: hello
hello hossein
a in main function: hello

حالا فرض کنید که می‌خواهیم یک تابع سومی هم داشته باشیم. قرار است تابع mohammad ورودی‌ای که می‌گیرد را تغییر بدهد و به آخر آن علامت ! را اضافه کند.
برای این کار برنامه‌ی زیر را می‌نویسیم:

fn main() {
    let mut a = String::from("hello");
    let reference1 = &a;
    let reference2 = &a;
    let reference3 = &mut a;
    ali(reference1);
    mohammad(reference3);
    hossein(reference2);
    println!("a in main function: {}", a);
}
fn ali(original_text: &String) {
    println!("Ali says: {}", original_text);
}
fn hossein(text: &String) {
    println!("{} hossein", text);
}
fn mohammad(original_input: &mut String) {
    original_input.push_str("!");
}

خب حالا اگر این برنامه‌را بخواهیم کامپایل کنیم چه اتّفاقی می‌افتد؟

error[E0502]: cannot borrow `a` as mutable because it is also borrowed as immutable
  --> src/main.rs:14:27
   |
۱۲ |     let reference1 = &a;
   |                       - immutable borrow occurs here
۱۳ |     let reference2 = &a;
۱۴ |     let reference3 = &mut a;
   |                           ^ mutable borrow occurs here
...
۱۹ | }
   | - immutable borrow ends here

error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
  --> src/main.rs:18:40
   |
۱۴ |     let reference3 = &mut a;
   |                           - mutable borrow occurs here
...
۱۸ |     println!("a in main function: {}", a);
   |                                        ^ immutable borrow occurs here
۱۹ | }
   | - mutable borrow ends here

خب با یک ارور بلندبالا مواجه شدیم. بیایید قدم به قدم با ارور جلو برویم و ببینیم که چه اتّفاقی افتاده است.
اوّل ارور این متن نوشته شده است:

cannot borrow `a` as mutable because it is also borrowed as immutable

کامپایلر به ما می‌گوید که نمی‌تواند یک رفرنس mutable به متغیّر a اضافه کند، چون پیش از آن، و البته به صورت همزمان (در یک scope)، رفرنس‌های immutable به این متغیّر ساخته شده است.
در دو بخش بعدی ارور هم کامپایلر به ما نشان می‌دهد که مشکل کجای کد رخ‌داده است:

--> src/main.rs:14:27
   |
۱۲ |     let reference1 = &a;
   |                       - immutable borrow occurs here
۱۳ |     let reference2 = &a;
۱۴ |     let reference3 = &mut a;
   |                           ^ mutable borrow occurs here
...
۱۹ | }
   | - immutable borrow ends here

اینجا کامپایلر به ما نشان می‌دهد که ابتدا یک immutable borrow رخ داده است، یعنی یک رفرنس immutable به متغیّر a ساخته شده است، و بعد یک mutable borrow.

در بخش بعدی هم کامپایلر توضیحات مشابهی می‌دهد.

امّا چرا کامپایلر Rust به ما اجازه‌ی ساخت رفرنس mutable را همراه رفرنس‌های immutable نمی‌دهد؟

محدودیت‌های ساخت رفرنس

زبان Rust به ما اجازه نمی‌دهد که وقتی که داریم از یک رفرنس mutable استفاده می‌کنیم، رفرنس دیگری داشته باشیم.
محدودیت ساخت رفرنس‌های متعدد به یک داده زمانی اجرایی می‌شود که هر۲ شرط زیر برقرار باشند:
۱) دو یا چند اشاره‌گر (رفرنس) به صورت هم‌زمان به یک داده دسترسی داشته باشند.
۲) حدّاقل یکی از این اشاره‌گرها برای نوشتن روی داده استفاده شوند (رفرنس mutable).

امّا چرا این حالت مشکل‌زا است و Rust جلوی اتّفاق افتادنش را می‌گیرد؟

Data Race

وقتی که چند رفرنس immutable به صورت همزمان به یک داده اشاره می‌کنند مشکلی ایجاد نمی‌شود. هرکدام می‌توانند بدون اینکه خللی به کار دیگران وارد کنند داده‌را بخوانند.
امّا وقتی که بیش از یک رفرنس داریم و حدّاقل یکی از آن‌ها mutable است قضیه فرق می‌کند.
فرض کنید که تنها یک اشاره‌گر برای نوشتن داریم و بقیه‌ی رفرنس‌ها immutable هستند. بخش‌هایی از کد که دارند از این رفرنس‌های immutable استفاده می‌کنند، انتظار آن‌را ندارند که داده وسط کارشان تغییر کند. امّا بخشی از برنامه که توانایی نوشتن روی داده را دارد، می‌تواند در حین کار آن‌ها داده‌را تغییر بدهد و کارشان‌را خراب کند.
حالا اگر بیش از ۱ اشاره‌گر نویسنده داشته باشیم قضیه بدتر می‌شود. در این حالت هر رفرنس mutable هم می‌تواند کار بخش‌هایی که صرفاً دارند داده‌را می‌خوانند خراب کند، و هم می‌تواند با قراردادن داده‌های خود مابین داده‌های رفرنس mutable دیگر، داده‌های آن‌را هم خراب کند.
به این حالت اصطلاحاً data race می‌گویند. data race یکی از بدترین باگ‌هایی است که می‌تواند در یک برنامه ایجاد شود و پیداکردن آن بسیار سخت است.
زبان Rust برای اینکه مطمئن شود هرگز data race رخ نمی‌دهد، به شما اصلاً اجازه‌ی این‌را نمی‌دهد که به صورت هم‌زمان یک رفرنس mutable ایجاد کنید و درکنارش رفرنس‌های دیگری هم داشته باشید.
این‌طوری وقتی برنامه با موفّقیّت کامپایل شد، می‌توانید مطمئن باشید که در آن data race وجود ندارد.
علاوه‌بر حالتی که دیدیم، اگر برنامه‌ای بنویسید که مثلاً دوتا mutable reference هم داشته باشد باز با اروری مشابه چیزی که دیدیم مواجه می‌شوید.

معنی هم‌زمان بودن اشاره‌گرها

باید به کلمه‌ی هم‌زمان بودن در اوّلین شرط از شرایط محدودیت‌های ساخت رفرنس خیلی دقّت کنید.
ما زمانی دوتا رفرنس به صورت هم‌زمان داریم که آن‌ها درون یک scope واحد تعریف شده باشند.
مثلاً در همین برنامه‌ای که بالاتر نوشتیم، متغیّرهای reference1، reference2 و reference3 همه در scope تابع main قرار دارند. پس ما به صورت هم‌زمان ۳ تا رفرنس به متغیّر a داریم.
حالا به برنامه‌ی زیر که دقیقا‌ً همان کاری را می‌کند که انتظار داشتیم برنامه‌ی قبلی انجام بدهد نگاه کنید:

fn main() {
    let mut a = String::from("hello");
    ali(&a);
    mohammad(&mut a);
    hossein(&a);
    println!("a in main function: {}", a);
}
fn ali(original_text: &String) {
    println!("Ali says: {}", original_text);
}
fn hossein(text: &String) {
    println!("{} hossein", text);
}
fn mohammad (original_input: &mut String) {
    original_input.push_str("!");
}

اگر این برنامه‌را کامپایل و اجرا کنیم می‌بینیم که دقیقاً همانطوری که انتظارش‌را داشتیم کار می‌کند و خروجی زیر را تولید می‌کند:

Ali says: hello
hello! hossein
a in main function: hello!

امّا چرا این کار کرد و برنامه‌ی قبلی نه؟
پاسخ در همان کلمه‌ی هم‌زمان است. اینجا هم ما ۳ رفرنس مختلف به متغیّر a داریم که یکی از آن‌ها mutable است. امّا این بار این ۳ رفرنس هم‌زمان ایجاد نشده اند. چون هرکدام مربوط به یک scope مختلف هستند.
یعنی رفرنس اوّل متعلّق به scope تابع ali است، دومی متعلّق به scope تابع mohammad و سومی هم متعلّق به تابع hossein.
علاوه بر اینکه این ۳ رفرنس متعلّق به scope های مختلف هستند، این برنامه‌ هم به صورت sequential اجرا می‌شود نه parallel. یعنی هرکدام از این توابع پس از تمام شدن تابع قبلی فراخوانی می‌شوند، نه هم‌زمان با اجرای آن‌ها. پس هرگز اینجا data race ایجاد نمی‌شود.
به همین خاطر است که کامپایلر Rust این بار اجازه‌ی داشتن چندین رفرنس‌را به یک مقدار می‌دهد.
این نکته شمارا از خیلی از اشتباهات آینده مصون می‌کند، البته اگر آن‌را همیشه به خاطر داشته باشید.

رفرنس‌های آویزان!

به عنوان آخرین بخش این آموزش به یکی دیگر از مشکلاتی که در دیگر زبان‌ها هنگام استفاده از رفرنس‌ها ایجاد می‌شود می‌پردازیم.
Dangling reference به رفرنسی گفته می‌شود که به جایی از حافظه اشاره می‌کند که دیگر داده‌ای که انتظارش می‌رود در آنجا نیست.
این اتّفاق زمانی می‌افتد که با آزاد شدن حافظه، آن مکان الان به جای دیگری اختصاص پیدا کرده است یا اینکه دیگر داده‌های قبلی به خاطر free شدن به صورت valid در آن‌جا قرار ندارند.
مثلاً برنامه‌ی ساده‌ی زیر را به زبان c درنظر بگیرید:

#include 
#include 
char* dangle_generator() {
    char * a = (char*) malloc(sizeof(char) * 10);
    a = "hello";
    free(a);
    return a;
}

int main() {
    char* b = dangle_generator();
    printf("%s", b);
    return 0;
}

اگر این برنامه‌را کامپایل کنید هیچ مشکلی رخ نمی‌دهد. حالا سعی کنید برنامه‌ی کامپایل شده را اجرا کنید:

munmap_chunk(): invalid pointer
Aborted (core dumped)

موقع اجرا به مشکل بدی خوردیم. وجود dangling reference ها درون برنامه می‌تواند همه‌چیز را خراب کند، و مثل اکثر باگ‌های مربتط با اشاره‌گرها، پیداکردن مشکل هم کار خیلی سختی است.
حالا بیایید مشابه برنامه‌ی بالا را به زبان Rust بنویسیم:

fn main() {
    let b = dangle_generator();
    println!("a in main function: {}", b);
}
fn dangle_generator() -> &String {
    let a = String::from("hello");
    &a
}

حالا اگر این برنامه‌را کامپایل کنیم با چه چیزی روبه‌رو می‌شویم؟

error[E0106]: missing lifetime specifier
 --> src/main.rs:6:26
  |
۶ | fn dangle_generator() -> &String {
  |                          ^ expected lifetime parameter
  |
  = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
  = help: consider giving it a 'static lifetime

باز هم مثل همیشه کامپایلر همیشه در صحنه‌ی Rust وارد عمل می‌شود و به شما یک پیام خطای دقیق و کامل می‌دهد.
ابتدای پیام خطا مربوط به ویژگی lifetime زبان Rust می‌شود که فعلاً با آن کاری نداریم و بعداً به صورت مفصّل درموردش صحبت می‌کنیم‌، امّا در بخش help پیغام خطا به ما می‌گوید که چه مشکلی پیش‌آمده است.
متن ارور می‌گوید که در انتهای تابع می‌خواهیم یک مقدار قرض‌گرفته شده را برگردانیم (یعنی یک رفرنس)، امّا مقداری برای قرض‌گرفتن وجود ندارد.
حالا این یعنی چی؟ متغیّر a یک متغیّر محلّی درون تابع dangle_generator است. بنابراین با به انتها رسیدن scope این تابع، این مقدار هم drop می‌شود و دیگر در دسترس نیست. حالا ما داریم تلاش می‌کنیم یک رفرنس به مقداری که از بین خواهد رفت‌را برگردانیم. یعنی می‌خواهیم به چیزی که اصلاً دیگر وجود ندارد رفرنس بدهیم.
اینجا Rust از به وجود آمدن یک dangling reference جلوگیری می‌کند.
پس یکی دیگر از کرامات زبان Rust این است که وقتی برنامه کامپایل شد، می‌توانید مطمئن باشید که هیچ باگی مربوط به dangling reference ها درونش وجود ندارد.
اگر بخواهیم این مشکل به وجود نیاید، کافی است به جای رفرنس، کل مقدار را از تابع خروجی بدهیم. این‌طوری مالکیّت آن مقدار منتقل می‌شود و همه‌چیز به خیر می‌گذرد.

در قسمت بعدی درمورد slicing صحبت می‌کنیم. آخرین ویژگی‌ای که مستقیماً به بحث مالکیّت (Ownership) مربوط می‌شود.
با دانستن آن عملاً اطّلاعات لازم را برای کار با مهم‌ترین ویژگی زبان Rust پیدا می‌کنیم، می‌توانیم به مفاهیم مهم و پرکاربرد دیگر بپردازیم و به نوشتن برنامه‌های کامل به این زبان نزدیک شویم.
اگر سؤالی درمورد این مفهوم داشتید می‌توانید در قسمت نظرات بیان کنید. شاید سؤال شما سؤال دیگران هم باشد. خوشحال می‌شوم که با همدیگر عمیق‌تر یادبگیریم.

این نوشته برای اوّلین بار خیلی وقت پیش در وبلاگ شخصی من منتشر شده است. برای دیدن این مطلب در آنجا، خواندن قسمت‌های جدیدتر و مطالب دیگری که در ویرگول منتشر نمی‌کنم، روی این نوشته کلیک کنید.

اگر قسمت قبلی‌را نخوانده‌ای همین حالا به آنجا برو تا با Ownership، مفهوم بنیادی زبان Rust آشنا بشوی.

اوّلین بار است که این مجموعه‌ی آموزشی‌را می‌بینی؟ با کلیک روی این نوشته به اوّلین قسمت آن برو و شروع به یادگیری کن.

نوشته آموزش زبان برنامه‌نویسی Rust – قسمت۸: Borrowing اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

هک شبکه بانکی شیلی با سوء استفاده از کارمند ساده لوح و اسکایپ

یک تماس اسکایپ و کارمندی ساده لوح موجب شدند هکرهای کره شمالی به شبکه کامپیوتری شرکت Redbanc نفوذ کنند؛ شرکتی که تمامی زیر ساخت های ATM بانک های کشور شیلی را به هم متصل می کند.

اصلی ترین مظنونین این نفوذ گروه لازاروس هستند که با نام Hidden Cobra هم شناخته می شوند. این گروه با دولت پیونگ یانگ نیز در ارتباط هستند. این گروه هکری یکی از خطرناک ترین ها است و در سال های اخیر به موسسه های مالی، بانکی و صرافی های ارزهای مجازی حمله کرده است.

این حمله گروه لازاروس در اواخر سال ۲۰۱۸ میلادی اتفاق افتاده و تنها زمانی توجه عموم را به خود جذب کرد که یکی از سناتورهای شیلی در هفته پیش از شرکت Redbanc در توییتر درخواست کرد که رخنه امنیتی مربوطه را فاش نکند. این شرکت البته یک روز پس از ارسال توییت سناتور به موضوع هک شدن اعتراف کرد ولی جزئیاتی از فرایند نفوذ منتشر نشد.

حمله سایبری

اما یک روز بعد بررسی های trendTIC، یک رسانه خبری حوزه فناوری از شیلی نشان داد که این شرکت مالی، قربانی حمله ای خطرناک بوده که به راحتی نمی توان آن را نادیده گرفت. بر اساس گزارش ها سرچشمه هک یک آگهی برای موقعیت شغلی توسعه دهنده در شبکه لینکدین بوده که یکی از کارمندان Redbanc هم به درخواست پاسخ داده است.

گفته شده که شرکت استخدام کننده با گروه لازاروس در ارتباط است و ظاهراً طعمه بزرگی را پیدا کرده. در ادامه از کارمند شرکت Redbanc برای مصاحبه کاری به زبان اسپانیایی و از طریق اسکایپ درخواست شده است. در حین مصاحبه از کارمند درخواست شد که یک فایل با نام ApplicationPDF.exe را دانلود و سپس روی سیستم نصب کند. به کارمند بخت برگشته گفته شد که این برنامه می تواند به فرایند استخدام کمک کند و یک فرم درخواست استاندارد را تولید نماید؛ غافل از اینکه در پس برنامه هدف دیگری پنهان شده بود.

لازاروس

تصویری از برنامه ای که کارمند ساده لوح روی کامپیوتر نصب کرد.

بر اساس بررسی های مدیر بخش تحقیقات شرکت تحلیلی فلش پوینت این فایل بدافزاری به نام PowerRatankba را نصب کرده که پیش از این هم به گروه لازاروس نسبت داده شده بود. به گفته این مدیر، بد افزار مورد بحث اقدام به جمع آوری اطلاعات کارمندان شاغل در Redbanc کرده و تمامی آنها را به سرورهایی ارسال کرده است.

اطلاعات جمع آوری شده شامل نام کاربری کامپیوترها ، جزئیات سخت افزارها و سیستم عامل های این شرکت، تنظیمات پراکسی ها، لیستی از تمامی پردازش های جاری، RPC (پروتکلی برای درخواست سرویس از یک برنامه روی کامپیوتر دیگر در شبکه) و فایل های به اشتراک گذاشته شده از طریق SMB (در صورت فعال بودن در دستگاه های میزبان آلوده شده) و وضعیت اتصال سرویس ریموت دسکتاپ بوده اند. این اطلاعات جمع آوری شده می توانستند به هکرها بگویند که کدام کامپیوترها آلوده شده اند تا در آینده بتوانند اسکریپت های مورد نظر خود را به کامپیوترها تزریق کنند.

معضلی که شرکت Redbanc با آن مواجه شد نشان می دهد که چگونه یک کارمند شرکت به سادگی و با کلیک روی یک لینک اشتباه یا اجرای یک فایل مخرب می تواند منجر به فاش شدن اطلاعات حیاتی شرکت ها شود.

نوشته هک شبکه بانکی شیلی با سوء استفاده از کارمند ساده لوح و اسکایپ اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی