این حکایت ادامه دار

ثبت هرازگاهی و کوتاه از شگفت زدگی هام حین یادگیری مطالب جدید

این حکایت ادامه دار

ثبت هرازگاهی و کوتاه از شگفت زدگی هام حین یادگیری مطالب جدید

توابع بازگشتی چطور کار می کنند؟ How does recursion work?

شکوفه دانش | شنبه, ۲۸ بهمن ۱۳۹۶، ۱۲:۱۲ ق.ظ | ۰ نظر
فرض کنید جمعی از افراد ایستادن و قراره کاری توسط همه شون انجام بشه.
بعد یک نفر از وسط جمع می گه من می تونم قسمت اول کار رو انجام بدم، نفر دیگری می گه من می تونم قسمت دوم کار رو انجام بدم، و به همین ترتیب الی آخر. تا اینکه کار کاملا بینشون تقسیم میشه.
حالا در یک مورد عجیب، فرض کنید همون جمع وجود داشته باشه ولی تمام افراد فقط یک نفر باشن! می دونم که خیلی تصورش عجیبه.
حالا مجددا فرض کنید فرار باشه کاری توسط همه شون انجام بشه. طبعا نفر اول وقتی بگه می تونه اون کار رو انجام بده بقیه همه هم می تونن. بنابراین باید اون یک نفر اون کار رو به نحوی انجام بده که کمکی بکنه به بقیه که با انجام دقیقا همون کار مشابه اون فرد حل مشکل رو یک گام به جلوتر ببرن!

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

func pow(int x, int n){
    if(n==2) return x*x;
}
حالا بیاید ببینیم این تابع اگر کار خودشو دوباره انجام بده چی می تونه تولید کنه

func pow(int x, int n){
    if(n==2) return x*x;
    return pow(x,n/2)*pow(x,n/2);
}

دقت کنید این همون تابع بالاست، با این تفاوت که صدا کردن خودش با همون کار "منتهی این بار به شکل تقسیم شده تر" بهش واگذار شده.
حالا اگر بهش بدیم: pow(x,4) اول این اجرا میشه: return pow(x,2)*pow(x,2);
بعد این اجرا میشه: return x*x;
بعد این return x*x
بعد هم این return (x*x)*(x*x);
که همون جواب مورد نظر ماست.
اما حالا بیاید بهش بدیم pow(x,3) اول این اجرا میشه: return pow(x,1)*pow(x,1);
که به وضوح از همین اول غلطه! چراکه توان ما فرد بوده و به یک ضرب اضافی دیگر در x هم احتیاج داریم. حتی ایراد کار تنها به همینجا هم خلاصه نمیشه و حتی وقتی که به اجراش ادامه هم می ده به یک دور بی نهایت دچار میشه چونکه 2 تقسیم بر 2 مساوی 1 میشه درحالیکه ما شرط پایانی رو، برابر شدن توان با 2 در نظر گرفتیم. درحالیکه توان های 1 و صفر کوچکترین توان های غیرمنفی هستن. پس تابع رو مجددا بازنویسی می کنیم:

func pow(int x, int n){
    if(n<0) return -1; //This function is not going to calculate negative powers.
    if(n<=1) return x;
    if(n%2==0) //if n is even
        return pow(x,n/2)*pow(x,n/2);
    return pow(x,n/2)*pow(x,n/2)*x;
}
و حالا این تابع دیگه به درستی کار می کنه.
دقت کنید جمله ی آخر احتیاجی به else نداشتیم چونکه شرط if اگر درست می بود return مقابلش انجام می شد و وقتی انجام نشود به return بعدی می رسد که خود به خود این همین معنای else شدن را دارد با این تفاوت که اندکی از سربار کاری که پردازنده بخواهد انجام بدهد کاسته شده است.
  • شکوفه دانش

بعد از دیدن فیلم ماحی

شکوفه دانش | پنجشنبه, ۱۲ بهمن ۱۳۹۶، ۰۳:۰۵ ق.ظ | ۰ نظر

یه جورایی خوشحالم که این فیلمو دیدم.

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

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

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

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

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

  • شکوفه دانش

c++ مریخی و javascript ونوسی و یک ربط بی ربط

شکوفه دانش | دوشنبه, ۲۵ دی ۱۳۹۶، ۰۸:۰۲ ق.ظ | ۰ نظر

حتما بسیاری از شما هنگام برنامه نویسی با زبان C++ هنگام کار کردن با یکی از محیط های برنامه نویسی این زبان با چنین تابع main ای مواجه شده اید:

int main(int argc, char *argv[])

یا این یکی که معادل همان قبلی ست:

int main(int argc char **argv)

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

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

argv and argc are how command line arguments are passed to main() in C and C++.
argc will be the number of strings pointed to by argv. This will (in practice) be 1 plus the number of arguments, as virtually all implementations will prepend the name of the program to the array.
The variables are named argc (argument count) and argv (argument vector) by convention, but they can be given any valid identifier:
 int main(int num_args, char** arg_strings) is equally valid. 
 They can also be omitted entirely, yielding int main(), if you do not intend to process command line arguments. Try the following program:
#include int main(int argc, char** argv){
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) { std::cout << argv[i] << std::endl; } } 
Running it with ./test a1 b2 c3 will output:
Have 4 arguments:
./test
a1
b2
c3


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

اما واقعیت دیگر این است که اتفاقا تعداد بسیار زیادی از برنامه هایی که امروزه ساخته می شوند هیچ رابط کاربری گرافیکی ندارند و اتفاقا خیلی هم برنامه های مهمی هستند! یک مثال این موضوع package manager ها خصوصا در دنیای برنامه نویسی هستند. مثلا در زبان javascript با برنامه ی npm می توان packageهای node.js را مدیریت کرد و امروزه بسیاری از وب کار ها همه ی کار و زندگی شان با این برنامه است. :) یا در لینوکس اوبونتو همه باید دائما از package managerای به نام apt استفاده کنند تا برنامه ای را نصب کنند/آپدیت کنند/سرچ کنند/و... .

البته لازم به ذکر است که حتی نیازی نیست یک برنامه 100% بدون رابط گرافیکی باشد تا از دستورات خط فرمان استفاده کند! یک مثال ساده ی آن برنامه ی Microsoft Word است. برای اینکه یک فایل ورد قبلا ذخیره شده را در سیستمتان باز کنید، فرضا روی آن کلیک می کنید، این کلیک کردن شما چیزی نیست جز یک رخداد(اتفاق، event، هرچه نامش را می گذارید) که نام این فایل را در یک دستور خط فرمان به خصوص گذاشته و اجرا می کند تا فایل ورد باز شود!


چند خورده اطلاعات مفید درباره package management systems:

package management system keeps track of information about software packages: what files go where, and which package owns that file, therefore behaving like a phone directory. Examples of package management systems for Linux include dpkgrpm and emerge. In Microsoft Windows, "Add/Remove Programs"/"Programs and Features" are like package managers, but use no format (it leaves it up to the program).


یک سوال جالب در وب که سوال خودمم بود:

I've never understood why there isn't a "meta-package manager" that gives you one OS-and-platform-neutral CLI tool for invoking whatever the most relevant package management tooling would be, and then polyfills in the differences.

At a base level, I want to just not have to care whether I need to "brew install", "gem install", or "npm install -g" something: just give me one namespace and put everything I need in it once. If the tool could do just that, I'd be sold.

However, I can't see why there couldn't be a more-complex namespace-mapping database, such that I could e.g. export an installed-above-baseline package-list from Ubuntu and import it into OSX, or Windows+Cygwin, to get equivalent effects. I wouldn't need the same versions of anything, necessarily; just the same commands and libraries.

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

چند مطلب نمونه درباره سیستم های مدیریت پکیج در سیستم عامل های مختلف گنو/لینوکس:

Package Management Systems: A Brief Overview

Most package systems are built around collections of package files. A package file is usually an archive which contains compiled binaries and other resources making up the software, along with installation scripts. Packages also contain valuable metadata, including their dependencies, a list of other packages required to install and run them.

While their functionality and benefits are broadly similar, packaging formats and tools vary by platform:

Operating System Format Tool(s)
Debian .deb aptapt-cacheapt-getdpkg
Ubuntu .deb aptapt-cacheapt-getdpkg
CentOS .rpm yum
Fedora .rpm dnf
FreeBSD Ports, .txz makepkg

Update Package Lists

Most systems keep a local database of the packages available from remote repositories. It's best to update this database before installing or upgrading packages. As a partial exception to this pattern, yumand dnf will check for updates before performing some operations, but you can ask them at any time whether updates are available.

System Command
Debian / Ubuntu sudo apt-get update
sudo apt update
CentOS yum check-update
Fedora dnf check-update
FreeBSD Packages sudo pkg update
FreeBSD Ports sudo portsnap fetch update

A package management system does much more than one-time installation of software. It also provides tools for upgrading already-installed packages. Package repositories help to ensure that code has been vetted for use on your system, and that the installed versions of software have been approved by developers and package maintainers.

When configuring servers or development environments, it's often necessary look beyond official repositories. Packages in the stable release of a distribution may be out of date, especially where new or rapidly-changing software is concerned.


لینک های مفید برای مطالعه بیشتر:

what are argc and argv

package manager wikipedia

npm(software) wikipedia

package management basics


  • شکوفه دانش

در روزنامه ای می خواندم که در زلزله ی کرمانشاه بیمارستانی که یک سال تازه از زمان ساختش می گذشته خراب شده است.

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

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

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

  • شکوفه دانش

ناامیدی دانشجویان

شکوفه دانش | دوشنبه, ۱۱ دی ۱۳۹۶، ۰۸:۳۷ ب.ظ | ۰ نظر

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


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


پیش از هر چیز یک مورد 0 هست که مقدمه ی موارد دیگر محسوب می شود:

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

و اما بعد:

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

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

3_ به هیچ وجه مطالعه ی غیردرسی را تعطیل نکنید، ولو اینکه شبی نیم ساعت باشد. علت این توصیه این است که تجربه ثابت کرده است کسانی که مطالعه ی آزاد ندارند خوب نمی توانند فکر کنند! و حتی نمی توانند خوب درباره ی چیزی نظرشان را بیان کنند و صحبت کردن خوبی هم ندارند. اما این ها ویژگی هایی هستند که بعدا وقتی مشغول به کار و زندگی شدید با هیچ قیمتی دیگر به دست نمی آیند. فراموش نکنید فرصت اندیشه های مولد و بکر داشتن در 20 تا 30 سالگی در حداکثر میزان کیفیت خودش است و اگرچه پس از آن هم فرصت هست اما به این کیفیت نیست و هر زمانی که در این سنین از دست برود هزینه محسوب می شود.

4_ درصورتی که احساس می کنید وقت کافی برای انجام همه ی این کارها در زندگی تان ندارید خواب شبتان را کم کنید، مثلا پنج الی شش ساعت و صبح ها سحرخیز از خواب پا شوید و افزایش امکان استفاده از زمانتان را با گذشته مقایسه کنید! در ابتدا حتی باور آن برایتان سخت خواهد بود. برای اینکه بیدار شدن هم سخت نباشد این کار ها را دو هفته انجام دهید: آ) شب ها بین 9 تا 12 بخوابید. ب) صبح با زحمت از رخت خواب بیرون بیایید و شروع کار کنید و اگر بعد از طلوع آفتاب باز هم خوابتان گرفت نیم ساعتی به خودتان مجددا استراحت بدهید. ج) صبح ها اگر احساس گرسنگی می کنید صبحانه میل کنید، علت این گرسنگی این است که بدن شما کیفیت کاری بهتری دارد و بنابراین نیاز به تغذیه دارد، و یا اگر حس می کنید صبحانه آماده کردن هم خیلی وقت گیر است می توانید آبجوش با آبلیمو و عسل میل کنید. د) صبح ها درجا پس از بلندشدن از رختخواب درها را باز و بسته کنید یا آب دست و رویتان بزنید یا به نور نگاه کنید تا حالت خواب از شما گرفته بشود. مقصود اصلی از این کارها این است که به هیچ وجه کاری نکنید که در آن "حفظ سکوت صبح" وجود داشته باشد، داد و بیداد هم لازم نیست! ولی احتیاطی که برای "سکوت شب" به خرج می دهید به خرج ندهید.

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

6_ تکنیک زدن و معامله کردن یاد بگیرید! وقتی مسئول بخشی از دانشگاه با شما همکاری نمی کند تا پیامک شما را بفرستد به او بگویید کیک و آبمیوه را نمی گیرید و در عوض پیامک ها را برای شما بفرستند! گلایه کنید، حتی گاهی به آن ها یادآوری کنید باید با شما همکاری کنند.

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

8_ واقع بین باشید، از نیروهایتان انتظار کارهای وقت گیر و سنگین در دانشگاه نداشته باشید، در عوض به ازای هر یک راهی که به آن ها نشان می دهید، انتظار راهروی داشته باشید. مثلا راه یادگیری فلان نرم افزار را به او بگویید و بعد به سه نفر بسپارید با همکاری هم در آن کار پیش بروند و دائم گزارش خواهی کنید.

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

10_ 

  • شکوفه دانش

قبل از یادگیری AngularJS چقدر Javascript باید بدانیم؟

شکوفه دانش | سه شنبه, ۵ دی ۱۳۹۶، ۱۲:۱۹ ب.ظ | ۰ نظر

می خواستم برای PWA برم و اول جاوااسکریپت و بعد هم AngularJS رو یاد بگیرم ولی متوجه شدم دانستنی های مقدماتیم از دریای Javascript اصلا کافی نیست و قبل از اون باید سرفصل هایی که در پایین اومده رو از JS بدونم! که بنابراین فعلا نمی تونم روش وقت بذارم، ولی برای آینده که یادم باشه ثبتش می کنم:


You must learn

  1. Javascript OOP (Inheritance, Prototype, Constructors, Object etc etc) to Understand scope hierarchy in Angular
  2. Closures
  3. Event mechanism
  4. Also learn the most magical word  "this" works in JS?
  5. Learn AJAX
  6. Read about AMD

More resources -

 https://developer.mozilla.org/en...

 www.quirksmode.org

 https://speakerdeck.com/addyosmani

 http://bonsaiden.github.io/JavaS...

 http://javascriptissexy.com/java...

 http://eloquentjavascript.net/1s...

 http://www.adequatelygood.com/Ja...

 http://javascript.crockford.com/

 http://james.padolsey.com/javasc... 

I have some experience in angularjs. In my case, it was like jumping into the sea without knowing how to swim. I knew some bits and pieces of javascript (still do), other than that, my experience in javascript was literally non-existent just as my front-end development experience. It was more like learning javascript through angularjs (which I still haven't finished)

source Quora


  • شکوفه دانش

TCP/IP - HTTP Requests - PHP - The Way Web Works

شکوفه دانش | دوشنبه, ۴ دی ۱۳۹۶، ۱۱:۳۸ ق.ظ | ۰ نظر

 تصور اشتباه جالبی که درباره ی requestهای http داشتم این بود که PHP این ها رو به سمت سرور می فرسته و Apache درخواست رو می گیره و پردازش می کنه در حالیکه اصلا خود PHP هم روی سروره :))) در حقیقت این browserه که http requests رو می فرسته (با یکی از روش های TCP/IP) و اون طرف Apache دریافت می کنه و تحویل نرم افزار PHP می ده و وقتی PHP طبق سورس کدهای PHP که قبلا توی سرورمون گذاشتیم، پردازش های درخواستی بروزر رو انجام داد پاسخ رو باز هم Apache به زبان HTTP به بروزر بر می گردونه.

پ.ن: احتمالا علت ایجاد شدن چنین تصور نادرستی کار کردنم در اوایل کار روی localhost هست که سیستم خودم رو ست می کردم هم سرور و هم کلاینت باشه :) 

اطلاعات احیانا مفید اضافه:

با فرض اینکه با درخواست یک وب سایت از سرورش، داریم درخواست کالا رو از فروشگاهش انجام می دیم:

  • TCP/IP: Transmission Control Protocol and Internet Protocol are communication protocols that define how data should travel across the web. This is like the transport mechanisms that let you place an order, go to the shop, and buy your goods. In our example, this is like a car or a bike (or however else you might get around).
  • HTTP: Hypertext Transfer Protocol is an application protocol that defines a language for clients and servers to speak to each other. This is like the language you use to order your goods.

اطلاعاتی که مطمئن نیستم درباره ی درستیشون:

(در HTTP 1.0 ابتدا HTML میومد و بعد Assets(عکس ها، فیلم ها، CSS ،JS ،pdfها و...) ولی در HTTP 2.x این مشکل برطرف شده و چیزهایی که ممکنه لازم باشن به Cache سیستم مخاطب می رن.)

امیدوارم مفید باشه. ^^

  • شکوفه دانش

DOM چیست؟

شکوفه دانش | يكشنبه, ۳ دی ۱۳۹۶، ۱۱:۲۹ ب.ظ | ۰ نظر
در حقیقت
DOM
یعنی
Document Object Model
یعنی به داکیومنت به شکل یک شی نگریسته بشه! و بعد از درون این آبجکت استخراج هایی انجام بشه و کارهایی باهاش کرد.
بعد اونوقت از این شی میشه در بعضی زبان ها مانند جاوااسکریپت استفاده کرد. مثلا توی این مثال:
var paragraphs = document.getElementsByTagName("P");
// paragraphs[0] is the first <p> element
// paragraphs[1] is the second <p> element
etc.alert(paragraphs[0].nodeName);
داره از "شی داکیومنت" متدی با نام
getElementsByTagName(...)
رو استفاده می کنه که می تونه از درون داکیومنت هر یک از تگ هایی که ما دلمون بخواد رو استخراج کنه و درون متغیر دلخواهمون بریزه که در این مثال تگ های
p
رو استخراج کرده و درون متغیر
paragraphs
ریخته و به صورت آرایه ای هم ذخیره کرده درون اون متغیر.

The short example above, is JavaScript. That is to say, it's written in JavaScript, but it uses the DOM to access the document and its elements. The DOM is not a programming language, but without it, the JavaScript language wouldn't have any model or notion of web pages, HTML documents, XML documents, and their component parts (e.g. elements). Every element in a document—the document as a whole, the head, tables within the document, table headers, text within the table cells—is part of the document object model for that document, so they can all be accessed and manipulated using the DOM and a scripting language like JavaScript.
  • شکوفه دانش

آیا باید همیشه بعد از یادگرفتن چیزی آن را تمرین کنیم؟

شکوفه دانش | يكشنبه, ۳ دی ۱۳۹۶، ۰۹:۱۶ ق.ظ | ۰ نظر

یه تمرین داریم یه تلاش. از نظر من همیشه بعد از یادگیری چیزی نباید تمرینش کنیم، بلکه خیلی اوقات هست که باید "تلاش" کنیم.

فرق تلاش کردن و تمرین کردن اینه که در تمرین کردن معمولا هدفمون اینه که کاری رو درست انجام بدیم. در حالیکه در تلاش کردن چنین هدفی نداریم!

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

  • شکوفه دانش

Six Simple Machines

شکوفه دانش | شنبه, ۲ دی ۱۳۹۶، ۱۱:۲۴ ب.ظ | ۰ نظر

اهرم

فرهنگ فارسی معین

(اَ رُ) (اِ.) میلة آهنی محکمی که می توان به وسیلة آن با انرژی کمتری اجسام سنگین را به حرکت درآورد.


if you attach a lever to a wheel and axle, then put a bin on top, you've built a wheelbarrow.

There are six simple machines from which all other machines are constructed. These six are lever, wheel and axle, pulley, inclined plane, wedge, and screw. Simple machines are combined to form complex machines.


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


A seesaw

the weight of the person you are trying to lift is at one end.  The work, force applied to the lever, is the person sitting on the other end of the seesaw.


Lever level one (Effort Fulcrum Load)

Seesaw Pliers Scissors

Lever level two(Effort Load Fulcrum)

Bottle Opener Wheelbarrow

Lever level three(Load Effort Fulcrum)

Tongs and tweezers

  • شکوفه دانش