Showing posts with label nodejs. Show all posts
Showing posts with label nodejs. Show all posts

How Does 2 Problems Live Together In Peace

گاهی دو مشکل کنار هم در سورس کد می توانند به نحو جالبی همدیگر را بپوشانند و باعث نتایج تقریبا درست شوند. چیزی شبیه اتفاقی که برای for-in در جاوااسکریپت و find در mongodb در کنار هم می افتد.


مقدمه اول
در جاواسکریپت حلقه ای به نام for-in داریم که کارش Enumeration در یک آرایه است. مثلا:

var list = [1,2,3];
for( var item in list){
   ...
}

تا اینجا چیزی شبیه foreach است که در خیلی زبانها داریم. اما فرقی که وجود دارد این است که for-in روی کلیدها Enumeration انجام می دهد. برای نمونه در مثال بالا مقادیر item عبارت خواهد بود از 0, 1, 2. چرا که برای یک آرایه کلیدها همان اندیس های آرایه هستند. یا به عنوان نمونه ای دیگر:

var product = { name:'MXD56', price:56, weight:32.4 }
for( var key in product){
   console.log(key)
}

Output: 
name
price
weight
البته استفاده از for-in زیاد توصیه نمی شود و در نکوهش استفاده از آن مطالبی زیادی نوشته شده است.


مقدمه دوم
اگر بخواهید در Collection های mongoDB به دنبال row هایی با یک مقدار خاص بگردید، احتمالا از دستوری شبیه این استفاده می کنید:

find( {field:value} )

اما وقتی value از نوع undefined باشد، شرط در نظر گرفته نمی شود و تمام row ها برگردانده می شود.
حالا یک نمونه پیچیده تر را بررسی می کنیم. اگر یک آرایه از مقادیر داشته باشید (مثلا به اسم list ) و بخواهید تمام row هایی را استخراج کنید که مقدار فیلد مشخصی از آنها یکی از مقادیر این آرایه باشد، از چنین دستوری استفاده می کنید:

find( { field : { $in : list }}

هنگام استفاده از mongoDB در دو حالت عجیب ولی منطقی زیر تمام row ها به عنوان نتیجه جست و جو برگردانده می شوند:
1- وقتی به عنوان مقدار فیلد مورد جست و جو undefined را وارد کنید؛ مثل این:

find({email:undefined)


2- و حالت کمی پیچیده تر، وقتی بخواهید مقدار فیلدی برابر یکی از مقادیر یک آرایه باشد و در آن آرایه مقادیر undefined داشته باشید و همچنین اسم فیلد را هم اشتباه زده باشید؛ مثلا _email به جای email:

find({_email:{$in:[undefined]}​})

مقدمه سوم
حالا فرض کنید در nodejs می خواهید از یک collection آن row هایی که یک فیلدشان مقدار خاصی دارند را پیدا کنید و در این بین با تصوری که از ForEach در سایر زبان ها دارید ( که خود object ها را بر می گرداند ) از for-in استفاده کنید(مشکل اول) و از طرفی اسم فیلد مورد نظر را هم اشتباه بزنید(مشکل دوم):

var items = [ {ID:123} , {ID:456} , {ID:789} ];
var IDList = [];
for( var item in items){
   IDList.push( item.ID );
}
mycollection.find( { ID : {$in : IDList } } ). ...


تمام row های collection به عنوان نتیجه برگردانده می شود. علت این است که در هر اجرای for-in مقدار item برابر اندیس های آرایه items خواهد بود؛ یعنی 0, 1 , 2. و این مقادیر فیلدی به نام ID ندارند. پس 3 تا مقدار undefined در آرایه IDList وارد می شود. در نهایت find هم در یک آرایه از undefined ها برای وجود مقدار فیلد ID می گردد ( که نام فیلد را هم اشتباها ID است و در collection چنین فیلدی وجود ندارد) و این یعنی شرطی که نادیده گرفته می شود ( یا به عبارتی دیگر شرطی همیشه درست! ).



نتیجه
گاهی ممکن است دو مشکل بنیادین در کنار هم ( 1- استفاده اشتباه از for-in و 2- استفاده از مقدار undefined برای جست و جو در mongoDB ) تقریبا درست کار کنند!

GitInspector, Git-Score, CLOC and SrcStatJS: Generating Simple Reports From Git Repositories


اگر با git کار می کنید، گاهی می خواهید آماری از Repository و مشارکت افراد مختلف در آن داشته باشید. Github این کار را به بهترین شکل ممکن انجام می دهد. اما در مورد Repository  های خصوصی که روی Github قرار ندارد باید چه کار کنیم؟
موضوع وقتی جدیتر می شود که قرار باشد آخر هر هفته آماری از  وضعیت توسعه پروژه برای افراد تیم ارسال کنید و نمی خواهیم وقت زیادی را صرف سر و کله زدن با ابزارهای عریض و طویل مربوط به مدیریت پروژه های نرم افزاری کنید (درباره این موضوع -گزارش های آخر هفته ای- در پست دیگری مفصل صحبت خواهم کرد ).
در ادامه با تعدادی از ابزارهای مفید برای استخراج آمارهای جالب مربوط به پروژه های نرم افزاری آشنا می شویم. این ابزارها نه قویترین هستند، نه قدیمیترین و نه بهترین. فقط ابزارهایی هستند که وقتی در جست وجو ابزارهای کوچک و ساده برای استخراج آمار بودم با آنها بر خورد داشتم و از آنها استفاده می کنم.

GitInspector
Gitinspector نام یک ابزار مفید است برای تولید این گونه آمار است که با  python نوشته شده است و به راحتی قابل استفاده است. این ابزار خروجی HTML ، XML ، TXT ، XML تولید می کند و میزان جزییات خروجی بوسیله پارامترهای خط فرمان قابل تنظیم است.



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

python [gitinspector dir path]\gitinspector.py  [git repo. path] > git.html

مثلا برای اجرا روی یک repository نمونه در سیستم عامل ویندوز می توانید از دستور زیر استفاده کنید:

python.exe D:\gitinspector-0.3.1\gitinspector\gitinspector.py --grading --format=html D:\projects\testapp > git.html

با این دستور گزارش به صورت HTML و با جزئیات لازم برای گزارش پروژه درسی تولید می شود.

برای آشنایی بیشتر با پارامترهای ورودی هم می توانید به مستندات آن نگاهی بیندازید:


Git-Score
یکی دیگر از ابزارها git-score است. git-score هم با python نوشته شده است و ولی خروجی آن تنها در ترمینال نمایش داده می شود. اطلاعات خروجی این ابزار مختصرتر است.
git-score screenshot
برای استفاده از آن هم کافی است به دایرکتوری Repository بروید و git-score را اجرا کنید:

python git-score.py

CLOC
CLOC ابزاری است که با Perl نوشته شده است و کارش تشخیص انواع زبان ها برنامه نویسی استفاده شده در پروژه بر اساس نوع فایل ها و شمارش تعداد خطوط کامنت، خالی و کد است. یک نمونه از خروجی این ابزار به شکل زیر است:

      31 text files.
classified 31 files
      31 unique files.                              
       8 files ignored.

http://cloc.sourceforge.net v 1.60  T=0.20 s (117.7 files/s, 9643.4 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Objective C                     12            416            178           1033
C/C++ Header                    11             49             71            138
-------------------------------------------------------------------------------
SUM:                            23            465            249           1171
-------------------------------------------------------------------------------

برای استفاده از این ابزار می توانید پس از دریافت سورس کد آن از آدرس http://cloc.sourceforge.net، از دستوری شبیه این استفاده کنید:

perl cloc-1.60.pl [Project Directory]

SrcStatJS
پس از اینکه حدود سه هفته از این ابزارها برای استخراج آماری مختصر از Repository های پروژه ها استفاده کردم، تصمیم گرفتن ابزاری کوچک بنویسم که بخش از کارها را خودکار انجام دهد. حاصل این تلاش پروژه SrcStatJS است که روی گیت هاب قابل دسترسی است.
این ابزار با کمک  CLOC و git-score اطلاعاتی شامل مجموع تعداد خطوط هر پروژه و مشارکت هر فرد در هر Repository را چاپ می کند. سورس کد به زبان Nodejs است و از کدهای CLOC و git-score برای بخش اصلی کار استفاده می کنم.
 امیدوارم وقت کافی پیدا کنم تا این پروژه را کاملتر کنم و آخر این هفته برای تولید گزارش از این ابزار استفاده کنم.