رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

فرهاد شیری

مدیران مرجع
  • تعداد ارسال ها

    120
  • تاریخ عضویت

  • روز های برد

    35

آخرین بار برد فرهاد شیری در 29 تیر

فرهاد شیری یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

134 عالی

2 دنبال کننده

درباره فرهاد شیری

توسعه‌ دهنده بَک اِند
توسعه‌ دهنده فرانت اِند
اساتید
  • تاریخ تولد 20 مهر 1360

موقعیت

  • شهر
    تهران

آخرین بازدید کنندگان نمایه

543 بازدید کننده نمایه
  1. فرهاد شیری

    دوست گرامی! اگر منظورتون استفاده از پلتفرم هایی مثل کیوت که توانایی ایجاد خروجی اندروید هم دارند که می توان بازبان ++C هم برای این پلت فرم برنامه نوشت، هست که باید عرض کنم هرچند قبلا خیلی بحث شده! ولی اینکه Qt,QML را یاد بگیرید خیلی از مباحث اندروید را هم یاد میگیرید باید عرض کنم خیر! حالا چرا به این علت که اغلب این فریم وورک هایی که توانایی خروجی دادن اندروید را هم دارن خودشون مستقل از اندروید یک تفسیر کننده دارند! مثلا برای همین کیوت شما کلا با مفاهیم Activity , Fragment ,... برای ایجاد GUI های تعامل با کاربران کاری نخواهید داشت بلکه زبان مستقلی به نام QML را باید یاد بگیرید واز اون استفاده کنید. والبته خیلی بحث های دیگه .... بنابراین خیلی خوب که پارالل هم اندروید جاوا را یاد یگیرید وهم پلت فرم Qt, QML را یاد بگیرید. البته پیشنهاد میکنم حتما کتاب آموزش Qt جناب اسدزاده را تهیه کنید، کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) 1.3.7
  2. دقیقا چه بخشی را متوجه نمیشید؟ هر Content Provider می تونه متد های مختلفی برای insert داشته باشه! سوال شما مبهمه در ضمن بهتره کمی درباره Content Provider ها مطالعه داشته باشید اغلب سوالات خودتون را پیدا میکنید!
  3. یک Content Provider ارائه دهنده محتوا داده ها از یک برنامه به برنامه های دیگر بر اساس درخواست عرضه میکنه! معمولا چنین درخواست هایی توسط کلاس ContentResolver انجام می شود. یک ارائه دهنده محتوا می تواند از روش های مختلف برای ذخیره داده های خود استفاده کند و داده ها را می توان در پایگاه دادهSQLlite، فایل ها یا حتی در وب سرویس ها ذخیره کرد. اگر بخوام بهتر توضیح بدم اینطور بگم در سیستم عامل ویندوز که ابزارهای مختلفی برای ذخیره سازی داده ها وجود دارد مانند SQL Server , Oracle ,Access,Excel,... بنابراین محل های ذخیره سازی زیادی داریم که بنا بر استراتژی نرم افزارهای خودمون از یکی از این ابزارها ویا از چنتاشون باهم استفاده میکنیم خوب حالا ویندوز برای اینکه تمامی این ابزارها با هم سینک باشن و بتونیم به راحتی باهشون ارتباط برقرار کنیم ابزارهایی مثل ODBC,ADO,ADO.NET,.... را تدارک دیده که دقیقا همون کاری را میکنن که Content Provider ها در اندروید انجام میدن! به این آموزش هم مطالعه کنید یک مثال ساده هم وجود داره! - Android - Content Providers
  4. فرهاد شیری

    نه آقا چه حرفی! برخوردن دیگه چی!(من نمیدونم این بدعت کی گذاشته که ماهرچی بگیم منتج به این حرف میشه! شما فرمودید که توجه نکردید، منهم عرض کردم که متوجه اون مثال شدم. این کجاش برخوردنه میخواهید یک قالب درست کنید توسایت که طبق همون جواب سوالها را بدیم اگر برمیخورد که نمیخندیدم اتفاقا نه تنها برنخورد بلکه برام جالب بود که اصولا دست به پیچوندن خوب دارید ماگفتیم مثال برای کاری که انجام دادید بذار شما اومدی میگی گذاشتم توجه نکردید دوست عزیز حال نداری مثال بذاری چرا توپ میندازی زمین ما... تشکر بابت توضیحی که دادید. قطعا من اگر میخواستم استفاده کنم همین مثالی که مربوط به خود مفسر اسکریپت بود، معرفی کردید ازش استفاده میکردم، ولی من گفتم مثال برای کسانی که شاید نتونن به خوبی ازش استفاده کنن کمی قابل درکتر و راحت بشه! دوست گرامی! من ناراحت نشدم ولی به هرحال تشکر از حسن لطف شما
  5. و البته زمانی که از نخ ها مانند AsyncTask استفاده میکنید و عملیاتهای مختلف I/O انجام میدید بهتره که از همه اکسپشن ها را در یک Try ارسال نکنید و همچنین از یک خاصیت به نام autoclose هم می توانید برای کلاسهای جاوا استفاده کنید که نیازی به نوشتن متد close برای هر کلاس ورودی و خروجی نداشته باشید. مثال ویرایش شده... @Override protected String doInBackground(String... params) { try(URL url=new URL("http://s8.picofile.com/d/8349389850/06c69ac4-70fb-4d33-991f-ac01b8c5324f/b.mp3")){ URLConnection connection=url.openConnection(); connection.connect(); try( InputStream fis=new BufferedInputStream(url.openStream(),10*1024)){ try(FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/saeed.mp3")){ int c=0; byte[] d=new byte[1024]; while ((c=fis.read(d))!=-1){ fos.write(d,0,c); } fos.flush(); } catch (IOException expOutPutStream) { expOutPutStream.printStackTrace(); } } catch (IOException expInputStream) { expInputStream.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } return null; }
  6. فرهاد شیری

    قطعا دقت کردم ظاهرا شما دقت نکردید که اون مثال مربوط به پست شما نیست ! انشاالله اگر بی دقت نباشیم!! منظورمون از مثال برای این پست بود...
  7. کلاس بافر یک Wrapper برای کلاس InputStream هست که امکان استفاده از یک بافر داخلی(آرایه داخلی) را به شما میده که میتونه سرعت بهتری نسبت به کلاس Base به شما بده! و اینکه چه مقادیری برای استریم های ارسالی و دریافتی تعیین میکنید بسته به شرایط ونوع فایل ها متفاوت هست! مثلا وقتی در کلاس بافر سایز تعریف میکنید باید به این نکته توجه کنید که درصورتی که یک بایت را بخواهید شیفت بدید کلاس بافر میاد از کلاس Array.copy استفاده میکنه وتمام بایت ها را دوباره مینویسه بنابراین در صورتی که این مقادیر را بیش از اندازه بزرگ تعریف کنید هزینه ی زیادی براتون داره در مصرف منابع حافظه. ویا وقتی یک آرایه از بایت ها تعریف میکنید بهتر هست که کمترین سایز ممکن را تعریف کنید که در صورتی که به هردلیل مشکلی در آرایه بایت ها به وجود آمد هزینه کمتری بابت از دست رفتن منابع بدهید به همین علت است که معمولا فایلهای خیلی بزرگ را در نخ های Background دانلود میکنن ونه در نخ اصلی ودریکبار بافر کردن داده ها. استریم بایت ها را به صورت بسته های خیلی کوچک در یک نخ کاربری background دریافت میکنن و در زمان مناسب همه بایت ها را به هم وصل میکنن! توجه داشته باشید که برنامه نویسی در زبانهای جاوا و دات نت اتلاف منابع حافظه ای زیادی میتونه در بر داشته باشه بنابراین باید همیشه به این نکات توجه داشته باشید. پیشنهاد میکنم این مطالب راهم مطالعه کنید! 10 تکنیک کاربردی که باعث بهینه شدن عملکرد برنامه های جاوا می شود
  8. فرهاد شیری

    اول از سوال دوم شروع کنم ! فلسفه SP ها در SQLServer به علت اینکه دستوری به نام Alter وجود دارد این امکان را به برنامه نویس میده که هر وقت خواست کل منطق SP را مجددا بنویسه و SP جدید را Execute کنه که خوب البته که این امکان فوق العاده ست ولی باعث از بین رفتن یکپارچگی داده هم میشه! و البته که این مهم به علت وجود دستور Alter هست و الباقی ماجرا... فکر کنم در پست های بالایی هم اشاره کردم که برای این کار باید از Meta Data ها استفاده کنید یعنی تمامی این شرایط که می فرمایید اگر از قبل روشن هست که خوب بهتر اگرهم نیست کافی امکانی تدارک ببنید که کاربر سیستم بتونه این متادیتاها را ایجاد کنه و حالا تمام مقادیری که برای اجرا شدن منطق های مختلف نیاز دارید را کافی در این متا دیتا ها کپسوله کنید و در سمت برنامه هم parser هایی بنویسید که این مقادیر را از متا دیتاها Map کنن داخل کلاسهای Model که دارید و در کلاسهای Logic از این مدل ها استفاده کنید و لایه Viewهم براساس تصمیمات Logic خروجی مناسب را نمایش بده! این مثال که عرض میکنم کاملا واقعی هست و همین الان در حوزه صنعت ریلی کشور در حال استفاده است، یعنی ما برای اینکه بتوانیم رفتارهای سنسورها و تمامی المانهایی که به صورت سخت افزاری برای نرم افزارهای کنترلی که نوشته ایم دیتا ارسال کنند وبرای اینکه هر ایستگاه قطارهای برون شهری با هم کاملا متفاوت هستند و حتی این تفاوت در ایستگاه های متروها هم کاملا متفاوت هست بنابراین با رفتارهای متفاوت سخت افزارهای متفاوتی روبه رو هستیم بنابراین قطعا متادیتاهایی داریم که به صورت مجزا هر ایستگاه را کاملا جداگانه با نوع داده ها و رفتارهای متفاوت تعریف میکنیم داخل نرم افزارهای اصلی هم تعریف کردیم که فقط از این متادیتا ها برای منطق کنترل سیگنالینگ خطوط استفاده کنند.در پست های قبلی هم براتون یک نمونه قرار دادم. پس نه به مفسر اسکریپتوری نیاز دارید ونه به هیچ ابزار دیگه ای! البته یا باید خودتون Parser ها را بنویسید ویا اگر از فرمت های استاندارد برای متادیتا ها استفاده میکنید، مثلا JSON,GSON,XML می توانید از کلاس های Parser که برای این فرمت داده ها وجود دارد هم استفاده کنید. قطعا هم سیستمی به مراتب Scalability بهتر وهم Responsibility بسیار بهتری خواهد داشت، وهم Configurable خواهد بود. بنابراین کافی که این شرایط که مثلا باید خودرو ها داشته باشند ویا منطق های تصمیم گیری که ذکر کردید را در یک متادیتا فایل استاندارد تعریف کنید و در زمان مناسب اونها را parse کنید. ویا یک نمونه ملموس تر همین فایلهای Make که برای کامپایل برنامه ها استفاده میکنیم شما در این فایلها مجموعه ای از قوانین مختلف و شرایط مختلف را دارید تعریف میکنید این کامپایلر هست که تصمیم میگیره چه تصمیمی بگیره براساس این داده ها بنابراین همانطور که مشاهده میکنید کامپایلرها هم از متادیتاها برای رفع این معضل استفاده میکنند. بنابراین همین مدل داده ای که دارید را کافی که در یک فایل متادیتا اکستراکت کنید و تغییرات لازم را اعمال نمایید و الباقی سناریو.... امیدوارم توضیحاتم مفید فایده باشه!
  9. فرهاد شیری

    نکات جالبی را ارائه دادید! در صورت امکان مقاله ای هم درباره همین تضادها درباره GUI در نرم افزارها با متریالهای Design Pattern چه در سیستم عامل های Personal Computer ویا سیستم عامل های Smart Phone ارائه بدید بی نهایت سپاسگزار خواهم شد!
  10. فرهاد شیری

    کلا خود کروم چی بود که حالا بخواد از توابع اون استفاده کنه! به نظر من که موزیلا خیلی خیلی بهتر از هر مرورگری هست! مرورگرهای کند و به شدت خطا دار مایکروسافت که در ویندوزهای خودش ارائه میده تا حالا که چیزی برای ارائه نداشتن، چه از نسخه های اولیه که در ویندوز 95 ارائه داد که البته اونموقه مجبور بودیم چون انحصاری بود استفاده میکردیم چه همین IE که روی ویندوز 10 ارائه دادن شخصا ترجیح میدم از اینترنت استفاده نکنم تا مجبور باشم از IE های مایکروسافت استفاده کنم
  11. فرهاد شیری

    قطعا مفسر اسکریپتی Lua خیلی معروفتر و تکمیلتر از اسکریپتور معرفی شده در پست های قبلی اشاره شد، ولی روش کار همون هست. خیر تغییر logic میسر نخواهد بود! بهتر بود یکم سناریوی خودتون را واضحتر بیان کنید تا روشهای بهتری بشه پیشنهاد داد!
  12. فرهاد شیری

    اگر منظورتون از تغییر کد helloWorld این هست که در در زمان اجرا کلا logic تابع که الان دستور return هست را تغییر بدید ویا logic جدیدی اضافه کنید که همانطور که توضیح داده شد خیر نه این زبان اسکریپتی ونه هیچ زبان اسکریپتی دیگری چنین کاری انجام نخواهد داد! فلسفه مفسرهای اسکریپتی اینچنینی این هست که شما در صورتی که توابع مورد نظر خودتون را از قبل کامپایل کرده باشید، می توانید در زمان اجرا با استفاده از دستوراتی که مفسر اسکریپتی در اختیار قرار میده توابع خود را با ورودی های مختلف که می توانند در یک تکست فایل هم قالب بندی شده باشند اجرا کنید. فقط همین...
  13. فرهاد شیری

    اگر یک نمونه مثال هم برای توضیحاتی که دادید ارسال کنید فکر کنم تاثیر بهتری داشته باشه!
  14. فرهاد شیری

    یعنی الان این تابع... std::string helloWorld(const std::string &t_name) { return "Hello " + t_name + "!"; } کامپایل شده ویا در زمان اجر کامپایل میشود.یعنی میشه این تابع را داخل یک فایل تکست نوشت ودر زمان اجرا بدون کامپایل این برنامه تابع فوق را evaluate میکنه! ویا فقط با استفاده از دستورات خود همین مفسر اسکریپتی مثل همین تابع puts , print را می توان به عنوان ورودی رفتار تابع helloWorld را evaluate کرد. به نظر من قطعا باید از قبل رفتار تابع کامپایل شده باشه ولی ورودی های این تابع که با استفاده از تابع puts ارسال میشن چون به صورت رشته هستند قطعا می تونن در زمان اجرا متفاوت باشن! بنابراین حوزه عملکرد این مفسر محدود به توابع سرویس دهنده ای هست که تدارک دیده.!
  15. فرهاد شیری

    یکی از پارادایم های برنامه نویسی همین موضوع کنترل رفتارهای برنامه در شرایط و ورودی های مختلف هست. یکی از راه های پرکاربرد که در سیستم عامل لینوکس هم خیلی شایع هست استفاده از متا دیتا فایلهاست یعنی شما نوع رفتاری که برنامه باید ازخودش نشون بده را داخل یک فایل تکست می نویسید مثل فایل زیر.... [TEST_CYCLE]=15; [AXLE_ELEMENT_ID]=4; [NET]=0,[CPU]=0 #Byte-1 #If you put in this byte true can be receive data from this NET and CPU. Otherwise put false can't receive data. # [RECEIVE]=true; #NOTHING, RESET, NEVER_SENT, MISMATCH # [IO_STATUS]=NOTHING; #OD_NORMAL, RX_TIMEOUT, TX_TIMEOUT, CD_CUT # [OD_COMM]=OD_NORMAL; #Just submit the errors you want # #(FL_NORMAL_MASK,FL_FPGA_LIVE) - (SH_NORMAL_MASK,SH_SECOND_HALF) - (FH_NORMAL_MASK,FH_FIRST_HALF) # [ERROR_FL_SH_FH]=FL_FPGA_LIVE | SH_SECOND_HALF | FH_FIRST_HALF |; #Byte-1 #Just submit the faulty you want #(PG_ERREONOUS,PG_NO_ERREONOUS_MASK ) - (PULS_ERREONOUS,PULS_NO_ERREONOUS_MASK) - (PILOT1_ERREONOUS, PILOT1_NO_ERREONOUS_MASK) # #(PILOT2_ERREONOUS,PILOT2_NO_ERREONOUS_MASK) - (RESET_ACK 0, NORMALLY_MASK 1)-(MiCRO_ERREONOUS 0, MiCRO_NO_ERREONOUS_MASK 1) # [FAULTY_ERROR]=PG_ERREONOUS | PULS_NO_ERREONOUS_MASK | PILOT1_NO_ERREONOUS_MASK | PILOT2_NO_ERREONOUS_MASK | NORMALLY_MASK | MiCRO_NO_ERREONOUS_MASK |; #If you put in this 3 bytes ($), then the original byte will be used. Otherwise, enter a number. # #Byte-1 [AXLE_COUNTER_VALUE]=$; #Byte-1 [CYCLE_COUNTER_VALUE]=$; #Byte-1 [CRC_VALUE]=$; حالا وقتی برنامه را با متادیتا های فوق بنویسید یعنی رفتار برنامه را در زمان اجرا می توانید تغییر بدید! البته بحث استفاده از متادیتا ها خیلی گسترده است با چند خط نمیشه توضیح داد ولی جان مطلب همین بود که عرض کردم فکر کنم کار شما را راه بندازه! اصولا چه نیازی هست که شما بخواهید از داخل برنامه سی پلاس پلاس کدهای پایتون را اجرا کنید من فکر میکنم که مطلبی که عرض کردم مشکل شما را رفع میکنه البته لازم هست که کمی هم مطالعه کنید راجع به Meta Data
×
×
  • جدید...