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

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

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

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

۵ مطلب با موضوع «برنامه نویسی» ثبت شده است

توابع بازگشتی چطور کار می کنند؟ 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


  • شکوفه دانش

قبل از یادگیری 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.
  • شکوفه دانش