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


Glimpse چیست؟
glimpse یک ابزار حرفه‌ای برای نمایش زمان اجرای کدها، پیکربندی سرور، درخواست‌های وب، اشکال زدایی و بررسی کارآیی وب سایت‌های MVC و Web Forms می‌باشد. البنه بدون آنکه در کد‌های پروژه شما تغییری ایجاد نماید.
ابتدا در پنجره Nuget عبارت glimpse را جستجو و آن را نصب نمایید:


کتابخانه‌های زیادی برای این ابزار آماده شده‌اند:

  • کتابخانه Glimpse Core
    که هسته اصلی ابزار است، حتما باید نصب شود.
  • کتابخانه Glimpse ASP.NET
    برای بررسی وب سایت‌های نوشته شده با ASP.NET Web Forms استفاده می‌شود. البته بری Mvc هم لازم است.
  • کتابخانه Glimpse Mvc2, Glimpse Mvc3، Glimpse Mvc4
    برای بررسی وب سایت‌های نوشته شده با ASP.NET Mvc
  • کتابخانه Glimpse Ado
    برای بررسی و نمایش زمان کوئری بر روی پایگاه داده
  • کتاخانه Glimpse EF4.3، Glimpse EF5، Glimpse EF6
    برای زمانیکه از نگارش‌های مختلف Entity Framework استفاده می‌نماییم
پس از نصب کتابخانه‌های مورد نیاز، پروژه را rebuild و سپس اجرا نمایید. برای فعال کردن glimpse آدرس http://{your-site}/Glimpse.axd را اجرا کنید تا صفحه تنظیمات آن فعال شوند و سپس بر روی گزینه Turn Glimpse on، کلیک کنید. همچنین با گزینه Turn Glimpse off می‌توانید آن را غیر فعال نمایید.

علاوه بر این، تنظیمات استاندارد این ابزار قابل تغییر است.
به صفحه اصلی سایت برگشته و صفحه را بروز رسانی کنید. ابزار glimpse در پایین مرورگر نمایش داده می‌شود.


این ابزار شامل سه قسمت است:
  • HTTP
    اطلاعات Request و زمان پاسخ و اطلاعات سرور نمایش داده می‌شود
  • HOST
    اطلاعات صفحه اجرا شده، زمان پاسخ و تعداد کوئری‌های اجرا شده و زمان آن نمایش داده می‌شوند
  • AJAX
    اطلاعات درخواست‌های اجکسی این صفحه و تعداد آن نمایش داده می‌شوند
بر روی هر یک از این قسمت‌ها با حرکت ماوس، جزئیات آن قسمت نمایش داده می‌شود.

اگر بر روی آیکون g ابزار کلیک کنید، همچون developer tools مرورگر‌ها باز شده و دارای زبانه‌های متعددی می‌باشد. مثلا اگر پلاگین ado و ef5 نصب باشند، در زبانه SQL می‌توانید کوئری‌های اجرا شده و زمان مصرف شده آن‌ها را مشاهده نمایید

زبانه دیگر Timeline است که زمان انقیاد اشیاء و رویدادها را بصورت گرافیکی نمایش می‌دهد.

در مطلب بعدی به جزئیات بیشتری از این ابزار می‌پردازم.
نظرات مطالب
نحوه اجباری کردن استفاده از WWW در ASP.NET MVC
سلام و تشکر.
اشکال این روش اینه که اگه درخواستی به برنامه برسه که توسط action‌ها پاسخ داده نمیشه، باز کماکان با مشکل قبلی مواجهیم. مثلا در رابطه با هندلرها یا فایل‌های استاتیک (البته خوب شرایطی هم هست که بعنوان مثال در رابطه فایل‌های استاتیک نیاز نیست ریدایرکشن صورت بگیره - کلی عرض میکنم). روش بهتر استفاده از یه HttpModule هست که البته باز این اشکال رو داره که (با توجه به تنظیمات) ممکنه برای همه درخواست‌ها اجرا نشه.
روشی بعدی که به نظرم ایده آل هست و خودم همیشه استفاده میکنم UrlRewrite  هست که امروزه تقریبا میشه گفت روی همه سرورها نصبه. یا اگه هم نصب نباشه، اکثر سرورا دسترسی ریموت به IIS میدن که میشه نصبش کرد.
ضمن این که جدای موضوع کوکی‌ها که خودش مبحث مفصلی هستش و فقط مربوط به اعتبارسنجی نمیشه، موضوع مهم دیگه نحوه برخورد موتورهای جستجو -مخصوصا گوگل- با سایتهایی ـه که هر دو آدرس با و بدون wwwشون در دسترسه. یعنی مثلا از دیدگاه گوگل، حتما یکی از آدرس‌ها باید Redirect Permanently بشه روی اون یکی. البته این داستان، سرِ درازی داره. سعی کردم خلاصه کنم. باز هم ممنون از شما. پاینده باشید.
نظرات مطالب
توسعه سیستم مدیریت محتوای DNTCms - قسمت اول
سلام و خسته نباشید .
  با استفاده از سری مقالات طراحی افزونه پذیر با Asp.net می‌شد یک سیستم پایه طراحی کرد و سپس ماژولها را به سیستم معرفی نمود.
با توجه به اینکه در این سری مقالات از اینترفیس برای توسعه ماژولها استفاده می‌شود دوستان متعددی می‌توانستند بدون وابستگی به دیگر ماژولها ، سیستم مذکور را توسعه دهند .
مسیرراه‌ها
React 16x
پیش نیاز ها
کامپوننت ها
ترکیب کامپوننت ها
طراحی یک گرید
مسیریابی 
کار با فرم ها
ارتباط با سرور
احراز هویت و اعتبارسنجی کاربران 
React Hooks  
توزیع برنامه

مدیریت پیشرفته‌ی حالت در React با Redux و Mobx   

       Redux
       MobX  

مطالب تکمیلی 
    مطالب
    آغاز کار با الکترون
    در مقاله «آشنایی با الکترون» با نحوه نصب و راه اندازی آن آشنا شدیم. در این مقاله با تعدادی اصطلاح، آشنا شده و یک برنامه ساده را برای نوشتن و خواندن فایل‌ها، می‌نویسیم.
    فرآیندها (Processes) در الکترون به دو بخش تقسیم می‌شوند:

    یک. فرآیند اصلی (Main Process) که همان فایل جاوااسکریپتی است و توسط main، در فایل package.json مشخص شده‌است .فرآیند اصلی تنها فرآیندی است که قابلیت دسترسی به امکانات گرافیکی سیستم عامل را از قبیل نوتیفیکشن ها، دیالوگ‌ها ،Tray و ... دارد. فرآیند اصلی می‌تواند با استفاده از شیء BrowserWindow که در قسمت قبلی کاربرد آن را مشاهده کردیم، render process را ایجاد کند. با هر بار ایجاد یک نمونه از این شیء، یک Render Process ایجاد می‌شود.

    دو. فرآیند رندر (Render Process): از آنجا که الکترون از کرومیوم استفاده می‌کند و کرومیوم شامل معماری چند پردازشی است، هر صفحه‌ی وب می‌تواند پردازش خود را داشته باشد که به آن Render Process می‌گویند. به طور معمول در مرورگرها، صفحات وب در محیطی به نام SandBox اجرا می‌شوندکه اجازه دسترسی به منابع بومی را ندارند. ولی از آنجا که الکترون می‌تواند از Node.js استفاده کند، قابلیت دسترسی به تعاملات سطح پایین سیستم عامل را نیز داراست.

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


    در ابتدا قصد داریم یک منو برای برنامه‌ی خود درست کنیم. برای ساخت منو، راه‌های متفاوتی وجود دارند که فعلا ما راه استفاده از template را بر می‌گزینیم که به صورت یک آرایه نوشته می‌شود. کدهای زیر را در فایل index.js یا هر اسمی که برای آن انتخاب کرده‌اید بنویسید:
    const electron = require('electron');
    const {app,dialog,BrowserWindow,Menu,shell} = electron;
    
    let win;
    
    app.on('ready', function () {
      win = new BrowserWindow({width: 800, height: 600});
      win.loadURL(`file://${__dirname}/index.html`);
    
    var app_menu=[
      {
        label:'پرونده',
        submenu:[
          {
            label:'باز کردن',
            accelerator:'CmdOrCtrl+O',
            click:()=>{
            }
          },
          {
            label:'ذخیره',
            accelerator:'CmdOrCtrl+S',
            click:()=>{
            }
          }
        ]
      },
      {
        label:'سیستم',
        submenu:[
            {
            label:'درباره ما',
            click:()=>
            {
                       shell.openExternal('https://www.dntips.ir');
            }
          },
          {
            label:'خروج',
            accelerator:'CmdOrCtrl+X',
            click:()=>
            {
              win=null;
              app.quit();
            }
          }
        ]
      }
    ];
    تا به اینجای کار، بیشتر کدها برای شما آشناست و فقط تغییرات اندکی در آن‌ها ایجاد شده‌است. مثلا شیء app و سایر اشیاء به طور خلاصه‌تری نوشته شده‌اند. در اینجا دو شیء menu و dialogو shell برای شما جدید هستند. بعد از آن ما یک آرایه را برای منو تدارک دیده‌ایم که نحوه ساخت آن و تعاریفی مثل عنوان، کلید میانبر یا ترکیبی و نحوه انتساب رویدادها را می‌بینید.
     
    در خطوط بعدی، یک کار اضافه‌تر را جهت آشنایی بیشتر انجام می‌دهیم. قصد داریم اگر سیستم عامل مکینتاش بود، نام برنامه هم در ابتدای نوار منو نمایش داده شود. به همین جهت در ادامه خطوط زیر را اضافه می‌کنیم:
      if(process.platform=="darwin")
      {
        const app_name=app.getName();
        app_menu.unshift({
          label:app_name
        })
      }
    با استفاده از process.platform در node.js می‌توانیم نوع پلتفرم جاری را دریافت کنیم. مقادیر زیر، مقادیری هستند که بازگردانده می‌شوند:

    ویندوز
    win32 حتی اگر 64 بیتی باشد.
     لینوکس  linux
     مک  darwin
     فری بی اس دی
     freebsd
    سولاریس
     sunos
    سپس نام برنامه را از شیء app دریافت می‌کنیم و با استفاده از متد unshift، مقادیر داده شده را به ابتدای آرایه اضافه می‌کنیم.

    دستو shell در بالا به شما اجازه می‌دهد با محیط دسکتاپ، یکپارچگی خود را حفظ کنید و دستوراتی از قبیل باز کردن url، باز کردن یک مسیر دایرکتوری، باز کردن یک فایل، انتقال فایل به سطل آشغال یا بازیافت و صدای بوق سیستم (بیپ) را به شما می‌دهد. مستندات این شیء را در اینجا مطالعه فرمایید.

    دستور app.quit همانطور که از نامش پیداست، باعث خاتمه برنامه می‌شود. ولی یک نکته در اینجا وجود دارد که الزامی به نوشتن کدی برای اینکار نیست. می‌توانید زیرمنوی بالا را به شکل زیر هم بنویسید:
    {
            label:'خروج',
            accelerator:'CmdOrCtrl+X',
            role:'close'
     }
    خصوصیت role شامل چندین نوع اکشن مانند minimize,close,undo,redo و... می‌باشد که لیست کاملتر آن در اینجا قرار دارد. اگر خصوصیت کلیک و role را همزمان استفاده کنید، خصوصیت role نادیده گرفته خواهد شد.

    در انتها با اجرای دو دستور زیر، منو ساخته می‌شود:
      var menu=Menu.buildFromTemplate(app_menu);
      Menu.setApplicationMenu(menu);
    در خط اول، منو توسط قالبی که با آرایه‌ها ایجاد کردیم ساخته می‌شود و در خط دوم، منو به برنامه ست می‌شود.
    حال قصد داریم برای زیرمنوی «باز کردن فایل» یک دیالوگ open درخواست کنیم. برای این کار از شیء dialog استفاده می‌کنیم. پس خطوط زیر را به رویداد کلیک این زیرمنو اضافه می‌کنیم:
     dialog.showOpenDialog({
                 title:'باز کردن فایل متنی',
                  properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ]
                 ,filters:[
                 {name:'فایل‌های نوشتاری' , extensions:['txt','text']},
                 {name:'جهت تست' , extensions:['doc','docx']}
                  ]
               },
                 (filename)=>{
                   if(filename===undefined)
                      return;
                   dialog.showMessageBox({title:'پیام اطلاعاتی',type:"info",buttons:['تایید'],message:`the name of file is [${filename}]`});
                });
    این متد سه پارامتر دارد که اولین و آخرین پارامتر آن اختیاری می‌باشد. اولین پارامتر آن شیء پنجره است. دومین پارامتر آن، تنظیم یک سری خصوصیات که شامل (پسوند‌های قابل قبول، عنوان، مسیر پیش فرض، قابلیت انتخاب چندگانه، قابلیت باز کردن دایرکتوری و...) می‌شود که لیست کامل آن را می‌توانید در این صفحه ببینید. سومین پارامتر هم که در کد بالا ذکر شده است، callback می‌باشد که خروجی آن، مسیر فایل مورد نظر است و اگر انتخاب چندگانه باشد، آرایه‌ای با نام فایل‌هاست، که همگی آن‌ها به همراه مسیرشان می‌باشند. در صورتیکه کاربر از دیالوگ انصراف بدهد، پارامتر دریافتی با خروجی undefined همراه است.  آخرین دیالوگ هم نمایش یک پیام ساده است که نام فایل جاری را بر میگرداند. اگر خصوصیت buttons را با آرایه خالی مقداردهی کنید، دکمه Ok نمایش داده می‌شود و اگر هم مقداردهی نکنید با خطا روبرو خواهید شد.
    برای قسمت ذخیره هم کد زیر را می‌نویسیم:
        dialog.showSaveDialog({
                title:'باز کردن فایل متنی',
                 properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ]
                ,filters:[
                {name:'فایل‌های نوشتاری' , extensions:['txt','text']}
                 ]
              },
                (filename)=>{
                  if(filename===undefined)
                     return;
    
               });

    حال بهتر است این دیالوگ‌های جاری را هدفمند کنیم و بتوانیم فایل‌های متنی را به کاربر نمایش دهیم، یا آن‌ها را ذخیره کنیم. به همین علت فایل html زیر را نوشته و طبق دستوری که در مقاله «آشنایی با الکترون» فرا گرفتیم، آن را نمایش می‌دهیم:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title></title>
      </head>
      <body>
        Fie Content:<br/>
        <textarea id="TextFile" cols="100" rows="50"></textarea>
     
      </body>
    </html>
    برای تشکیل ساختار HTML می‌توانید عبارت HTML را تایپ نمایید تا بعد از زدن Enter، ساختار آن به طور خودکار تشکیل شود. سپس محتوا را مثل بالا به شکل دلخواه تغییر می‌دهیم.

    کاری که می‌خواهیم انجام دهیم این است که فایل متنی را باز کرده و محتوای آن را در کادر متنی نشان دهیم و موقع ذخیره نیز محتوای نوشته شده در کادر متنی را در فایلی ذخیره کنیم. از آنجا که main Process به المان‌های DOM یا Render Process دسترسی ندارد، باید از طریقی، ارتباط آن را برقرار کنیم. یکی از راه‌های برقراری این ارتباط، IPC است. IPC در واقع یک فرستنده و یک شنونده است که هر کدام در یک سمت قرار گرفته اند. فرستنده پیام را تحت یک عنوان ارسال می‌کند و شنونده منتظر دریافت پیامی تحت همان عنوان میماند و پیام دریافتی را پاسخ می‌دهد. در این مقاله، ما فقط قسمتی از این نوع ارتباطات را بررسی میکنیم.

    در نتیجه محتوای callback کدهای دیالوگ open و save را به شکل زیر تغییر می‌دهیم:
    Open
     dialog.showOpenDialog({
                     title:'باز کردن فایل متنی',
                      properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ]
                     ,filters:[
                     {name:'فایل‌های نوشتاری' , extensions:['txt','text']},
                     {name:'جهت تست' , extensions:['doc','docx']}
                      ]
                   },
                     (filename)=>{
                       if(filename===undefined)
                          return;
    
                          win.webContents.send('openFile',filename);
                      // dialog.showMessageBox({title:'پیام اطلاعاتی',type:"info",buttons:['تایید'],message:`the name of file is [${filename}]`});
                    });
    Save
      dialog.showSaveDialog({
                    title:'باز کردن فایل متنی',
                     properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ]
                    ,filters:[
                    {name:'فایل‌های نوشتاری' , extensions:['txt','text']}
                     ]
                  },
                    (filename)=>{
                      if(filename===undefined)
                         return;
                           win.webContents.send('saveFile',filename);
                   });
    دستور win.webContents.send یک پیام را به صورت Async به سمت RenderProcess مربوطه ارسال میکند. پارامتر اول، عنوان IPC است و پارامتر دوم، پیام IPC است.
    برای ایجاد شنونده هم کد زیر را به فایل index.html اضافه می‌کنیم:
      <script>
        const {ipcRenderer} = require('electron');
        var fs=require('fs');
    
        ipcRenderer.on('openFile', (event, arg) => {
          var content=  fs.readFileSync(String(arg),'utf8');
          document.getElementById("TextFile").value=content;
        });
    
        ipcRenderer.on('saveFile', (event, arg) =>{
          var content=document.getElementById("TextFile").value;
          fs.writeFileSync(String(arg),content,'utf8');
          alert('ذخیره شد');
        });
        </script>

    در اینجا شونده‌هایی را از نوع ipcRenderer ایجاد می‌کنیم و با استفاده از متد on، به پیام‌هایی تحت عنوان‌های مشخص شده گوش فرا می‌دهیم. پیام‌های ارسالی را که حاوی آدرس فایل می‌باشند، به شیءای که از نوع fs می‌باشد، می‌دهند و آن‌ها را می‌خوانند یا می‌نویسند. خواندن و نوشتن فایل، به صورت همزمان صورت میگیرد. ولی اگر دوست دارید که به صورت غیر همزمان پیامی را بخوانید یا بنویسید، باید عبارت Sync را از نام متدها حذف کنید و یک callback را به عنوان پارامتر دوم قرار دهید و محتوای آن را از طریق نوشتن یک پارامتر در سازنده دریافت کنید.

    فایل‌های پروژه
     

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

    متد sys.dm_fts_index_keywords

    این متد محتوای full-text index یک جدول را باز می‌گرداند. از آن می‌توان برای موارد ذیل استفاده کرد:
    - آیا واژه کلیدی خاصی جزو full-text index است؟
    - چه تعداد رکورد دارای واژه‌ی کلیدی خاصی هستند؟
    - متداولترین واژه‌های کلیدی موجود در ایندکس کدامند؟
    - کدام واژه را می‌توان به عنوان stop word تشخیص داد؟ شاید پس از بررسی، تشخیص داده شود که بهتر است متداولترین واژه‌ی کلیدی ایندکس شده، به stop list اضافه شود.

     SELECT *
    FROM sys.dm_fts_index_keywords(DB_ID(DB_NAME()), OBJECT_ID(N'dbo.Documents'));



    متد sys.dm_fts_index_keywords_by_document

    این متد اطلاعاتی را در سطح اسناد باز می‌گرداند. کاربردهای آن می‌توانند شامل موارد زیر باشند:
    - یافتن جمع تعداد واژه‌های کلیدی که یک full-text index دارا است.
    - آیا واژه‌ی کلیدی مورد نظر، در ردیف در حال بررسی وجود دارد؟
    - یک واژه‌ی کلیدی چندبار در کل ایندکس ظاهر شده‌است؟
    - یک واژه‌ی کلیدی در یک ردیف یا سند مشخص، چندبار تکرار شده‌است؟
    - یک ردیف یا سند، از چند واژه‌ی کلیدی تشکیل شده‌است؟

     SELECT
     I.document_id,
     D.title,
     I.display_term,
     I.occurrence_count
    FROM sys.dm_fts_index_keywords_by_document(DB_ID(DB_NAME()), OBJECT_ID(N'dbo.Documents')) AS I
    INNER JOIN dbo.Documents D
    ON D.id = I.document_id;



    متد sys.dm_fts_index_keywords_by_property

    در قسمت‌های قبل، خواص و متادیتای اسناد آفیس را نیز ایندکس کردیم. این متد، اطلاعات مرتبط با خواص اسناد موجود در full-text index را باز می‌گرداند.
    کاربردهای آن:
    - چه محتوایی، در خاصیتی مشخص از سندی معلوم، ذخیره شده‌است؟
    - خاصیت مورد نظر چه اندازه بکار رفته و تکرار شده‌است؟
    - چه اسنادی دارای خاصیتی مشخص هستند؟

     SELECT
     I.document_id,
     D.title,
     I.display_term,
     I.property_id
    FROM sys.dm_fts_index_keywords_by_property(DB_ID(DB_NAME()), OBJECT_ID(N'dbo.Documents')) AS I
    INNER JOIN dbo.Documents D
    ON D.id = I.document_id;



    متد sys.dm_fts_parser

    متدهای قبلی که بررسی کردیم، نیاز به یک جدول و وجود full-text index بر روی آن دارند؛ اما متد dm_fts_parser خیر. این متد یک ورودی را گرفته و سپس تمام مراحل تهیه‌ی یک full-text index را به صورت پویا انجام می‌دهد.
    کاربردهای آن:
    - درک اینکه موتور FTS با یک ورودی رشته‌ای چگونه رفتار می‌کند.
    - استخراج ایندکس‌های یک متن و ذخیره‌ی دستی آن در یک جدول.
    - استخراج واژه‌های کلیدی یک رشته.
    - آنالیز پویای INFLECTIONAL (مانند مثال زیر)
     SELECT
     display_term,
     keyword
    FROM sys.dm_fts_parser(N'"Mycustom string"', 1033, NULL, 0);


     SELECT *
    FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,'+ 'term' + ')', 1033, NULL, 0);


    در اینجا پارامتر دوم آن شماره زبان مورد استفاده است. پارامتر سوم مشخص کننده‌ی stop list می‌تواند باشد و پارامتر سوم حساسیت به لهجه را مشخص می‌کند.
    اشتراک‌ها
    نظرات اسپم و روش جلوگیری از آن‌ها

    وجود کامنت‌های مفید و متعدد در یک صفحه‌ی اینترنتی، نشانه‌ای از کیفیت و مشارکت کاربران سایت شما به حساب می‌آید و ممکن است اثرات مثبتی در افزایش رتبه‌ی سئو سایت شما ایفا کند.

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

    نظرات اسپم و روش جلوگیری از آن‌ها
    نظرات مطالب
    ساخت یک Form Generator ساده در MVC
    مشکل طراحی بانک اطلاعاتی با تغییر نوع ارتباط دو موجودیت فیلد و مقدار از یک به یک به یک به چند و گذاشتن فیلدی از نوع guid در موجودیت مقدا ر قابل اصلاح است .
    هر فرم میتواند حاوی چندین فیلد و هر فیلد حاوی چند مقدار و اطلاعات ارسالی کاربر با مقدار دهی فیلد guid جدول مقادیر که امکان پست‌های متعدد کاربران و تمییز دادن اینکه کدام مجموعه از داده‌های جدول مقدار در هر دفعه ارسال؛  ثبت شده اند .
    نظرات مطالب
    EF Code First #12

    با خوندن مطالب فوق این طور بر میاد که در Ef یک Context به صورت Singleton ایجاد بشه تا هم بهینه باشه و هم مباحث مدیریت Transactionها و غیره به راحتی مدیریت بشه.

    اما در  اینجا StackOverflow در این خصوص خوندم که بهتره برای هر thread یک Context مجزا ایجاد کرد و سیستم Pools کانکشن تکراری و ارتباط متعدد را چک می‌کند.

    بنده اشتباه برداشت کردم و یا سیستم Pool استفاده دیگره ای دارد .

    نظرات مطالب
    NOSQL قسمت سوم

    اگر مطالب مقدماتی‌تر رو مطالعه می‌کردید، می‌دید که اصلا هدف از بانک اطلاعاتی NoSQL این نیست که باهاش سایت معمولی درست کنند اون هم روی سرور اجاره‌ای با 100 مگ فضا. هدفش توزیع شده بودن در سرورهایی متعدد و یا با پراکندگی جغرافیایی بالا است.

    نتیجه گیری؟ ابزار زده نباشید. اول مفاهیم رو مطالعه کنید. اول تئوری کار مهمه.