یک فنجان جاوا – دیزاین پترن ها – Iterator

میتونین برای آشنایی با الگوهای طراحی (یا همون دیزاین پترن های) زبان جاوا به مقاله ی یک فنجان جاوا – دیزاین پترن ها Design Patterns مراجعه کنین.

(همونطور که گفته شده این الگو زیرمجموعه ی الگوهای رفتاری (Behavioral) هست)

الگوی Iterator

واژه Iterate به معنی تکرار کردن هست. توی iteration ما نیاز به ساختاری داریم که object فعلی رو نگهداریم و در عین حال بدونیم object بعدی یا قبلی (و نه کل مجموعه) چیه. در حقیقت Iterator زمانی استفاده میشه که میخوایم توی چرخه (یا روند رفت یا برگشتی) به اجزای یک مجموعه دسترسی داشته باشیم.
به عبارت دیگه iterator الگوییه که به ما اجازه دسترسی و پیمایش یه تجمع از اشیاء رو میده بدون نیاز به افشا کردن کل مجموعه.

خب با یه مثال ببینیم منظورمون چیه:

اول یه اینترفیس به اسم Iterator تعریف میکنیم

interface Iterator{
	public boolean hasNext();
	public Object next();
}

توابع hasNext و next اجزای لازمی هستن که توی پیاده سازی این پترن همیشه ازشون استفاده میکنیم (و طبیعتا مشخصه که hasNext به ما میگه عنصر بعدی ای وجود داره یا نه و تابع next باید عنصر بعدی رو برگردونه).
خب توی قدم بعدی یه اینترفیس دیگه به اسم Container تعریف میکنیم که کارش ساخت یه شی از Iterator هست

interface Container{
	public Iterator createIterator();
}

خب حالا نگاهی به کلاس زیر بندازیم

class BooksCollection implements Container{
	private String m_titles[] = {"test0","test1","test2","test3","test4"};

	public Iterator createIterator(){
		BookIterator result = new BookIterator();
		return result;
	}
	
	private class BookIterator implements Iterator{
		private int m_position;

		public boolean hasNext(){
			if (m_position < m_titles.length)
				return true;
			else
				return false;
		}
		public Object next(){
			if (this.hasNext())
				return m_titles[m_position++];
			else
				return null;
		}
	}
}

اول ببینیم کلاس BookIterator چیه. خب ما میخوایم مجموعه از کتاب ها داشته باشم و همونطور که گفتیم این الگو نیاز به یه Iterator داره. پس کلاس BookIterator رو تعریف کردیم که یه عضو داره به اسم m_position که داره ایندکس فعلی کتابمون رو داخل مجموعه نگه میداره٬ و البته Iteratorمون رو implement و طبیعتا توابع hasNext (میبینه بعد از m_position عضوی وجود داره یا نه) و next (اگه عنصری بعد از m_position باشه٬ m_position یدونه زیاد میشه و عضو بعدی رو برمیگردونیم) رو پیاده سازی کرده.

و این کلاس خودش داخل کلاسی به اسم BooksCollection هست که آرایه ی m_titles رو بصورت پیشفرض با چند مقدار داره٬ و تابع createIterator رو هم بواسطه ی implement کردن کلاس Container پیاده سازی کرده و یه BookIterator برمیگردونه.

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

Iterator iterator = new BooksCollection().createIterator();
while (name.hasNext() ){
    System.out.println(name.next());
}

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

test0
test1
test2
test3
test4

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

BooksCollection booksRepository = new BooksCollection();

for(Iterator iter = booksRepository.createIterator(); iter.hasNext();)
    System.out.println(iter.next());

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

میشه به این الگو توابع remove یا insertAfter یا insertBefore رو هم اضافه کرد. خود جاوا کلاسی داره به اسم Iterator که خوبه نگاهی بهش بندازین و ما هم توی مثال بعدی از این کلاس استفاده خواهیم کرد.

خب با یه مثال دیگه ادامه میدیم. کلاس شکل رو مینویسیم:

public class Shape {

	private int id;
	private String name;
	
	public Shape(int id, String name){
		this.id = id;
		this.name = name;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

و یه کلاس دیگه هم تعریف میکنیم برای اضافه کردن و نگهداری شکلها:

public class ShapeStorage {
	
	private Shape []shapes = new Shape[5];
	private int index;
	
	public void addShape(String name){
		int i = index++;
		shapes[i] = new Shape(i,name);
	}
	
	public Shape[] getShapes(){
		return shapes;
	}
}

خب میریم سراغ تعریف یه Iterator برای مجموعه ی شکلهامون:

public class ShapeIterator implements Iterator{

	private Shape [] shapes;
	int pos;
	
	public ShapeIterator(Shape []shapes){
		this.shapes = shapes;
	}
	@Override
	public boolean hasNext() {
		if(pos >= shapes.length || shapes[pos] == null)
			return false;
		return true;
	}

	@Override
	public Shape next() {
		return shapes[pos++];
	}

	@Override
	public void remove() {
		if(pos <=0 )
			throw new IllegalStateException("Illegal position");
		if(shapes[pos-1] !=null){
			for (int i= pos-1; i<(shapes.length-1);i++){
				shapes[i] = shapes[i+1];
			}
			shapes[shapes.length-1] = null;
		}
	}
}

همونطور که میبینیم این کلاس یه آرایه از Shapeها داره و Iterator رو implement کرده (توابع hasNext و next و remove پیاده سازی شده). مشخصه که تابع hasNext به ما میگه شکل بعدی ای وجود داره یا نه٬ تابع next در صورت وجود شکل بعدی رو برمیگردونه و تابع remove اگه توی pos (یا همون position) فعلی توی آرایمون شکلی وجود داشته باشه اونو حذف میکنه!

و برای تست کد زیر رو اجرا میکنیم:

ShapeStorage storage = new ShapeStorage();
storage.addShape("Polygon");
storage.addShape("Hexagon");
storage.addShape("Circle");
storage.addShape("Rectangle");
storage.addShape("Square");
		
ShapeIterator iterator = new ShapeIterator(storage.getShapes());
while(iterator.hasNext()){
    System.out.println(iterator.next());
}

اتفاقی که اینجا میفته به این صورته که اول میایم یه ShapeStorage تعریف میکنیم که داخلش یه آرایه از shapeها رو نگه میداره. و به کمک تابع addShape بهش شکل های Polygon و Hexagon و Circle و Rectangle و Square رو اضافه میکنیم (با توجه به نوع پیاده سازی تابع addShape فقط کافیه اسم شکلمون رو بدیم و اون خودش اتوماتیک id هر شکل که اضافه میشه رو یکی یکی افزایش میده).
توی قدم بعدی یه شی از ShapeIterator ساختیم و آرایه ی شکلهای موجود توی storage رو بهش دادیم.
و در آخر هم رفتیم سراغ نمایش یا به اصطلاح iterate کردن آرایه ی شکل هامون.
و همونطور که انتظار داریم خروجی بصورت زیر هست:

ID: 0 Shape: Polygon
ID: 1 Shape: Hexagon
ID: 2 Shape: Circle
ID: 3 Shape: Rectangle
ID: 4 Shape: Square

خب فکر کنم متوجه شدیم که چه اتفاقی افتاد. برای اینکه تابع remove رو هم تست کرده باشیم قطعه کد زیر رو اجرا میکنیم:

ShapeIterator removeTestIterator = new ShapeIterator(storage.getShapes()); while(removeTestIterator.hasNext()){
    System.out.println(removeTestIterator.next());
    removeTestIterator.remove();
}

خب شما بگین انتظار داریم توی خروجی چی ببینیم

.

.

.

.

.

کاری که اینجا اتفاق میفته اینه که اولین بار با صدا زدن

removeTestIterator.next();

و با رسیدن به عبارت

return shapes[pos++];

اول کد زیر اجرا میشه

return shapes[pos];

و بعدش با اجرای دستور زیر یدونه به pos اضافه میشه

pos++

پس ما توی خروجی عنصر اول رو میبینیم (که Polygon هست) و pos داره به عنصر دوم (Hexagon) اشاره میکنه. حالا با رسیدن به دستور زیر

removeTestIterator.remove();

جایی که pos داره بهش اشاره میکنه (یعنی Hexagon) حذف میشه. و این روند همینطور ادامه پیدا میکنه و در حقیقت ما داریم یکی در میون شکلهای با pos زوج (۰ و ۲ و ۴) رو نشون میدیم و شکلهای با pos فرد (۱ و ۳) رو حذف میکنیم! بنابراین خروجی به صورت زیر خواهد بود:

ID: 0 Shape: Polygon
ID: 2 Shape: Circle
ID: 4 Shape: Square

خب فکر کنم به خوبی با مفهوم Iterate کردن و الگوی Iterator آشنا شدیم. به عنوان آخرین مثال هم بدونیم که بعضی کلاسای جاوا مثل کلاس ArrayList خودش تابعی داره به اسم iterator که میتونیم بدون اینکه خودمون بخوایم الگوی iterator رو پیاده سازی و کلاس هاش رو تعریف کنیم٬ ازش براحتی استفاده کنیم. مثالش هم بصورت زیر خواهد بود:

 ArrayList al = new ArrayList();

al.add("M");
al.add("I");
al.add("S");
al.add("A");
al.add("G");
al.add("H");


System.out.print("Original list: ");
Iterator itr = al.iterator();
while (itr.hasNext()) {
    String element = itr.next();
    System.out.print(element + " ");
}
System.out.println();


System.out.print("Modified contents: ");
ListIterator litr = al.listIterator();
while (litr.hasNext()) {
    String element = litr.next();
    String newElement = "*" + element + "+";
    litr.set(newElement);
    System.out.print(newElement + " ");
}
System.out.println();


System.out.print("Modified list backwards: ");
while (litr.hasPrevious()) {
    String element = litr.previous();
    System.out.print(element + " ");
}

و خروجی به این صورته:

Original list: M I S A G H
Modified contents: *M+ *I+ *S+ *A+ *G+ *H+
Modified list backwards: *H+ *G+ *A+ *S+ *I+ *M+


منتشر شده در ویرگول توسط محمد قدسیان https://virgool.io/@mohammad.ghodsian

https://virgool.io/@mohammad.ghodsian/java-iterator-design-pattern-d8x2pyrv3vdi

نوشته یک فنجان جاوا – دیزاین پترن ها – Iterator اولین بار در ویرگول پدیدار شد.

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

پشیمانی های فارغ التحصیلان کامپیوتر

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

اما چند روز پیش چند نفری دور هم جمع شدیم که با هم در مورد کارهایی که چهار سال لیسانس اگه میکردیم جلوتر بودیم و یا اگه نمیکردیم کلی عقب تر بودیم بحث میکردیم و فکر کردم اگه بعنوان یه ترم ۹ لیسانس کامپیوتر یه دانشگاه دولتی بخوام کسایی که توی این رشته تازه وارد هستن رو راهنمایی کنم خیلی بهتر از اینه که اموزش چیزای مختلف رو بزارم اگه تازه میخواید برید رشته کامپیوتر تو دانشگاه بخونید یا سال اول و دوم این رشته هستید این نوشته بدردتون میخوره و پیشنهاد میکنم بخونیدش


۰:چرا از کد زدن ترسیدم؟

مهم ترین بخش ماجرا همینه!!

شما وقتی کامپیوتر میخونید یک برنامه نویس میشید و برای برنامه نویس خوب شدن هم باید زیاد کد بزنید

به هیچ وجه پروژه هاتون رو از بقیه نگیرید این خیلی مهمه و البته مهم تر ازون پروژه های شخصی خودتون رو پیش ببرید اگه زیاد کد نزنید دقیقا مثل کسی میشید که مهندس معماری میشید که حتی نمیتونه یه خونه ی سادرو طراحی کنه درواقع لیسانس خوندن جز عقب انداختن سربازی و کلاسش چیز دیگه برای شما نخواهد داشت!!

۱:چرا وقت کشی کردم؟

این بیشترین موردیه که دیدم دانشجوها بخاطرش حسرت میخورن. بهترین پیشنهادی که میتونم بهتون بکنم اینه که هرشب که میخوابین به این فکر کنین که امروز چه پیشرفت هایی کردین و کارهای بدردبخوری رو انجام دادین و در کل اینکه ایا نسبت به صبح که از خواب پاشدین تغییر مثبتی داشتین یا نه.

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

۲:خودتون رو با دیگران مقایسه نکنید

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

و البته باید اضافه کنم که دانش و مهارت به تنهایی هیچ ارزشی ندارن و مهم تر از اون خلاقیت و استفاده ازون دانش برای کمک به دیگرانه و البته هزاران دلیل دیگه میتونم براتون بیارم که مقایسه کردن خودتون با دیگران کاملا غیر منطقیه

۳:چرا تکنولوژی های کمی یادگرفتم؟

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

۴:چرا بجای اینکه در یک زمینه عمیق شم در چندین زمینه سطحی کار کردم؟

درسته!!شاید فکر کنید موضوع ۴ با موضوع ۳ در تناقضه اما اینجور نیست!!

این هم نکته ی قابل بحثیه دوستای زیادی دارم که توی مباحث(اندروید ,بازی سازی,هوش مصنوعی,طراحی سایت و …) به صورت سطحی کار کردن اما توی هیچکدوم عمیق نشدن باید حواستون باشه که تعادل رو رعایت کنید اینکه ۱۰ تا زبان برنامه نویسی بلد باشید اما توی هیچکدوم عمیق نشده باشین بدونید که کارتون داره اشتباه پیش میره بهتره با ۳ تا زبان اشنایی داشته باشید و توی دو زبان بصورت عمیق کار کنید یا توی زمینه ی برنامه نویسی سمت سرور عمیق کار کنید وبا لینوکس و برنامه نویسی فرانت – اند اشنایی داشته باشید اینطوری بهتر میتونید زمینه ای که بهش علاقه دارید رو پیدا کنید و اگر هم اون زمینه قدیمی شد بتونید به زمینه های دیگه مهاجرت کنید

۵:چرا توی پروژه های متن باز مشارکت نکردم؟

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

۶:چرا بیشتر روی طراحی الگوریتم ها و ساختمان داده ها کار نکردم؟

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

۷: نیم نگاهی به design pattern ها هم داشته باشید:

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

۸:حتما گیت رو یاد بگیرین!!

بنظرم گیت بشدت مهمهاگه بلد نیستین همین الان شروع کنید به یادگیریش منابع خوبی توی یوتیوب هست و البته به فارسی هم گوگل کنید نتایج خوبی رو میاره و البته بهتون میگه چی هست و به چه دردی میخوره

۹:ریاضیات رو جدی بگیرید!!

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

۱۰:فکر نکنید چون لینوکس رو (به صورت سطحی) بلدید خیلی خفنید!!

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

۱۱:در اسرع وقت کار پیدا کنید!!

بله اگه زودتر کار پیدا نکنید(البته که منظورم کاراموزیه) به احتمال زیاد پشیمون میشید.کار هم باعث میشه چیز یاد بگیرید هم رزومه خوبی میشه برای کارای بعدی

۱۲:اگه میخواید برید خارج حتما معدل خوبی بیارید


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

نوشته پشیمانی های فارغ التحصیلان کامپیوتر اولین بار در ویرگول پدیدار شد.

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

۴ دوره آموزشی آنلاین رایگان برای کسب مهارت و تخصص در بلاکچین

توی پست قبلی‌م گفتم که چرا از کریپتوکارنسی‌ها خوشم میاد و توی این پست میخوام یه مقدار جلوتر برم…

خیلی از ماها در طول یکی دو سال گذشته اسم بیتکوین و کریپتوکارنسی‌هایی شبیه بهش رو شنیدیم، ولی خب اطلاعات‌مون بیشتر درباره افزایش و کاهش قیمت‌ها بوده، یا حواشی دیگه مثل اینکه چرا میشه و یا نمیشه باهاش تحریم رو دور زد؟ چطور میشه رایگان کوین دریافت کرد؟ یا چطور شروع به ماینینگ کریپتوها کنیم؟ و… ولی آیا این همه اون چیزی هست که باید بدونیم؟

قطعن جواب من به این سوال نه هستش، بنظرم خیلی خوبه که توجه رو گذاشت روی سوالاتی از این دست که چرا این همه اقبال شد به این تکنولوژی؟ آیا فقط بحث ساخت و چاپ پول و اعتبار مالی هستش؟ چرا اینقدر پروژه‌های ریز و درشت براساس بلاکچین داره شروع میشه؟ چرا با این وضعیت نزولی شدن مارکت کریپتوکارنسی هنوز داره کلی ICO راه‌اندازی میشه و براحتی اعتبار اولیه خودش رو جمع میکنه؟ این پروژه‌ها قراره چه مشکلاتی رو رفع کنن برای انسان؟

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

چرا باید یه آدم فنی توی تکنولوژی بلاکچین شد؟

  1. مارکت کریپتوکارنسی‌ها و قیمت کوین‌هاش خیلی افت و خیز داره، اکثر کوین‌ها تبدیل شدن به ابزاری برای پامپ و دامپ ولی داشتن یه شغل مرتبط توی این صنعت جوان و آینده‌دار میتونه خیلی باثبات و کم‌خطرتر باشه.
  2. پول خوبی توش هست، چون تکنولوژی بلاکچین جوان هستش و آدمای فنی صاحب تخصص توش کمه خیلی خوب پول میدن و معمولن آدمای فنی توش ۴۰-۵۰ درصد بیشتر از سایر آدمای فنی توی دنیای کامپیوتر و اینترنت پول میگیرن که البته نیاز نیست حتمن برنامه‌نویس باشن، شما میتونید مدیر محصول باشین اینجا یا مدیر شبکه بشین و یا از کارهای امنیتی توش کسب درآمد کنید و… ولی باید شناخت فنی به این حوزه داشته باشین.

قانع شدین؟ امیدوارم که شده باشین چون میخوام شروع کنم به معرفی دوره‌ها 🙂

دوره اول: تکنولوژی بیتکوین و بلاکچین

از دانشگاه پرینستون

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

دوره دوم: شناخت بنیادین از بلاکچین برای توسعه‌دهندگان

از شرکت IBM

این دوره که به ۲ بخش میشه تقسیمش کرد توی بخش اول یه شناخت اولیه از بلاکچین میده و بعد یه مقدار بحث رو فنی‌تر میکنه، برای برنامه‌نویس‌ها و توسعه‌دهندگان تولید شده و کمک‌تون میکنه تا بتونید بیتکوین رو از میون کدها یاد بگیرین، کمی باهاش بازی کنید و ببینید چطور میشه یه شبکه توی سایز کوچیک برای خودتون راه بندازین و کشف کنید پشت این زیبای رمزآلود چی هست و چه خبره؟ چه چیزی اینقدر توسعه‌دهنده‌ها رو بهش علاقمند کرده؟ شما میتونید کل محتوای این دوره رو به رایگان استفاده کنید ولی خبر خوب اینکه اگر میخواین به رزومه‌تون چیزی اضافه کنید با پرداخت ۴۲ دلار (آخ آخ! دلار!) یه گواهینامه هم بگیرین از IBM که توی این دوره شرکت کردین، بهتر از مدرک فولان دانشگاه فولان نیست جدن؟ 🙂

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

از گرگوری مک‌کوبین

این یه دوره ۰ تا ۱۰۰ هستش، این دوستمون آقای گرگوری توی چند ساعت بهتون یاد میده که چطور یه کریپتوکارنسی بسازید برای خودتون بر روی شبکه اتریوم، مفاهیم اولیه شبکه اتریوم رو بهتون توضیح میده و میگه که توکن‌های ERC-20 چی هستن و چطور میشه باهاشون اپلیکیشن‌های غیرمتمرکز نوشت، از یه طرف دیگه میگه چطور یه وبسایت راه بندازین برای پروژه‌تون، چطور ICO برگزار کنید و چطور به دیگران پیش‌فروش کنید پروژه‌تون رو و تقسیم کنید توکن‌ها رو و… اگر شما یه توسعه دهنده و برنامه‌نویس هستید میتونید یه بخش‌هایی ازش رو بی‌خیال میشین و برین سراغ بخش‌های جالب‌تر و تازه‌تر… دوره‌اش چون متمرکز هست روی کد نوشتن و کار عملی یه مقدار داستان داره، مثلن اینکه از زبون برنامه‌نویسی solidity استفاده کرده و یا نشون میده که چطور لپ‌تاپ و سیستم‌عامل مک رو کانفیگ کنید و این برای کاربرهای ویندوزی ممکنه کمی پیچیدگی داشته باشه ولی خب اگر واقعن بخواین یاد بگیرین اینا بهانه‌ست، یوتیوب کنید و یاد بگیرین از این خان‌ها چطور میشه گذشت؟ 🙂

دوره چهارم: فین‌تک یا فناوری‌های مالی

از دانشگاه هنگ‌کنگ

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

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

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

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

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

نگاهی به تغییرات ظاهری Visual Studio 2019 Preview

نسخه بعدی Visual Studio، در نیمه اول سال ۲۰۱۹ منتشر میشه این نسخه نسبت به نسخه های قبلی تغییرات بسیار خوبی رو هم در عملکرد و هم در ظاهر به خود دیده، تو این پست سعی میکنم تغییرات ظاهری که تا کنون در نسخه ۲۰۱۹ اعمال شده رو با هم مرور کنیم البته این انتهای کار نیست و طبق اعلام خود ماکروسافت تغییرات بیشتر و بهتری در راه هستن.

آیکون»

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

آیکون سمت چپ نسخه ۲۰۱۷ و سمت راست نسخه ۲۰۱۹

باز کردن آسان تر پروژه ها»

پنجره استارتر شیک و ساده تر برای باز کردن هرچه ساده تر پروژه ها

سمت چپ ویژوال استودیو مک سمت راست ویژوال استودیو

تم آبی (رفرش شده)»

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

تم رفرش شده سمت چپ / تم کنونی سمت راست

البته بعد از اتمام کامل تم آبی رفرش شده، تیم ماکروسافت قرار هست تم تیره رو هم رفرش کنن و یه دستی روش بکشن.

بهره وری و فضای کار بیشتر»

نسخه ۲۰۱۹ تمرکز بیشتری روی رابط کاربری و تجربه کاربری داشته برای همین سعی کردن تا منوها رو بیشتر جمع و جور کنن همینطور که توی تصویر مشخصه توی نسخه ۲۰۱۹ برنامه نویس فضای کار بیشتری برای کد نویسی در اختیار داره (تایتل بار حذف شده و منو ها به تایتل بار منتقل شدن)

بالا نسخه ۲۰۱۷ / پایین نسخه ۲۰۱۹

اطلاعیه ها»

مدیریت و نمایش بهتر اطلاعیه ها

نوشته نگاهی به تغییرات ظاهری Visual Studio 2019 Preview اولین بار در ویرگول پدیدار شد.

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

قسمت چهارم JavaFX _ معماری و ساختار

سایر قسمت هارا در اینجا ببینید.

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

ـ JavaFX یک API کامل با مجموعه ای غنی از کلاس ها و اینترفیس ها برای ساخت اپلیکیشن های گرافیکی با گرافیک غنی را فراهم می کند.پکیج های مهمّ این API عبارت اند از _

ـ javafx.animation _ شامل کلاس هایی برای اضافه کردن انیمیشن های مبتنی بر انتقال از قبیل پر کردن(fill)، محو شدن(fade)، چرخش(rotate)، تغییر مقیاس(scale) و جابه جایی(translation) برای nodeهای JavaFX است.

نکته: node ها المان های گرافیکی JavaFX هستند.

  • ـjavafx.application _ شامل مجموعه ای از کلاس ها است که چرخه ی زندگی(life cycle) برنامه های JavaFX را بر عهده دارند.
  • ـ javafx.css _ شامل کلاس هایی برای طرّاحی CSSمانندِ اپلیکیشن های گرافیکی JavaFX می باشد.
  • ـ javafx.event _ شامل کلاس ها و اینترفیس هایی برای ارائه و مدیریت رویداد های JavaFX است.
  • ـ javafx.geometry _ شامل مجموعه ای از کلاس ها برای تعریف کردن اشیاء ۲بعدی و عملیات بر روی آن هاست.
  • ـ javafx.stage _ این بسته دارای کلاس های نگه دارنده ی(container) سطح بالای اپلیکیشن های JavaFX است.
  • ـ javafx.scene _ این بسته کلاس ها و اینترفیس هایی را برای پشتیبانی از گرافیک صحنه(Scene Graph) فراهم می کند. علاوه بر این، زیربسته ها یا sub_package هایی از قبیل بوم، نمودار، کنترل ها، افکت، تصویر، ورودی، لایه، مدیا، رنگ، شکل، متن، تبدیل، وب و… را فراهم می کند. اجزای متعدّدی هستند که این API غنی JavaFX، پشتیبانی می کنند. There are several components that support this rich API of JavaFX.

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

ساختار ای پی آی های JavaFX و اجزایی که از این APIها پشتیبانی می کنند.

گراف صحنه(Scene Graph)

در JavaFX ، اپلیکیشن های گرافیکی با استفاده از گراف صحنه کد نویسی شده اند. گراف صحنه نقطه ی شروع ساخت اپلیکیشن است. گراف صحنه(Scene Graph) اِلِمان های اصلی اپلیکیشن های گرافیکی JavaFX را که node نامیده می شوند در خود نگه داری می کند.

ـ node یک شیء بصری یا گرافیکی است و می تواند شامل این موارد باشد _

  • اشیای هندسی (گرافیکی) _ (۲بعدی و ۳بعدی) از قبیل دایره، مستطیل، چند ضلعی و…
  • کنترل های UI _ از قبیل Button ، CheckBox ، Choice box ، Text Area و…
  • ظروف شامل شونده (Containers) _ (پنجره های لایه ها یا layout panes)مثل Border Pane و Grid pane و Flow Pane و… (نگران نباشید بعداً به طور کامل همه ی این هارا بررسی خواهیم کرد.)
  • عناصر رسانه (Media elements) _ مانند آبجکت های صوتی، ویدیویی و تصویری.

به طور کلّی مجموعه ای از node ها یک گراف صحنه(scene graph) را می سازد. همه ی این node ها در یک سلسله مراتب(وراثتی) مرتّب شده اند که در تصویر زیر نشان داده شده است.

نمودار وراثتی node ها

هر node در گراف صحنه(scene graph) یک والد تک دارد، و node ای که هیچ والدی ندارد به عنوان nodeریشه یا root node شناخته می شود.

به طور مشابه node ها یک یا چند فرزند دارند، و node ای که هیچ فرزندی نداشته باشد leaf node نامیده می شود؛ node ای که دارای فرزند باشد branch node نامیده می شود.

در یک گراف صحنه(scene graph) فقط یک node می تواند اضافه شود. node ِ گراف صحنه می تواند افکت(Effects)، شفّافیت(Opacity)، تغییر شکل (transform) و Event Handler داشته باشد. (نگران نباشید در ادامه ی آموزش درباره ی همه ی این موارد توضیح داده خواهد شد)

ـPrism

ـprism یک عملکرد گرافیکی سطح بالاست که برای تفسیر گرافیکی در JavaFX استفاده می شود. که می تواند هر دوی گرافیک های دو بعدی و سه بعدی را تفسیر کند.

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

زمانی که از کارت گرافیک یا GPU استفاده شود، گرافیک روان تری ارائه می شود. فقط زمانی که سیستم کارت گرافیک نداشته باشد، prism به صورت پیش فرض از پردازش گرافیکی نرم افزاری استفاده می کند.

GWT (Glass Windowing Toolkit)

ـGWT سرویس هایی برای مدیریت پنجره ها، تایمرها، سطوح برنامه(Surfaces) و صف رویدادها ارائه می دهد. GWT بسترِ JavaFX را به سیستم عامل بومی سیستم متّصل می کند.

وب ویو (WebView)

با استفاده از JavaFX شما می توانید محتوای HTML را هم در گراف صحنه ی خود قرار دهید. WebView کامپوننتی(جزئی) است که نمایش این محتوارا بر عهده دارد. وب ویو از تکنولوژی ای به نام Web Kit استفاده می کند که یک مرورگر وب داخلی منبع باز(open source) است. این جزءِ JavaFX از تکنولوژی های مختلف مربوط به وب پشتیبانی می کند مانند HTML5 و CSS و JavaScript و DOM و SVG.

با استفاده از وب ویو شما می توانید _

  • محتوای HTML را از بخش محلّی(local) یا آدرس URL ، رندر کنید.
  • پشتیبانی از تاریخ و ارائه ی قابلیت برگشت و جلو رفتن در صفحات وب.
  • بارگیری مجدّد محتوا (reload the content)
  • اعمال افکت روی صفحات وب.
  • ویرایش محتوای HTML.
  • اجرای دستورات JavaScript.
  • مدیریت رویدادها.

به طور کلّی با استفاده از WebView می توانید محتوای وب را از جاوا کنترل کنید.

موتور رسانه یا Media Engine

موتور رسانه ی JavaFX مبتنی بر یک موتور() منبع باز است که به عنوان یک استریمر(streamer) شناخته می شود. این موتور رسانه از پخش ویدیو و محتوای صوتی پشتیبانی می کند.

موتور رسانه ی JavaFX فایل های صوتی با فرمت های زیر را پشتیبانی می کند _

قالب های پشتیبانی شده در موتور رسانه ی JavaFX

بسته ی javafx.scene.media ، کلاس ها و اینترفیس هایی را برای ارائه ی قابلیت رسانه در JavaFX فراهم می کند. این در قالب سه جزء ارائه شده است که موارد زیر هستند _

ـMedia Object _ این نشان دهنده ی یک فایل رسانه ای است.

ـMedia Player _ برای پخش محتوای رسانه.

ـMedia View _ برای نمایش رسانه.

در ادامه با این سه بهتر آشنا خواهیم شد. فعلاً اسمشان را در گوشه ی ذهن خود داشته باشید تا بعد.

لطفاً نظرات ارزشمند خودتون رو بنویسید. لایک هم فراموش نشه، مرسی.

نوشته قسمت چهارم JavaFX _ معماری و ساختار اولین بار در ویرگول پدیدار شد.

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

آموزش زبان برنامه‌نویسی Rust-قسمت۶: کار با تابع + تمرین

حالا که با متغیّرها, دیتاتایپ‌ها, شرط و حلقه ها آشنا شده‌ایم, وقت آن است که سراغ تابع‌ها برویم.
تابع(function)ها در سرتاسر کدهایی که به زبان Rust نوشته می‌شوند حضور دارند. همانطوری که در جلسات قبلی دیدیم, نقطه‌ی شروع برنامه‌ها تابع main است.
در این جلسه‌ی کوتاه همه‌ی چیزهایی که برای کار با توابع لازم است را یاد می‌گیریم.

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

تعریف تابع

شکل کلّی یک تابع که مقداری را برنمی‌گرداند(return نمی‌کند) مثل زیر است:

fn function_name(arguments) {
// Function body
}

تعریف یک تابع با کلمه‌ی کلیدی fn شروع می‌شود که مخفف کلمه‌ی function است. بعد از fn, نام تابع نوشته می‌شود.
در زبان Rust نام توابع‌را به صورت snake case می‌نویسم. یعنی از حروف بزرگ استفاده نمی‌کنیم و کلمات‌را با علامت _ از هم جدا می‌کنیم.
بعد از نام تابع, پرانتز قرار می‌گیرد. داخل این پرانتزها آرگومنت‌های ورودی قرار می‌گیرند.
بعد از پرانتز, آکولاد می‌گذاریم. کدهای تابع درون آکولادهای باز و بسته قرار خواهند گرفت.
بگذارید نگاهی به یک مثال بیاندازیم. تابع ساده‌ی زیر هیچ ورودی و خروجی ای ندارد, تنها یک خط نوشته‌را چاپ می‌کند.

fn simple_function() {
    println!("ساده است. نه؟");
}

fn main() {
}

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

warning: function is never used: `simple_function`
 --> src/main.rs:6:1
   |
   ۶ | fn simple_function() {
     | ^^^^^^^^^^^^^^^^^^^^
       |
         = note: #[warn(dead_code)] on by default

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

fn main() {
    simple_function();
}

fn simple_function() {
    println!("ساده است. نه؟");
}

حالا خروجی به ما نمایش داده می‌شود:

ساده است. نه؟

ساده بود, نه؟

تابع با پارامترهای ورودی

ما خیلی وقت‌ها از تابع با پارامترهای ورودی استفاده می‌کنیم تا عملی‌را روی چند داده‌ی ورودی انجام دهیم. برای این کار باید هنگام تعریف تابع, مشخص کنیم که چه ورودی‌هایی دارد و هر پارامتر ورودی از چه نوعی است.
پارامترها داخل پرانتزهای جلوی اسم تابع قرار می‌گیرند و مثل متغیّرها تعریف می‌شوند, با این تفاوت که کلمه‌ی let اوّل آن‌ها نمی‌آید.
مثلاً فرض کنید می‌خواهیم تابعی بنویسیم که یک عدد را به عنوان ورودی بگیرد و آن‌را پرینت کند. نتیجه می‌شود تابع زیر:

fn number_printer(number: i32){
    println!("The number parameter is: {}", number);
}

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

fn main() {
    number_printer(50);
}

fn number_printer(number: i32){
    println!("The number parameter is: {}", number);
}

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

The number parameter is: 50

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

Statement ها و Expression ها

ما تا همین‌جای کار هم داشتیم از این دوتا استفاده می‌کردیم.
Statement ها دستوراتی هستند که اعمالی‌را انجام می‌دهند, بدون اینکه مقداری‌را برگردانند.
مثلاً وقتی که یک متغیّررا تعریف می‌کردیم, درواقع داشتیم از یک Statement استفاده می‌کردیم.
لازم است که اینجا یادآوری کنم برخلاف زبان‌هایی مثل c یا زبان‌های سطح بالاتری مثل php, تعریف متغیّر در Rust یک Statement است و چیزی‌را برنمی‌گرداند. مثلاً شما نمی‌توانید کدی مثل زیر را بنویسید:

fn main() {
    let a = b = 10;
}

اگر این کدرا کامپایل کنید با ارور زیر مواجه می‌شوید:

error[E0425]: cannot find value `b` in this scope
 --> src/main.rs:3:13
  |
۳ |     let a = b = 10;
  |             ^ not found in this scope

یا مثلاً اگر برنامه‌ی زیر را کامپایل کنید:

fn main() {
    let a = (let b = 10);
}

با ارور زیر مواجه می‌شوید:

error: expected expression, found statement (`let`)
 --> src/main.rs:3:14
  |
۳ |     let a = (let b = 10);
  |              ^^^ expected expression
  |
  = note: variable declaration using `let` is a statement

چرا؟ همانطوری که در متن ارور آخر می‌بینید, بعد از علامت = باید یک expression قرار بگیرد. امّا از آنجایی که تعریف متغیّر یک Statement است, پس کامپایل با ارور روبه‌رو می‌شود.
خب احتمالاً الان خودتان تعریف Expression را قبل از اینکه من بگویم می‌دانید. بله, دستوراتی
که خروجی دارند.
مثلاً اعمال ریاضی همه expression هستند. چون عبارت ۶ + ۱ مقدار ۷ را برمی‌گرداند. همچنین فراخوانی یک تابع یا ماکرو هم یک expression است.
شاید برایتان جالب باشد که بدانید یک مقدار عددی تنها هم می‌تواند یک expression باشد. به شرط اینکه بعد از آن ; قرار نگرفته باشد. چون به محض اینکه ; می‌آید, آن دستور تبدیل به یک statement می‌شود.

تابع با مقدار خروجی

خب مفهوم expression و statement را خوب فهمیدید؟ اینجا با آن‌ها کار داریم.
ما خیلی وقت‌ها نیاز داریم که یک خروجی از تابع دریافت کنیم. مثلاً می‌خواهیم تابع ما یک عدد را دریافت کند و مقدار فاکتوریل آن‌را برگرداند. برای اینکه بتوانیم از تابع چیزی‌را خروجی بدهیم, باید هنگام تعریف تابع نوع آن‌را مشخّص کنیم.
برای تعیین نوع خروجی یک تابع, باید بعد از پرانتزهای حاوی پارامترها ورودی, علامت <- را قرار دهیم(از چپ به راست: خط فاصله و علامت بزرگتر). حالا پس از این علامت نوع داده‌ی خروجی‌را مشخّص می‌کنیم.
مثلاً فرض کنید می‌خواهیم یک تابع بنویسم که ۲ برابر ورودی‌اش را به عنوان خروجی برگرداند. حاصل می‌تواند چیزی شبیه به این باشد:

fn duplicator(input_number : i32) -> i32 {
    let result = input_number * 2;
    return result;
}

همانطور که می‌بینید ما دو برابر ورودی‌را در متغیّری به نام result ذخیره کردیم. سپس برای بازگرداندن این مقدار از تابع, نام متغیّررا بعد از کلمه‌ی کلیدی return نوشته ایم.
در واقع شما با قرار دادن هرچیزی بعد از کلمه‌ی کلیدی return در تابع, آن را به خارج از تابع می‌فرستید.
خب چیزهایی که درمورد expression گفتم را یادتان هست؟ اگر پاسختان مثبت است پس حتماً به یاد دارید که عبارت ریاضی هم خودش یک expression است, البته اگر بعد از آن ; قرار نگیرد. پس تابع بالا را می‌توان این‌طوری هم نوشت:

fn duplicator(input_number : i32) -> i32 {
    input_number * 2
}

توابع بازگشتی

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

fn main() {
    recursive_function(10);
}
fn recursive_function(mut input_number: i32) {
    if input_number < 1 {
        return;
    }
    println!("Current input_number is: {}", input_number);
    input_number -= 1;
    recursive_function(input_number);
}

اگر این برنامه‌را اجرا کنیم, خروجی زیر را می‌بینیم:

Current input_number is: 10
Current input_number is: 9
Current input_number is: 8
Current input_number is: 7
Current input_number is: 6
Current input_number is: 5
Current input_number is: 4
Current input_number is: 3
Current input_number is: 2
Current input_number is: 1

در این برنامه سه نکته‌ی خیلی مهم وجود دارد:
۱- چون ما قصد داریم که پارامتر ورودی‌را تغییر بدهیم, قبل از اسم پارامتر کلمه‌ی mut را نوشته ایم. اگر این کار را نمی‌کردیم پارامتر ورودی immutable می‌شد و دیگر نمی‌شد در خط ۱۳ آن‌را تغییر داد.
۲- در خط ۱۳ به جای آنکه بنویسیم:
input_number = input_number - 1;
نوشتیم:
input_number -= 1;
این کار خلاصه‌تر است, امّا همان معنی‌را دارد. شما می‌توانید تمامی اعمال ریاضی را اینطوری بنویسید:
=- , =+ , =/ , =% , =*
۳-با رسیدن به return اجرای تابع متوقّف می‌شود و مقدار مقابل آن برگردانده می‌شود. وقتی که تابع ما چیزی برنمی‌گرداند می‌توانیم از یک return خالی برای متوقف کردن تابع و خروج از آن استفاده کنیم.
خب این جلسه هم مثل جلسه‌ی قبلی با هم چندتا مثال حل می‌کنیم تا دستمان با Rust راه بیافتد.

تمرین

تمرین این جلسه واقعاً ساده است. همانطوری که در متن اشاره شد می‌خواهیم تابع فاکتوریل را به زبان Rust پیاده‌سازی کنیم. ولی چون هدفمان آموزش است, این کار را به شیوه‌های متفاوت انجام می‌دهیم.
۱-تابع فاکتوریل‌را به صورت بازگشتی بنویسید.
۲-تابع فاکتوریل‌را با استفاده از حلقه‌ی for بنویسید.
وقتی که روی این تمرین کار کردید, می‌توانید از طریق این لینک پاسخ‌هارا ببینید.

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

خواندن قسمت قبلی

رفتن به ابتدای این مجموعه‌ی آموزشی

نوشته آموزش زبان برنامه‌نویسی Rust-قسمت۶: کار با تابع + تمرین اولین بار در ویرگول پدیدار شد.

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

جنگو بهتر است یا لاراول ؛)

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

اگر سوال تون اینه که جنگو بهتره یا لاراول؟ این سوال مثل خیلی سوال‌های دیگه جوابی نداره بعضی وقتها این خوبه بعضی وقتها اون، اکثر مواقع هم خیلی فرقی نمی‌کنند و با هر دو میشه اکثر کارها رو انجام داد در واقع این شمایید که باید ببینید چه منابعی در اختیار دارید و می‌خواهید چه کاری انجام بدهید.

اما برای یاد گرفتن هردو به چندتا چیز احتیاج قطعی داریم:

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

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

… مهم نیست چه ایرادی پیش اومده مهم اینه که چطوری باهش برخورد میکنی …

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

google: PostgreSQL
google: PostgreSQL features
google: PostgreSQL vs sqlite3
google: PostgreSQL compatibility with django
google: PostgreSQL limitations in django

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

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

البته خبر خوب اینکه کم کم دیگه داره از اون ۲۴ ساعت کم میشه ؛).

اما چند نکته در مورد یادگرفتن جنگو:

به نظرم به این ترتیب سراغ یادگرفتن جنگو با هدف توسعه وبسایت بروید البته ترتیب خیلی دقیقی نیست و ممکن است یکی را زودتر از دیگری یا همزمان با بعدی لازم داشته باشید:

  • آشنایی با پایتون در حد دانستن OOP
  • مطالعه تمرین اولیه جنگو در خود وبسایت جنگو
  • آشنایی با Bootstrap، java script، CSS، HTML مثلا از اینجا
  • مطالعه کتاب جنگو ۲ به کمک مثال (Django 2.0 by example ) از انتشارات Packt
  • مطالعه و رجوع به مستندات جنگو
  • انتخاب یک موضوع واقعی و طراحی و ساخت یک پروژه شخصی

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

در یوتیوب آموزشهای انگلیسی خوبی هست اما اکثرا با جنگو ۱٫۸ یا ۱٫۹ نوشته شده اند.

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

در ضمن می توانید با بخشی از جامعه داخلی جنگو مثلا در این گروه یا جامعه کاربران جهانی جنگو نیز در ارتباط باشید.

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

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

اعترافات یک طراح!

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

تنبلی

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

نداشتن حس همدلی

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

اجتناب از مکالمه‌های سخت

مکالمه‌های سخت، سخت هستن! من باید یاد بگیرم اون مکالمه‌ها رو انجام بدم. حتی اگر برام سخت هستن و باعث ناراحتیم می‌شن.

شنیدن، بدون گوش کردن

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

کمبود اعتماد به نفس

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

خودمحور بودن

تصور اینکه همه کاربرها مثل من فکر می‌کنند اشتباهه. باید این حس بی‌تفاوتیم رو از بین ببرم.

نداشتن توانایی “نه” گفتن

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

من همیشه قدردان افرادی که به من اعتماد می‌کنن و من رو در کارهاشون شریک می‌کنن هستم و این موضوع رو دوست دارم. اما باید یاد بگیرم زمانی که نمی‌تونم به اون‌ها کمک کنم یا نیاز‌های اون‌ها در اولویتی بالاتر از مراقبت از خودم قرار می‌گیره بهشون نه بگم.

ناتوانی در جدا شدن از کار

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

بی‌توجه و آزادهنده بودن

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

انجام کارها در لحظه آخر

ممکنه که فکر کنید که کار کردن تحت فشار باعث بهتر انجام شدن کار می‌شه. بعضی وقت‌ها این عقیده درسته. اما بهترین راه برای انجام کارها نیست. باید برای بهبود عادت به تعویق انداختن کارهام فکری کنم.

صبور نبودن

برای صبور بودن باید اعتماد به نفس داشته باشی. باید روی نیازم به تایید شدن کار کنم و اون رو از بین ببرم.

تنهایی رو ترجیح دادن

از راه دور کار کردن و کل روز خونه موندن احساس امنیت بیشتری داره. باید ترسم از بیرون رفتن رو کنار بزارم و گاهی از خونه بیرون برم، قدم بزنم و …

اجازه دادن به اینکه افکار منفی چیره بشن

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

نوشتن این مطلب تلاشی بود برای اینکه بتونم با شیطان درونم کنار بیام.

اگر شما هم این نشونه ها رو دارید، خوشبختانه این عکس‌ها میتونه به شما کمک کنه که کمتر احساس تنهایی کنید.

همچنین امیدوارم این اعتراف من باعث اخراجم نشه.

شما چه عادت‌هایی دارین؟ در حال حاضر روی تغییر چه عادت‌هایی کار می‌کنید؟

نوشته اعترافات یک طراح! اولین بار در وبلاگ پارسکدرز پدیدار شد.

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

آرامبخش موقتی در یادگیری ماشین

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

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

برای فهم دقیق Over fitting از مقادیر مختلف برای تعداد همسایه ها در یادگیری مدل استفاده شده است که مرحله به مرحله با مشاهده ی مراحل کد نویسی شاهد توضیحات هر قسمت از کد خواهید بود:

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

۱- فراخوانی پکیج های مورد نیاز:

برای انجام این پروژه از پکیج اصلی sklearn و چند پکیج دیگر استفاده شده است.

۲- گرفتن داده ها از data set:

برای این پروژه از یک data set آماده که نمایانگر احتمال ابتلای مردم هند به بیماری دیابت است، استفاده شده است که دارای ۸ ستون ویژگی های بررسی شده و یک ستون نتایج ، متشکل از اعداد ۰ و ۱ است.

۳- اصلاح داده ها:

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

۴- جداسازی داده ها:

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

۵- تشکیل حلقه نتایج:

در این قسمت با استفاده از حلقه for مدل را برای مقادیر مختلف همسایه های نزدیک به دست آورده و داخل یک آرایه ذخیره کردم تا برای نمایش روی نمودار از آنها استفاده کنم البته در هر مرحله یک بار روی داده های train و یک بار روی داده های test پیاده سازی کردم.

۶- رسم نمودار و نمایش نتایج:

نتیجه گیری:

همانطور که در نمودار بالا مشاهده می شود هر چقدر تعداد همسایه های نزدیک کمتر می شود صحت مدل برای داده های train بیشتر می شود چرا که مدل روی داده های fit ،train شده پس زمانیکه تعداد همسایه ها را برابر ۱ قرار می دهیم دقیقا داده مورد استفاده در پیاده سازی را یافته و صحت ۱۰۰% را به ما نشان می دهد و به همین روال با افزایش تعداد همسایه ها دقت تصمیم گیری کاهش می یابد.

و در ادامه مشاهده می کنید که در داده های test و هر داده اتفاقی دیگر نمودار سیر کلی برعکس را پیش می گیرد و در حالتی که تعداد همسایه ها به کمترین حالت خود رسیده صحت نتایج نیز به کمترین مقدار خود می رسد چراکه در این حالت یادگیری دچار Overfitting شده است و همانطور که مشاهده میشود بهترین حالت در n_neighbor=25 یا به صورت متعادل تر در n_neighbor=16 اتفاق میافتد

نوشته آرامبخش موقتی در یادگیری ماشین اولین بار در ویرگول پدیدار شد.

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

ده نکته طلایی برای سئو سایت خودتان و رسیدن به رتبه اول گوگل

امروزه نقش گوگل در رشد کسب و کار های آنلاین بر کسی پوشیده نیست. تاثیری که گوگل بر دیده شدن شما و جذب مخاطبان حقیقی می گذارد قابل مقایسه با هیچ کانال ورودی دیگری نیست. از این رو توجه به سئو و بهینه سازی سایت برای کسب رتبه های بالاتر گوگل به اولویت اصلی وب مستران مبدل شده است.
اما چه معیار هایی برای سئو حقیقی وجود دارند؟ و چطور می توانیم از دید گوگل انتخاب شایسته تری نسبت به رقبا باشیم؟
 همراه وبلاگ وبزی و با طرح راهکار های طلایی به این سوالات پاسخ خواهیم داد. 

یک – از کلمات ترکیبی استفاده کنید!

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

دو – از دامنه مناسب استفاده کنید.

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

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

سه – مخاطب موبایل را خیلی جدی بگیرید!

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

چهار – از تیتر و توضیحات صحیح و کاربردی استفاده کنید.

عنوان هایی که برای صفحه نخست سایت و دیگر صفحات آن انتخاب می کنید با ارزش ترین فاکتور سئو هستند. دو قسمت مهمی که گوگل توجه زیادی به آنها دارد، تیتر (Title) و توضیحات (Descriptions) هر صفحه از سایت هستند. تیتر در دو یا چند کلمه به کاربر می گوید محتوای این صفحه درباره‌ی چیست و توضیحات اطلاعات بیشتری درباره آن صفحه را می گوید.

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

پنج – به سئو محلی هم فکر کنید.

درست است که اینترنت شما از محدودیت های مکانی رهایی می بخشد، اما اگر صاحب کسب و کار فیزیکی هستید می توانید بسته به مکان و گستردگی طیف خدمات تان، هدف گذاری روی کاربران محلی نیز انجام دهید. برای مثال شما کسب و کاری در شرق تهران راه اندازی کرده اید. پروسه خرید، ارائه خدمت تان  یا هر چیز که به اصطلاح هدف (Goal) شما از راه اندازی سایت است؛ به نحوی ساکنان در آن منطقه را در برمی‌گیرد. در این شرایط رقابت روی ترکیب هایی با عبارت “شرق تهران” یا نام منطقه مورد نظر  به مراتب ساده تر از رقابت بر سر عبارات کلی و سراسری می باشد که در طول روز در گوگل یا هر موتور جست و جوی دیگر جستجو می شود.

شش – ساختار مناسبی برای سایت تان طراحی کنید.

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

از طرفی دیگر در ساختار سایت خودتان نباید اهمیت تگها Heading مثل H1 و H2 را نادیده بگیرید. خوشبختانه در سایت ساز وبزی شما به راحتی می توانید ساختار سایت خودتان را به بهترین شکل تنظیم نمایید. 

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

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

هفت – برای تصاویر توضیحات اضافه کنید.

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

هشت – محتوای ارزشمند بنویسید.

شاید اگر مجبور بودیم تنها یک نکته برای رسیدن به سئوی طلایی به شما بگوییم: محتوای ارزشمند بنویسید!

بنا به شعار معروف گوگل برای اهمیت بخشیدن به ارزش این نکته «محتوا پادشاه است!»
 محتوا معیار اصلی برای رتبه بندی سایت ها توسط گوگل محسوب می شود. اما نکته اصلی اینجاست، چه محتوایی؟ 
سه پیشنهاد گوگل برای نوشتن یک مطلب استاندارد عبارتند از:
۱. منحصر به فرد باش.
۲. بروز باش.
۳. ارزشمند باش.
فضای وب سرشار از محتوا های رنگارنگ در بینهایت موضوع و دسته بندی است، پیش از شما قطعا افرادی با پرداخت به موضوعات از دیدگاه های گوناگون و ارائه های مختلف، به تولید و انتشار مطالب مشغول بودند. نکته اول به شما گوشزد می کند که خودتان تولید کننده باشید! نوشته های کپی شده نه تنها ارزشی برای گوگل ندارند بلکه باعث تنزل رتبه شما خواهند شد. با استفاده کردن از این دست مطالب حتی خطر اخراج از گوگل را هم برای خودتان متصور شوید! زیرا هیچکس احتیاجی به مطالب تکراری و کپی های ناشیانه ندارد.  از این رو تمام تمرکز تان را روی تولید محتوا بگذارید.
همیشه به روز باشید و مطالب تازه اضافه کنید. این توصیه دوم گوگل به شماست. سعی داشته باشید بروزرسانی ها را در زمان های معین انجام دهید.
محتواهایی تهیه کنید که کاربران فقط در وب سایت شما بتوانند پیدا کنند. این به شما ارزش می بخشد. همان چیزی که گوگل در توصیه سوم به دنبال آن است.

نه – بک لینک بگیرید!

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

بک لینک یعنی پیشنهاد سایت شما توسط  یک سایت دیگر. بک لینک مانند یک امتیاز مثبت به سایت شما است . وقتی سایتی شما را به هر عنوانی لینک می کند، درحقیقت یک امتیاز مثبت به سایت شما برای بالا آمدن سایت شما در گوگل در “عنوان” انتخاب شده، می باشد. تصور کنید مهارت های زیادی در یک حوزه مشخص دارید، برای معرفی و تبلیغ کارتان می توانید شخصا به تعریف و تمجید بپردازید و یا توسط اشخاص دیگری معرفی شوید؟ به نظر شما کدام یک بازدهی بیشتری خواهد داشت؟ 
قطعا وقتی توسط شخص یا شرکت دومی معرفی می شوید اعتماد بیشتری جذب خواهید کرد. این موضوع  در زندگی رومره کاملا عادی است،  باید بگوییم در بحث سئو نیز ساز و کارهای مشابه ای وجود دارد که بک لینک ها بازیگران اصلی آن هستند.
نکته دومی که در این بخش اشاره خواهیم کرد درباره اهمیت شبکه های اجتماعی در فرآیند لینک سازی است. روزانه میلیون ها بازدید برای محتوا هایی که در این فضا تولید و منتشر می شوند، ثبت می شود که حجم کاربران بسیار عظیمی را تشکیل می دهد. در نتیجه سایت هایی مثل فیسبوک، اینستاگرام، توئیتر و … بستر مناسبی برای معرفی شما خواهند بود که علاوه بر دیده شدن توسط مخاطبان، می تواند مستقیما به صفحه ی اصلی سایت شما یا هر لندینگ پیج دیگری لینک شود و در سئو تاثیر گذار باشد.

ده – همین فرمان را ادامه بده.

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

ترافیک ورودی به وب سایت تان را ارزیابی کنید. کدام کانال ها بهترین عملکرد را برای شما به ارمغان آورده اند؟
چه بخشی هایی برای کاربران جذاب تر هستند؟ بازدید کدام بخش های سایت نسبت به دیگر قسمت ها بیشتر است و … آمار های نظیر آن. در ادامه باید با توجه به این آمار استراتژی های جدیدی آماده کنید. به عنوان در موضوعاتی که بازدید بیشتری دارید مقالات جدید در سایت قرار دهید.

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

منبع

نوشته ده نکته طلایی برای سئو سایت خودتان و رسیدن به رتبه اول گوگل اولین بار در ویرگول پدیدار شد.

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