اذهب إلى المحتوى

سمير عبود

الأعضاء
  • المساهمات

    3471
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    34

إجابات الأسئلة

  1. إجابة سمير عبود سؤال في استيراد الصور من json و عرضها في React كانت الإجابة المقبولة   
    إن كانت الصور في مجلد images بداخل المجلد public تحتاج إلى التأكد من المسارات التي تضعها بداخل ملف JSON لتكون بالشكل التالي:
    [ { "id": 1, "name": "Image 1", "url": "images/chair1.jpg" }, { "id": 2, "name": "Image 2", "url": "images/chair2.jpg" }, { "id": 3, "name": "Image 3", "url": "images/chair3.jpg" }, { "id": 4, "name": "Image 4", "url": "images/chair4.jpg" } ] ثم من خلال المكون تقوم بإستيراد ملف json بالشكل التالي:
    import Images from "./records.json"; ثم من داخل المكون تعرض الصور بالشكل التالي:
    import Images from "./records.json"; function App() { return ( <div className="App"> {Images && Images.map(image => { return <div key={image.id} className="card"> <img className="card-img-top" src={image.url} alt={image.name}/> </div>}) } </div> ); } export default App; إن كانت الصور بداخل المجلد src ثم img مثلاً: ملف json بالشكل التالي:
    [ { "id": 1, "name": "Image 1", "url": "img/chair1.jpg" }, { "id": 2, "name": "Image 2", "url": "img/chair2.jpg" }, { "id": 3, "name": "Image 3", "url": "img/chair3.jpg" }, { "id": 4, "name": "Image 4", "url": "img/chair4.jpg" } ] ثم تستخدم require بداخل src:
    import Images from "./records.json"; function App() { return ( <div className="App"> {Images && Images.map(image => { return <div key={image.id} className="card"> <img className="card-img-top" src={require(`./${image.url}`)} alt={image.name}/> </div>}) } </div> ); } export default App; و تُعدل المسارات بما يتوافق معك.
  2. إجابة سمير عبود سؤال في كيف أجعل خيارات اللغة في momentjs تظهر باللغة العربية في Nuxt.js؟ كانت الإجابة المقبولة   
    حاول إستيراد ملف اللغة من المجلد dist بالشكل التالي:
    import moment from "moment" import "moment/dist/locale/ar" moment.locale("ar"); بإمكانك أيضاً استعمال وحدة Day.js Nuxt Module و في التوثيق طريقة التثبيت و إعدادها لتعمل مع nuxt، إضافة اللغات و تعيين اللغة الإفتراضية.
  3. إجابة سمير عبود سؤال في مشكلة في ربط نت بينز بال mySQL كانت الإجابة المقبولة   
    أعتقد أن لديك خطأ في ترتيب المعاملات عند إستدعاء التابع getConnection، يستقبل أولاً  url ثم المستخدم ثم كلمة المرور:
    con = DriverManager.getConnection(url, username, password);  
  4. إجابة سمير عبود سؤال في عدم ظهور الصورة بالمتصفح باستخدام الخاصية background في css كانت الإجابة المقبولة   
    يُرجى توضيح هيكلية الملفات في المجلد الذي تعمل عليه، إضغط على أيقونة الملفات في vscode حتى تظهر الهيكلية وقم بأخذ لقطة شاشة توضح الهيكلية بشكل كامل مع مكان تواجد الصورة.
    أيضاً يرجى توضيح كود ال css الخاص بتنسيقات الخلفية، و طريقة إستعراضك للمشروع عندما تحدث المُشكلة، أي الرابط الذي تفتحه
    غالباً تكون المُشكلة لديك بسبب مسار الصورة حاول إستخدام مسار نسبي يبدأ من ملف التنسيقات وصولاً إلى ملف الصورة:
    بفرض أن هيكلية الملفات لديك:
    css - style.css img - test.png index.html في هذه الحالة ستكتب بداخل الدالة url:
    url('../img/test.png') و ../ تعني إصعد من المجلد الحالي للملف إلى المجلد الأب، أي مجلد المشروع ثم أدخل للمجلد img ستجد ملف صورة بالإسم test.png.
    و هذا ما أعتقد أنه لديك كهيكلية، أعتقد أنه لديك ملف html في مجلد المشروع بالإضافة لمجلد فيه ملفات css و مجلد فيه الصور، عند تشغيل المشروع عبر الإضافة فهو يبدأ الخادم في المجلد الحاوي لملف html و / تعني ذلك المجلد، بالتالي مسار الصورة يكون صحيح. أما عندما تستعرض المشروع عبر فتح ملف html مباشرةً تُصبح / لا تُعبر عن جذر المشروع بل شيء آخر في ملفات النظام.
  5. إجابة سمير عبود سؤال في موعد الامتحان كانت الإجابة المقبولة   
    أهلا بك،
    ستجد كل ما يتعلق بالإمتحان و الشهادة في هذه الصفحة الامتحان والحصول على الشهادة،  الإمتحان ليس له موعد محدد، و إنما الطالب هو من يقوم بالتقدم لطلب موعد للإمتحان بعد إستوفاء الشروط اللازمة و ستجد هذه الشروط في الصفحة السابقة و يتم ذلك من خلال التواصل مع مركز مساعدة أكاديمية حسوب، أيضاً ستجد في الصفحة السابقة خطوات و مراحل سير الإمتحان لذلك أنصحك بالإطلاع عليها، كما أنه يوجد في قاعدة المعرفة عدة أسئلة و مواضيع شائعة يستفسر عنها الطلاب بكثرة.
  6. إجابة سمير عبود سؤال في ترتيب البيانات تصاعدياً او تنازلياً من خلال العلاقة Laravel كانت الإجابة المقبولة   
    يُمكنك إستخدام التابع withAvg كما هو الحال مع withCount او withMax و غيرها، تحتاج فقط أن تمرر إسم العلاقة كمعامل أول و إسم العمود الذي تريد أن تحسب المتوسط من خلاله (أعتقد أن إسم العلاقة لديك هو ratings و إسم العمود stars) بالشكل التالي:
    $users = User::withAvg('ratings', 'stars')->get(); سيظهر لك مع بيانات المستخدم متوسط التقييمات إسم المفتاح سيكون مكون من إسم العلاقة و إسم العمود بينهما avg بالشكل: ratings_avg_stars يمكنك من خلاله.
    يمكنك بعد ذلك إستخدام التابع orderBy أو orderByDesc لترتيب البيانات تصاعدياً او تنازلياً حسب المعدل كما يلي:
    $users = User::withAvg('ratings', 'stars')->orderBy('ratings_avg_stars')->get(); $users = User::withAvg('ratings', 'stars')->orderByDesc('ratings_avg_stars')->get();
  7. إجابة سمير عبود سؤال في لارافيل 9 : كيف استيراد المعلومات منتج باستخدام جدول ف المنتصف كانت الإجابة المقبولة   
    لديك بعض الأخطاء في تعريف العلاقات، عندما نتحدث عن السعر فهو ينتمي لمنتج و ينتمي لمتجر:
    ProductPrice: belongsTo Product belongsTo Store أما عندما نتحدث عن المنتج فنقول أن المنتج لديه عدة أسعار، و موجود في عدة متاجر:
    Product hasMany ProductPrice belongsToMany Store أما عندما نتحدث عن المتجر فنقول أنه يبيع عدة منتجات و لديه عدة أسعار:
    Store: hasMany ProductPrice belongsToMany Product العلاقة بين المتجر و المنتج هي كثير لكثير و الجدول الوسيط هو product_prices.
     
    توابع العلاقات نُعرفها عامة public و ليس protected، أيضاً عند تعريفك للمفاتيح الأولية لم تتبع العُرف لارافل يستخدم id و عليه يجب عليك إعادة تعريف خاصية المفتاح الأولي لكل نموذج و وضع اسم العمود، مثلا في النموذج Product:
    protected $primaryKey = 'product_id'; و في النموذج Store:
    protected $primaryKey = 'store_id'; و في النموذج ProductPrice:
    protected $primaryKey = 'productPrice_id'; و نفس الأمر بالنسبة للبقية.
    عليه عند تعريف العلاقات في النموذج ProductPrice نكتب:
    public function product() { return $this->belongsTo(Product::class, 'product_id', 'product_id'); } public function store() { return $this->belongsTo(Store::class, 'store_id', 'store_id'); } يجب تمرير أسماء الحقول الثانوية في المعاملات (الثاني و الثالث) لأنك غيرت و لم تتبع العرف في التسمية و إن لم تمرر الأسماء الصحيحة ستحدث أخطاء.
    في النموذج Product:
    public function prices(){ return $this->hasMany(ProductPrice::class, 'product_id', 'product_id'); } public function stores() { return $this->belongsToMany(Store::class, 'product_prices', 'product_id', 'store_id'); } أما بالنسبة للنموذج Store:
    public function prices(){ return $this->hasMany(ProductPrice::class, 'store_id', 'store_id'); } public function products() { return $this->belongsToMany(Product::class, 'product_prices', 'store_id', 'product_id'); } أخيراً في المتحكم يُمكنك جلب البيانات بالشكل الذي تريد مثلاً:
    $products = Product::with('prices', 'prices.store')->get(); $stores = Store::with('prices', 'prices.product')->get(); return view('test', compact('products', 'stores')); في ملف العرض يُمكنك الوصول للبيانات بالشكل التالي:
    <h2>Products</h2> <ol> @foreach($products as $product) <li> {{ $product->productName }} <ul> @foreach($product->prices as $price) <li> <strong>Store: </strong> {{ $price->store->storeName }} / <strong>Price: </strong> {{ $price->productPrice }} </li> @endforeach </ul> </li> @endforeach </ol> <hr> <h2>Stores</h2> <ol> @foreach($stores as $store) <li> {{ $store->storeName }} <ul> @foreach($store->prices as $price) <li> <strong>Product: </strong> {{ $price->product->productName }} / <strong>Price: </strong> {{ $price->productPrice }} </li> @endforeach </ul> </li> @endforeach </ol> قمت ببذر بعض البيانات و كانت النتيجة كالتالي:

    ركزت فقط على النماذج الثلاثة Product و ProductPrice  و Store و الحالة التي ذكرتها، بقية النماذج عليك تعريف العلاقات فيها بنفس الشكل.
  8. إجابة سمير عبود سؤال في [PHP] خطأ عند إستخدام الدالة imagettftext كانت الإجابة المقبولة   
    إن السطر:
    imagettftext($image, 25, 0, 25, 110, $color, 'font.ttf', 'PHP:hypertext processor'); معناه أنني اريد كتابة النص "PHP:hypertext processor" على الصورة بحجم خط 25 باللون color و الإحداثيات x و y، و نوع الخط سيكون font.ttf. و هذا هو وصف الدالة في التوثيق الرسمي:
    imagettftext( GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = [] ): array|false font_filename يُشير إلى مسار ملف الخط الذي تريد أن تكتب به على الصورة.
    هل لديك بجانب السكربت ملف خط بالإسم font.ttf أم لا؟ يجب أن يتواجد ملف خط حتى تعمل الدالة، يُمكنك تحميل ملف خط من خلال موقع google fonts و إستخراج ملف الخط الذي تريد إستخدامه و وضع مساره ضمن إستدعاء الدالة، يُمكنك مثلاً إستخدام ملف الخط التالي: Roboto-Regular.ttf و وضعه بجانب السكربت ثم تمرير الإسم للدالة بالشكل:
    imagettftext($image, 25, 0, 25, 110, $color, 'Roboto-Regular.ttf', 'PHP:hypertext processor');
  9. إجابة سمير عبود سؤال في Warning: imagecreatefromjpeg(image.jpgaa): Failed to open stream: No such file or directory كانت الإجابة المقبولة   
    لاحظ رسالة الخطأ:
    تُخبرك أنه لم يجد الملف image.jpgaa و رسالة الخطأ:
    تُخبرك أن المعامل الأول للدالة imagecolorat يجب أن يكون من النوع GdImage بينما استقبلت معامل من النوع bool. ما يعني أن المتغير image لا يحمل قيمة صحيحة و ذلك بسبب السطر:
    $image = imagecreatefromjpeg('image.jpg'); تأكد أنك تكتبه بنفس الشكل لأنه من خلال التحذير يبدو أنه بالشكل التالي:
    $image = imagecreatefromjpeg('image.jpgaa'); تأكد من الحفظ، رُبما غيرت و لم تحفظ الملف، أيضاً تأكد من أن الملف image.jpg يتواجد في نفس المستوى مع ملف السكربت الذي تقوم بتنفيذه.
    حسب الشيفرات التي أرفقتها لا يوجد خطأ في الشيفرة، و إنما الخطأ يمكن أن يكون في الحفظ أو مسار ملف الصورة.
  10. إجابة سمير عبود سؤال في كيفية تحديد قيمة في عنصر select بإستخدام jQuery؟ كانت الإجابة المقبولة   
    لتحديد عُنصر option عن طريق القيمة نستعمل:
    $('.my_selector option[value="value 2"]') ثم إختياره عن طريق التابع prop بالشكل التالي:
    $('.my_selector option[value="value 2"]').prop('selected', true) لتحديد عُنصر ال option بإستخدام الفهرس، الخيار الأول لديه الفهرس 0 و الثاني 1 و هكذا .. نستخدم:
    $('.my_selector option:eq(1)') في مثالك السطر أعلاه سيُحدد العُنصر ذو القيمة value 2 و هو الخيار الثاني. و لإختياره نستخدم التابع prop بنفس الطريقة الأولى.
    إستخدام التابع val لتغيير القيمة لعُنصر select بالشكل:
    $('.my_selector select').val('value 3');
  11. إجابة سمير عبود سؤال في كيفية إيقاف ميزة view caching في لارافيل Laravel؟ كانت الإجابة المقبولة   
    في الإصدارات الأخيرة (> v9.7.0)  تم إضافة إعدادات من خلالها تتمكن من التحكم في ميزة التخزين المؤقت لصفحات العرض ببساطة و ذلك من خلال ملف الإعدادات الخاص بالعُروض config/view.php
    'cache' => App::environment('local') ? false : true يُمكنك الإطلاع على رابط إضافة الميزة في الإطار على github من خلال Add option to disable cached view
    في الإصدارات الأقدم يُمكنك إيقاف الميزة من خلال:
    في ملف env. إضافة: CACHE_DRIVER=none في ملف config\cache.php إضافة التالي إلى مصفوفة stores: 'none' => [ 'driver' => 'null', ], ثم في ملف AppServiceProvider.php بالتابع boot تقوم بإضافة: Cache::extend( 'none', function( $app ) { return Cache::repository( new NullStore ); }); مع تضمين الكلاسات في الأعلى: use Illuminate\Cache\NullStore; use Cache;  
  12. إجابة سمير عبود سؤال في [PHP] دالة file_exists لا تحقق شرطها أين الخطأ كانت الإجابة المقبولة   
    المُشكلة ليست في الدالة و إنما في المسار رُبما هو خاطئ. حاول إستخدام:
    $location = __DIR__ . '/assets/images/common_cloth_composition/'.$image; if (file_exists($location)) { } // أو $location = './assets/images/common_cloth_composition/'.$image; if (file_exists($location)) { } // أو $location = 'assets/images/common_cloth_composition/'.$image; if (file_exists($location)) { } بفرض أن الملف الحالي و المجلد assets موجودان ضمن نفس المستوى.
  13. إجابة سمير عبود سؤال في laravel جعل منتج غير محدود الكمية كانت الإجابة المقبولة   
    لا أدري ما المُشكلة التي تحدث لك لكن السطر المسؤول عن حذف السجل من الجدول الوسيط ليس به خطأ:
    auth()->user()->servicesInCart()->detach($book->id); و أعتقد أنه يعمل.
    ما لاحظته أنه عند حذف كل المُنتج من السلة لا تقوم بعملية إسناد للقيمة الجديدة لاحظ هذا السطر:
    $book->number_of_copies - $oldQuantity; هنا أنت تقوم بعملية طرح فقط كأن تقول 10 - 2 لكن لا تحفظ القيمة الجديدة في خاصية number_of_copies لذلك الكائن. يجب عليك التعديل:
    $book->number_of_copies = $book->number_of_copies - $oldQuantity; // أو $book->number_of_copies -= $oldQuantity; بإمكانك إستخدام التوابع Increment & Decrement مباشرةً عوض اسناد القيمة للخاصية ثم إستدعاء التابع save.
    بهذا الشكل:
    $book->decrement('number_of_copies ', $oldQuantity); بهذا الشكل سيتم التعديل مُباشرة في جدول الكتب. لا تستدعي التابع save.
    و في حالة حذف نُسخة واحدة تستخدم:
    $book->decrement('number_of_copies '); لاحظ لم أمرر قيمة للمُعامل الثاني و في هذه الحالة سيتم إستخدام القيمة الإفتراضية و هي 1 أي أنه سيتم الإنقاص بـ 1 نفس الملاحظة في التابع increment يُمكنك إستخدامه في التابع addToCart.
  14. إجابة سمير عبود سؤال في كيفية حساب الفرق بين تاريخين بالدقائق في PHP؟ كانت الإجابة المقبولة   
    تقوم بتحويل المُتغيرين من سلاسل نصية إلى كائنات DateTime ثم تستخدم التابع diff لحساب الفرق:
    <?php // Enter your code here, enjoy! $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); سيكون الناتج عبارة عن كائن من الصنف DateInterval من خلاله تستطيع الوصول لعدة خاصيات تُساعدك في تحويل الفرق إلى دقائق أو ساعات أو ثواني ...
    <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); echo $since_start->days.' days total<br>'; echo $since_start->y.' years<br>'; echo $since_start->h.' hours<br>'; echo $since_start->i.' minutes<br>'; echo $since_start->s.' seconds<br>'; سيكون الخرج:
    0 days total 0 years 19 hours 54 minutes 12 seconds لحساب الفرق بالدقائق فقط نُحول ناتج الأيام إلى دقائق و نُضيف له ناتج تحويل الساعات إلى دقائق و نضيف له الدقائق كما يلي:
    <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); $minutes = $since_start->days * 24 * 60; $minutes += $since_start->h * 60; $minutes += $since_start->i; echo $minutes.' minutes'; // 1194 minutes أما إن كنت تستخدم مكتبة Carbon فهي تُوفر عدة توابع للتعامل مع التواريخ و الوقت من بينها حساب الفرق بأي وحدة ترغب:
    <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $startTime = \Carbon\Carbon::parse($date1); $finishTime = \Carbon\Carbon::parse($date2); echo $finishTime->diffInHours($startTime) . "<br>"; // 19 echo $finishTime->diffInMinutes($startTime) . "<br>"; // 1194 echo $finishTime->diffInSeconds($startTime) . "<br>"; // 71652 echo $finishTime->diffInSeconds($startTime) . "<br>"; // 71652 $finishTime->diffForHumans($startTime); // 19 hours after $startTime->diffForHumans($finishTime); // 19 hours before \Carbon\Carbon::setLocale('ar'); $startTime->diffForHumans($finishTime); // قبل 19 ساعة
  15. إجابة سمير عبود سؤال في خطأ php logout ? كانت الإجابة المقبولة   
    لا أدري أي رسالة خطأ تظهر لك، لكن مبدئياً لديك خطأ في كتابة التابع: getElementByid لغة جافاسكربت حساسة لحالة الأحرف لذلك فالأصح هو getElementById
    document.getElementById('logout-form').submit();
  16. إجابة سمير عبود سؤال في نقل العناصر من اليمين الى اليسار باستخدام css كانت الإجابة المقبولة   
    إذا لاحظت أنه حتى تُحدد العُنصر الحاوي للزر لتلك المنشورات التي تحتوي على صور فقط هناك شيء إضافي و هو صنف has-post-thumbnail الذي يتواجد في وسم article الذي يحتوي على صورة و لا يتواجد في غيره، من خلاله يُمكنك تحديد العناصر المطلوبة التي تريد أن يكون تنسيقها مختلف:
    article.has-post-thumbnail .page-box .box-content .readmore-btn{ } لاحظ لا يوجد فراغ بين article و has-post-thumbnail. في المحدد لاننا نريد العُنصر article و في نفس الوقت يملك الصنف has-post-thumbnail
  17. إجابة سمير عبود سؤال في جلب بيانات معينة من yajra datatables كانت الإجابة المقبولة   
    يُمكنك من خلال التابع eloquent تكوين الإستعلام الذي تُريد و تمريره له 
    <?php public function dataTable($query) { $query = User::query()->where(function ($q) { if (request()->has('level')) { return $q->where('level', request('level')); } }); return datatables() ->eloquent($query) ... } أو يُمكنك القيام بذلك في الميثود query من صنف Datatable لأنه تم توفيرها لإنشاء و التحكم في الإستعلام كما تشاء:
    <?php public function query() { return User::query()->where(function ($q) { if (request()->has('level')) { return $q->where('level', request('level')); } }); }  
  18. إجابة سمير عبود سؤال في خطأ برمجي لارافيل: ArgumentCountError Too few arguments ؟ كانت الإجابة المقبولة   
    سبب المُشكلة أن الدالة update يجب أن تٌمرر لها 3 معاملات هي request و guest و id حيث أنها تلقت معاملين فقط و هما request و guest أي أن المُعامل الذي لم يتم تمريره هو id عند التنفيذ.
    أي أنه عند وضعك لمسار الدالة الموافق لها يجب تمرير كل من المُعاملين id و guest حيث أن المعامل request يتم حقنه من طرف لارافل تلقائياً.
    هذا ما يعنيه الخطأ أي أنك إن واجهت نفس الخطأ مرة ثانية يجب أن تُفكر بهذا المنطق.
    الآن سأسألك سؤال لماذا أضفت المُعامل id للدالة update و أنت بالفعل تملك بيانات الزائر مُسبقاً في المُعامل guest ؟ في نظري لست بحاجة لتمرير المُعامل id و لست بحاجة لوضعه كمعامل للدالة update كما لست بحاجة لجلب بيانات الزائر (guest) عن طريق:
    $guest= Guest::find($id); لارافل تقوم بذلك تلقائياً عن طريق ما يُسمى بربط النموذج بالمسار (Route model binding) 
    بالتالي كل ما تحتاج له هو مسح المُعامل id من الدالة update و مسح السطر السابق.
  19. إجابة سمير عبود سؤال في مشكلة Identifier 'form' has already been declared في JavaScript كانت الإجابة المقبولة   
    لديك مُشكلة في المُتغير form حيث إستخدمت الإسم form في تعريفك للمُتغير في الأعلى:
    const form = document.querySelector("form"); إستخدمت هنا الكلمة المحجوزة const لتعريف المتغير فأصبح ثابت لا يُمكن إستخدام نفس الإسم لتعريف مُتغير بنفس الإسم لذلك عند تعريفك للمُتغير مرة أخرى:
    var form = document.getElementById("feed-back"); أعطى خطأ وسبب المُشكلة.
    لحل المُشكلة قم بتغيير إسم المتغير في الأسفل إلى إسم آخر:
    var feedForm = document.getElementById("feed-back"); و إستعمال نفس الإسم:
    var feedForm = document.getElementById("feed-back"); async function handleSubmit(event) { event.preventDefault(); var status = document.getElementById("status"); var data = new FormData(event.target); fetch(event.target.action, { method: feedForm.method, body: data, headers: { 'Accept': 'application/json' } }).then(response => { status.classList.add('success'); status.innerHTML = "Thanks We will respond as soon as possible!"; feedForm.reset() }).catch(error => { status.classList.add('error'); status.innerHTML = "Oops! There was a problem submitting your form" }); } feedForm.addEventListener("submit", handleSubmit) أيضاً أنصحك بوضع الأكواد مع بعضهم في الأسفل و نضعهم بداخل:
    document.addEventListener("DOMContentLoaded", function (event) { }); الملف بعد التعديل: FeedBack.html
  20. إجابة سمير عبود سؤال في استفسار بخصوص دورة تطوير واجهات المستخدم في الأكاديمية كانت الإجابة المقبولة   
    إن الدروس 17 كافية لتعلم الأساسيات التي تحتاجها في تعلمك لمجال تطوير الواجهات الأمامية، الهدف من الدورة ليس إحترافك للغة جافاسكربت في حد ذاتها و إنما الدخول في مجال تطوير الواجهات الأمامية و إستخدام التقنيات و اللغات الأساسية في تطوير الويب مع بعضها في مشاريع حقيقية و فعلية و هذا ما يُميز دورات أكاديمية حسوب عن بعضها: الجانب التطبيقي و الجانب التوجيهي هو أكثر شيء مفيد لك في أكاديمية حسوب. ليس الهدف من الدورات هو شرح كل الخاصيات الموجودة في لغة ما و إنما الهدف هو شرح المفاهيم الأساسية التي ستحتاج لها في مجال الدورة و في مُعظم المشاريع أي المفاهيم الأساسية و هذا الجزء سيتم شرحه في مسار الأساسيات و مفاهيم أخرى ستتعلمها في الجانب التطبيقي. ليست الدورة هي من ستُعلمك كل شيء الأكيد أنها ستكون جزء من تعلمك و دافع و حافز لك، لكن الجزء الأكبر الذي سيزيد من مستواك و يُطورك هو أنت، حبك للمجال، إرادتك و شغفك في التعلم. 
    نصيحة ستفيدك في طريقك: أي شيء يمر عليك و لا تعرفه أو تجد فيه لُبس ما إبحث عنه و أقرأ عنه، إجعل مُحرك البحث صديقك الدائم، بالتوفيق.
  21. إجابة سمير عبود سؤال في خطأ command not found عند تنفيذ الأمر artisan من خلال PHP كانت الإجابة المقبولة   
    هل بإمكانك تنفيذ الأمر:
    php --version إذا لم تحصلي على إصدار الphp المثبت فتحتاجين إلى إضافة مسار php إلى متغيرات البيئة إبحثي عن edit the system environment variables من خلال شريط البحث ثم من خلال system variables حددي متغيري path و أضيفي مسار جديد الذي سيكون مسار الملف التنفيذي ل php سيكون بهذا الشكل:
    C:\xampp\php
  22. إجابة سمير عبود سؤال في ما هو خادم redis ولماذا نستخدمه؟ كانت الإجابة المقبولة   
    مفهوم Redis:
    Redis هو عبارة عن مخزن مفتوح المصدر يُستعمل لتخزين البيانات على شكل أزواج من مفتاح-قيمة Key-Value في الذاكرة الرئيسية In-Memory، حيث Key-Value storage عبارة عن نظام تخزين يتم فيه تخزين البيانات على شكل أزواج من المفاتيح والقيم ، تخزّن هذه الأزواج في الذاكرة الرئيسية RAM وهذا ما نقصده بـ In-Memory وبهذا يمكننا القول أن تقنية Redis تخزن البيانات في الذاكرة الرئيسية على شكل أزواج من المفاتيح والقيم.
    يكون المفتاح في هذه التقنية عبارة عن سلسلة نصية String، أما القيمة فيمكن أن تكون سلسلة محارف String أو قائمة List أو مزيج منهما. يُمكن استخدام Redis إمّا كخادوم قاعدة بيانات لوحده أو مرتبطًا مع قاعدة بيانات أخرى مثل MySQL.
    خطوات تثبيت Redis على أوبنتو:
    إعداد بيئة ومتطلبات Redis
    نقوم في البداية بتحديث جميع حزم apt-get:
    sudo apt-get update بعد ذلك نقوم بتحميل مُترجم (compiler) باستخدام الحزمة build-essential، والّتي من شأنها المساعدة في تنصيب Redis من المصدر:
    sudo apt-get install build-essential سنقوم بعدها بتحميل الأداة tcl الّتي يَعتمد عليها Redis:
    sudo apt-get install tcl8.5 تنصيب Redis:
    بعد أنّ تمّ تنصيب المُتطلّبات الأساسيّة، فمن المُمكن الآن الشروع وتنصيب redis، ويُمكن تحديد الإصدار المطلوب أو تحميل الإصدار الأخير والذي سيحمل دائمًا الاسم redis-stable:
    wget http://download.redis.io/redis-stable.tar.gz يجب بعد ذلك فك ضغط الملفّ والانتقال إليه:
    tar xvzf redis-stable.tar.gz cd redis-stable ثم المتابعة بتنفيذ الامر: make
    make ولتنصيب Redis على كامل النّظام، فيُمكن إما نسخ ملفاته من المصدر:
    sudo cp src/redis-server /usr/local/bin/ sudo cp src/redis-cli /usr/local/bin/ أو تنفيذ الأمر التّالي:
    sudo make install بعد انتهاء عمليّة التنصيب، من المُستحسن تشغيل Redis كحارس (daemon) في خلفيّة النّظام، ولعمل ذلك يأتي Redis بملفّ برمجي (سكريبت) لهذه المُهمّة.
    يجب الانتقال إلى المسار utils للوصول إلى هذا الملفّ:
    cd utils ومن ثم تشغيل الملفّ الخاص بتوزيعات Ubuntu/Debian:
    sudo ./install_server.sh سيَعرض السكريبت بعض الأسئلة لإتمام عمليّة التهيئة، ولكن يُمكن الاعتماد على الإعداد الافتراضي والاكتفاء بالضغط على Enter، وبعد انتهاء عملية التهيئة سيكون خادم Redis يعمل في الخلفيّة (background).
    يُمكن تنفيذ الأمر التّالي للوصول إلى قاعدة البيانات Redis:
    redis-cli يُمكن اختبار Redis كالتّالي:
    λ redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set name hsoub OK 127.0.0.1:6379> get name "hsoub" 127.0.0.1:6379> بإمكانك المتابعة مع المقال التالي:
    الذي يشرح كيفية التثبيت بشكل مفصل و الإطلاع على بقية أوامر Redis.
  23. إجابة سمير عبود سؤال في ما هو خادم nginx ولماذا نستخدمه؟ كانت الإجابة المقبولة   
    Nginx عبارة عن مشروع مفتوح المصدر، له استخدامات مُختلفة قد يكون أهمها هو استخدامه كخادوم ويب. 
    تنصيب NGINX
    بعد الدخول إلى السيرفر نفذ الأمريين التاليين لتثبيت وتشغيل برنامج Nginx على السيرفر:
    sudo apt-get update sudo apt-get install -y nginx بعد التثبيت يمكنك زيادة السيرفر من المتصفح عبر وضع عنوان السيرفر (Ip Address) في شريط العنوان في المتصفح، وسوف تظهر لك الصفحة الافتراضية لـNginx.

    تابع هذا الدرس لمعرفة كيفية التثبيت و ضبط خادم Nginx على توزيعة اوبنتو بالإضافة إلى مثال بسيط لتخديم صفحات html :
    و أيضا هناك عدة مقالات تم نشرها على الأكاديمية تشرح عن Nginx و كيفية التعامل معه بإمكانك الوصول لها من خلال: مقالات Nginx
  24. إجابة سمير عبود سؤال في ماهي خطوات رفع قاعدة البيانات PostgreSQL على الاستضافة كانت الإجابة المقبولة   
    خطوات رفع قاعدة بيانات من نوع PostgreSQL  إلى الإستضافة كالتالي:
    تصدير قاعدة البيانات:
     يمكنك تصدير قاعدة بيانات PostgreSQL إلى ملف باستخدام برنامج سطر الأوامر pg_dump ، أو يمكنك استخدام phpPgAdmin:
    الطريقة الأولى: إستخدام برنامج pg_dump:
    لتصدير قاعدة بيانات PostgreSQL باستخدام برنامج pg_dump ، اتبع الخطوات التالية:
    قم بالوصول إلى سطر الأوامر على الحاسوب حيث يتم تخزين قاعدة البيانات. على سبيل المثال ، إذا كانت قاعدة البيانات موجودة على حساب استضافة ويب آخر أو مع مزود استضافة ويب آخر ، فقم بتسجيل الدخول إلى الحساب باستخدام SSH. إذا كان لديك وصول مادي إلى الكمبيوتر ، فيمكنك فتح DOS أو نافذة طرفية للوصول إلى سطر الأوامر. اكتب الأمر التالي ، ثم اضغط على Enter. استبدل username باسم المستخدم الخاص بك ، واستبدل dbname باسم قاعدة البيانات التي تريد تصديرها: pg_dump -U username dbname > dbexport.pgsql  
    سيُطلب منك كلمة المرور قم بإدخالها ثم إضغط Enter و بعد ذلك سيتم تصدير قاعدة البيانات إلى الملف dbexport.pgsql  الطريقة الثانية: إستخدام phpPgAdmin
    بعد فتح البرنامج قم بالضغط على إسم قاعدة البيانات التي تريد تصديرها.
    من القائمة العُلوية إضغط على export
    تحت Format إضغط على Structure and data.
    من الخيارات إضغط على قائمة الإختيار و حدد SQL
    إضغط على تحميل ثم حدد مسار الحفظ ثم إضغط على زر save.
    إنشاء قاعدة بيانات PostgreSQL على إستضافتك و إسناد مستخدم لها.
    سجل دخولك إلى حسابك على الإستضافة من قسم Databases إضغط على PostgreSQL Databases من قسم إنشاء قاعدة بيانات ادخل الإسم الذي تريده في حقل الإسم إضغط على زر الإنشاء بعد ذلك إضغط على زر go back تحت قسم Add User to Database من قائمة المستخدمين حدد المستخدم الذي تريد ربطه بقاعدة البيانات التي أنشأتها. من قائمة قواعد البيانات حدد قاعدة البيانات التي أنشأتها. إضغط على زر submit إستيراد قاعدة البيانات 
    يُمكنك إستيراد قاعدة البيانات إلى إستضافتك بإستخدام احدى الطريقتين إما عن طريق إستخدام سطر الأوامر بإستخدام الأمر psql أو إستخدام برنامج phpPgAdmin
    بعد تسجيل الدخول إلى حسابك على الإستضافة عن طريق بروتوكول SSH يُمكنك تنفيذ الأمر:
    psql -U username dbname < dbexport.pgsql حيث نقوم بتعويض username بإسم المستخدم و dbname بإسم قاعدة البيانات التي نريد الإستيراد فيها و dbexport.pgsql بإسم الملف الموجود الذي صدرناه سابقاً.
    الطريقة الثانية هي عن طريق إستخدام برنامج phpPgAdmin المثبت على الإستضافة بعد تسجيل الدخول إلى حسابك إفتح البرنامج، حدد قاعدة البيانات التي تريد الإستيراد فيها ثم من القائمة العلوية حدد SQL ثم choose file إضغط عليه لتحديد الملف من حاسوبك في الأخير إضغط على execute بعدها سيتم إستيراد البيانات.
     
  25. إجابة سمير عبود سؤال في هل يتوفر شرح بسيط لمفهوم DevOps وما هي الجوانب التي يغطيها؟ كانت الإجابة المقبولة   
    يُعتبر DevOps بمثابة زواج بين إدارتين متنافستين منذ الأزل: التطوير "Development" وإدارة العمليات/التنفيذ "Operations".
    فمنذ عُرفت الإدارة بشكلها الحديث، عانت فرق التطوير وفرق التنفيذ من ضعف التواصل والتعاون، لما؟ لأن لدى كل منها هدف يتعارض مع هدف الأخرى: ففي حين ترغب فرق إدارة العمليات برؤية المنتج مكتملاً بأعلى جودة وبأقل قدر ممكن من الموارد، تُصرّ فرق التطوير على التأكد من إنجاز العمل بالكامل وبجودة عالية، بغض النظر عن الموارد اللازمة لتحقيق النجاح.
    تكمن المفارقة في كون هذا التعارض لا يؤدي لتخصيص الموارد بشكل مناسب ولا لإنجاز العمل بالجودة المطلوبة! وهنا يأتي دور DevOps.
    تُستخدَم كلمة DevOps (اختصارٌ للكلمتين Development و Operations) لوصف مجموعةٍ من أنشطة التكنولوجيا الحديثة التي تسعى إلى تقريب مطوري البرمجيات وموظفي العمليات من بعضهم بعضًا بشكلٍ أوثق بغية العمل بصورة أكثر تعاونية على نفس المشروع.
    تهدف DevOps لخلق بيئة تطوير تدعم التكامل المتواصل والتسليم المستمر. وذلك من خلال أربعة مبادئ رئيسية تقوم عليها DevOps:
    التكامل المتواصل (CI: Continuous integration): هو مصطلح خاص بهندسة البرمجيات يصف أسلوبًا في تطوير البرمجيات يتسم بتواصل عملية إعادة بناء تطبيق ما مصحوبة باختباره بصفة متكررة التسليم المتواصل (CD: Continuous delivery): هو منهج يعتمده مهندسو البرمجيات في تطوير البرامج ضمن دورات قصيرة، ويهدف إلى تسريع بناء واختبار وإطلاق البرامج  الاختبار المتواصل (Continuous Testing): هي عملية تنفيذ الاختبارات الآلية كجزء من خط أنابيب تسليم البرامج للحصول على تعليقات فورية حول مخاطر العمل المرتبطة بإصدار البرنامج
    المراقبة المتواصلة (Continuous Monitoring): وهي العملية المسؤولة عن مراقبة البرنامج أو الميزة الجديدة بحثًا عن الأخطاء والأمان والتوافق.
    بإمكانك الإطلاع على هذه المقالات للتوسع أكثر في مجال ال DevOps و أخذ فكرة شاملة عنه:
    ما المقصود بـ DevOps؟ ما هي الغاية من DevOps؟ ثلاث خطوات لتأمين DevOps مفتوح المصدر أفضل 5 لغات برمجة لـ DevOps رحلة المطور عبر DevOps لماذا تعد DevOps الاستراتيجية التقنية الأكثر أهمية و هناك عدة مقالات أخرى في المجال يُمكنك الوصول لها من القائمة العُلوية تحت قسم :
    دروس و مقالات > DevOps.
×
×
  • أضف...