63 | {% endif %}
64 |
65 | {% include footer.html %}
66 |
--------------------------------------------------------------------------------
/_posts/2015-01-08-ask-your-friends-what-you-should-do-with-your-life.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "برای کشف راه زندگی از دوستانتان سوال کنید"
3 | date: 2015-01-08
4 | description: در زندگی، گرفتن بعضی تصمیمات بسیار دشوار است
5 | author: dariubs
6 | disqus: true
7 | ---
8 |
9 | 
10 |
11 | در زندگی، گرفتن بعضی تصمیمات بسیار دشوار است. تصمیماتی مانند اینکه “میخواهید در زندگی خود چه کار کنید؟”.
12 |
13 | فراموش نکنید که شما با افرادی احاطه شده اید که تخصص شما، علایق و سلایق و ارزشی که برای دیگران دارید را خوب میشناسند.از آنها بپرسید که چه کاری بهتر است انجام دهید و چگونه ارزشمندتر می شوید؟ از آنها بخواهید که در کشف پاسخ این سوال ها راهنمایتان باشند.
14 |
15 | یکی از تمرینات سایت گامرُد این است که بر قدرت سوال “چرا” متمرکز شوید. ایده کاربسیار ساده است: اگر متوجه شوید ارزش ها و ویژگی های مثبت شما از نظردوستانتان چیست، میتوانید کشف کنید که چرا باید کسب و کارها از شما استفاده کنند. چون احتمالا در عرصه تجارت نیز همان ارزش هایی از شما دیده میشوند که دوستانتان در شما یافته اند.
16 |
17 | پس ابتدا لیستی از دوستان نزدیک خود را بنویسید.از آنها بپرسید چرا با شما دوستند و سپس جوابهایشان را مقایسه کنید.اگر هیچ ایده ای درمورد ارزشهای شخصی خود برای عرضه به دنیا ندارید، این یک تمرین خوب برای یافتن ارزش های شماست.
18 |
19 |
20 | [lifehacker](http://lifehacker.com/ask-your-friends-what-you-should-do-with-your-life-1678243045)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/_posts/2015-04-07-how-to-keep-pushing-towards-your-goals-when-you-feel-overwhelmed.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "وقتی سرتان شلوغ است چگونه به راهتان ادامه دهید"
3 | date: 2015-04-07
4 | description: نگران این که قدمتان چقدر کوچک است نباشید
5 | author: sajad
6 | disqus: true
7 | ---
8 |
9 | 
10 |
11 | جان با عجله از محل کارش خارج و ساعت شش و چهل دقیقه سوار اتومبیلش میشود. نفس نفس میزند همان طور که تمام روز نفس نفس میزد.
12 |
13 | به خاطر شغلش و کارهای طاقت فرسا سرش حسابی شلوغ است. باید خرید کند. باید ورزش کند. باید غذای خودش را بپزد و به سگش هم غذا دهد. باید روی پروژه جانبیاش کار کند. باید پستی برای وبلاگش بنویسد.
14 |
15 | باید های زیادی است، نه؟ از چه زمانی زندگی اینقدر پیچیده شده؟
16 |
17 | جان اتوموبیلش را از پارکینگ خارج و به سمت منزل حرکت میکند.
18 |
19 | امروز ۱۰ ساعت کار کرده و باید در خانه کارهای بیشتری هم انجام دهد. گرچه اهدافش یک ماهه هستند ولی خیلی دور به نظر میرسند.
20 |
21 | دلش میخواهد از کارش استعفا دهد، اما بعد چه؟ چگونه قرار است زندگی را بگذراند؟ با یک پروژه نرمافزاری؟ این پروژه باید پول زیادی تولید کند، ولی هیچ ایدهی پولسازی ندارد.
22 |
23 | با ماشینش از چراغهای سبز رد میشود. حداقل ترافیک سنگین نیست.
24 |
25 | جان راهی برای رسیدن به چیزهایی که میخواهد به ذهنش نمیرسد. ساعات روز به نظر کافی نیستند.
26 |
27 | کار [تیم فریس](http://en.wikipedia.org/wiki/Timothy_Ferriss) به نظر راحت میآمد.
28 |
29 | شاید اگر نمیخوابید زمان بیشتری داشت. اما همه مجبورهستند بخوابند، مگرنه؟ شاید نعمتی به بیل گیتس داده شده بود که بیدار بماند. اما متاسفانه جان، بیل گیتس نیست.
30 |
31 | میخواست در محل کار فردی باشد که همه رویش حساب باز میکنند. میخواست رابطهای با معنی داشته باشد. میخواست از حیوانات خانگیاش خوب مراقبت کند. میخواست پسر خوبی باشد و روابط خوبی با والدینش داشته باشد.
32 |
33 | چیزهای زیادی میخواست، چطور زندگی چنان پیچیده شد؟
34 |
35 | جان متعجب است که چرا برنامههای هفتگیاش کاملا پر است. او در بهترین زمان در تاریخ انسانها زندگی میکند و هنوز وقت خالی ندارد.
36 |
37 | او تنها کسی نیست که اینگونه است، همه همین طور هستند.
38 |
39 | او متعجب است که چگونه مردم بچه دار شدند و او هنوز به سختی زندگی خودش را پیش میبرد.
40 |
41 | جان به زندگی ۱۰۰۰۰ سال پیش فکر میکند، حتما زندگی درآن زمان راحت تر میبود. گرچه امروزی ها حتما مخالف اند، اما حداقل مرد غارنشین زمان خالی داشت.
42 |
43 | تنها چیزی که یک مرد غارنشین میتواند نگرانش باشد غذای کافی برای زنده ماندن است. یخچالی هم در کار نیست، پس نمیتواند برای آیندهاش برنامه ریزی کند. تنها نگرانی، یافتن غذا برای وعده بعدی است.
44 |
45 | باید خیلی خوب میبود، البته اگر ببر آنها را نمیخورد!
46 |
47 | اما جان نظرش را عوض کرد. وقتی غذای کافی داشته باشد، نگران این است که بیشترین غذا را در قبیله اش داشته باشد. اگر بیشترین غذای قبیله را میداشت، میتوانست باحال ترین غارنشین باشد و شانس بیشتری هم برای ازدواج می داشت.
48 |
49 | وقتی که صاحب همه غذاها بود … میتوانست خودش را کامل بداند.
50 |
51 | زندگی اش بالاخره میتوانست بامعنی باشد زیرا او مردی بود که تمام غذاها را در اختیار داشت. در آن صورت معنای زندگی بر این اساس تعیین میشد که هرکس چه مقدار غذا دارد.
52 |
53 | جان هنوز درحال فکر کردن بود که نوری از گوشه چشمش دید. او وسط یک چهارراه بود.
54 |
55 | بوم!
56 |
57 | صدای وحشتناک برخورد فلزی به فلز دیگر. بلندتر از صدای هر تصادفی که میتوانست تصور کند. بدنش به شدت به سمت راست پرتاب شد و سرش محکم به سمت چپ برگشت و یک میلگرد از کنار گوش راستش رد شد.
58 |
59 | و سپس همه چیز سیاه شد.
60 |
61 |
62 |
63 | چند دقیقه بعد با صدای آتشنشانی که از پشت شیشه ماشینش فریاد میزد بیدار شد.
64 |
65 | جان هنوز آنجا بود. گویا یک فورد اف-۱۵۰ چراق قرمز را رد کرده و ماشین او را در راه شخم زده بود.
66 |
67 | در حالی که آتشنشان او را از لاشه ماشین بیرون میآورد به این فکر میکرد که یک کار دیگر به لیستش اضافه کند «خرید یک ماشین جدید».
68 |
69 | وقتی از ماشین خارج شد حالش کاملا خوب بود و هیچ آسیبی ندیده بود. گرچه سردرد شدیدی داشت اما امدادگران که شرایط جسمانی اش را خوب تشخیص داده بودند او را راهی خانه کردند.
70 |
71 | دیگر بقیه شب کمی گنگ بود. اوراقچی ها در حال جمع کردن ماشین از محل حادثه بودند. او هرگز با راننده دیگر حرف نزد. پلیس هم کارهای بیمه را ردیف میکرد. او هم فقط به خروج از آن وضعیت فکر میکرد.
72 |
73 | قبل از این که جرثقیل ماشین را ببرد، متوجه میله فولادیای در بخش راننده شد و پیله ای که در بین آهن قراضه ها زنده مانده بود، در حالی که ماشین کاملا نابود شده بود.
74 |
75 | اگر آن میله چند سانتی متر آن طرف تر فرود می آمد …
76 |
77 | جان به خود لرزید و از تفکر دست کشید و پیاده به سمت خانه حرکت کرد. لااقل هوا سرد نبود.
78 |
79 | در راه به آسمان نگاه میکرد و زیبایی ستاره ها جان را غرق خود کرد. عادت داشت با سگش به پیاده روی برود اما مدت زیادی بود که وقت این کار را نداشت.
80 |
81 | هنوز در شک تصادف بود و ادرنالین در خونش پمپاژ میشد. نمیتوانست باور کند که چه پیش آمده . همه چیز خیلی سریع و غیر قابل پیشبینی بود. چند ساعت قبل ماشین سالمی داشت و الان پاره هایی از آهن. او تا به حال هیچ تصادفی را تجربه نکرده بود.
82 |
83 | وقتی به خانه رسید پای کامپیوترش نشست و از این که دیگر استرسی نداشت شگفتزده بود.
84 |
85 | شروع به نوشتن مطلبی در وبلاگش کرد. نوشتن، بیشتر از دیدن تلویزیون یا بازی با کامپیوتر آدم را سر حال میآورد. گرچه کار سختیست ولی ارزشمند است. تولید به جای مصرف عالیست.
86 |
87 | او بخشی از وجود خودش را در پرونده میگذارد. بخشی از خلاقیتش با صفر و یک در جهان ذخیره شده است.
88 |
89 | هیچ آینده و گذشته ای نیست. فقط حال و فقط نوشتن.
90 |
91 | بدون هیچ نگرانی.
92 |
93 | بدون هیچ نگرانی از این که آیا وبلاگش مشهور است یا نه.
94 |
95 | بدون نگرانی از این که آیا از کارش استعفا میدهد یا نه.
96 |
97 | بدون نگرانی از اهداف.
98 |
99 | فقط کلید ها را پشت سر هم فشار میداد.
100 |
101 | وقتی که یک پست را تمام میکند احساس شگفت انگیزی دارد. قدمش را برداشته. نقشی که برای امروز تعیین کرده بود انجام داده. یک قدم به جلو، به سمت جایی که میخواهد باشد.
102 |
103 | قدم برداشتن مهمترین کاری است که میتوان انجام داد. مهم نیست که آن قدم چقدر بزرگ است یا آیا نتیجه میدهد یا نه.
104 |
105 | قدمی برمیدارد و این تنها کاری است که میتواند انجام دهد. این تنها جایی است که تحت کنترل اوست.
106 |
107 | در واقع زندگی خیلی ساده به نظر میرسد.
108 |
109 | نمیتوانست باور کند که چقدر زندگی را سخت گرفته بود.
110 |
111 |
112 |
113 | اگر احساس میکنید سرتان خیلی شلوغ است، روی چیزی که در همین لحظه روبهروی شماست تمرکز کنید. به فردا یا هفته بعد فکر نکنید.
114 |
115 | به قدمی که امروز رو به جلو میتوانید بردارید فکر کنید.
116 |
117 | هر عملی که میتوانید انجام دهید را انجام دهید، هرجایی که هستید و با هر چیزی که در اختیار دارید
118 |
119 | نگران این که قدمتان چقدر کوچک است نباشید. نگران این که آیا حتما به اهدفتان میرسید نباشید.
120 |
121 | تا وقتی که میتوانید عملی انجام دهید، کارها خود به خود انجام میشوند.
122 |
123 | به یاد داشته باشید تا وقتی که میتوانید قدمی بردارید مهم نیست چه قدمی برمیدارید.
124 |
125 | –[متن اصلی](http://thinkfaster.co/2015/02/how-to-keep-pushing-towards-your-goals-when-you-feel-overwhelmed)
126 |
--------------------------------------------------------------------------------
/_posts/2015-04-19-6-tips-for-writing-better-code.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "۶ گام برای نوشتن کدهایی بهتر"
3 | date: 2015-04-19
4 | description: "روش های برای کنترل کیفیت و انسجام کدها"
5 | author: dariubs
6 | disqus: true
7 | ---
8 |
9 | 
10 |
11 |
12 | در هر هفته کاری از من اینطور انتظار می رود که حداقل چندصد خط کد با حدودا چهار زبان مختلف بنویسم. در کدهای نوشته شده توسط سایر همکاران نیز از من انتظار مشارکت و ویرایش میرود.
13 |
14 | در حالت کلی، کدهای زیادی در اطراف من یافت میشوند و همه چیز میتواند بسیار پیچیده باشد به خصوص اگر آن ها بخوبی مدیریت و مرتب نشوند و اینکه خوب نیز نوشته نشده باشند. اجازه دهید نگاهی داشته باشیم به چند روش که درحالت کلی کیفیت کدهای ما را افزایش میدهد.
15 |
16 | > نویسنده اصلی این نوشته را با تمرکز روی [توسعه دهندگان فرانتاند](http://en.wikipedia.org/wiki/Front_end_development) وب نوشته و مطالب ممکن است برای سایر توسعه دهنده ها قدری نامفهوم باشد.
17 |
18 | ## **۱. شروع کنید به ساختن ماژول ها**
19 |
20 | یکی از بهترین راه ها برای افزایش سازگاری و قابلیت استفاده مجدد و مرتب نگه داشتن کدها، گروه بندی توانایی های مرتبط باهم در دستهبندی های مشخص است. برای مثال فرض کنید بجای آنکه تمام کدهای جاوا اسکریپت خود را در فایل main.js بنویسید، کدها را در فایل ها و گروه های مختلف بر اساس کاربرد آنها قرار دهید و سپس آنها را در مرحله ساخت باهم ترکیب کنید. البته که این تمام مفهوم ماژولاریتی نیست. البته میتوانید هرچیز دیگری جز جاوا اسرکریپت را هم ماژولار بنویسید.
21 |
22 | پیش پردازنده های css، مانند [sass](http://sass-lang.com) امکان نوشتن استایلها در فایلهایی جدا و سپس ترکیب آنها در فایل اصلی و کامپایل آن به css را در اختیار شما قرار میدهند. این قابلیت اجازه میدهد که برای بخشهای مختلف، مانند دکمه ها، لیست ها و فونتها در فایل های css مجزا استایل بنویسید. در پایان همه آنها به فایل اصلی اضافه میشوند و نگهداری این کدها هم بسیار آسانتر میشود.
23 |
24 | تکنولوژی های جدید مانند [Polymer](https://www.polymer-project.org) نیز امکان نوشتن المان های شخصی شده HTML را میدهند.
25 |
26 | پس HTML، فایل های CSS و جاوا اسکریپت میتوانند در کامپوننتت های جدا از هم بر اساس کاربرد خود دسته بندی شوند.
27 |
28 | برد فراست یک مرور عالی بر ایده ها و روش شناسی های نوشتن برنامه های ماژولار دارد. [بیشتر بخوانید …](http://bradfrostweb.com/blog/post/atomic-web-design/)
29 |
30 | ## **۲. از پیش پردازنده ها استفاده کنید**
31 |
32 | کار پیش پردازنده ها صرفا کمک به برنامه نویسی ماژولار نیست، آن ها کاربردهای بسیار بیشتری دارند!
33 |
34 | پیش پردازنده ها قابلیت های بسیار زیادی به کدهای شما میبخشند درحالی که خروجی کدشان همان خروجی مورد انتظار مرورگرها است. گرچه معمولا زمان بیشتری برای نصب نیاز دارند اما پیش پردازنده ها برای راحتی کار شما ساخته شده اند.
35 |
36 | پیش پردازنده ها با حذف کدهای تکراری زمان کد نویسی را کاهش میدهند و همچنین دارای قابلیت های مفیدی مانند متغیرها، توابع، حلقه ها و سینتکس ساده هستند. بیشتر پیش پردازندهها قابلیت شخصی سازی بالایی دارند. بسیاری از آنها گزینه هایی را برای تنظیمات خروجی دلخواه، استفاده از پلاگین ها، افزونه ها و همچنین هشدارهای شخصی شده در جاهای لازم در اختیار شما میگذارند.
37 |
38 | پیش پردازنده های معروف جامعه کاربران بزرگی دارند که مشکلات، خطاها و باگها را به سرعت حل میکنند و پاسخ به مشکلات هم در آنها سریع انجام میگیرد.
39 |
40 | برای شروع کار با پیشپردازندههای معروف CSS، HTML و جاوا اسکریپت از این لینک ها استفاده کنید : [Sass](http://sass-lang.com/) ، [Haml](http://edrock.blog.ir/post/HAML-TUTORIAL) و [کافیاسکریپت](http://coffeescript.org/)
41 |
42 | اجباری در استفاده از پیش پردازنده ها نیست اما انها میتوانند در نوشتن کدهای بهتر به شما کمک کنند.
43 |
44 | ## **۳. قبل از نوشتن برنامه ریزی کنید**
45 |
46 | آخرین باری که وقت گذاشتید و مسیر رسیدن به اهداف پروژه را روی کاغذ نوشتید دقیقا کی بود؟ از چه فریم ورک هایی میخواستید استفاده کنید؟ چه مرورگرهایی قرار بود پشتیبانی شوند؟ آیا به استفاده از یک تسک راننر در روند پروژه اندیشیده بودید؟ انجام پروژه ای که پیش از شروع، برنامه ریزی شده باشد بسیار راحتتر از این است که میانه راه متوجه شوید کاری را انجام نداده اید و تمام پروژه را به عقب برگردانید و دوباره بنویسید.
47 |
48 | [North](https://github.com/north/north) مجموعهای از راهنماهاست که در برنامه ریزی پروژه به شما کمک میکند. نورث در یک سند طولانی و جامع بیان میکند: فقط نباید روی کدنویسی تمرکز شود بلکه فاکتورهای زیادی را باید از شروع پروژه وبسایت در نظر گرفت.
49 |
50 | تصمیم گیری برای انتخاب ابزارها و کتابخانه های مناسب یک تصمیم چالش بر انگیز است. زیرا که ابزارها و کتابخانه های جدید هر روز بیشتر میشوند. برای همین [لیستی تدارک دیدهام](https://github.com/tevko/Resources) که به شما کمک میکند بهترین و مناسب ترین ابزارهای کارتان را انتخاب کنید، پس وقتی برای پروژه بعدی خود برنامه ریزی میکنید با خیال راحت از آن استفاده کنید.
51 |
52 | ## **۴. از ابزارهای کنترل نسخه استفاده کنید**
53 |
54 | ابزارهای کنترل نسخه سیستم هایی هستند که تغییرات فایل یا مجموعه ای از فایل ها را بررسی میکنند، اجازه مشارکت چندین کاربر را میدهند، تغییرات را ذخیره میکنند و از Asset های شما میزبانی میکنند .سرویس های زیادی هستند که ابزارهای کنترل نسخه را ارائه میدهند مانند [بیتباکت](http://bitbucket.org) و [گیتهاب](http://github.com). من خودم به گیتهاب علاقه دارم به این دلیل که کدنویسی اجتماعی را رواج میدهد. به این معنی که افراد میتوانند کدهای خو را روی گیتهاب منتشر کنند و کدهای دیگران را نیز بهبود دهند و از آنها یاد بگیرند.
55 |
56 | کنترل نسخه ممکن است کمی پیچیده بنظر برسد، اما آموزش های بسیاری برای شروع کار با آنها در اینترنت موجود است. [بیشتر بخوانید..](http://git.coderz.ir)
57 |
58 | یک توصیه : از خط فرمان استفاده کنید. خط فرمان ممکن است رابط ترسناکی داشته باشد اما شروع کار با آن میتواند درک شما از برنامه نویسی را بهبود بخشد و همچنین از طرفی ابزارهایی مانند گرانت را تنها در خط فرمان میتوانید اجرا کنید.
59 |
60 | ## **۵. بررسی کدها**
61 |
62 | بررسی کدها در یک تیم بسیار آسان است اما به این معنی نیست که به تنهایی نمیشود انجامش داد. ایده بررسی کد این است که کدهایی را که نوشته اید با عده ای از همسالان (هم سطحان) خود مرور کنید که شما میتوانید تشریح کنید که کدتان چه کار میکند، یاد بگیرید چگونه بهتر بنویسید و همچنین به دیگران تکنولوژی های مورد استفاده خود را اموزش دهید.
63 |
64 | بهتر است این کار را بصورت هفتگی انجام دهید با هدف اینکه کدنویسی خود را بهبود بخشید.
65 |
66 | اگر شما عضو یک تیم نیستید یا خیلی درونگرا هستید، [JSLint](http://www.jslint.com) و [SCSSLint](https://github.com/brigade/scss-lint) میتوانند برای شما مفید باشند. این ابزارها کدهایتان را به دنبال خطاها چک میکنند و همزمان آنها ر اشسته و رفته نگه میدارند. هیچ ارتباط انسانی هم نیاز نخواهید داشت!
67 |
68 | ## **۶. در چالش های کدنویسی شرکت کنید**
69 |
70 | خودسنجی های فراوانی در سراسر اینترنت برای توسعه دهنده ها ایجاد شده که باعث میشود نگاه بهتری به زبانی که با آن هرروز برنامه مینویسند داشته باشند. بسیاری ازین وبسایت ها جامعه بزرگی از کاربران هستند که به یکدیگر در موقع لزوم کمک میکنند پس نگران در راه ماندن و ناتوانی در ادامه چالش ها نباشید.
71 |
72 | [کدوارز](http://www.codewars.com/) برای تقویت جاوااسکریپت شما عالیست و [The Practise App](https://tevko.github.io/practice) به شما چالش های تصادفی معرفی میکند که روی کدپن بسازید.
73 |
74 | ## **خلاصه**
75 |
76 | تداوم در اجرای روش های یاد شده در متن، روی توسعه و تقویت اجرای پروژه ها در شما بسیار مفید واقع خواهد شد پس اگر این هدف شماست، کمی برای آن ها وقت بگذارید.
77 |
78 | منبع : [SitePoint](http://www.sitepoint.com/6-tips-for-writing-better-code/)
79 |
80 |
81 |
--------------------------------------------------------------------------------
/_posts/2015-11-12-flask-intro.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "میکروفریمورک فلسک - معرفی"
3 | date: 2015-11-12
4 | description: آشنایی با میکروفریمورک فلسک و امکانات آن
5 | author: dariubs
6 | disqus: true
7 | ---
8 | 
9 |
10 |
11 | [فلسک](http://flask.pocoo.org) یک [فریمورک وب](https://fa.wikipedia.org/wiki/%DA%86%D8%A7%D8%B1%DA%86%D9%88%D8%A8_%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A7%D8%B1%DB%8C_%D8%AA%D8%AD%D8%AA_%D9%88%D8%A8) مبتنی بر [پایتون](http://python.coderz.ir/) است که توسط [آرمینروناچر](http://lucumr.pocoo.org) یکی از معروفترین توسعهدهندگان پایتون نوشتهشده است. ایدهی فلسک بسیار شبیه برادرش [سیناترا](http://www.sinatrarb.com/) است که در برای روبی طراحی شده است. در طراحی فلسک امکانات پایهی مینیمال برپایهی استانداردهای پایتون قرار داده شده و تلاش برای سادهنگه داشتن و کوچکی فریمورک و قائل نشدن بسیاری از پیشفرض ها برای برنامهنویسان دلیلیاست که این بستهنرم افزار را یک میکروفریمورک مینامند. فلسک با [مجوز آزاد BSD ](https://fa.wikipedia.org/wiki/%D9%BE%D8%B1%D9%88%D8%A7%D9%86%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C_%D8%A8%DB%8C%E2%80%8C%D8%A7%D8%B3%E2%80%8C%D8%AF%DB%8C) منتشر شده است.
12 |
13 | مثال خوبی از سرویسهای اینترنتی که از فلسک استفاده میکنند [پینترست](https://www.pinterest.com/) است. هماکنون شرکتهای بزرگی چون linkedin نیز در پروداکشن خود از فلسک استفاده میکنند که بیانگر مناسب بودن فلسک برای توسعهی سرویسهای اینترنتی است.
14 |
15 | اگر با زبان پایتون آشنا باشید با دیدن اولین کدهای فلسک با ساختار این فریمورک آشنا میشوید. فریمورک فلسک با همهی سادگی خود بسیار قدرتمند و کاراست و به هیچ عنوان کوچک بودن فریمورک را نمیتوان با ضعیف بودن آن برابر دانست و امکانات فریمورکهایی مثل جنگو و ریلز را با اندکی جستوجو به دست میدهد.
16 |
17 | در طراحی این فریمورک دو کتابخانهی اساسی پایههای قدرتمند فلسک را ساختهاند. به عنوان واسط وبسرور ([ WSGI ](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface)) از کتابخانه ی [ werkzeug ](http://werkzeug.pocoo.org/) و برای تمپلیتانجین از[ Jinja2 ](http://jinja.pocoo.org) استفاده کرده اند که هردو کتابخانه توسط تیم توسعه ی فلسک توسعه یافته شده است.
18 |
19 | بطور پیشفرض برای کار با دیتابیسها، اعتبارسنجی فرم ها و کاربران و از این دست کارها ابزار مشخصی در فلسک تعریف نشده است و میتوانید به انتخاب خود با ابزارهایی که احساس راحتی بیشتری میکنید کار کنید.
20 |
21 | # نصب فلسک
22 |
23 | معقولترین راه نصب فلسک و راهاندازی پروژههای فلسکی ساخت یک محیط توسعه مجازی است. محیطهای توسعهمجازی یک کپی از مفسر پایتون را بصورت خصوصی در دایرکتوری پروژه شما ایجاد میکند و بعد از فعال کردن این مفسر پکیجها هم بصورت خصوصی در دایرکتوری پروژه نصب میشوند. با این روش مفسر عمومی و پکیجهای عمومی سیستم دچار تغییر و کانفلیکت نمیشوند. [درمورد Virtualenv بیشتر بخوانید...](http://python.coderz.ir/lessons/l03.html#id9)
24 |
25 | با دستور زیر بررسی کنید که virtualenv روی سیستم شما نصب شده باشد :
26 |
27 | ```
28 | virtualenv --version
29 | ```
30 | برای ساخت یک محیط توسعه مجازی با virtualenv دستور زیر را بکار ببرید. بجای envdir میتوانید هرنامی را استفاده کنید که فایلهای ساخته شده توسط virtualenv در آن قرار بگیرند :
31 |
32 | ```
33 | virtualenv envdir
34 | ```
35 |
36 | و پس از نصب باید هربار که پروژه را اجرا میکنید مفسر خصوصی نصب شده با virtualenv را فعال کنید.
37 |
38 | در لینوکس دستور زیر :
39 |
40 | ```
41 | source envdir/bin/activate
42 | ```
43 | و در ویندوز دستور زیر :
44 |
45 | ```
46 | envdir\Scripts\activate
47 | ```
48 |
49 | این مفسر را فعال میکند.
50 |
51 | اگر مراحل را درست طی کرده باشید حالا نوبت نصب بسته ی فلسک است. متداول ترین روش نصب بستههای پایتون استفاده از مدیر بسته ی pip است که در آن فلسک با دستور زیر نصب میشود :
52 |
53 | ```
54 | pip install flask
55 | ```
56 |
57 | برای بررسی صحت نصب فلسک مفسر پایتون را بصورت تعاملی در ترمینال باز کنید ( تنها دستور python را اینتر کنید ) و بستهی فلسک را با دستور زیر فراخوانی کنید :
58 |
59 | ```python
60 | import flask
61 | ```
62 |
63 | اگر خطایی رخ نداد فلسک درست نصب شده است.
64 |
65 |
66 | # ساختار برنامهها در فلسک
67 |
68 | فلسک هیچ محدودیتی درمورد ساختاربندی فایلهای پروژه برای شما ایجاد نمیکند و میتوانید ساختار خودتان را داشته باشید یا از رولهای متداول جامعه ی فلسک استفاده کنید.
69 |
70 | در این راهنما یک فایل با نام app.py در دایرکتوری پروژه میسازیم و کدها و مثالها را در آن به شما نشان میدهیم.
71 |
72 | # ساخت برنامه های فلسک
73 |
74 | کدهای یک اپلیکیشن سادهی فلسک که عبارت `Hello World` را در یک صفحه ی وب نمایان میکند بصورت زیر است :
75 |
76 |
77 | ```python
78 | from flask import Flask
79 | app = Flask(__name__)
80 |
81 | @app.route('/')
82 | def hello_world():
83 | return 'Hello World!'
84 |
85 | if __name__ == '__main__':
86 | app.run()
87 | ```
88 |
89 | این برنامه از چند بخش تشکیل شده است : فراخوانی و تعریف فلسک ، تعریف مسیرها، اجرای فلسک.
90 |
91 | برای ساخت برنامههای فلسک نیاز است ابتدا فلسک را در فایل .py خود لود کنید و سپس یک اینستس از Flask بسازید یعنی این بخش :
92 |
93 | ```python
94 | from flask import Flask
95 | app = Flask(__name__)
96 | ```
97 |
98 | تنها آرگومان مورد نیاز برای کانستراکتور فلسک نام ماژول یا پکیج main است که برای بیشتر برنامه ها ` __name___` در پایتون مقدار درستی است.
99 |
100 | میتوانیم بجای نام اینستنس فلسک ( در مثال بالا app ) هر نام متغیر معتبری استفاده کنیم.
101 |
102 | بخش بعدی تعریف مسیرهاست. مسیرها همان آدرس های url مختلفی هستند که عملیاتهای متفاوت در آن ها انجام میشود مثلا `www.coderz.ir` مسیر ریشه و `www.coderz.ir/python` یک مسیر دیگر در همان سایت تعریف میکند. در کد مثال ما مسیر بصورت زیر تعریف شده بود :
103 |
104 | ```python
105 | @app.route('/')
106 | def hello_world():
107 | return 'Hello World!'
108 | ```
109 |
110 | که یک دکوریتور از app که در قسمت قبل ساختیم تعریف میکند به نام `route()` که آدرس مسیر (`'/'`) را به آن میفرستد. مسیرها در فلسک اساس ساخت برنامهها هستند. با استفاده از مسیرها میتوانید به سادگی بخشهای مختلف وباپلیکیشن خود را بسازید و مدیریت کنید.
111 |
112 | در قسمت آخر هم به پایتون میگوییم که فلسک را روی یک وبسرور اجرا کند که دستورات آن بصورت زیر است :
113 |
114 | ```python
115 | if __name__ == '__main__':
116 | app.run()
117 | ```
118 |
119 | این کد را در یک فایل مانند app.py ذخیره کرده و در خط فرمان با دستور `python app.py` اجرا کنید. خروجی روی ترمینال چیزی شبیه این است :
120 |
121 | ```
122 | * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
123 | ```
124 |
125 |
126 | که آدرس 127.0.0.1:5000 را که در خروجی مشخص شده است اگر در مرورگر خود امتحان کنید روی صفحه عبارت Hello World نمایان میشود :)
127 |
128 | # افرونهها
129 |
130 | فلسک یک فریمورک بسیار توسعه پذیر است و میتوانید بصورت ماژولار کدهای آن را تقسیم بندی و استفاده کنید. همچنین پلاگینهای بسیاری هماکنون برای آن نوشته شده است که میتوانید در صفحهی extension های فلسک تعدادی از بهترین افزونههای فلسک را بیابید و استفاده کنید.
131 |
132 |
133 |
134 | # مطالعه بیشتر
135 |
136 | * [صفحهخانگی فلسک](http://flask.pocoo.org/)
137 | * [مستندات رسمی فلسک](http://flask.pocoo.org/docs/)
138 | * [آموزش فلسک توسط میگل](http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world)
139 |
140 |
--------------------------------------------------------------------------------
/_posts/2015-5-24-install-oracle-java-jdk-on-ubuntu-linux.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "نصب جاوا اوراکل روی اوبونتو با فایل"
3 | date: 2015-05-14
4 | description: "نصب جاوا اوراکل روی سیستم عامل اوبونتو"
5 | author: sajad
6 | disqus: true
7 | ---
8 | 
9 |
10 | نصب جاوا اوراکل روی اوبونتو با فایل
11 |
12 | شاید برای افرادی که میخواهند برنامه نویسی را شروع کنند سیستم عامل لینوکس تا اندازه ای پیچیده به نظر برسد. اما استفاده از این سیستم عامل بین توسعه دهندگان جایگاه ویژه ای دارد.
13 |
14 | گرچه نصب اغلب نرم افزارها در لینوکس با یک دستور ساده انجام میشود، اما گاهی نیاز است تا قدری بیشتر با پیچ و خم ماجرا آشنا شویم. دراین مطلب چگونگی نصب جاوا با فایل فشرده ای که از وبسایت اوراکل دانلود شده است توضیح داده میشود.
15 |
16 | >این مطلب، نحوه نصب جاوا اوراکل ۸ (کیت توسعه جاوا) بر روی نسخه های ۳۲ بیتی و ۶۴ بیتی لینوکس اوبونتو را شامل میشود. البته این آموزش با لینوکس دبیان و لینوکس مینت نیز سازگار است.
17 |
18 | #۱ معماری لینوکس خود را بررسی کنید
19 |
20 | باید بررسی کنید که لینوکس شما ۳۲ بیتی است یا ۶۴ بیتی. برای این کار در ترمینال دستور زیر را وارد کنید
21 |
22 | **سیستم های جدید**
23 |
24 | ```
25 | file /lib/systemd/systemd
26 | ```
27 |
28 | **سیستمهای قدیمی تر**
29 |
30 | ```
31 |
32 | file /sbin/init
33 | ```
34 |
35 | در خروجی این دستور میتوانید معماری سیستم خود را بیابید
36 |
37 | #۲ بررسی کنید که آیا نسخهای از جاوا روی سیستم شما نصب است یا خیر
38 |
39 | دستور java -version در ترمینال این کار را برای شما انجام میدهد
40 |
41 | ```
42 | java -version
43 | ```
44 |
45 | اگر OpenJDK روی سیستم شما نصب باشد، خروجی مشابه زیر دریافت خواهید کرد
46 |
47 | ```
48 | java version "1.7.0_15"
49 | OpenJDK Runtime Environment (IcedTea6 1.10pre) (7b15~pre1-0lucid1)
50 | OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)
51 | ```
52 |
53 | برای نصب جاوا اوراکل در صورتی که روی سیستم عامل خود OpenJDK نصب دارید آن را پاک کنید
54 |
55 | #۳ OpenJDK را پاک و پوشهای برای جاوا اوراکل ایجاد کنید
56 |
57 | با این کار امکان هرگونه تضاد بین نسخههای جاوا که توسط سازندگان مختلف روی سیستم شما هست را از بین میبرید. برای حذف OpenJDK از دستور زیر در ترمینال اجرا کنید :
58 |
59 | ```
60 |
61 | sudo apt-get purge openjdk-\*
62 | ```
63 |
64 | پوشه مربوط به نسخه اوراکلی جاوا را با دستور زیر بسازید
65 |
66 | ```
67 |
68 | sudo mkdir -p /usr/local/java
69 | ```
70 |
71 | ( p برای این است که اگر پوشه فوق وجو داشت با ارور مواجه نشوید، همچنین اگر پوشههای پدر وجو نداشتند ساخته شود)
72 |
73 | #۴ آخرین نسخه JDK را از سایت اوراکل دانلود کنید
74 |
75 | نسخه متناسب با سیستم خود را که با پسوند tar.gz است را دانلود کنید. توجه داشته باشید که نسخه ۶۴ بیتی روی سیستم عامل ۳۲ بیتی اجرا نخواهد شد.
76 |
77 | البته سایت اوراکل برای کاربران ایرانی بسته است و برای دانلود باید از تحریم شکن استفاده کنید. البته میتوانید از لیچرها یا هر روش دیگری که میشناسید برای دانلود استفاده کنید.
78 |
79 | #۵ فایلی که دریافت کردهاید را به پوشه جاوا انتقال دهید
80 |
81 | فرض کنیم فایل شما در پوشه /home/“your_user_name”/Downloads قرار دارد و نام آن jdk-8u20-linux-i586.tar.gz برای سیستم ۳۲ بیتی و یا jdk-8u20-linux-x64.tar.gz برای سیستم ۶۴ بیتی است. (نام فایل دریافتی شما ممکن است متفاوت باشد. اما شباهتهایی با فایل های نام برده خواهد داشت)
82 |
83 | ابتدا به پوشه دانلود رفته
84 |
85 | ```
86 | cd /home/"your_user_name"/Downloads
87 | ```
88 |
89 | سپس فایل مورد نظر را به پوشه جاوا انتقال دهید
90 |
91 | ```
92 |
93 | sudo cp -r jdk-8u20-linux-i586.tar.gz /usr/local/java/
94 | ```
95 |
96 | ```
97 | sudo cp -r jdk-8u20-linux-x64.tar.gz /usr/local/java/
98 | ```
99 |
100 | و به پوشه جاوا بروید
101 |
102 | ```
103 | cd /usr/local/java
104 | ```
105 |
106 | #۶ فایل فشرده جاوا را باز کنید
107 |
108 | ```
109 |
110 | sudo tar xvzf jdk-8u20-linux-i586.tar.gz
111 | ```
112 |
113 | ```
114 | sudo tar xvzf jdk-8u20-linux-x64.tar.gz
115 | ```
116 |
117 | x برای اکسترکت کردن یا خارج کردن از آرشیو tar است.
118 |
119 | v برای ساکت نبودن عملیات است. یعنی تا حدودی پروسه اکسترکت را نشان میدهد.
120 |
121 | z برای استفاذه از الگوریتم gunzip قبل از اکسترکت است.
122 |
123 | f برای شناساندن فایل مورد نظر به tar میباشد. به طوری که نام فایلی که بعد از این دستور میآید به عنوان فایل ورودی خوانده میشود.
124 |
125 | #۷ بررسی کنید که فایل ها استخراج شده اند!
126 |
127 | باید پوشه jdk در پوشه فعلی وجود داشته باشد
128 |
129 | ```
130 | ls -a
131 | ```
132 |
133 | #۸ مسیر سیستمی java را تغییر دهید
134 |
135 | با یک ویرایشگر متن مانند nano یا gedit فایل etc/profile را به عنوان کاربر ریشه (root) باز کنید
136 |
137 | ```
138 | sudo nano /etc/profile
139 | ```
140 |
141 | و در صورتی که خطوط زیر در انتهای این فایل وجود ندارد، این خطوط را اضافه کنید. همچنین بررسی کنید که مسیرها متناسب با مسیرهای شما باشند
142 |
143 | ```
144 | JAVA_HOME=/usr/local/java/jdk1.8.0_20
145 | PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
146 | export JAVA_HOME
147 | export PATH
148 | ```
149 |
150 | سطر اول مسیر خانگی جاوا را مشخص میکند، دقت کنید که متناسب با نسخه دانلود شده شما باشد.
151 |
152 | سطر دوم متغیر PATH را تغییر میدهد و مسیر جاوا را به مسیرهای فایلهای اجرایی اضافه میکند
153 |
154 | export نیز این متغیرها را ثبت میکند
155 |
156 | پس از انجام تغییرات، فایل را ذخیره کرده و خارج شوید.
157 |
158 | #۹ به لینوکس اعلام کنید که فایلهای اجرایی جاوا کجا است
159 |
160 | با دستور update-alternatives باید به لینوکس اعلام کنید که دستور جدید java وجود دارد
161 |
162 | ```
163 | sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_20/bin/java" 1
164 | ```
165 |
166 | این دستور لینکی به نام java در مسیر usr/bin/java که به مسیر usr/local/java/jdk1.8.0_20/bin/java متصل است میسازد.
167 |
168 | برای javac و javaws نیز این کار را تکرار کنید
169 |
170 | ```
171 | sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_20/bin/javac" 1
172 | sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_20/bin/javaws" 1
173 | ```
174 |
175 | #۱۰ به لینوکس بگویید که جاوا اوراکل، جاوای پیشفرض سیستم باشد
176 |
177 | برای محیط اجرایی جاوا، کامپایلر جاوا و وب استارت دستورات زیر را اجرا کنید
178 |
179 | ```
180 | sudo update-alternatives --set java /usr/local/java/jdk1.8.0_20/bin/java
181 | sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_20/bin/javac
182 | sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_20/bin/javaws
183 | ```
184 |
185 | #۱۱ متغیر PATH را که تغییر داده بودیم به سیستم بار کنید
186 |
187 | البته این کار با خاموش/روشن کردن سیستم نیز انجام میشود. اما با استفاده از دستور زیر این کار را انجام دهید
188 |
189 | ```
190 | source /etc/profile
191 | ```
192 |
193 | دستور source محتویات فایلی که به آن داده شده است را اجرا میکند. میتوانید از نقطه (.) نیز به جای source میتوانید استفاده کنید
194 |
195 | #۱۲ صحت نصب جاوا را بررسی کنید
196 |
197 | میتوانید با اجرای دستور java -version نسخه جاوا و با دستور javac -version نسخه کامپایلر فعلی جاوا را بیابید.
198 |
199 | ```
200 | java -version
201 | java version "1.8.0_20"
202 | Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
203 | Java HotSpot(TM) Server VM (build 25.20-b23, mixed mode)
204 |
205 | javac -version
206 | javac 1.8.0_20
207 | ```
208 | #تبریک! جاوا نصب شده
209 | پیشنهاد شده بعد از نصب یک بار سیستم را خاموش و روشن کنید. (البته من ضرورتی ندیدم!)
210 |
211 | [متن اصلی](http://www.wikihow.com/Install-Oracle-Java-JDK-on-Ubuntu-Linux)
212 |
213 | ترجمه با اندکی دستکاری
214 |
--------------------------------------------------------------------------------
/_posts/2016-05-20-choose-android-programming-language.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "با چه زبانی برای اندروید برنامه بنویسم؟"
3 | date: 2016-05-20
4 | description: "مروری بر برنامه نویسی اندروید"
5 | author: sajad
6 | disqus: true
7 | ---
8 | با چه زبانی برای اندروید برنامه بنویسم؟
9 |
10 | شاید قبل از پاسخ دهی به این سوال بهتر باشه شما به سوال زیر پاسخ دهید:
11 |
12 | آیا میخواهید برنامه نویس اندروید شوید؟ یا میخواهید با چیزی که میدانید برای اندروید برنامه بنویسید؟
13 |
14 |
15 | ## **خودتان زبان مناسب را انتخاب کنید:**
16 |
17 | زبانی که گوگل (پشتیبان اصلی اندروید) برای برنامه نویسی این پلتفورم پیشنهاد میدهد **جاوا** است. اما با زبان های دیگر هم میتوان برای اندروید برنامه نویسی کرد. کوتلین، سی، سی پلاس پلاس، جاواسکریپت، پایتون، گو، روبی و...
18 |
19 | * اگر میخواهید **برنامه نویس اندروید** شوید ابتدا **جاوا** یا **کوتلین** و **گرووی** در مراحل بعد احتمالا نیازمند **سی** یا **سی پلاس پلاس** خواهید شد.
20 |
21 | * اما اگر میخواهید با چیزی که میدانید برای اندروید برنامه بنویسید دست به هر کاری که میتوانید بزنید.
22 |
23 | ### چرا؟
24 | یک برنامه نویس اندروید اولین کاری که میکند این است که باید با تیم های توسعه دهنده دیگر هماهنگ شود و اکثریت این تیمها جاوا را به عنوان زبان اصلی توسعه نرمافزارشان انتخاب میکنند. همچنین به علت پیشرفت هایی که اخیرا زبان کوتلین داشته مورد توجه تیمهای حرفهای قرار گرفته و شاید بتواند جایگزینی شایسته برای جاوا باشد.
25 |
26 | در توسعه اندروید به مشکلات و سوالاتی بر خواهید خورد که در اسناد و مثالهای گوگل، سوال و جوابهای استک اورفلو، آموزشهای پراکنده در وب و مثالها و کتابخانههای اختصاصی اندروید که در وبسایتهای اشتراک گذاری کد متن باز مثل گیتهاب هستند میتوانید جواب سوالتان را پیدا کنید. اما اکثریت اینها به زبان جاوا میباشند. همچنین به خاطر پشتیبانی صددرصد کوتلین از کتابخانههای جاوا و همچنین پشتیبانی و علاقه بهترین برنامهنویسان اندروید و پشتیبانی کامل آن در اندروید استودیو (ابزار توسعه نرم افزار اندروید)، کوتلین نیز انتخابی شایسته برای توسعه اندروید است.
27 | اگر شما به زبانی مثل پایتون علاقهمندید احتمالا به کوتلین نیز علاقهمند خواهید شد.
28 | [Kotlin](https://kotlinlang.org/)
29 |
30 | در کنار اینها زبان گرووی زبانی اسکریپتی است که به علت استفاده از آن در سیستم توسعه گردل (با شروع برنامه نویسی اندروید با این سیستم آشنا میشوید) ممکن است به آن نیاز پیدا کنید.
31 | [Groovy](http://www.groovy-lang.org/)
32 | [Geadle](http://gradle.org/)
33 |
34 | در نهایت برای توسعه برنامه های بومی اندروید (احتمالا برای دستیابی به سرعت اجرای بالاتر یا استفاده از کتابخانهای خاص) ممکن است به سی یا سی پلاس پلاس نیاز پیدا کنید.
35 | [Android NDK](http://developer.android.com/tools/sdk/ndk/index.html)
36 |
37 | بهترین دوست شما در این مسیر [خود سایت اندروید است](http://developer.android.com/index.html)
38 |
39 | ### من پایتون/روبی/جاواسکریپت و... میدانم. آیا نمیتوانم برای اندروید برنامه بنویسم؟
40 | چرا، میتوانید. اما باید خودتان راهش را پیدا کنید. البته از طرف علاقهمندان این زبان ها روشهایی معرفی شده و با دنبال کردن این روشها میتوانید به هدفتان برسید. برای نمونه شاید لینکهای زیر بتواند به شما برای شروع کمک کند
41 |
42 | [پایتون برای اندروید] (https://python-for-android.readthedocs.io/en/latest/)
43 |
44 | [ruboto روبی برای اندروید](http://ruboto.org/)
45 |
46 | [rubymotion روبی برای اندروید و آی او اس و مک او اس](http://www.rubymotion.com/)
47 |
48 | [REACT NATIVE برنامه های بومی اندروید و آی او اس با جاواسکریپت](http://www.reactnative.com/)
49 |
50 | [phonegap ](http://phonegap.com/) یا [cordova](https://cordova.apache.org/) استفاده از تکنولوژی های وب بین پلتفورم های مختلف
51 |
52 | [Swift توسعه اندروید با سویفت](https://github.com/apple/swift/blob/master/docs/Android.md)
53 |
54 | [Xamarin سی شارپ برای اندروید و آی او اس](https://www.xamarin.com/)
55 |
56 | [بیسیک برای اندروید] (https://www.b4x.com/b4a.html)
57 |
58 | و...
59 |
60 | اما همانطور که میبینید تمام اینها نیازمند یادگیری و خواندن مطالب اختصاصی توسعه برای اندروید یا به طور کلی موبایل هستند. پس انتظار حرفهای شدن در کوتاه مدت را نداشته باشید.
61 |
62 | در آخر این موضوع را در نظر داشته باشید که اندروید تنها موبایل و تبلت نیست. احتمالا در آینده نیاز پیدا میکنید برای تلویزیون، ساعت و اتوموبیل اندروید نیز برنامه بنویسید و با این پیشرفت سریع شاید دنبال کردن پیشنهادات گوگل بهتر باشد.
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/_posts/2016-12-02-gitbook.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "انتشار کتاب راهنمای گیت"
3 | date: 2016-12-02
4 | description: انتشار کتاب راهنمای فارسی گیت به زبان فارسی در کدرز
5 | author: dariubs
6 | disqus: true
7 | ---
8 |
9 | گیت یک سیستم مدیریت سورس کد است و عمدهی استفادهی آن امروز بین برنامهنویسان است، آنچنان که به یکی از ابزارها بسیار مهم برای این قشر از جامعه تبدیل شده است. امروز دیگر کمتر برنامهنویسی یافت میشود که لااقل روزی یک بار گذرش به یک مخزن گیت، یا پروژههایی که روی سرویسهایی همچون گیتهاب و گیتلب قرار دارند نخورد و پروژههایش را بدون ابزار مدیریت سورس کد مدیریت کند.
10 |
11 | همهی اینها باعث شد تا تصمیم بگیریم یک راهنمای کوچکِ گیت برای برنامهنویسان فارسی زبانی که هنوز درگیر دنیای استفاده از گیت نشدهاند، در کدرز آماده کنیم.
12 |
13 | اولین انتشار راهنما در آدرس [git.codecast.ir](http://git.codecast.ir) برای استفاده ی عمومی هم اکنون در دسترس است. این راهنما در بخشهای مختلفی آماده شده و سعی کرده ایم برای اولین انتشار بخش بزرگی از نیازمندیهای روزمرهی برنامهنویسان را در آن پوشش دهیم. از آنجایی که عمدتا در محیط خط فرمان از گیت استفاده میشود( هرچند که محیطهای گرافیکی بسیاری برای آن ساخته شده است)، یک [راهنمای اولیه برای کار با محیط خط فرمان یونیکس](http://git.codecast.ir/en/latest/book/appendix01-CLI.html) هم به راهنما افزوده شده که برای کسانی که هیچ آشنایی قبلی با محیط خط فرمان ندارند هم استفاده از کتاب ممکن باشد. و البته راهنما حتما ایراداتی دارد و در برخی موارد اشکالات ویرایشی و شاید تکنیکی که از دست نویسندگان در رفته است را بتوانید بیابید، خوشحال میشویم اگر اشکالات را در [ایشوهای پروژه روی گیتهاب](https://github.com/dariubs/git/issues) به ما بگویید یا اگر اصلاحیه ای داشتید روی پروژه [پولریکوئست](https://github.com/dariubs/git/pulls) بفرستید تا اعمال کنیم. تا همینجا هم [دوستان زیادی با مشارکتشان برای بهتر شدن راهنما](https://github.com/dariubs/git/graphs/contributors)، به ایجاد راهنمایی منظمتر برای گیت به زبان فارسی کمک کرده اند و امروز اولین نسخهی این پروژهی آزاد بصورت عمومی در دسترس شماست.
14 |
--------------------------------------------------------------------------------
/_posts/2016-23-09-linux-sysrq.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "اگر لینوکسم هنگ کرد چکار کنم؟"
3 | date: 2016-09-23
4 | description: "مگه اصلا لینوکسم هنگ میکنه؟"
5 | author: sajad
6 | disqus: true
7 | ---
8 |
9 | بله لینوکس هم هنگ میکنه. اگر تابحال برای شما این اتفاق نیوفتاده، شاید همیشه نرمافزارهای سبکی استفاده میکنید یا سیستم خیلی قدرتمندی دارید. اما گاهی پر شدن رم، نداشتن حافظه سوپ، ورودی و خروجی زیاد، نرم افزارهای بد یا اتفاقات دیگه باعث میشه لینوکس هنگ کنه.
10 |
11 | اگر فقط یک برنامه فریز شده خب احتمالا میتونید اون برنامه رو بکشید! اما اگر یو آی کاملا هنگ کرده شاید بتونید با عوض کردن tty و دستورات ترمینال خودتونو نجات بدید:
12 |
13 | برای این کار از دکمه های `Ctrl` + `Alt` + `F1` تا `F7` استفاده کنید. احتمالا UI شما در tty7 قرار گرفته. با رفتن به صفحه ترمینال میتونید پروسس مخرب را قطع کنید یا سرویسی را خاموش کنید و یا حتی سیستم را ریبوت کنید.
14 |
15 | ###اما اگر ترمینال هم باز نشد چه؟
16 |
17 | احتمالا به دکمهای که تا کنون از وجودش خبر نداشتید نیاز پیدا خواهید کرد `SysRq`. این دکمه در نزدیکی `PrtSc` قرار دارد.
18 |
19 | دستورات وارد شده با این دکمه مستقیما توسط کرنل لینوکس پردازش شده و چند دستور سطح پایین را در هر شرایطی برای کاربر فراهم میکند. برای ارسال دستورات به کرنل `Alt` + `SysRq` را با یکی از دکمه های زیر بزنید:
20 |
21 | ```
22 | `R` unRaw (پس گرفتن کنترل کیبورد)
23 | `E` tErminate (ارسال SIGTERM به تمام پروسه ها)
24 | `I` kIll (ارسال SIGKILL به تمام پروسه ها)
25 | `S` Sync (فلاش دیتای ذخیره نشده در دیسک)
26 | `U` Unmount
27 | `B` reBoot.
28 | ```
29 |
30 | [لیست کامل تر](https://en.wikipedia.org/wiki/Magic_SysRq_key)
31 |
--------------------------------------------------------------------------------
/_posts/2017-12-26-go-hugo.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "هیوگو"
3 | date: 2017-12-26
4 | description: یک استاتیک جنریتور همه کاره
5 | author: dariubs
6 | disqus: true
7 | ---
8 |
9 | در پنج شش سال اخیر استفاده از استاتیک جنریتورها در بین جامعهی توسعه دهندگان، بعد از سالها یکه تازی سیستم های مدیریت محتوای داینامیک و وابسته به زبان برنامهنویسی سمت سرور و دیتابیس؛ برای بسیاری از کارها باب شده است.
10 |
11 | استفاده از این سیستم ها بسیاری از مشکلات مربوط به امنیت و البته چالش های نگهداری را حل کردهاست و با پیشرفت ابزارهای این حوزه استفاده از آنها هم تقریبا ساده شده است. وبلاگ کدرز هم از سالها پیش از استاتیک جنریتور [jekyll](http://jekyll.github.io) برای سرو داده های سایت اصلی استفاده میکند .
12 |
13 | استاتیک جنریتور ها به زبان ساده ابزارهایی هستند که صفحات بدون نیاز به یک زبان برنامه نویسی سمت سرور برای رندر مداوم و تنها یکبار بعد از هر عملیات تغییر داده بیلد شده و بصورت فایلهای استاتیک روی سرورهایی بدون نیازمندی خاص ( مثلا بدون نیاز به php ) قابل پیاده سازی و انتشارند. اما داده ها چطور؟ داده ها هم معمولا در قالب فایلهای استاتیک و در قالب فایل هایی چون مارکداون به پروژه اضافه میشوند.
14 |
15 | تصمیم گرفتم یک جنریتور خوب و مناسب که این روزها طرفداران زیادی را هم به سوی خود جلب کرده را به شما معرفی کنم، هیوگو.
16 |
17 | ## هیوگو چیست؟
18 |
19 | در تاریخ انتشار این نوشته، هیوگو یکی از پرطرفدارترین استاتیک جنریتورهای دنیاست و در مقام استفاده بعد از jekyll بیشترین کاربر را در دنیا دارد. این پروژه توسط استیو فرانشا به زبان برنامهنویسی گو ساخته شد و همچنان در حال توسعه است.
20 |
21 | برای استفاده از هیوگو از [وبسایت رسمی پشتیبانی هیوگو](http://gohugo.io) یا از [مخزن گیتهاب هیوگو](https://github.com/gohugoio/hugo/releases) نسخه ی مربوط به سیستم عامل خود را دانلود و نصب کنید.
22 |
23 | ## ویژگی های هیوگو
24 |
25 | در بین تعداد زیادی از استاتیک جنریتورهای موجود به زبانهای برنامهنویسی مختلف، هیوگو ویژگی های منحصر به فردی دارد که باعث شده انتخاب اول بسیار از افراد باشد که جا دارد نگاهی به این ویژگی ها بکنیم.
26 |
27 | هیوگو به زبان برنامه نویسی گو نوشته شده است و البته توسعه مداومی دارد و مشارکت کننده های بسیاری در توسعه ی آن همکاری میکنند. استفاده از این زبان باعث شده این برنامه بصپرت کراس پلتفرم قابل دسترسی و اجرا باشد. نصب هیوگو روی پلتفورم های مختلف بسیار آسان است و تقریبا برای تمام سیستم های عامل مشهور بسته های نصبی ساده ای توسط تیم توسعه آن آماده شده است. برای اجرای هیوگو یک باینری در سیستم شما برنامه ی hugo را اجرا میکند و تمام عملیات های مربوط به استفاده از سیستم، افزودن محتوا و تم و بیلد و پیاده سازی توسط دستور hugo در خط فرمان انجام میشود.
28 |
29 | وبسایتهای ساخته شده با هیوگو با سرعت زیادی بیلد و آماده ی اجرا میشوند. تقریبا ۱ میلی ثانیه به ازای هر صفحه و البته با ویژگی لایو ریلود آن در هنگام توسعه میتوانید تغییرات را در لحظه مشاهده کنید.
30 |
31 | نوشته ها را میتوانید در قالب بخش های مختلف دسته بندی کنید و نظمی بی نظیر به آنها بدهید، URL ها را میتوانید کاملا مطابق با میل خود بسازید و از ویژگی های عمومی چون تگ و دسته بندی هم میتوانید در پروژه تان استفاده کنید.
32 |
33 | توابع قدرتمند و پرکاربردی برای هیوگو ساخته شده است که یکی از مهمترین آنها مرتب سازی محتوا بر اساس ویژگی های مختلف از جمله زمان از درون محتواست. بر خلاف jekyll و بسیاری دیگر، نیاز نیست روی فایلتان شماره یا تاریخ بزنید برای اینکه مرتب نمایش داده شوند و همچنین نیازی نیست به صورت دستی اقدام به تولید فهرست مطالب خود کنید.
34 |
35 | هیوگو بصورت درونی از مارکداون و ایمکس اورگ-مد پشتیبانی میکند و با استفاده از ابزارهای کمکی و افزودن آنها به پروژه سایر فرمت های متنی را نیز میتواند پشتیبانی کند. ابزارهایی مانند زمان مطالعه و کلمه شمار را بصورت درونی پشتیبانی میکند و میتوانید صفحات مختلف خود را با قابلیت قدرتمند ساخت تم هیوگو کاملا شخصی سازی کنید و البته در هیوگو میتوانید انواع مختلف مطالب تعریف و استفاده کنید.
36 |
37 | و البته هیوگو را میتوانید روی دسته ی بزرگی از سرویس های هاستینگ یا سی دی ان ها سرو و اجرا کنید، هیچ پیش نیاز عجیبی نیاز نیست تنها باید فایلهای بیلد شده روی بستر اینترنت در دسترس باشند.
38 |
39 | اینها تنها بخشی از ویژگی های هیوگو بود که آن را به انتخابی خوب برای توسعه دهندگان بدل کرده است. اگر علاقه به راه اندازی یک وبسایت استاتیک دارید سری به [وبسایت هیوگو](https://gohugo.io) بزنید.
40 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-04-14-python-tutorial-introduction.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "آشنایی با زبان برنامهنویسی پایتون"
3 | date: 2015-04-14
4 | description: درس یکم کتاب آموزش زبان برنامهنویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 |
8 | ---
9 | درس یکم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس با بیان تاریخچه ایجاد پایتون شروع و با توصیفی کوتاه و شرح ویژگیهای آن ادامه مییابد؛ در شرح ویژگیها سعی شده است کمی نیز توضیحات غیر پایتونی برای درک بهتر موضوعات ارایه گردد. همچنین در مورد کارایی پایتون و این موضوع که چرا در حال حاضر دو شاخه متفاوت از این زبان وجود دارد نیز صحبت شده است. هدف این درس ایجاد یک پیش زمینه بدون ابهام از پایتون است! به این امید که مفید باشد و بتواند شما را به یادگیری این زبان تشویق کند.
13 |
14 |
15 | [← متن درس یکم](https://python.coderz.ir/lessons/l01.html)
16 |
17 |
18 | ---
19 |
20 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
21 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-04-23-python-tutorial-installation.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "نصب و راهاندازی پایتون"
3 | date: 2015-04-23
4 | description: درس دوم کتاب آموزش زبان برنامهنویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس دوم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | در این درس به چگونگی نصب و راهاندازی محیط اجرای زبان برنامهنویسی پایتون در دو سیستم عامل ویندوز و گنولینوکس پرداخته و در پایان نیز توضیح مختصری از «سیستم مدیریت بسته» پایتون ارایه شده است.
13 |
14 |
15 | [← متن درس دوم](https://python.coderz.ir/lessons/l02.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-05-05-python-tutorial-create-project.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "چگونگی ایجاد و اجرای یک پروژه پایتون"
3 | date: 2015-05-05
4 | description: درس سوم کتاب آموزش زبان برنامهنویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس سوم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس به چگونگی ایجاد پروژههای برنامهنویسی پایتون و اجرای آنها اختصاص یافته است. درس با بیان تعاریف و رسم ساختار معمول یک پروژه شروع و اشارهای نیز به ساختار پروژههای قابل انتشار در PyPI میشود. در بخش یکم تلاش شده است که تصویر کاملی از ساختار یک پروژه در ذهن خواننده ایجاد و از این طریق او با تعاریف «بسته»، «ماژول» و «اسکریپت» در زبان پایتون آشنا شود. در دو بخش بعدی نیز ضمن اشاره به دو شیوه اجرای دستورات پایتون، به شیوه ایجاد اسکریپت و چگونگی اجرای آن تمرکز شده است؛ چرا که پروژههای پایتون به این شیوه اجرا میگردند. در ادامه هم به روند اجرای کد توسط مفسر پایتون و همچنین معرفی بایتکد توجه و در نهایت نیز به معرفی virtualenv و pyvenv پرداخته شده است.
13 |
14 |
15 | [← متن درس سوم](https://python.coderz.ir/lessons/l03.html)
16 |
17 |
18 | ---
19 |
20 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
21 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-05-29-python-tutorial-interactive-mode.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "برنامهنویسی تعاملی با پایتون"
3 | date: 2015-05-29
4 | description: درس چهارم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس چهارم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | در این درس به توضیح حالت تعاملی پایتون میپردازیم؛ اینکه چگونه وارد یا خارج شویم، کد بنویسیم یا در مورد چیزی در این زبان راهنمایی بگیریم. پس از مطالعه درس پیش و دو بخش ابتدایی این درس، با اجرای اسکریپت و حالت تعاملی پایتون آشنا شدهاید؛ بر همین اساس در بخش سوم این درس به توضیح گزینههای مورد کاربرد در فراخوانی مفسر پایتون میپردازیم که به نوعی به هر دو مبحث یاد شده مربوط میشوند. این درس پر از مطالبی است که در آینده سر نوبت(!) بررسی خواهند شد (مانند مفهوم شی) البته برای درک موضوعات، توضیح کوتاهی ارایه شده ولی بهتر است متمرکز به موضوعات اصلی خود درس باشید و زیاد درگیر آنها نشوید؛ فقط به خاطر بسپارید!
12 |
13 |
14 | [← متن درس چهارم](https://python.coderz.ir/lessons/l04.html)
15 |
16 | ---
17 |
18 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
19 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-06-20-python-tutorial-concept-object-oriented.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "مفهوم شیگرایی در پایتون"
3 | date: 2015-06-20
4 | description: درس پنجم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس پنجم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس به توضیح مفاهیم پایه «برنامهنویسی شیگرا» (Object-Oriented Programming) اختصاص یافته است و آخرین درس از سطحبندی «پایه» در این کتاب میباشد. هدف از این درس آشنایی خوانندگان با مفاهیم عمومی شیگرایی بوده و نه آموزش آن؛ جزییات بیشتر از برنامهنویسی شیگرا به همراه آموزش پیادهسازی مفاهیم آن در زبان پایتون از درس هفدهم به بعد بررسی خواهد شد. در این درس همچنین به ساختار اشیا و کلاسها در زبان پایتون اشاره شده است که پیشنیاز دروس آتی خواهد بود.
13 |
14 |
15 | [← متن درس پنجم](https://python.coderz.ir/lessons/l05.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-07-17-python-tutorial-syntax.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "سینتکس یا دستور نحو زبان پایتون"
3 | date: 2015-07-17
4 | description: درس ششم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس ششم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | در این درس به معرفی اجزای پایه در برنامهنویسی پایتون پرداخته شده و اینکه چه هستند، چه گرامری دارند، چه کاری انجام میدهند یا... مورد بررسی قرار گرفته است. همچنین در موارد بسیاری نکتههایی از شیوه استاندارد پایتوننویسی که توسط سند PEP 8 به برنامهنویسان پایتون پیشنهاد میشود نیز آورده شده است؛ رعایت این اصول به یکدستی کدهای جامعه پایتون کمک میکند.
13 |
14 | سینتکس (Syntax یا دستور نحو) مجموعهای از قواعد است که چگونگی برنامهنویسی به یک زبان مشخص را تعریف میکند؛ برای نمونه اینکه یک متن چطور نوشته شود که توسط مفسر پایتون به عنوان توضیح در نظر گرفته شود یا یک شی رشته، به رعایت سینتکس تعریف شده در پایتون بستگی دارد و چنانچه مفسر نتواند متن را با هیچ قاعده تعریف شدهای مطابقت دهد یک استثنا گزارش خواهد شد. سینتکس پایتون تنها محدود به این درس نیست و موارد بسیار دیگری به مانند چگونگی تعریف اشیا گوناگون را در طی درسهای آتی مشاهده خواهید کرد.
15 |
16 |
17 | [← متن درس ششم](https://python.coderz.ir/lessons/l06.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-08-19-python-tutorial-object-types-1.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "انواع داده یا شی در پایتون: عددی و رشته"
3 | date: 2015-08-19
4 | description: درس هفتم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس هفتم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | پایتون هر «نوع داده» (Data Type) را توسط یک کلاس ارایه میدهد؛ بنابراین هر داده یک نمونه یا یک شی از کلاسی مشخص است. هر چند برنامهنویس نیز میتواند با تعریف کلاس، نوع دلخواه خود را داشته باشد ولی در این درس میخواهیم درباره آن بخشی از انواع داده یا انواع شیای که به شکل آماده (Built-in) در اختیار مفسر زبان پایتون قرار داده شده است صحبت کنیم.
13 |
14 | در این درس تنها به بررسی «انواع شی عددی» و «نوع رشته» در پایتون پرداخته میشود و انواع باقی مانده دیگر توسط درس بعد بررسی خواهند شد. با اینکه تلاش شده است جزییات کامل باشند ولی در برخی بخشها مطالعه اسناد رسمی پایتون میتواند اطلاعات کاملتری را در اختیار شما قرار دهد. در مواقع بسیاری از تابعهای آماده پایتون استفاده خواهد شد که ممکن است جزییاتی بیشتر از آنچه در این درس بیان میشود را داشته باشند؛ به همین دلیل لینک تعریف آنها در اسناد پایتون نیز ارایه گشته است. نکته مهم در مطالعه این درس بررسی نمونه کدهاست که گاهی درک توضیحی که داده شده است بدون دقت در این نمونه کدها ناممکن خواهد بود.
15 |
16 |
17 | [← متن درس هفتم](https://python.coderz.ir/lessons/l07.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-09-19-python-tutorial-object-types-2.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "انواع داده یا شی در پایتون: set ،dict ،tuple ،list و None"
3 | date: 2015-09-19
4 | description: درس هشتم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس هشتم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | پایتون هر «نوع داده» (Data Type) را توسط یک کلاس ارایه میدهد؛ بنابراین هر داده یک نمونه یا یک شی از کلاسی مشخص است. هر چند برنامهنویس نیز میتواند با تعریف کلاس، نوع دلخواه خود را داشته باشد ولی در این درس میخواهیم درباره آن بخشی از انواع داده یا انواع شی (Object Types) که به شکل آماده (Built-in) در اختیار مفسر زبان پایتون قرار داده شده است صحبت کنیم.
13 |
14 | این درس در ادامه درس پیش به بررسی برخی از انواع دیگر پایتون به مانند «لیست»، «تاپل»، «دیکشنری» و «مجموعه» میپردازد.
15 |
16 |
17 | [← متن درس هشتم](https://python.coderz.ir/lessons/l08.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-10-12-python-tutorial-control-statements.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "دستورهای کنترلی در پایتون"
3 | date: 2015-10-12
4 | description: درس نهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس نهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | در حالت عادی جریان اجرای یک برنامه روند ثابتی دارد به این شکل که کدها سطر به سطر، از بالا به پایین خوانده و اجرا میشوند؛ دستورهای کنترلی امکانی برای کنترل یا تغییر این جریان ثابت است. با استفاده از این دستورها میتوان برای اجرای یک بلاک شرط تعیین کرد که اگر در زمان اجرا این شرط برقرار نباشد از اجرای بلاک صرف نظر خواهد شد یا میتوان شرایطی را به وجود آورد که اجرای یک بلاک را از میان چندین بلاک مشخص انتخاب گردد و همچنین میتوان اجرای یک بلاک را چندین بار تکرار کرد.
13 |
14 | این درس به بررسی دستورهای کنترلی پایتون در دو بخش «انتخاب» و «تکرار» اختصاص یافته است.
15 |
16 | [← متن درس نهم](https://python.coderz.ir/lessons/l09.html)
17 |
18 | ---
19 |
20 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
21 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2015-12-11-python-tutorial-input-output.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: " فایل، ورودی و خروجی (I/O) در پایتون"
3 | date: 2015-12-11
4 | description: درس دهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس دهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | موضوع این درس به چگونگی دریافت یا خواندن دادهها از کاربر حالت تعاملی یا فایلها و همچنین نمایش یا نوشتن در آنها اختصاص یافته است؛ بر همین اساس در متن درس به بررسی شی فایل و تابعهای آماده ()print و ()input در پایتون پرداخته خواهد شد. به برخی از تفاوتها در پیادهسازی نسخه جدید پایتون (شاخه 3x) که به موضوع این درس مربوط میباشند نیز اشاره شده است.
13 |
14 |
15 | [← متن درس دهم](https://python.coderz.ir/lessons/l10.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2016-12-11-python-tutorial-library-math-os-path.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "ماژولهای math (تابعهای ریاضی) و os (ارتباط با سیستمعامل) پایتون"
3 | date: 2016-12-11
4 | description: درس یازدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس یازدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | کتابخانه استاندارد پایتون مجموعه وسیعی از امکانات آماده است که با نصب پایتون در اختیار قرار میگیرد. فهرست کامل این امکانات را میتوانید از نشانیهای (پایتون 2x) و (پایتون 3x) مشاهده نمایید. لازم به یادآوری است که بخشی بزرگی از قدرت پایتون به دلیل وجود کتابخانههای فراوان و قدرتمند آن است که تعداد زیادی از آنها خارج کتابخانه استاندارد پایتون و درون جامعه کاربری در حال توسعه هستند که فهرست تقریبا کاملی از آنها نیز توسط PyPI قابل جستجو و دریافت هستند.
13 |
14 | این درس به عنوان آخرین درس از سطح مقدماتی کتاب به بررسی بخشی از امکانهای کاربردی این کتابخانه اختصاص یافته است که البته ممکن است در طول درسهای گذشته از آنها استفاده کرده باشیم!.
15 |
16 |
17 | [← متن درس یازدهم](https://python.coderz.ir/lessons/l11.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2019-06-26-python-tutorial-function.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "تابع در پایتون: تعریف، ارسال و تطابق آرگومانها"
3 | date: 2019-06-26
4 | description: درس دوازدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس دوازدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس به معرفی مفهوم تابع (Function) در زبان برنامهنویسی پایتون میپردازد.
13 |
14 |
15 | [← متن درس دوازدهم](https://python.coderz.ir/lessons/l12.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2019-10-20-python-tutorial-function-decorator-generator-yield-coroutine-lambda.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "تابع در پایتون: Coroutine ،Generator ،Decorator و lambda"
3 | date: 2019-10-20
4 | description: درس سیزدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس سیزدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس در ادامه درس پیش است که به معرفی مواردی از کاربردهای تابع در ایجاد مفاهیمی جدید، مهم و کاربردی در زبان برنامهنویسی پایتون میپردازد. مبحث تابع در پایتون با این درس به پایان نمیرسد و نکات باقیمانده در درس بعدی ارائه میشوند.
13 |
14 |
15 | [← متن درس سیزدهم](https://python.coderz.ir/lessons/l13.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2019-11-05-python-tutorial-recursive-memoization.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "تابع در پایتون: تابع بازگشتی و Memoization"
3 | date: 2019-11-05
4 | description: درس چهاردهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس چهاردهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس بخش پایانی از بررسی تابع در پایتون میباشد و به شرح تابع بازگشتی (Recursive) و مفهوم Memoization در زبان برنامهنویسی پایتون خواهد پرداخت.
13 |
14 |
15 | [← متن درس چهاردهم](https://python.coderz.ir/lessons/l14.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-02-19-python-regular-expression.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "عبارات با قاعده (Regular Expression) یا RegEx در پایتون"
3 | date: 2021-02-19
4 | description: درس پانزدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس پانزدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | عبارات با قاعده (Regular expression) یا به اختصار RegEx، رشتهای حاوی کاراکترهایی خاص و با معنی است که در عملیاتهایی مانند یافتن (find)، جاگذاری (repleace) و اعتبارسنجی (validation) به شدت کاربرد پیدا کرده است. در واقع با استفاده از RegEx میتوان یک الگو (pattern) برای جستجو در متن یا تطابق آن ایجاد کرد.
13 |
14 | در این درس به شرح قواعد موجود در RegEx و همچنین ماژول re از کتابخانه استاندارد پایتون خواهیم پرداخت. ماژول re یک مجموعه ابزار برای کار با RegEx در پایتون را فراهم آورده است که میتوان آن را موتور تحلیل RegEx در پایتون دانست.
15 |
16 |
17 | [← متن درس پانزدهم](https://python.coderz.ir/lessons/l15.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-02-26-python-regular-expression-2.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "ماژول re (عبارات باقاعده) پایتون"
3 | date: 2021-02-26
4 | description: درس شانزدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس شانزدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | این درس در ادامه درس قبل «عبارات با قاعده یا Regular Expression» میباشد و به شرح برخی از تابعهای کاربردی موجود در ماژول re از کتابخانه استاندارد زبان برنامهنویسی پایتون میپردازد. پیش از مطالعه این درس میبایست حتما درس قبل را نیز مطالعه کرده باشید.
13 |
14 |
15 | [← متن درس شانزدهم](https://python.coderz.ir/lessons/l16.html)
16 |
17 | ---
18 |
19 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
20 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-05-python-tutorial-oop-class-and-object.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: تعریف کلاس و ایجاد شی"
3 | date: 2021-03-05
4 | description: درس هفدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس هفدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 |
12 | پیشتر مفهوم شیگرایی شرح داده شده است (درس پنجم). در این درس میخواهیم به بررسی چگونگی پیادهسازی این مفهوم در زبان برنامه نویسی پایتون بپردازیم. هنگام نگارش این درس فرض بر این بوده است که خوانندگان دروس پیش، بخصوص درس پنجم و دروس مربوط به توابع را مطالعه کردهاند.
13 |
14 | این درس بر ارائه تعاریف مربوط به کلاس (Class) و شی (Object) از مفاهیم شیگرایی حاکم در زبان برنامهنویسی پایتون تمرکز دارد و مفاهیم باقی مانده در دروس آتی ارائه خواهند شد.
15 |
16 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین برخلاف دروس پیشین و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
17 |
18 |
19 | [← متن درس هفدهم](https://python.coderz.ir/lessons/l17.html)
20 |
21 |
22 |
23 | ---
24 |
25 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
26 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-12-python-tutorial-oop-inheritance-mro-association.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: وراثت (Inheritance) و Association"
3 | date: 2021-03-12
4 | description: درس هجدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس هجدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس در ادامه درس پیش میباشد و به بررسی رابطه بین کلاسها و اشیا میپردازد. در درس پنجم مقدمهای از این روابط صحبت شده است و این درس به صورت کامل دو رابطه IS-A یا Inheritance و HAS-A یا Association در مفهموم شی گرایی و چگونگی پیادهسازی آنها در زبان برنامهنویسی پایتون را شرح میدهد.
12 |
13 | در این درس همچنین به شرح وراثت چندگانه (Multiple Inheritance)، Method Resolution Order و کلاسهای Mixin در زبان برنامهنویسی پایتون خواهیم پرداخت.
14 |
15 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند درس پیش و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
16 |
17 |
18 | [← متن درس هجدهم](https://python.coderz.ir/lessons/l18.html)
19 |
20 | ---
21 |
22 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
23 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-17-python-tutorial-oop-metaclass-abstraction.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: متا کلاس (Metaclass) و انتزاع (Abstraction)"
3 | date: 2021-03-17
4 | description: درس نوزدهم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس نوزدهم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس در ادامه دروس پیش مرتبط با آموزش شی گرایی در پایتون میباشد و به بررسی قابلیت متا کلاس (Metaclass) در پایتون میپردازد و در ادامه یکی دیگر از مفاهیم اصلی برنامهنویسی شی گرا به نام انتزاع (Abstraction) را معرفی و چگونگی پیادهسازی آن در زبان برنامهنویسی پایتون را بررسی خواهیم کرد.
12 |
13 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
14 |
15 |
16 | [← متن درس نوزدهم](https://python.coderz.ir/lessons/l19.html)
17 |
18 | ---
19 |
20 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
21 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-19-python-tutorial-oop-encapsulation-polymorphism.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: Encapsulation و چندریختی (Polymorphism)"
3 | date: 2021-03-19
4 | description: درس بیستم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیستم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس در ادامه دروس گذشته مرتبط با آموزش شی گرایی در زبان برنامهنویسی پایتون میباشد. تاکنون با دو تا از چهار مفهوم مهم در شیگرایی آشنا شدهایم: وراثت (Inheritance) - درس هجدهم و انتزاع (Abstraction) - درس نوزدهم. این درس به بررسی دو مورد باقیمانده، یعنی کپسولهسازی (Encapsulation) و چندریختی (Polymorphism) در زبان برنامهنویسی پایتون میپردازد.
12 |
13 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
14 |
15 |
16 | [← متن درس بیستم](https://python.coderz.ir/lessons/l20.html)
17 |
18 | ---
19 |
20 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
21 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-23-python-tutorial-oop-slots-descriptors-property.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: Context Manager ،Descriptors ،Decorator"
3 | date: 2021-03-23
4 | description: درس بیست و یکم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیست و یکم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس نیز در ادامه مجموعه دروس آموزش شی گرایی در زبان برنامهنویسی پایتون میباشد که به شرح و جمعبندی برخی موارد مرتبط با مفاهیم کلاس و شی موجود در پایتون میپردازد. مواردی که ممکن است قابل گذر باشند ولی هریک نکاتی دارند که در توسعه برنامه شی گرای پایتونی به شما کمک خواهند کرد. مواردی همچون صفت ویژه __slots__ در کلاسها، ایجاد Decorator با استفاده از کلاس در پایتون و همچنین ایجاد قابلیت getter و setter در پایتون با استفاده از مفاهیم Descriptors و دکوراتور property که در ادامه تا حد کافی شرح داده خواهند شد.
12 |
13 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین همانند دروس پیش شی گرایی و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
14 |
15 |
16 |
17 |
18 | [← متن درس بیست و یکم](https://python.coderz.ir/lessons/l21.html)
19 |
20 | ---
21 |
22 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
23 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-23-python-tutorial-oop-type-hinting-data-class.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "شی گرایی (OOP) در پایتون: Type Hinting و دیتا کلاس (Data Class)"
3 | date: 2021-03-23
4 | description: درس بیست و دوم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیست و دوم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس به عنوان آخرین بخش از دروس آموزش شیگرایی در زبان برنامهنویسی پایتون به شرح یک ویژگی جدید در این زبان با نام دیتا کلاس (Data Class) میپردازد. البته پیش از شروع لازم است با یک سینتکس جدید نیز در پایتون آشنا شویم، در این سینتکس ما نوع دادههای خود را نیز به صراحت ذکر میکنیم، شیوهای که Type Hints [PEP 484] خوانده میشود. هنگام ایجاد دیتا کلاس (Data Class) به دانش این سینتکس نیاز خواهیم داشت.
12 |
13 | توجه داشته باشید که تمام مطالب این درس تنها از نسخههای 3.5 به بعد پایتون پشتیبانی میگردد (هر جایی که به نسخهای بالاتر نیاز باشد، به صراحت ذکر میگردد).
14 |
15 |
16 |
17 | [← متن درس بیست و دوم](https://python.coderz.ir/lessons/l22.html)
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-03-29-python-tutorial-error-exception-traceback.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "مدیریت خطا در پایتون: Exception ،Traceback و Exception Handling"
3 | date: 2021-03-29
4 | description: درس بیست و سوم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیست و سوم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس به شرح یکی از مفاهیم جدانشدنی از برنامهنویسی یعنی خطا (Error) پرداخته و چگونگی بروز و مدیریت آن در زبان برنامهنویسی پایتون را بررسی خواهد کرد. در این درس خواهیم آموخت که ردیابی خطا در پایتون توسط Traceback چگونه خواهد بود و اینکه اساسا Exception چیست و چه مفهومی در پایتون دارد، پیادهسازی دستور try/except در پایتون چگونه میباشد و همچنین نقش دستورات دیگری به مانند else و finally در کنار دستور try پایتون چیست.
12 |
13 | این درس تمام مفاهیم مربوط به Error و Exception را در زبان برنامهنویسی پایتون پوشش نمیدهد و مطالب باقی مانده طی درس بعد ارائه خواهد شد.
14 |
15 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
16 |
17 |
18 |
19 | [← متن درس بیست و سوم](https://python.coderz.ir/lessons/l23.html)
20 |
21 |
22 | ---
23 |
24 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
25 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-04-02-python-tutorial-raise-exception-warnings-assertion.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "مدیریت خطا در پایتون: Warning ،raise Exception و Assertion"
3 | date: 2021-04-02
4 | description: درس بیست و چهارم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیست و چهارم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | این درس در ادامه درس پیش میباشد و به شرح مفاهیم باقیمانده پیرامون مفهوم Exception در زبان برنامهنویسی پایتون میپردازد. اینکه چگونه میتوان با استفاده از دستور raise یک Exception را به صورت عمدی در برنامه بروز داد و همچنین چگونه میشود یک Exception در زبان برنامهنویسی پایتون ایجاد نماییم. در ادامه این درس به بررسی مفاهیم Warning و Assertion در زبانبرنامهنویسی پایتون و نیز ارتباط آنها با Exception میپردازد.
12 |
13 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
14 |
15 |
16 |
17 | [← متن درس بیست و چهارم](https://python.coderz.ir/lessons/l24.html)
18 |
19 |
20 | ---
21 |
22 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
23 |
--------------------------------------------------------------------------------
/_posts/Python Persian Tutorial/2021-04-16-python-tutorial-datetime.markdown:
--------------------------------------------------------------------------------
1 | ---
2 | title: "زمان در پایتون: ماژول datetime"
3 | date: 2021-04-16
4 | description: درس بیست و پنجم از کتاب آزاد آموزش زبان برنامه نویسی پایتون.
5 | author: saeiddrv
6 | disqus: true
7 | ---
8 |
9 | درس بیست و پنجم [کتاب آموزش زبان برنامهنویسی پایتون.](https://coderz.ir/python)
10 |
11 | برای کار با زمان سه ماژول در کتابخانه استاندارد زبان برنامهنویسی پایتون آماده شده است؛ time ،datetime و calendar. این درس به شرح کامل ماژول datetime پایتون اختصاص یافته است و دو ماژول دیگر توسط درس بعد بررسی خواهند شد. ماژول datetime پایتون انواع یا کلاسهای زیادی را برای ایجاد اشیا مرتبط با زمان و دستکاری (manipulating) آنها فراهم آورده است، همچون ``time`` ،``date`` ،``timezone`` ،``timedelta`` و ``datetime`` که همگی در این درس بررسی خواهند شد.
12 |
13 | توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود.
14 |
15 |
16 | [← متن درس بیست و پنجم](https://python.coderz.ir/lessons/l25.html)
17 |
18 |
19 | ---
20 |
21 | دیدگاه و سوالهای خود را در همینجا مطرح نمایید.
22 |
--------------------------------------------------------------------------------
/about.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: About
3 | permalink: about/
4 | profile: true
5 | ---
6 |
7 | کدرز، گاه نوشتی متن باز برای برنامه نویسان
8 |
9 | [متن کدرز در گیتهاب](https://github.com/coderz-ir/coderz)
10 |
11 | [توسعه دهندگان](https://github.com/coderz-ir/coderz/graphs/contributors)
12 |
13 |
14 | {% include footer.html %}
15 |
--------------------------------------------------------------------------------
/assets/css/highlight.css:
--------------------------------------------------------------------------------
1 | /*
2 | IR_Black style (c) Vasily Mikhailitchenko
3 | */
4 |
5 | .hljs {
6 | display: block;
7 | overflow-x: auto;
8 | /*padding: 0.5em;*/
9 | background: #272b2d;
10 | color: #d0d0d0;
11 | -webkit-text-size-adjust: none;
12 | }
13 |
14 | .hljs-shebang,
15 | .hljs-comment {
16 | color: #777279;
17 | }
18 |
19 | .hljs-keyword,
20 | .hljs-tag,
21 | .tex .hljs-command,
22 | .hljs-request,
23 | .hljs-status,
24 | .clojure .hljs-attribute {
25 | color: #ebde68;
26 | }
27 |
28 | .hljs-sub .hljs-keyword,
29 | .method,
30 | .hljs-list .hljs-title,
31 | .nginx .hljs-title {
32 | color: #ffffb6;
33 | }
34 |
35 | .hljs-string,
36 | .hljs-tag .hljs-value,
37 | .hljs-cdata,
38 | .hljs-filter .hljs-argument,
39 | .hljs-attr_selector,
40 | .apache .hljs-cbracket,
41 | .hljs-date,
42 | .coffeescript .hljs-attribute {
43 | color: #c1ef65;
44 | }
45 |
46 | .hljs-subst {
47 | color: #daefa3;
48 | }
49 |
50 | .hljs-regexp {
51 | color: #e9c062;
52 | }
53 |
54 | .hljs-title,
55 | .hljs-sub .hljs-identifier,
56 | .hljs-pi,
57 | .hljs-decorator,
58 | .tex .hljs-special,
59 | .hljs-type,
60 | .hljs-constant,
61 | .smalltalk .hljs-class,
62 | .hljs-doctag,
63 | .nginx .hljs-built_in {
64 | color: #c1ef65;
65 | }
66 |
67 | .hljs-symbol,
68 | .ruby .hljs-symbol .hljs-string,
69 | .hljs-number,
70 | .hljs-variable,
71 | .vbscript,
72 | .hljs-literal,
73 | .hljs-name {
74 | color: #77bcd7;
75 | }
76 |
77 | .css .hljs-tag {
78 | color: #96cbfe;
79 | }
80 |
81 | .css .hljs-rule .hljs-property,
82 | .css .hljs-id {
83 | color: #ffffb6;
84 | }
85 |
86 | .css .hljs-class {
87 | color: #fff;
88 | }
89 |
90 | .hljs-hexcolor {
91 | color: #c6c5fe;
92 | }
93 |
94 | .hljs-number {
95 | color:#77bcd7;
96 | }
97 |
98 | .coffeescript .javascript,
99 | .javascript .xml,
100 | .tex .hljs-formula,
101 | .xml .javascript,
102 | .xml .vbscript,
103 | .xml .css,
104 | .xml .hljs-cdata {
105 | opacity: 0.7;
106 | }
107 |
108 |
--------------------------------------------------------------------------------
/assets/css/style.css:
--------------------------------------------------------------------------------
1 | /* */
2 | @import url(http://fonts.googleapis.com/earlyaccess/droidarabicnaskh.css);
3 | html,body{direction:rtl;}
4 |
5 | /* Reset */
6 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}
7 | *, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
8 |
9 | /* Clearfix */
10 | .clearfix:after {
11 | content: "";
12 | display: table;
13 | clear: both;
14 | }
15 | .hidden { display: none; }
16 |
17 | /* Icons */
18 | @font-face {
19 | font-family: 'icons';
20 | src: url('../fonts/icons.eot');
21 | src: url('../fonts/icons.eot#iefix') format('embedded-opentype'),
22 | url('../fonts/icons.woff') format('woff'),
23 | url('../fonts/icons.ttf') format('truetype'),
24 | url('../fonts/icons.svg#icons') format('svg');
25 | font-weight: normal;
26 | font-style: normal;
27 | }
28 |
29 | [class^="icon-"]:before, [class*=" icon-"]:before {
30 | font-family: "icons";
31 | font-style: normal;
32 | font-weight: normal;
33 | speak: none;
34 | display: inline-block;
35 | text-decoration: inherit;
36 | text-align: center;
37 | font-variant: normal;
38 | text-transform: none;
39 | line-height: 1em;
40 | }
41 | .icon-facebook:before { content: '\e802'; }
42 | .icon-facebook-squared:before { content: '\e800'; }
43 | .icon-twitter:before { content: '\e801'; }
44 | .icon-twitter-1:before { content: '\e804'; }
45 | .icon-facebook-circled:before { content: '\e805'; }
46 | .icon-twitter-circled:before { content: '\e806'; }
47 | .icon-facebook-rect:before { content: '\e803'; }
48 |
49 | /* Spacing */
50 | .post h1, h3, h4, h5, p, .post-body ul, #post-list li, pre {
51 | margin-bottom: 20px;
52 | }
53 |
54 | /* Base */
55 | html, body { height: 100%;}
56 |
57 | body {
58 | font:16px/1 Vazir, 'Droid Arabic Naskh', "Helvetica Neue", Helvetica, Arial, sans-serif;
59 | color: #666;
60 | -webkit-font-smoothing: antialiased;
61 | text-rendering: optimizeLegibility;
62 | overflow-x: hidden;
63 | }
64 |
65 | h1 {
66 | font-size: 30px;
67 | letter-spacing: -1px;
68 | color: #222;
69 | font-weight: bold;
70 | }
71 |
72 | h2 {
73 | font: italic 19px/1.3em Vazir, 'Droid Arabic Naskh', Georgia,serif;
74 | color: #bbb;
75 | margin-top:20px
76 | }
77 |
78 | .profile #wrapper {
79 | padding: 100px 40px 0px;
80 | max-width: 740px;
81 | margin: 0 auto;
82 | }
83 |
84 | .profile #header {
85 | border-bottom: 1px solid #eee;
86 | margin-bottom: 40px;
87 | padding-bottom: 40px;
88 | text-align: center;
89 | position: relative;
90 | }
91 |
92 | .profile #avatar {
93 | display: inline-block;
94 | width: inherit;
95 | height: 80px;
96 | border-radius: 0;
97 | margin-bottom: 20px;}
98 |
99 | .profile h1 {
100 | font-weight: 400;
101 | letter-spacing: 0px;
102 | font-size: 20px;
103 | color: #222;
104 | }
105 |
106 | .profile h2 {
107 | font-size: 20px;
108 | font-weight: 300;
109 | color: #aaa;
110 | margin-top: 10px;
111 | font-family: Vazir, 'Droid Arabic Naskh', 'Helvetica Neue', Helvetica, Arial, sans-serif;
112 | font-style: normal;
113 |
114 | }
115 |
116 | nav.main-nav {
117 | padding: 20px 20px 0;
118 | width:100%;
119 | min-height:58px;
120 | background: #FAFAFA;
121 | margin: 0 auto;
122 | text-align: right;
123 | position: fixed;
124 | z-index: 100;
125 | border-bottom: 1px #F5F5F5 solid;
126 | box-shadow: 0 0px 1px rgba(0,0,0,0.25);
127 | right: 0;
128 | top: 0;
129 | left:0;
130 | }
131 |
132 | nav.main-nav ul {
133 | padding: 0;
134 | margin: 0 auto;
135 | }
136 | nav.main-nav li {
137 | display: inline;
138 | list-style-type:none;
139 | }
140 |
141 | nav.main-nav a {
142 | top: 8px;
143 | right: 6px;
144 | padding: 8px 12px;
145 | color: #5694f1;
146 | font-size: 16px;
147 | font-weight: bold;
148 | line-height: 1.35;
149 | border-radius: 3px;
150 |
151 | }
152 | nav.main-nav a.cta {
153 | background: #5badf0;
154 | color: #fff;
155 | margin-left: 12px;
156 | }
157 | nav a#pull {
158 | display: none;
159 | }
160 |
161 | nav a#pull:focus {
162 | outline: 0;
163 | }
164 |
165 | #scrolltop{
166 | cursor: pointer;
167 | }
168 |
169 | @media only screen and (max-width : 768px) {
170 | nav.main-nav ul {
171 | display: none;
172 | }
173 | nav.main-nav li {
174 | display: block;
175 | width: 100%;
176 | text-align: right;
177 | padding: 5px 0;
178 | border-bottom: 1px #EEEEEE solid;
179 | }
180 | nav.main-nav #pull {
181 | display: block;
182 | width: 100%;
183 | position: relative;
184 | }
185 | nav.main-nav a {
186 | color: #5badf0;
187 | font-size: 13px;
188 | line-height: 1.35;
189 | padding: 0;
190 | border-radius: 3px;
191 | }
192 | nav.main-nav a.cta {
193 | background: transparent;
194 | color: #5badf0;
195 | margin-left: auto;
196 | }
197 | nav.main-nav #pull img{
198 | width: 20px;
199 | height: 20px;
200 | display: inline-block;
201 | }
202 | }
203 | .pullone{
204 | top: 8px !important;
205 | padding: 8px 0 20px 12px !important;
206 | }
207 | .pulltwo{
208 | top: 0 !important;
209 | padding: 0 !important;
210 | }
211 |
212 | #logo{
213 | z-index:999;
214 | position: fixed;
215 | left:20px;
216 | top: 5px;
217 | display: none;
218 | webkit-transition:all 0.1s ease;
219 | -moz-transition:all 0.1s ease;
220 | -o-transition:all 0.1s ease;
221 | -ms-transition:all 0.1s ease;
222 | transition:all 0.1s ease
223 | }
224 | #logo span{
225 | display: block;
226 | }
227 |
228 | #wrapper {
229 | max-width: 740px;
230 | margin: 0 auto;
231 | padding: 60px 40px 100px 40px;
232 | }
233 |
234 | #wrapper.home {
235 | max-width: 740px;
236 | margin: 0 auto;
237 | padding: 0px 40px 20px 40px;
238 | }
239 |
240 | .home #avatar {
241 | float: right;
242 | width: 40px;
243 | height: 40px;
244 | border-radius: 50%;
245 | }
246 |
247 | /* Typography */
248 | /*Accent color*/
249 | a,
250 | #title,
251 | #post-list a:hover,
252 | #post-list li:hover .dates,
253 | #title:hover {
254 | text-decoration: none;
255 | color: #5badf0;
256 | color: #5694f1;
257 | }
258 |
259 | p a { color: #5694f1; }
260 |
261 | /*Transitions*/
262 | a,
263 | #post-nav a,
264 | #post-list a {
265 | -webkit-transition: all 0.15s ease;
266 | -moz-transition: all 0.15s ease;
267 | -ms-transition: all 0.15s ease;
268 | -o-transition: all 0.15s ease;
269 | transition: all 0.15s ease;
270 | }
271 |
272 | ul { margin:0; padding:0; }
273 | li { list-style-type:circle; list-style-position:inside;padding-top:8px }
274 |
275 | /* Line Height */
276 | #post-body, p { line-height:1.7; }
277 |
278 | b, strong { font-weight: 500;
279 | color: #1E2025; }
280 | em, i { font-style: italic; }
281 |
282 | #title {
283 | display: inline-block;
284 | line-height: 100%;
285 | font-weight: 500;
286 | font-size: 19px;
287 | margin: 0;
288 | padding-bottom: 20px;
289 | }
290 |
291 | .description {
292 | float: right;
293 | font: italic 14px/1.4em Vazir, 'Droid Arabic Naskh', Georgia,serif;
294 | color: #aaa;
295 | }
296 |
297 |
298 |
299 | .home h1 {
300 | font-size: 30px;
301 | letter-spacing: -1px;
302 | color: #222;
303 | font-weight: bold;
304 | }
305 |
306 | .home h2 {
307 | font: italic 19px/1.3em Vazir,'Droid Arabic Naskh', Georgia,serif;
308 | color: #bbb;
309 | }
310 |
311 | .post header {
312 | text-align:center;
313 |
314 | }
315 |
316 | .post h1 {
317 | margin-bottom:2 0px;
318 | color: #222;
319 | font: 300 32px/1.4em Vazir,'Droid Arabic Naskh', "Helvetica Neue", Helvetica,Arial,sans-serif;
320 | }
321 |
322 | .post h2 {
323 | margin-bottom: 40px;
324 | font: 300 24px/1.5 Vazir,'Droid Arabic Naskh', "Helvetica Neue",Helvetica,Arial,sans-serif;
325 | color: #111;
326 | }
327 |
328 |
329 | .post h2.headline {
330 | /*font: italic 22px/1.3em Georgia,serif;*/
331 | font: normal 13px/1.5em Vazir,'Droid Arabic Naskh', "Helvetica Neue",Helvetica,Arial,sans-serif;
332 | margin: -5px 0 40px 0;
333 | color: #b2b9be;
334 | font-size: 13px;
335 | text-transform: uppercase;
336 | letter-spacing: 2px;
337 | /*margin-top: 15px;*/
338 | display: inline-block;
339 | }
340 |
341 | #post-list h2 {
342 | font: normal 17px/1.5em Vazir,'Droid Arabic Naskh', "Helvetica Neue",Helvetica,Arial,sans-serif;
343 | color: #aaa;
344 | max-width: 400px;
345 | margin-top: 2px;
346 | }
347 |
348 | h3, h4, h5 { color:#333; }
349 |
350 | h3 { font-size:20px; font-weight: 400; }
351 | h4 { font-size:16px; font-weight:bold; }
352 | h5 { font-size:15px; font-weight: bold; }
353 |
354 | h6 {
355 | font-size: 13px;
356 | font-weight: bold;
357 | color: #666;
358 | margin-bottom: 6px;
359 | }
360 |
361 | p.small {
362 | color: #bbb;
363 | font-size: 14px;
364 | line-height: 1.5;
365 | display: block;
366 | }
367 |
368 | blockquote {
369 | padding-right: 15px;
370 | border-right: 3px solid #eee;
371 | }
372 |
373 | hr {
374 | display: block;
375 | border: none;
376 | height: 1px;
377 | margin: 40px auto;
378 | background: #eee;
379 | }
380 |
381 | span.code { font-family:Menlo, Monaco, Courier; background-color:#EEE; font-size:14px; direction:ltr; }
382 |
383 | pre {
384 | direction:ltr;
385 | font-family:Menlo, Monaco, Courier;
386 | white-space:pre-wrap;
387 | /*border: 1px solid #ddd;*/
388 | padding:20px;
389 | background-color:#fdfdfd;
390 | /*font-size:14px;*/
391 | overflow:auto;
392 | border-radius: 3px;
393 | background: #272b2d;
394 | font-family: 'Source Code Pro',Menlo,monospace;
395 | font-size: 13px;
396 | line-height: 1.5em;
397 | font-weight: 500;
398 | color: #d0d4d7;
399 |
400 | }
401 |
402 | table {
403 | width: 100%;
404 | margin: 40px 0;
405 | border-collapse: collapse;
406 | font-size: 13px;
407 | line-height: 1.5em;
408 | }
409 |
410 | th,td {
411 | text-align: left;
412 | padding-right: 20px;
413 | vertical-align: top;
414 | }
415 |
416 | table td,td {
417 | border-spacing: none;
418 | border-style: solid;
419 | padding: 10px 15px;
420 | border-width: 1px 0 0 0;
421 | }
422 |
423 | tr>td {
424 | border-top: 1px solid #eaeaea;
425 | }
426 |
427 | tr:nth-child(odd)>td {
428 | background: #fcfcfc;
429 | }
430 |
431 | thead th,th {
432 | text-align: left;
433 | padding: 10px 15px;
434 | height: 20px;
435 | font-size: 13px;
436 | font-weight: bold;
437 | color: #444;
438 | border-bottom: 1px solid #dadadc;
439 | cursor: default;
440 | white-space: nowrap;
441 | }
442 |
443 | img {
444 | width: 100%;
445 | max-width: 100%;
446 | border-radius: 3px;
447 | }
448 |
449 | /* Made with Cactus Badge */
450 | #badge {
451 | position: absolute;
452 | bottom: 8px;
453 | right: 8px;
454 | height: 48px;
455 | width: 48px;
456 | }
457 |
458 | /*=========================================
459 | Post List
460 | =========================================== */
461 | #post-list,#archive-list {
462 | margin-top: 100px;
463 | }
464 |
465 | #post-list li,#archive-list li {
466 | list-style-type: none;
467 | }
468 |
469 | #post-list li:last-child {
470 | margin-bottom: 0;
471 | }
472 |
473 | #post-list li+li {
474 | padding-top: 20px;
475 | border-top: 1px solid #eee;
476 | }
477 |
478 | #post-list a {
479 | color: #333;
480 | display: block;
481 | font: bold 19px/1.7 Vazir,'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
482 | }
483 |
484 | #post-list .dates {
485 | float: left;
486 | position: relative;
487 | top: 1px;
488 | font: 300 17px/1.8 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
489 | color: #bbb;
490 | }
491 |
492 | #post-list-footer {
493 | border-top: 1px solid #eee;
494 | margin-top: 20px;
495 | padding-top: 100px;
496 | }
497 |
498 | #archive-link {
499 | display: inline-block;
500 | font-size: 13px;
501 | font-weight: bold;
502 | border-radius: 4px;
503 | padding: 3px 10px 6px;
504 | box-shadow: 0 0 0 1px hsla(207,83%,80%,1);
505 | }
506 |
507 | #archive-link:hover {
508 | background: #5694f1;
509 | color: #fff;
510 | box-shadow: 0 0 0 1px #5694f1;
511 | }
512 |
513 | #archive-link span {
514 | position: relative;
515 | top: 0;
516 | font-size: 17px;
517 | }
518 |
519 | .wr-footer{
520 | width: 100%;
521 | background: #FAFAFA;
522 | box-shadow: 0 0px 1px rgba(0,0,0,0.25);
523 | padding: 20px 0 20px 0;
524 | margin-top: 100px;
525 | position: absolute;
526 | right: 0;
527 | left: 0;
528 | }
529 |
530 | #footer {
531 | max-width: 740px;
532 | margin-left:auto;
533 | margin-right:auto;
534 | margin-top:20px;
535 | padding: 0 40px;
536 | }
537 |
538 | .footerbody{
539 | display: table;
540 | }
541 |
542 | div.footerbody{
543 | display: table-cell;
544 | vertical-align:top;
545 | }
546 |
547 | /* Post Page */
548 | #header {
549 | border-bottom: 1px solid #eee;
550 | }
551 |
552 | .post {
553 | margin: 80px 0 0 0;
554 | }
555 |
556 | #post-meta {
557 | font-size: 13px;
558 | font-weight: bold;
559 | line-height: 1.4;
560 | border-top: 1px solid #eee;
561 | padding-top: 40px;
562 | margin-bottom: 40px;
563 | padding-bottom: 40px;
564 | margin-top: 40px;
565 | color:#444;
566 | border-bottom: 1px solid #eee;
567 | }
568 |
569 | #post-meta div span {
570 | color: #aaa;
571 | font-weight: 500;
572 | display: block;
573 | }
574 |
575 | #post-meta div span.dark {
576 | color: #1E2025;
577 |
578 | }
579 |
580 | #post-meta div {
581 | margin: 0 0 0 25px;
582 | float: right;
583 | }
584 |
585 | #sharing {
586 | float: left;
587 | margin: -2px;
588 | }
589 |
590 | #sharing a {
591 | font-size: 20px;
592 | font-size: 23px;
593 | margin-left: 1px;
594 | margin-top: 4px;
595 | color: #d4d4d4;
596 | display: inline-block;
597 | vertical-align: middle;
598 | }
599 |
600 | #sharing a:hover {
601 | /*color: #444;*/
602 | opacity: 0.8;
603 | }
604 |
605 | /* Post Navigation */
606 | #post-nav {
607 | border-top:1px solid #eee;
608 | text-align:center;
609 | padding-top:20px;
610 | font-size:13px;
611 | font-weight:500;
612 | margin-top: 40px;
613 | }
614 |
615 | #post-nav span {
616 | -webkit-transition: all 0.1s linear;
617 | -moz-transition: all 0.1s linear;
618 | -ms-transition: all 0.1s linear;
619 | -o-transition: all 0.1s linear;
620 | transition: all 0.1s linear;
621 | position: relative;
622 | }
623 |
624 | #post-nav span.prev {
625 | float: left;
626 | }
627 |
628 | #post-nav span.next {
629 | float: right;
630 | }
631 |
632 | #post-nav span .arrow {
633 | position: relative;
634 | padding: 1px;
635 | }
636 |
637 | #post-nav span.prev:hover .arrow {
638 | left: -4px;
639 | }
640 |
641 | #post-nav span.next:hover .arrow {
642 | right: -4px;
643 | }
644 |
645 | #post-nav span.prev:hover {
646 | left: -3px;
647 | }
648 |
649 | #post-nav span.next:hover {
650 | right: -3px;
651 | }
652 |
653 | /* Archive */
654 | h1.archive {
655 | margin-bottom: 0px;
656 | }
657 |
658 | h2.month {
659 | width: 100%;
660 | font: bold 13px/1 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
661 | text-transform: uppercase;
662 | margin-top: 40px;
663 | margin-bottom: 10px;
664 | padding-bottom: 10px;
665 | border-bottom: 1px solid #eee;
666 | }
667 |
668 | #archive-list li:last-child {
669 | margin-bottom: 0;
670 | }
671 |
672 | #archive-list a {
673 | display: block;
674 | font: bold 17px/1.7 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
675 | color: #333;
676 | }
677 |
678 | #archive-list .dates {
679 | float: right;
680 | position: relative;
681 | top: 1px;
682 | font: 300 17px/1.7 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
683 | color: #bbb;
684 | }
685 |
686 | #archive-list li a:hover,#archive-list li:hover .dates {
687 | color: #5694f1;
688 | }
689 |
690 | #post-meta img.avatar {
691 | height: 36px;
692 | width: 36px;
693 | float: right;
694 | border-radius: 50%;
695 | margin-top: 3px;
696 | margin-left: 20px;
697 | box-shadow: 0 0 0 3px #fff, 0 0 0 4px #eee;
698 | }
699 |
700 | #post-list.archive.readmore h3{
701 |
702 | font: 400 20px Vazir, 'Droid Arabic Naskh', "Helvetica Neue", Helvetica,Arial,sans-serif;
703 | margin-bottom: 30px;
704 | }
705 |
706 | #post-list.archive.readmore a{
707 | font: 400 16px/1.6 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
708 | color: #5694f1;
709 | }
710 |
711 | #post-list.archive.readmore a:hover{
712 | opacity: 0.8;
713 | }
714 |
715 | #post-list.archive.readmore .dates{
716 | font: 300 16px/1.6 Vazir, 'Droid Arabic Naskh', "Helvetica Neue",helvetica,Arial,sans-serif;
717 | }
718 | #sharing a.facebook {
719 | background: #4361b3;
720 | }
721 | #sharing a.twitter {
722 | background: #4fafed;
723 | }
724 |
725 | #sharing a {
726 | font-size: 20px;
727 | font-size: 13px;
728 | font-weight: bold;
729 | color: #fff;
730 | padding: 6px 10px;
731 | border-radius: 4px;
732 | margin-left: 2px;
733 | }
734 |
735 | /* Media Queries */
736 | @media screen and (max-width: 540px) {
737 | #wrapper { padding:20px 20px 20px 20px;}
738 | #header { margin-bottom: 60px; border-bottom: 1px solid #eee; }
739 | .post { margin: 80px 0; }
740 | #footer { margin-top: 20px; }
741 |
742 | #post-list, #archive-list { margin-top: 0; }
743 | #post-meta { margin-top: 60px; }
744 |
745 | #title { font-size: 17px; }
746 | #post-list .dates { display: none; }
747 |
748 | #post-list-footer { margin-top: 20px; padding-top: 40px; }
749 |
750 | h1 { font-size: 26px; }
751 | .post h2.headline { font-size: 13px; }
752 | .post h1 { font-size:24px; }
753 | .post h2 { font-size:20px; }
754 | }
755 |
756 | p {text-align: justify}
757 | h2 {margin-bottom:20px}
758 |
759 |
760 |
761 |
--------------------------------------------------------------------------------
/assets/fonts/icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/fonts/icons.eot
--------------------------------------------------------------------------------
/assets/fonts/icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/assets/fonts/icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/fonts/icons.ttf
--------------------------------------------------------------------------------
/assets/fonts/icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/fonts/icons.woff
--------------------------------------------------------------------------------
/assets/images/Kactus-theme-index.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/Kactus-theme-index.png
--------------------------------------------------------------------------------
/assets/images/Kactus-theme-post.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/Kactus-theme-post.png
--------------------------------------------------------------------------------
/assets/images/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/avatar.png
--------------------------------------------------------------------------------
/assets/images/avatar@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/avatar@2x.png
--------------------------------------------------------------------------------
/assets/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/favicon.ico
--------------------------------------------------------------------------------
/assets/images/nav-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/images/nav-icon.png
--------------------------------------------------------------------------------
/assets/img/general/ask-your-friend.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/general/ask-your-friend.jpg
--------------------------------------------------------------------------------
/assets/img/general/coding_illustration.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/general/coding_illustration.jpg
--------------------------------------------------------------------------------
/assets/img/general/flask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/general/flask.png
--------------------------------------------------------------------------------
/assets/img/general/java_ubuntu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/general/java_ubuntu.png
--------------------------------------------------------------------------------
/assets/img/general/keep-pushing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/general/keep-pushing.jpg
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson01-cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson01-cover.jpg
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson02-cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson02-cover.jpg
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson03-cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson03-cover.jpg
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson04-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson04-cover.png
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson05-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson05-cover.png
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson06-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson06-cover.png
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson08-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson08-cover.png
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson09-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson09-cover.png
--------------------------------------------------------------------------------
/assets/img/python/python-tutorial-lesson10-cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coderz-ir/coderz/ee251a116dc6341d538474abc356bd25f6095a28/assets/img/python/python-tutorial-lesson10-cover.png
--------------------------------------------------------------------------------
/assets/js/main.js:
--------------------------------------------------------------------------------
1 | // To make images retina, add a class "2x" to the img element
2 | // and add a @2x.png image. Assumes jquery is loaded.
3 |
4 | function isRetina() {
5 | var mediaQuery = "(-webkit-min-device-pixel-ratio: 1.5),\
6 | (min--moz-device-pixel-ratio: 1.5),\
7 | (-o-min-device-pixel-ratio: 3/2),\
8 | (min-resolution: 1.5dppx)";
9 |
10 | if (window.devicePixelRatio > 1)
11 | return true;
12 |
13 | if (window.matchMedia && window.matchMedia(mediaQuery).matches)
14 | return true;
15 |
16 | return false;
17 | };
18 |
19 |
20 | function retina() {
21 |
22 | if (!isRetina())
23 | return;
24 |
25 | $("img.2x").map(function(i, image) {
26 |
27 | var path = $(image).attr("src");
28 |
29 | path = path.replace(".png", "@2x.png");
30 | path = path.replace(".jpg", "@2x.jpg");
31 |
32 | $(image).attr("src", path);
33 | });
34 | };
35 |
36 | $(document).ready(retina);
--------------------------------------------------------------------------------
/assets/js/moment-jalaali.js:
--------------------------------------------------------------------------------
1 |
2 | ;(function(){
3 |
4 | /**
5 | * Require the module at `name`.
6 | *
7 | * @param {String} name
8 | * @return {Object} exports
9 | * @api public
10 | */
11 |
12 | function require(name) {
13 | var module = require.modules[name];
14 | if (!module) throw new Error('failed to require "' + name + '"');
15 |
16 | if (!('exports' in module) && typeof module.definition === 'function') {
17 | module.client = module.component = true;
18 | module.definition.call(this, module.exports = {}, module);
19 | delete module.definition;
20 | }
21 |
22 | return module.exports;
23 | }
24 |
25 | /**
26 | * Registered modules.
27 | */
28 |
29 | require.modules = {
30 | moment: { exports: moment }
31 | };
32 |
33 | /**
34 | * Register module at `name` with callback `definition`.
35 | *
36 | * @param {String} name
37 | * @param {Function} definition
38 | * @api private
39 | */
40 |
41 | require.register = function (name, definition) {
42 | require.modules[name] = {
43 | definition: definition
44 | };
45 | };
46 |
47 | /**
48 | * Define a module's exports immediately with `exports`.
49 | *
50 | * @param {String} name
51 | * @param {Generic} exports
52 | * @api private
53 | */
54 |
55 | require.define = function (name, exports) {
56 | require.modules[name] = {
57 | exports: exports
58 | };
59 | };
60 |
61 | require.register("jalaali-js", function (exports, module) {
62 | /*
63 | Expose functions.
64 | */
65 | module.exports =
66 | { toJalaali: toJalaali
67 | , toGregorian: toGregorian
68 | , isValidJalaaliDate: isValidJalaaliDate
69 | , isLeapJalaaliYear: isLeapJalaaliYear
70 | , jalaaliMonthLength: jalaaliMonthLength
71 | , jalCal: jalCal
72 | , j2d: j2d
73 | , d2j: d2j
74 | , g2d: g2d
75 | , d2g: d2g
76 | }
77 |
78 | /*
79 | Converts a Gregorian date to Jalaali.
80 | */
81 | function toJalaali(gy, gm, gd) {
82 | return d2j(g2d(gy, gm, gd))
83 | }
84 |
85 | /*
86 | Converts a Jalaali date to Gregorian.
87 | */
88 | function toGregorian(jy, jm, jd) {
89 | return d2g(j2d(jy, jm, jd))
90 | }
91 |
92 | /*
93 | Checks whether a Jalaali date is valid or not.
94 | */
95 | function isValidJalaaliDate(jy, jm, jd) {
96 | return jy >= -61 && jy <= 3177 &&
97 | jm >= 1 && jm <= 12 &&
98 | jd >= 1 && jd <= jalaaliMonthLength(jy, jm)
99 | }
100 |
101 | /*
102 | Is this a leap year or not?
103 | */
104 | function isLeapJalaaliYear(jy) {
105 | return jalCal(jy).leap === 0
106 | }
107 |
108 | /*
109 | Number of days in a given month in a Jalaali year.
110 | */
111 | function jalaaliMonthLength(jy, jm) {
112 | if (jm <= 6) return 31
113 | if (jm <= 11) return 30
114 | if (isLeapJalaaliYear(jy)) return 30
115 | return 29
116 | }
117 |
118 | /*
119 | This function determines if the Jalaali (Persian) year is
120 | leap (366-day long) or is the common year (365 days), and
121 | finds the day in March (Gregorian calendar) of the first
122 | day of the Jalaali year (jy).
123 |
124 | @param jy Jalaali calendar year (-61 to 3177)
125 | @return
126 | leap: number of years since the last leap year (0 to 4)
127 | gy: Gregorian year of the beginning of Jalaali year
128 | march: the March day of Farvardin the 1st (1st day of jy)
129 | @see: http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
130 | @see: http://www.fourmilab.ch/documents/calendar/
131 | */
132 | function jalCal(jy) {
133 | // Jalaali years starting the 33-year rule.
134 | var breaks = [ -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210
135 | , 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178
136 | ]
137 | , bl = breaks.length
138 | , gy = jy + 621
139 | , leapJ = -14
140 | , jp = breaks[0]
141 | , jm
142 | , jump
143 | , leap
144 | , leapG
145 | , march
146 | , n
147 | , i
148 |
149 | if (jy < jp || jy >= breaks[bl - 1])
150 | throw new Error('Invalid Jalaali year ' + jy)
151 |
152 | // Find the limiting years for the Jalaali year jy.
153 | for (i = 1; i < bl; i += 1) {
154 | jm = breaks[i]
155 | jump = jm - jp
156 | if (jy < jm)
157 | break
158 | leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4)
159 | jp = jm
160 | }
161 | n = jy - jp
162 |
163 | // Find the number of leap years from AD 621 to the beginning
164 | // of the current Jalaali year in the Persian calendar.
165 | leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4)
166 | if (mod(jump, 33) === 4 && jump - n === 4)
167 | leapJ += 1
168 |
169 | // And the same in the Gregorian calendar (until the year gy).
170 | leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150
171 |
172 | // Determine the Gregorian date of Farvardin the 1st.
173 | march = 20 + leapJ - leapG
174 |
175 | // Find how many years have passed since the last leap year.
176 | if (jump - n < 6)
177 | n = n - jump + div(jump + 4, 33) * 33
178 | leap = mod(mod(n + 1, 33) - 1, 4)
179 | if (leap === -1) {
180 | leap = 4
181 | }
182 |
183 | return { leap: leap
184 | , gy: gy
185 | , march: march
186 | }
187 | }
188 |
189 | /*
190 | Converts a date of the Jalaali calendar to the Julian Day number.
191 |
192 | @param jy Jalaali year (1 to 3100)
193 | @param jm Jalaali month (1 to 12)
194 | @param jd Jalaali day (1 to 29/31)
195 | @return Julian Day number
196 | */
197 | function j2d(jy, jm, jd) {
198 | var r = jalCal(jy)
199 | return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1
200 | }
201 |
202 | /*
203 | Converts the Julian Day number to a date in the Jalaali calendar.
204 |
205 | @param jdn Julian Day number
206 | @return
207 | jy: Jalaali year (1 to 3100)
208 | jm: Jalaali month (1 to 12)
209 | jd: Jalaali day (1 to 29/31)
210 | */
211 | function d2j(jdn) {
212 | var gy = d2g(jdn).gy // Calculate Gregorian year (gy).
213 | , jy = gy - 621
214 | , r = jalCal(jy)
215 | , jdn1f = g2d(gy, 3, r.march)
216 | , jd
217 | , jm
218 | , k
219 |
220 | // Find number of days that passed since 1 Farvardin.
221 | k = jdn - jdn1f
222 | if (k >= 0) {
223 | if (k <= 185) {
224 | // The first 6 months.
225 | jm = 1 + div(k, 31)
226 | jd = mod(k, 31) + 1
227 | return { jy: jy
228 | , jm: jm
229 | , jd: jd
230 | }
231 | } else {
232 | // The remaining months.
233 | k -= 186
234 | }
235 | } else {
236 | // Previous Jalaali year.
237 | jy -= 1
238 | k += 179
239 | if (r.leap === 1)
240 | k += 1
241 | }
242 | jm = 7 + div(k, 30)
243 | jd = mod(k, 30) + 1
244 | return { jy: jy
245 | , jm: jm
246 | , jd: jd
247 | }
248 | }
249 |
250 | /*
251 | Calculates the Julian Day number from Gregorian or Julian
252 | calendar dates. This integer number corresponds to the noon of
253 | the date (i.e. 12 hours of Universal Time).
254 | The procedure was tested to be good since 1 March, -100100 (of both
255 | calendars) up to a few million years into the future.
256 |
257 | @param gy Calendar year (years BC numbered 0, -1, -2, ...)
258 | @param gm Calendar month (1 to 12)
259 | @param gd Calendar day of the month (1 to 28/29/30/31)
260 | @return Julian Day number
261 | */
262 | function g2d(gy, gm, gd) {
263 | var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4)
264 | + div(153 * mod(gm + 9, 12) + 2, 5)
265 | + gd - 34840408
266 | d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752
267 | return d
268 | }
269 |
270 | /*
271 | Calculates Gregorian and Julian calendar dates from the Julian Day number
272 | (jdn) for the period since jdn=-34839655 (i.e. the year -100100 of both
273 | calendars) to some millions years ahead of the present.
274 |
275 | @param jdn Julian Day number
276 | @return
277 | gy: Calendar year (years BC numbered 0, -1, -2, ...)
278 | gm: Calendar month (1 to 12)
279 | gd: Calendar day of the month M (1 to 28/29/30/31)
280 | */
281 | function d2g(jdn) {
282 | var j
283 | , i
284 | , gd
285 | , gm
286 | , gy
287 | j = 4 * jdn + 139361631
288 | j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908
289 | i = div(mod(j, 1461), 4) * 5 + 308
290 | gd = div(mod(i, 153), 5) + 1
291 | gm = mod(div(i, 153), 12) + 1
292 | gy = div(j, 1461) - 100100 + div(8 - gm, 6)
293 | return { gy: gy
294 | , gm: gm
295 | , gd: gd
296 | }
297 | }
298 |
299 | /*
300 | Utility helper functions.
301 | */
302 |
303 | function div(a, b) {
304 | return ~~(a / b)
305 | }
306 |
307 | function mod(a, b) {
308 | return a - ~~(a / b) * b
309 | }
310 | })
311 | require.register("moment-jalaali", function (exports, module) {
312 |
313 | module.exports = jMoment
314 |
315 | var moment = require('moment')
316 | , jalaali = require('jalaali-js')
317 |
318 | /************************************
319 | Constants
320 | ************************************/
321 |
322 | var formattingTokens = /(\[[^\[]*\])|(\\)?j(Mo|MM?M?M?|Do|DDDo|DD?D?D?|w[o|w]?|YYYYY|YYYY|YY|gg(ggg?)?|)|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g
323 | , localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g
324 |
325 | , parseTokenOneOrTwoDigits = /\d\d?/
326 | , parseTokenOneToThreeDigits = /\d{1,3}/
327 | , parseTokenThreeDigits = /\d{3}/
328 | , parseTokenFourDigits = /\d{1,4}/
329 | , parseTokenSixDigits = /[+\-]?\d{1,6}/
330 | , parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i
331 | , parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i
332 | , parseTokenT = /T/i
333 | , parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/
334 |
335 | , unitAliases =
336 | { jm: 'jmonth'
337 | , jmonths: 'jmonth'
338 | , jy: 'jyear'
339 | , jyears: 'jyear'
340 | }
341 |
342 | , formatFunctions = {}
343 |
344 | , ordinalizeTokens = 'DDD w M D'.split(' ')
345 | , paddedTokens = 'M D w'.split(' ')
346 |
347 | , formatTokenFunctions =
348 | { jM: function () {
349 | return this.jMonth() + 1
350 | }
351 | , jMMM: function (format) {
352 | return this.localeData().jMonthsShort(this, format)
353 | }
354 | , jMMMM: function (format) {
355 | return this.localeData().jMonths(this, format)
356 | }
357 | , jD: function () {
358 | return this.jDate()
359 | }
360 | , jDDD: function () {
361 | return this.jDayOfYear()
362 | }
363 | , jw: function () {
364 | return this.jWeek()
365 | }
366 | , jYY: function () {
367 | return leftZeroFill(this.jYear() % 100, 2)
368 | }
369 | , jYYYY: function () {
370 | return leftZeroFill(this.jYear(), 4)
371 | }
372 | , jYYYYY: function () {
373 | return leftZeroFill(this.jYear(), 5)
374 | }
375 | , jgg: function () {
376 | return leftZeroFill(this.jWeekYear() % 100, 2)
377 | }
378 | , jgggg: function () {
379 | return this.jWeekYear()
380 | }
381 | , jggggg: function () {
382 | return leftZeroFill(this.jWeekYear(), 5)
383 | }
384 | }
385 |
386 | function padToken(func, count) {
387 | return function (a) {
388 | return leftZeroFill(func.call(this, a), count)
389 | }
390 | }
391 | function ordinalizeToken(func, period) {
392 | return function (a) {
393 | return this.localeData().ordinal(func.call(this, a), period)
394 | }
395 | }
396 |
397 | (function () {
398 | var i
399 | while (ordinalizeTokens.length) {
400 | i = ordinalizeTokens.pop()
401 | formatTokenFunctions['j' + i + 'o'] = ordinalizeToken(formatTokenFunctions['j' + i], i)
402 | }
403 | while (paddedTokens.length) {
404 | i = paddedTokens.pop()
405 | formatTokenFunctions['j' + i + i] = padToken(formatTokenFunctions['j' + i], 2)
406 | }
407 | formatTokenFunctions.jDDDD = padToken(formatTokenFunctions.jDDD, 3)
408 | }())
409 |
410 | /************************************
411 | Helpers
412 | ************************************/
413 |
414 | function extend(a, b) {
415 | var key
416 | for (key in b)
417 | if (b.hasOwnProperty(key))
418 | a[key] = b[key]
419 | return a
420 | }
421 |
422 | function leftZeroFill(number, targetLength) {
423 | var output = number + ''
424 | while (output.length < targetLength)
425 | output = '0' + output
426 | return output
427 | }
428 |
429 | function isArray(input) {
430 | return Object.prototype.toString.call(input) === '[object Array]'
431 | }
432 |
433 | // function compareArrays(array1, array2) {
434 | // var len = Math.min(array1.length, array2.length)
435 | // , lengthDiff = Math.abs(array1.length - array2.length)
436 | // , diffs = 0
437 | // , i
438 | // for (i = 0; i < len; i += 1)
439 | // if (~~array1[i] !== ~~array2[i])
440 | // diffs += 1
441 | // return diffs + lengthDiff
442 | // }
443 |
444 | function normalizeUnits(units) {
445 | if (units) {
446 | var lowered = units.toLowerCase()
447 | units = unitAliases[lowered] || lowered
448 | }
449 | return units
450 | }
451 |
452 | function setDate(m, year, month, date) {
453 | var d = m._d
454 | if (m._isUTC) {
455 | /*eslint-disable new-cap*/
456 | m._d = new Date(Date.UTC(year, month, date,
457 | d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds()))
458 | /*eslint-enable new-cap*/
459 | } else {
460 | m._d = new Date(year, month, date,
461 | d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds())
462 | }
463 | }
464 |
465 | function objectCreate(parent) {
466 | function F() {}
467 | F.prototype = parent
468 | return new F()
469 | }
470 |
471 | function getPrototypeOf(object) {
472 | if (Object.getPrototypeOf)
473 | return Object.getPrototypeOf(object)
474 | else if (''.__proto__)
475 | return object.__proto__
476 | else
477 | return object.constructor.prototype
478 | }
479 |
480 | /************************************
481 | Languages
482 | ************************************/
483 | extend(getPrototypeOf(moment.localeData()),
484 | { _jMonths: [ 'Farvardin'
485 | , 'Ordibehesht'
486 | , 'Khordaad'
487 | , 'Tir'
488 | , 'Amordaad'
489 | , 'Shahrivar'
490 | , 'Mehr'
491 | , 'Aabaan'
492 | , 'Aazar'
493 | , 'Dey'
494 | , 'Bahman'
495 | , 'Esfand'
496 | ]
497 | , jMonths: function (m) {
498 | return this._jMonths[m.jMonth()]
499 | }
500 |
501 | , _jMonthsShort: [ 'Far'
502 | , 'Ord'
503 | , 'Kho'
504 | , 'Tir'
505 | , 'Amo'
506 | , 'Sha'
507 | , 'Meh'
508 | , 'Aab'
509 | , 'Aaz'
510 | , 'Dey'
511 | , 'Bah'
512 | , 'Esf'
513 | ]
514 | , jMonthsShort: function (m) {
515 | return this._jMonthsShort[m.jMonth()]
516 | }
517 |
518 | , jMonthsParse: function (monthName) {
519 | var i
520 | , mom
521 | , regex
522 | if (!this._jMonthsParse)
523 | this._jMonthsParse = []
524 | for (i = 0; i < 12; i += 1) {
525 | // Make the regex if we don't have it already.
526 | if (!this._jMonthsParse[i]) {
527 | mom = jMoment([2000, (2 + i) % 12, 25])
528 | regex = '^' + this.jMonths(mom, '') + '|^' + this.jMonthsShort(mom, '')
529 | this._jMonthsParse[i] = new RegExp(regex.replace('.', ''), 'i')
530 | }
531 | // Test the regex.
532 | if (this._jMonthsParse[i].test(monthName))
533 | return i
534 | }
535 | }
536 | }
537 | )
538 |
539 | /************************************
540 | Formatting
541 | ************************************/
542 |
543 | function makeFormatFunction(format) {
544 | var array = format.match(formattingTokens)
545 | , length = array.length
546 | , i
547 |
548 | for (i = 0; i < length; i += 1)
549 | if (formatTokenFunctions[array[i]])
550 | array[i] = formatTokenFunctions[array[i]]
551 |
552 | return function (mom) {
553 | var output = ''
554 | for (i = 0; i < length; i += 1)
555 | output += array[i] instanceof Function ? '[' + array[i].call(mom, format) + ']' : array[i]
556 | return output
557 | }
558 | }
559 |
560 | /************************************
561 | Parsing
562 | ************************************/
563 |
564 | function getParseRegexForToken(token, config) {
565 | switch (token) {
566 | case 'jDDDD':
567 | return parseTokenThreeDigits
568 | case 'jYYYY':
569 | return parseTokenFourDigits
570 | case 'jYYYYY':
571 | return parseTokenSixDigits
572 | case 'jDDD':
573 | return parseTokenOneToThreeDigits
574 | case 'jMMM':
575 | case 'jMMMM':
576 | return parseTokenWord
577 | case 'jMM':
578 | case 'jDD':
579 | case 'jYY':
580 | case 'jM':
581 | case 'jD':
582 | return parseTokenOneOrTwoDigits
583 | case 'DDDD':
584 | return parseTokenThreeDigits
585 | case 'YYYY':
586 | return parseTokenFourDigits
587 | case 'YYYYY':
588 | return parseTokenSixDigits
589 | case 'S':
590 | case 'SS':
591 | case 'SSS':
592 | case 'DDD':
593 | return parseTokenOneToThreeDigits
594 | case 'MMM':
595 | case 'MMMM':
596 | case 'dd':
597 | case 'ddd':
598 | case 'dddd':
599 | return parseTokenWord
600 | case 'a':
601 | case 'A':
602 | return moment.localeData(config._l)._meridiemParse
603 | case 'X':
604 | return parseTokenTimestampMs
605 | case 'Z':
606 | case 'ZZ':
607 | return parseTokenTimezone
608 | case 'T':
609 | return parseTokenT
610 | case 'MM':
611 | case 'DD':
612 | case 'YY':
613 | case 'HH':
614 | case 'hh':
615 | case 'mm':
616 | case 'ss':
617 | case 'M':
618 | case 'D':
619 | case 'd':
620 | case 'H':
621 | case 'h':
622 | case 'm':
623 | case 's':
624 | return parseTokenOneOrTwoDigits
625 | default:
626 | return new RegExp(token.replace('\\', ''))
627 | }
628 | }
629 |
630 | function addTimeToArrayFromToken(token, input, config) {
631 | var a
632 | , datePartArray = config._a
633 |
634 | switch (token) {
635 | case 'jM':
636 | case 'jMM':
637 | datePartArray[1] = input == null ? 0 : ~~input - 1
638 | break
639 | case 'jMMM':
640 | case 'jMMMM':
641 | a = moment.localeData(config._l).jMonthsParse(input)
642 | if (a != null)
643 | datePartArray[1] = a
644 | else
645 | config._isValid = false
646 | break
647 | case 'jD':
648 | case 'jDD':
649 | case 'jDDD':
650 | case 'jDDDD':
651 | if (input != null)
652 | datePartArray[2] = ~~input
653 | break
654 | case 'jYY':
655 | datePartArray[0] = ~~input + (~~input > 47 ? 1300 : 1400)
656 | break
657 | case 'jYYYY':
658 | case 'jYYYYY':
659 | datePartArray[0] = ~~input
660 | }
661 | if (input == null)
662 | config._isValid = false
663 | }
664 |
665 | function dateFromArray(config) {
666 | var g
667 | , j
668 | , jy = config._a[0]
669 | , jm = config._a[1]
670 | , jd = config._a[2]
671 |
672 | if ((jy == null) && (jm == null) && (jd == null))
673 | return [0, 0, 1]
674 | jy = jy != null ? jy : 0
675 | jm = jm != null ? jm : 0
676 | jd = jd != null ? jd : 1
677 | if (jd < 1 || jd > jMoment.jDaysInMonth(jy, jm) || jm < 0 || jm > 11)
678 | config._isValid = false
679 | g = toGregorian(jy, jm, jd)
680 | j = toJalaali(g.gy, g.gm, g.gd)
681 | config._jDiff = 0
682 | if (~~j.jy !== jy)
683 | config._jDiff += 1
684 | if (~~j.jm !== jm)
685 | config._jDiff += 1
686 | if (~~j.jd !== jd)
687 | config._jDiff += 1
688 | return [g.gy, g.gm, g.gd]
689 | }
690 |
691 | function makeDateFromStringAndFormat(config) {
692 | var tokens = config._f.match(formattingTokens)
693 | , string = config._i
694 | , len = tokens.length
695 | , i
696 | , token
697 | , parsedInput
698 |
699 | config._a = []
700 |
701 | for (i = 0; i < len; i += 1) {
702 | token = tokens[i]
703 | parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0]
704 | if (parsedInput)
705 | string = string.slice(string.indexOf(parsedInput) + parsedInput.length)
706 | if (formatTokenFunctions[token])
707 | addTimeToArrayFromToken(token, parsedInput, config)
708 | }
709 | if (string)
710 | config._il = string
711 | return dateFromArray(config)
712 | }
713 |
714 | function makeDateFromStringAndArray(config, utc) {
715 | var len = config._f.length
716 | , i
717 | , format
718 | , tempMoment
719 | , bestMoment
720 | , currentScore
721 | , scoreToBeat
722 |
723 | if (len === 0) {
724 | return makeMoment(new Date(NaN))
725 | }
726 |
727 | for (i = 0; i < len; i += 1) {
728 | format = config._f[i]
729 | currentScore = 0
730 | tempMoment = makeMoment(config._i, format, config._l, config._strict, utc)
731 |
732 | if (!tempMoment.isValid()) continue
733 |
734 | // currentScore = compareArrays(tempMoment._a, tempMoment.toArray())
735 | currentScore += tempMoment._jDiff
736 | if (tempMoment._il)
737 | currentScore += tempMoment._il.length
738 | if (scoreToBeat == null || currentScore < scoreToBeat) {
739 | scoreToBeat = currentScore
740 | bestMoment = tempMoment
741 | }
742 | }
743 |
744 | return bestMoment
745 | }
746 |
747 | function removeParsedTokens(config) {
748 | var string = config._i
749 | , input = ''
750 | , format = ''
751 | , array = config._f.match(formattingTokens)
752 | , len = array.length
753 | , i
754 | , match
755 | , parsed
756 |
757 | for (i = 0; i < len; i += 1) {
758 | match = array[i]
759 | parsed = (getParseRegexForToken(match, config).exec(string) || [])[0]
760 | if (parsed)
761 | string = string.slice(string.indexOf(parsed) + parsed.length)
762 | if (!(formatTokenFunctions[match] instanceof Function)) {
763 | format += match
764 | if (parsed)
765 | input += parsed
766 | }
767 | }
768 | config._i = input
769 | config._f = format
770 | }
771 |
772 | /************************************
773 | Week of Year
774 | ************************************/
775 |
776 | function jWeekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
777 | var end = firstDayOfWeekOfYear - firstDayOfWeek
778 | , daysToDayOfWeek = firstDayOfWeekOfYear - mom.day()
779 | , adjustedMoment
780 |
781 | if (daysToDayOfWeek > end) {
782 | daysToDayOfWeek -= 7
783 | }
784 | if (daysToDayOfWeek < end - 7) {
785 | daysToDayOfWeek += 7
786 | }
787 | adjustedMoment = jMoment(mom).add(daysToDayOfWeek, 'd')
788 | return { week: Math.ceil(adjustedMoment.jDayOfYear() / 7)
789 | , year: adjustedMoment.jYear()
790 | }
791 | }
792 |
793 | /************************************
794 | Top Level Functions
795 | ************************************/
796 |
797 | function makeMoment(input, format, lang, strict, utc) {
798 | if (typeof lang === 'boolean') {
799 | utc = strict
800 | strict = lang
801 | lang = undefined
802 | }
803 | var config =
804 | { _i: input
805 | , _f: format
806 | , _l: lang
807 | , _strict: strict
808 | , _isUTC: utc
809 | }
810 | , date
811 | , m
812 | , jm
813 | , origInput = input
814 | , origFormat = format
815 | if (format) {
816 | if (isArray(format)) {
817 | return makeDateFromStringAndArray(config, utc)
818 | } else {
819 | date = makeDateFromStringAndFormat(config)
820 | removeParsedTokens(config)
821 | format = 'YYYY-MM-DD-' + config._f
822 | input = leftZeroFill(date[0], 4) + '-'
823 | + leftZeroFill(date[1] + 1, 2) + '-'
824 | + leftZeroFill(date[2], 2) + '-'
825 | + config._i
826 | }
827 | }
828 | if (utc)
829 | m = moment.utc(input, format, lang, strict)
830 | else
831 | m = moment(input, format, lang, strict)
832 | if (config._isValid === false)
833 | m._isValid = false
834 | m._jDiff = config._jDiff || 0
835 | jm = objectCreate(jMoment.fn)
836 | extend(jm, m)
837 | if (strict && jm.isValid()) {
838 | jm._isValid = jm.format(origFormat) === origInput
839 | }
840 | return jm
841 | }
842 |
843 | function jMoment(input, format, lang, strict) {
844 | return makeMoment(input, format, lang, strict, false)
845 | }
846 |
847 | extend(jMoment, moment)
848 | jMoment.fn = objectCreate(moment.fn)
849 |
850 | jMoment.utc = function (input, format, lang, strict) {
851 | return makeMoment(input, format, lang, strict, true)
852 | }
853 |
854 | jMoment.unix = function (input) {
855 | return makeMoment(input * 1000)
856 | }
857 |
858 | /************************************
859 | jMoment Prototype
860 | ************************************/
861 |
862 | jMoment.fn.format = function (format) {
863 | var i
864 | , replace
865 | , me = this
866 |
867 | if (format) {
868 | i = 5
869 | replace = function (input) {
870 | return me.localeData().longDateFormat(input) || input
871 | }
872 | while (i > 0 && localFormattingTokens.test(format)) {
873 | i -= 1
874 | format = format.replace(localFormattingTokens, replace)
875 | }
876 | if (!formatFunctions[format]) {
877 | formatFunctions[format] = makeFormatFunction(format)
878 | }
879 | format = formatFunctions[format](this)
880 | }
881 | return moment.fn.format.call(this, format)
882 | }
883 |
884 | jMoment.fn.jYear = function (input) {
885 | var lastDay
886 | , j
887 | , g
888 | if (typeof input === 'number') {
889 | j = toJalaali(this.year(), this.month(), this.date())
890 | lastDay = Math.min(j.jd, jMoment.jDaysInMonth(input, j.jm))
891 | g = toGregorian(input, j.jm, lastDay)
892 | setDate(this, g.gy, g.gm, g.gd)
893 | moment.updateOffset(this)
894 | return this
895 | } else {
896 | return toJalaali(this.year(), this.month(), this.date()).jy
897 | }
898 | }
899 |
900 | jMoment.fn.jMonth = function (input) {
901 | var lastDay
902 | , j
903 | , g
904 | if (input != null) {
905 | if (typeof input === 'string') {
906 | input = this.lang().jMonthsParse(input)
907 | if (typeof input !== 'number')
908 | return this
909 | }
910 | j = toJalaali(this.year(), this.month(), this.date())
911 | lastDay = Math.min(j.jd, jMoment.jDaysInMonth(j.jy, input))
912 | this.jYear(j.jy + div(input, 12))
913 | input = mod(input, 12)
914 | if (input < 0) {
915 | input += 12
916 | this.jYear(this.jYear() - 1)
917 | }
918 | g = toGregorian(this.jYear(), input, lastDay)
919 | setDate(this, g.gy, g.gm, g.gd)
920 | moment.updateOffset(this)
921 | return this
922 | } else {
923 | return toJalaali(this.year(), this.month(), this.date()).jm
924 | }
925 | }
926 |
927 | jMoment.fn.jDate = function (input) {
928 | var j
929 | , g
930 | if (typeof input === 'number') {
931 | j = toJalaali(this.year(), this.month(), this.date())
932 | g = toGregorian(j.jy, j.jm, input)
933 | setDate(this, g.gy, g.gm, g.gd)
934 | moment.updateOffset(this)
935 | return this
936 | } else {
937 | return toJalaali(this.year(), this.month(), this.date()).jd
938 | }
939 | }
940 |
941 | jMoment.fn.jDayOfYear = function (input) {
942 | var dayOfYear = Math.round((jMoment(this).startOf('day') - jMoment(this).startOf('jYear')) / 864e5) + 1
943 | return input == null ? dayOfYear : this.add(input - dayOfYear, 'd')
944 | }
945 |
946 | jMoment.fn.jWeek = function (input) {
947 | var week = jWeekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).week
948 | return input == null ? week : this.add((input - week) * 7, 'd')
949 | }
950 |
951 | jMoment.fn.jWeekYear = function (input) {
952 | var year = jWeekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year
953 | return input == null ? year : this.add(input - year, 'y')
954 | }
955 |
956 | jMoment.fn.add = function (val, units) {
957 | var temp
958 | if (units !== null && !isNaN(+units)) {
959 | temp = val
960 | val = units
961 | units = temp
962 | }
963 | units = normalizeUnits(units)
964 | if (units === 'jyear') {
965 | this.jYear(this.jYear() + val)
966 | } else if (units === 'jmonth') {
967 | this.jMonth(this.jMonth() + val)
968 | } else {
969 | moment.fn.add.call(this, val, units)
970 | }
971 | return this
972 | }
973 |
974 | jMoment.fn.subtract = function (val, units) {
975 | var temp
976 | if (units !== null && !isNaN(+units)) {
977 | temp = val
978 | val = units
979 | units = temp
980 | }
981 | units = normalizeUnits(units)
982 | if (units === 'jyear') {
983 | this.jYear(this.jYear() - val)
984 | } else if (units === 'jmonth') {
985 | this.jMonth(this.jMonth() - val)
986 | } else {
987 | moment.fn.subtract.call(this, val, units)
988 | }
989 | return this
990 | }
991 |
992 | jMoment.fn.startOf = function (units) {
993 | units = normalizeUnits(units)
994 | if (units === 'jyear' || units === 'jmonth') {
995 | if (units === 'jyear') {
996 | this.jMonth(0)
997 | }
998 | this.jDate(1)
999 | this.hours(0)
1000 | this.minutes(0)
1001 | this.seconds(0)
1002 | this.milliseconds(0)
1003 | return this
1004 | } else {
1005 | return moment.fn.startOf.call(this, units)
1006 | }
1007 | }
1008 |
1009 | jMoment.fn.endOf = function (units) {
1010 | units = normalizeUnits(units)
1011 | if (units === undefined || units === 'milisecond') {
1012 | return this
1013 | }
1014 | return this.startOf(units).add(1, (units === 'isoweek' ? 'week' : units)).subtract(1, 'ms')
1015 | }
1016 |
1017 | jMoment.fn.clone = function () {
1018 | return jMoment(this)
1019 | }
1020 |
1021 | jMoment.fn.jYears = jMoment.fn.jYear
1022 | jMoment.fn.jMonths = jMoment.fn.jMonth
1023 | jMoment.fn.jDates = jMoment.fn.jDate
1024 | jMoment.fn.jWeeks = jMoment.fn.jWeek
1025 |
1026 | /************************************
1027 | jMoment Statics
1028 | ************************************/
1029 |
1030 | jMoment.jDaysInMonth = function (year, month) {
1031 | year += div(month, 12)
1032 | month = mod(month, 12)
1033 | if (month < 0) {
1034 | month += 12
1035 | year -= 1
1036 | }
1037 | if (month < 6) {
1038 | return 31
1039 | } else if (month < 11) {
1040 | return 30
1041 | } else if (jMoment.jIsLeapYear(year)) {
1042 | return 30
1043 | } else {
1044 | return 29
1045 | }
1046 | }
1047 |
1048 | jMoment.jIsLeapYear = jalaali.isLeapJalaaliYear
1049 |
1050 | jMoment.loadPersian = function () {
1051 | moment.locale('fa'
1052 | , { months: ('ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر').split('_')
1053 | , monthsShort: ('ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر').split('_')
1054 | , weekdays: ('یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_آدینه_شنبه').split('_')
1055 | , weekdaysShort: ('یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_آدینه_شنبه').split('_')
1056 | , weekdaysMin: 'ی_د_س_چ_پ_آ_ش'.split('_')
1057 | , longDateFormat:
1058 | { LT: 'HH:mm'
1059 | , L: 'jYYYY/jMM/jDD'
1060 | , LL: 'jD jMMMM jYYYY'
1061 | , LLL: 'jD jMMMM jYYYY LT'
1062 | , LLLL: 'dddd، jD jMMMM jYYYY LT'
1063 | }
1064 | , calendar:
1065 | { sameDay: '[امروز ساعت] LT'
1066 | , nextDay: '[فردا ساعت] LT'
1067 | , nextWeek: 'dddd [ساعت] LT'
1068 | , lastDay: '[دیروز ساعت] LT'
1069 | , lastWeek: 'dddd [ی پیش ساعت] LT'
1070 | , sameElse: 'L'
1071 | }
1072 | , relativeTime:
1073 | { future: 'در %s'
1074 | , past: '%s پیش'
1075 | , s: 'چند ثانیه'
1076 | , m: '1 دقیقه'
1077 | , mm: '%d دقیقه'
1078 | , h: '1 ساعت'
1079 | , hh: '%d ساعت'
1080 | , d: '1 روز'
1081 | , dd: '%d روز'
1082 | , M: '1 ماه'
1083 | , MM: '%d ماه'
1084 | , y: '1 سال'
1085 | , yy: '%d سال'
1086 | }
1087 | , ordinal: '%dم'
1088 | , week:
1089 | { dow: 6 // Saturday is the first day of the week.
1090 | , doy: 12 // The week that contains Jan 1st is the first week of the year.
1091 | }
1092 | , meridiem: function (hour) {
1093 | return hour < 12 ? 'ق.ظ' : 'ب.ظ'
1094 | }
1095 | , jMonths: ('فروردین_اردیبهشت_خرداد_تیر_امرداد_شهریور_مهر_آبان_آذر_دی_بهمن_اسفند').split('_')
1096 | , jMonthsShort: 'فرو_ارد_خرد_تیر_امر_شهر_مهر_آبا_آذر_دی_بهم_اسف'.split('_')
1097 | }
1098 | )
1099 | }
1100 |
1101 | jMoment.jConvert = { toJalaali: toJalaali
1102 | , toGregorian: toGregorian
1103 | }
1104 |
1105 | /************************************
1106 | Jalaali Conversion
1107 | ************************************/
1108 |
1109 | function toJalaali(gy, gm, gd) {
1110 | var j = jalaali.toJalaali(gy, gm + 1, gd)
1111 | j.jm -= 1
1112 | return j
1113 | }
1114 |
1115 | function toGregorian(jy, jm, jd) {
1116 | var g = jalaali.toGregorian(jy, jm + 1, jd)
1117 | g.gm -= 1
1118 | return g
1119 | }
1120 |
1121 | /*
1122 | Utility helper functions.
1123 | */
1124 |
1125 | function div(a, b) {
1126 | return ~~(a / b)
1127 | }
1128 |
1129 | function mod(a, b) {
1130 | return a - ~~(a / b) * b
1131 | }
1132 | });
1133 |
1134 | if (typeof exports == "object") {
1135 | module.exports = require("moment-jalaali");
1136 | } else if (typeof define == "function" && define.amd) {
1137 | define([], function(){ return require("moment-jalaali"); });
1138 | } else {
1139 | this["moment"] = require("moment-jalaali");
1140 | }
1141 | })()
1142 |
--------------------------------------------------------------------------------
/feed.xml:
--------------------------------------------------------------------------------
1 | ---
2 | layout: null
3 | ---
4 |
5 |
6 |
7 | {{ site.name | xml_escape }}
8 | {% if site.description %}{{ site.description | xml_escape }}{% endif %}
9 | {{ site.url }}
10 |
11 | {% for post in site.posts limit:10 %}
12 |
13 | {{ post.title | xml_escape }}
14 | {% if post.author.name %}
15 | {{ post.author.name | xml_escape }}
16 | {% endif %}
17 | {% if post.excerpt %}
18 | {{ post.excerpt | xml_escape }}
19 | {% else %}
20 | {{ post.content | xml_escape }}
21 | {% endif %}
22 | {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }}
23 | {{ site.url }}{{ post.url }}
24 | {{ site.url }}{{ post.url }}
25 |
26 | {% endfor %}
27 |
28 |
--------------------------------------------------------------------------------
/google893d0e73f23f834a.html:
--------------------------------------------------------------------------------
1 | google-site-verification: google893d0e73f23f834a.html
2 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 | ---
2 | profile: true
3 | ---
4 |
5 | {% include post-list.html %}
6 | {% include footer.html %}
--------------------------------------------------------------------------------
/jashnvare_verify.txt:
--------------------------------------------------------------------------------
1 | 6656590
2 |
--------------------------------------------------------------------------------
/privacy-policy.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Privacy Policy
3 | permalink: privacy-policy/
4 | profile: true
5 | text_direction: ltr
6 | ---
7 |
8 | # Privacy Policy
9 |
10 | Effective date: Feb 25, 2024
11 |
12 | Coderz. (“us”, “we”, or “our”) operates the coderz.club website (the “Service”) and its subdomains.
13 |
14 | This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data.
15 |
16 | We use your data to provide and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy.
17 |
18 | **Table of Contents**
19 |
20 | - [Definitions](#definitions)
21 | - [Information Collection And Use](#information-collection-and-use)
22 | - [Types of Data Collected](#types-of-data-collected)
23 | - [Use of Data](#use-of-data)
24 | - [Legal Basis for Processing Personal Data Under General Data Protection Regulation (GDPR)](#legal-basis-for-processing-personal-data-under-general-data-protection-regulation-gdpr)
25 | - [Retention of Data](#retention-of-data)
26 | - [Transfer Of Data](#transfer-of-data)
27 | - [Disclosure Of Data](#disclosure-of-data)
28 | - [Business Transaction](#business-transaction)
29 | - [Disclosure for Law Enforcement](#disclosure-for-law-enforcement)
30 | - [Legal Requirements](#legal-requirements)
31 | - [Security Of Data](#security-of-data)
32 | - [Your Data Protection Rights Under General Data Protection Regulation (GDPR)](#your-data-protection-rights-under-general-data-protection-regulation-gdpr)
33 | - [Service Providers](#service-providers)
34 | - [Analytics](#analytics)
35 | - [Payments](#payments)
36 | - [Links To Other Sites](#links-to-other-sites)
37 | - [Children’s Privacy](#childrens-privacy)
38 | - [Changes To This Privacy Policy](#changes-to-this-privacy-policy)
39 | - [Contact Us](#contact-us)
40 |
41 | ---
42 |
43 | ## Definitions
44 |
45 | **Service**
46 |
47 | Service is the [coderz.club](https://coderz.club) website and its sub-domains.
48 |
49 | **Personal Data**
50 |
51 | Personal Data means data about a living individual who can be identified from those data (or from those and other information either in our possession or likely to come into our possession).
52 |
53 | **Usage Data**
54 |
55 | Usage Data is data collected automatically either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).
56 |
57 | **Cookies**
58 |
59 | Cookies are small pieces of data stored on your device (computer or mobile device).
60 |
61 | **Data Controller**
62 |
63 | Data Controller means the natural or legal person who (either alone or jointly or in common with other persons) determines the purposes for which and the manner in which any personal information are, or are to be, processed.
64 |
65 | For the purpose of this Privacy Policy, we are a Data Controller of your Personal Data.
66 |
67 | **Data Processors (or Service Providers)**
68 |
69 | Data Processor (or Service Provider) means any natural or legal person who processes the data on behalf of the Data Controller.
70 |
71 | We may use the services of various Service Providers in order to process your data more effectively.
72 |
73 | **Data Subject (or User)**
74 |
75 | Data Subject is any living individual who is using our Service and is the subject of Personal Data.
76 |
77 | ## Information Collection And Use
78 |
79 | We collect several different types of information for various purposes to provide and improve our Service to you.
80 |
81 | ### Types of Data Collected
82 |
83 | #### Personal Data
84 |
85 | While using our Service, we may ask you to provide us with certain personally identifiable information that can be used to contact or identify you (“Personal Data”). Personally identifiable information may include, but is not limited to:
86 |
87 | - Email address
88 | - First name and last name
89 | - Address, State, Province, ZIP/Postal code, City
90 | - Cookies and Usage Data
91 |
92 | We may use your Personal Data to contact you with newsletters, marketing or promotional materials and other information that may be of interest to you. You may opt out of receiving any, or all, of these communications from us by following the unsubscribe link or instructions provided in any email we send or by contacting us.
93 |
94 | #### Usage Data
95 |
96 | We may also collect information how the Service is accessed and used (“Usage Data”). This Usage Data may include information such as your computer’s Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, unique device identifiers and other diagnostic data.
97 |
98 | #### Tracking Cookies Data
99 |
100 | We use cookies and similar tracking technologies to track the activity on our Service and hold certain information.
101 |
102 | Cookies are files with small amount of data which may include an anonymous unique identifier. Cookies are sent to your browser from a website and stored on your device. Tracking technologies also used are beacons, tags, and scripts to collect and track information and to improve and analyze our Service.
103 |
104 | You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you may not be able to use some portions of our Service.
105 |
106 | Examples of Cookies we use:
107 |
108 | * Session Cookies. We use Session Cookies to operate our Service.
109 | * Preference Cookies. We use Preference Cookies to remember your preferences and various settings.
110 | * Security Cookies. We use Security Cookies for security purposes.
111 |
112 | ## Use of Data
113 |
114 | Coderz.club uses the collected data for various purposes:
115 |
116 | * To provide and maintain our Service
117 | * To notify you about changes to our Service
118 | * To allow you to participate in interactive features of our Service when you choose to do so
119 | * To provide customer support
120 | * To gather analysis or valuable information so that we can improve our Service
121 | * To monitor the usage of our Service
122 | * To detect, prevent and address technical issues
123 | * To provide you with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless you have opted not to receive such information
124 |
125 | ## Legal Basis for Processing Personal Data Under General Data Protection Regulation (GDPR)
126 |
127 | If you are from the European Economic Area (EEA), Coderz’s legal basis for collecting and using the personal information described in this Privacy Policy depends on the Personal Data we collect and the specific context in which we collect it.
128 |
129 | Coderz may process your Personal Data because:
130 |
131 | * We need to perform a contract with you
132 | * You have given us permission to do so
133 | * The processing is in our legitimate interests and it’s not overridden by your rights
134 | * For payment processing purposes
135 | * To comply with the law
136 |
137 | ## Retention of Data
138 |
139 | Coderz will retain your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.
140 |
141 | Coderz will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of our Service, or we are legally obligated to retain this data for longer time periods.
142 |
143 | ## Transfer Of Data
144 |
145 | Your information, including Personal Data, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.
146 |
147 | If you are located outside Canada and choose to provide information to us, please note that we transfer the data, including Personal Data, to Canada and process it there.
148 |
149 | Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
150 |
151 | Coderz will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.
152 |
153 | ## Disclosure Of Data
154 |
155 | #### Business Transaction
156 |
157 | If Coderz is involved in a merger, acquisition or asset sale, your Personal Data may be transferred. We will provide notice before your Personal Data is transferred and becomes subject to a different Privacy Policy.
158 |
159 | #### Disclosure for Law Enforcement
160 |
161 | Under certain circumstances, Coderz may be required to disclose your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).
162 |
163 | #### Legal Requirements
164 |
165 | Coderz may disclose your Personal Data in the good faith belief that such action is necessary to:
166 |
167 | * To comply with a legal obligation
168 | * To protect and defend the rights or property of Coderz
169 | * To prevent or investigate possible wrongdoing in connection with the Service
170 | * To protect the personal safety of users of the Service or the public
171 | * To protect against legal liability
172 |
173 | ## Security Of Data
174 |
175 | The security of your data is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.
176 |
177 | ## Your Data Protection Rights Under General Data Protection Regulation (GDPR)
178 |
179 | If you are a resident of the European Economic Area (EEA), you have certain data protection rights. Coderz aims to take reasonable steps to allow you to correct, amend, delete, or limit the use of your Personal Data.
180 |
181 | If you wish to be informed what Personal Data we hold about you and if you want it to be removed from our systems, please contact us.
182 |
183 | In certain circumstances, you have the following data protection rights:
184 |
185 | **The right to access, update or to delete the information we have on you.** Whenever made possible, you can access, update or request deletion of your Personal Data directly within your account settings section. If you are unable to perform these actions yourself, please contact us to assist you.
186 |
187 | **The right of rectification.** You have the right to have your information rectified if that information is inaccurate or incomplete.
188 |
189 | **The right to object.** You have the right to object to our processing of your Personal Data.
190 |
191 | **The right of restriction.** You have the right to request that we restrict the processing of your personal information.
192 |
193 | **The right to data portability.** You have the right to be provided with a copy of the information we have on you in a structured, machine-readable and commonly used format.
194 |
195 | **The right to withdraw consent.** You also have the right to withdraw your consent at any time where Coderz. relied on your consent to process your personal information.
196 |
197 | Please note that we may ask you to verify your identity before responding to such requests.
198 |
199 | You have the right to complain to a Data Protection Authority about our collection and use of your Personal Data. For more information, please contact your local data protection authority in the European Economic Area (EEA).
200 |
201 | ## Service Providers
202 |
203 | We may employ third party companies and individuals to facilitate our Service (“Service Providers”), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.
204 |
205 | These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.
206 |
207 | #### Analytics
208 |
209 | We may use third-party Service Providers to monitor and analyze the use of our Service.
210 |
211 | **Google Analytics**
212 |
213 | Google Analytics is a web analytics service offered by Google that tracks and reports website traffic. Google uses the data collected to track and monitor the use of our Service. This data is shared with other Google services. Google may use the collected data to contextualize and personalize the ads of its own advertising network.
214 |
215 | You can opt-out of having made your activity on the Service available to Google Analytics by installing the Google Analytics opt-out browser add-on. The add-on prevents the Google Analytics JavaScript (ga.js, analytics.js, and dc.js) from sharing information with Google Analytics about visits activity.
216 |
217 | For more information on the privacy practices of Google, please visit the Google Privacy Terms web page: http://www.google.com/intl/en/policies/privacy/
218 |
219 | ## Links To Other Sites
220 |
221 | Our Service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party’s site. We strongly advise you to review the Privacy Policy of every site you visit.
222 |
223 | We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.
224 |
225 | ## Children’s Privacy
226 |
227 | Our Service does not address anyone under the age of 18 (“Children”).
228 |
229 | We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.
230 |
231 | ## Changes To This Privacy Policy
232 |
233 | We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
234 |
235 | We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the “effective date” at the top of this Privacy Policy.
236 |
237 | You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
238 |
239 | ## Contact Us
240 |
241 | If you have any questions about this Privacy Policy, the practices of this site, or your dealings with this site, please contact us:
242 |
243 | ```
244 | Coderz
245 |
246 | info@coderz.club
247 | ```
248 |
249 |
250 | {% include footer.html %}
251 |
--------------------------------------------------------------------------------
/python.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: آموزش پایتون
3 | permalink: python/
4 | profile: true
5 | ---
6 | کتاب آزاد آموزش زبان برنامهنویسی پایتون
7 |
8 |
9 | این کتاب تلاشی است برای آموزش زبان برنامهنویسی پایتون (Python) بر پایه پیادهسازی استاندارد آن (CPython)، به شکلی کامل و ساده که بتواند هر دو شاخه از پایتون (نسخههای 3x و 2x) را البته با محوریت نسخه 3x (به خصوص از درس هفدهم به بعد) پوشش دهد و همچنین برای افرادی که تاکنون سابقه برنامهنویسی نداشتهاند نیز کاربردی و مفید باشد. یادگیری پایتون نیازی به پیشزمینه برنامهنویسی ندارد و تنها پیشنیاز آن علاقه خوانندگان به فن برنامهنویسی است.
10 |
11 |
12 |
13 | ---
14 | سطح: پایه
15 | ---
16 | * درس ۰۱ – [ آشنایی با زبان برنامهنویسی پایتون][1]
17 | * درس ۰۲ – [نصب و راهاندازی پایتون][2]
18 | * درس ۰۳ – [چگونگی ایجاد و اجرای یک پروژه پایتون][3]
19 | * درس ۰۴ – [برنامهنویسی تعاملی با پایتون][4]
20 | * درس ۰۵ – [مفهوم شی گرایی][5]
21 |
22 | ---
23 | سطح: مقدماتی
24 | ---
25 | * درس ۰۶ – [سینتکس یا دستور نحو زبان پایتون][6]
26 | * درس ۰۷ – [انواع داده یا شی در پایتون: عددی و رشته][7]
27 | * درس ۰۸ – [انواع داده یا شی در پایتون: set ،dict ،tuple ،list و None][8]
28 | * درس ۰۹ – [دستورهای کنترلی در پایتون][9]
29 | * درس ۱۰ – [فایل، ورودی و خروجی (I/O) در پایتون][10]
30 | * درس ۱۱ – [ماژولهای math (تابعهای ریاضی) و os (ارتباط با سیستمعامل) پایتون][11]
31 |
32 | ---
33 | سطح: متوسط
34 | ---
35 | * درس ۱۲ – [تابع در پایتون: تعریف، ارسال و تطابق آرگومانها][12]
36 | * درس ۱۳ – [تابع در پایتون: Coroutine ،Generator ،Decorator و lambda][13]
37 | * درس ۱۴ – [تابع در پایتون: تابع بازگشتی و Memoization][14]
38 | * درس ۱۵ – [عبارات با قاعده (Regular Expression) یا RegEx در پایتون][15]
39 | * درس ۱۶ – [ماژول re (عبارات باقاعده) پایتون][16]
40 | * درس ۱۷ – [شی گرایی (OOP) در پایتون: تعریف کلاس و ایجاد شی][17]
41 | * درس ۱۸ – [شی گرایی (OOP) در پایتون: وراثت (Inheritance) و Association][18]
42 | * درس ۱۹ – [شی گرایی (OOP) در پایتون: متا کلاس (Metaclass) و انتزاع (Abstraction)][19]
43 | * درس ۲۰ – [شی گرایی (OOP) در پایتون: Encapsulation و چندریختی (Polymorphism)][20]
44 | * درس ۲۱ – [شی گرایی (OOP) در پایتون: Context Manager ،Descriptors ،Decorator][21]
45 | * درس ۲۲ – [شی گرایی (OOP) در پایتون: Type Hinting و دیتا کلاس (Data Class)][22]
46 | * درس ۲۳ – [مدیریت خطا در پایتون: Exception ،Traceback و Exception Handling][23]
47 | * درس ۲۴ – [مدیریت خطا در پایتون: Warning ،raise Exception و Assertion][24]
48 | * درس ۲۵ – [زمان در پایتون: ماژول datetime][25]
49 |
50 |
51 |
52 | ---
53 | سطح: پیشرفته
54 | ---
55 |
56 | [1]: http://coderz.ir/python-tutorial-introduction
57 | [2]: http://coderz.ir/python-tutorial-installation
58 | [3]: http://coderz.ir/python-tutorial-create-project
59 | [4]: http://coderz.ir/python-tutorial-interactive-mode
60 | [5]: http://coderz.ir/python-tutorial-concept-object-oriented
61 | [6]: http://coderz.ir/python-tutorial-syntax
62 | [7]: http://coderz.ir/python-tutorial-object-types-1
63 | [8]: http://coderz.ir/python-tutorial-object-types-2
64 | [9]: http://coderz.ir/python-tutorial-control-statements
65 | [10]: http://www.coderz.ir/python-tutorial-input-output
66 | [11]: http://www.coderz.ir/python-tutorial-library-math-os-path
67 | [12]: http://www.coderz.ir/python-tutorial-function
68 | [13]: http://www.coderz.ir/python-tutorial-function-decorator-generator-yield-coroutine-lambda
69 | [14]: http://www.coderz.ir/python-tutorial-recursive-memoization
70 | [15]: http://www.coderz.ir/python-regular-expression
71 | [16]: http://www.coderz.ir/python-regular-expression-2
72 | [17]: http://www.coderz.ir/python-tutorial-oop-class-and-object
73 | [18]: http://www.coderz.ir/python-tutorial-oop-inheritance-mro-association
74 | [19]: http://www.coderz.ir/python-tutorial-oop-metaclass-abstraction
75 | [20]: http://www.coderz.ir/python-tutorial-oop-encapsulation-polymorphism
76 | [21]: http://www.coderz.ir/python-tutorial-oop-slots-descriptors-property
77 | [22]: http://www.coderz.ir/python-tutorial-oop-type-hinting-data-class
78 | [23]: http://www.coderz.ir/python-tutorial-error-exception-traceback
79 | [24]: http://www.coderz.ir/python-tutorial-raise-exception-warnings-assertion
80 | [25]: http://www.coderz.ir/python-tutorial-datetime
81 |
82 | {% include footer.html %}
83 |
--------------------------------------------------------------------------------