Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...

<none>

Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...

CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
4 + 5 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

أخبار تكنلوجيا

رقم الخبر عنوان الخبر التفاصيل
28,386 مدير تيك توك التنفيذي يستقيل من منصبه بعد أقل من 3 أشهر

قامت تيك توك في مايو الماضي بتعيين كيفين ماير بمنصب المدير التنفيذي لعمليات الشركة أملًا في تطوير العلامة التجارية على المستوى العالمي بعد فترة قضاها في شركة والت ديزني كان أخرها مديرًا لخدمة ديزني بلس، لكن على ما يبدو أن هذه الخطة لم يكتب لها النجاح مع إعلان ماير الاستقالة من منصبه بعد أقل من 3 أشهر على تعيينه.

وجاءت استقالة ماير بعد المناوشات السياسية بين الولايات المتحدة والصين في الفترة الأخيرة وتهديدات حظر التطبيق بأوامر من الرئيس ترامب.

وهو ما جعل كيفين ماير بإداءة عمليات تيك توك على المستوى العالمي صعبة للغاية، لاسيما وأن المشاكل سياسية وليست تسويقية.

وكتب كيفين ماير في رسالة وداعية وجهها إلى موظفي الشركة: “في الأسابيع الأخيرة ومع تغير البيئة السياسية بشكل حاد، قمت بالتفكير بشكل كبير حول ما تتطلبه التغييرات الهيكلية في الشركة، وماذا يعني ذلك بالنسبة للدور العالمي الذي قدمت من أجله.” وأضاف: “وفي ظل هذه الحالة، ومع توقعاتنا بالتوصل إلى حل في وقت قريب جدًا، فقد أردت بقلب مثقل أن أعلمكم جميعًا بقراري ترك الشركة.”

تُعد مغادرة ماير لمنصبه ضربة قوية لجهود تيك توك في مكافحة الإجراءات الأمريكية، خاصة وأنه يملك تاريخيًا ناجحًا في المجال.

وكان ماير قد شغل منصب الرئيس لخدمة هولو وبعدها خدمة ديزني بلس لبث المحتوى وقت إطلاقها وحتى انضمامه لتيك توك.

المصدر:

Deadline

التدوينة مدير تيك توك التنفيذي يستقيل من منصبه بعد أقل من 3 أشهر ظهرت أولاً على عالم التقنية.

28,374 لعشاق الألعاب.. هذه طريقتك للحصول على بلاي ستيشن 5

أعلنت شركة سوني اليابانية عن أحدث خطوة في كشفها عن منصة الألعاب الجديدة (PlayStation 5)، مع فتح الشركة للتسجيل عبر الإنترنت لتلقي دعوة ربما لتكون من أوائل من طلبوا المنصة بشكل أولي مباشرةً من (PlayStation).

ووفقًا لإعلان سوني، ستكون هناك كمية محدودة من منصات (PS5) المتاحة للطلب الأولي في موسم العطلات هذا.

ويشكل برنامج الدعوة بمثابة فرصة لعملاء (PlayStation) الحاليين للحصول على فرصة لطلب المنصة القادمة.

وكما تلاحظ صفحة الأسئلة الشائعة من سوني، فإن ملء نموذج التسجيل لا يضمن وصول دعوة لتكون قادرًا على طلب المنصة بشكل أولي، مع توزيع الدعوات على أساس الاهتمامات وأنشطة (PlayStation) السابقة.

وحتى إذا تلقيت دعوة، فلا يزال الطلب الأولي غير مضمون، حيث ستكون كل دعوة مفتوحة لفترة محدودة، ولها حدود على طلب أولي واحد فقط للمنصة لكل معرف (PSN) – إلى جانب ذراعي التحكم (DualSense) الجديدتين وملحقات (PS5) الأخرى.
وبالإضافة إلى ذلك، ستحتاج إلى عنوان أميركي لشحن (PlayStation 5) إليه، لذلك سيحتاج الأشخاص الموجودون في أجزاء أخرى من العالم إلى الانتظار لفترة أطول قليلاً للحصول على أخبار حول كيفية حجز المنصة.

وعندما يتم طرح المنصة من الجيل التالي للبيع في وقت لاحق من هذا العام، سيكون من الصعب على الأرجح الحصول على واحدة عند الإطلاق، لذلك، فإن سوني تخطط لدعوة بعض اللاعبين المتخصصين ليكونوا أول من يحصل عليها.

وللدخول ضمن القائمة الخاصة بإحدى دعوات الطلب الأولي، انتقل إلى موقع (PlayStation) على الويب وأرسل اسم مستخدم (PSN) الخاص بك في النموذج.

وستتوفر المنصات طالما أن الإمدادات موجودة، وتغيب تفاصيل السعر أو تاريخ إصدار (PlayStation 5)، حيث تواصل سوني لعبتها مع مايكروسوفت حول من سيعلن عن التكلفة الفعلية للمنصة من الجيل التالي أولاً.

وكانت الشركة اليابانية قد أعطتنا نظرة على منصة (PlayStation 5) الجديدة في حدث (Future of Gaming) في شهر يونيو.

وتأتي المنصة من الجيل التالي بنسختين: الأولى قياسية بها محرك أقراص (Blu-ray)، والثانية رقمية أقل حجمًا لا تحتوي على أقراص وتعتمد كليًا على التنزيلات والبث المباشر.

وركز إعلان (PS5) التشويقي الذي أصدرته سوني الأسبوع الماضي على العناصر الغامرة لألعاب الجيل التالي، مثل ردود الفعل اللمسية والمشغلات التكيفية والصوت الثلاثي الأبعاد.

28,356 الدرس 39: دوال لامدا Lambdas في Cpp

ما هي تعابير لامدا؟

توفّر دوال لامدا طريقة موجزة لإنشاء كائنات دوالّ بسيطة، وتعبير لامدا هو [قيمة يمينية](رابط الفصل 74) خالصة (prvalue) تُنتجُ كائنَ تغليف (closure)، والذي يتصرف ككائن دالة.

نشأ الاسم "تعبير لامدا" (lambda expression) عن علم حسابيات اللامدا (lambda calculus)، وهو شكل رياضي اختُرِع في الثلاثينيات من قِبل Alonzo Church للإجابة عن بعض الأسئلة المتعلقة بالمنطق والحوسبيّات (computability)، وقد شكّلت حسابيات لامدا أساس لغة LISP، وهي لغة برمجة وظيفية.

مقارنة بحسابيات لامدا و LISP، فإنّّ تعبيرات لامدا في C++‎ تشترك معها في أنّها غير مسمّاة، وأنّها تلتقط المتغيّرات الموجودة في السياق المحيط، لكنّها تفتقر إلى القدرة على العمل على الدوال أو إعادتها.

وغالبًا ما تُستخدَم دوال لامدا كوسائط للدوالّ التي تأخذ كائنًا قابلاً للاستدعاء، وذلك غالبًا أبسط من إنشاء دالة مُسمّاة، والتي لن تُستخدَم إلا عند تمريرها كوسيط، وتعبيرات لامدا مفضّلة في مثل هذه الحالات، لأنّها تسمح بتعريف الدوّال ضمنيًا.

يتألف تعبير لامدا عادة من ثلاثة أجزاء: قائمة الالتقاط ‎[]‎، وقائمة المعاملات الاختيارية ‎()‎، والمتن ‎{}‎، وكلها يمكن أن تكون فارغة:

[]() {} // تعبير لامدا فارغ لا يعيد أي شيء. قائمة الالتقاط (Capture list)

تمثّل ‎[]‎ قائمة الالتقاط. لا يمكن الوصول إلى متغيّرات النطاق المحيط عبر تعبير لامدا افتراضيًا، ويكون المتغير متاحًا بمجرد التقاطه داخل تعبير لامدا سواء كنسخة أو مرجع، وتصبح المتغيرات الملتقطة جزءًا من لامدا، ولا يلزم تمريرها عند استدعاء لامدا، على عكس وسائط الدوال.

int a = 0; // تعريف متغير عددي صحيح auto f =[]() { return a * 9; }; // Error: 'a' cannot be accessed auto f =[a]() { return a * 9; }; // بالقيمة 'a' تم التقاط auto f =[& a]() { return a++; }; // بالمرجع 'a' تم التقاط // a ملاحظة: المبرمج ليس مسؤولا عن ضمان ألا تُدمَّر // قبل استدعاء لامدا auto b = f(); // من دالة الالتقاط ولم تُمرّر هنا a استدعاء دالة لامدا، تم أخذ قائمة المعاملات

تمثّل ‎()‎ قائمة المعاملات، وهي تماثل قائمة المعاملات في الدوال العادية، ويمكن حذف الأقواس إذا لم يأخذ تعبير لامدا أيّ وسائط، إلا إذا كنت بحاجة إلى جعل تعبير لامدا قابلًا للتغيير ‎mutable‎. يُعدُّ تعبيرا لامدا التاليان متكافئين:

auto call_foo =[x]() { x.foo(); }; auto call_foo2 =[x] { x.foo(); };

الإصدار ≥ C++‎ 14

تستطيع قائمةُ المعاملات أن تستخدم النوعَ النائب (placeholder type)‏ ‎auto‎ بدلاً من الأنواع الفعلية، وهذا يجعل الوسيط يتصرّف كمُعامل قالب لقالب دالة. تعبيرات لامدا التالية متكافئة:

auto sort_cpp11 =[](std::vector<T>::const_reference lhs, std::vector<T>::const_reference rhs) { return lhs < rhs; }; auto sort_cpp14 =[](const auto &lhs, const auto &rhs) { return lhs < rhs; }; متن الدالة

القوسان المعقُوصان ‎{}‎ يحتويان على متن تعبير لامدا، ويُماثل متن الدوال العادية.

استدعاء دالة لامدا

يعيد تعبير لامدا مغلِّفًا أو غلافًا (closure)، ويمكن استدعاؤه باستخدام الصيغة ‎operator()‎ (كما هو الحال مع الدوال العادية):

int multiplier = 5; auto timesFive =[multiplier](int a) { return a * multiplier; }; std::out << timesFive(2); // 10 multiplier = 15; std::out << timesFive(2); // 2 *5 == 10 نوع القيمة المعادة

افتراضيًا، يُستنبَط نوع القيمة المُعادة لتعبير لامدا تلقائيًا.

[]() { return true; };

في هذه الحالة، نوع القيمة المُعادة هو ‎bool‎، يمكنك أيضًا تعريف نوع القيمة المُعادة يدويًا باستخدام الصياغة التالية:

[]()->bool { return true; }; دوال لامدا القابلة للتغيير (Mutable Lambda)

الكائنات المُلتقطة بالقيمة في دوال لامدا تكون افتراضيًا غير قابلة للتغيير (immutable)، وذلك لأنّ المُعامل ‎operator()‎ الخاصّ بالكائن المغلّف المُنشأ ثابت (‎const‎) افتراضيًا. في المثال التالي، سيفشل التصريف لأن ++C ستحاول محاكاة حالة تعبير لامدا.

auto func = [c = 0](){++c; std::cout << c;};

يمكن السماح بالتعديل باستخدام الكلمة المفتاحية ‎mutable‎، والتي تجعل المُعامل ‎operator()‎ غير ثابت ‎const‎:

auto func =[c = 0]() mutable { ++c; std::cout << c; };

إذا اسُتخدِم مع نوع القيمة المُعادة، فينبغي وضع ‎mutable‎ قبله.

auto func =[c = 0]() mutable->int { ++c; std::cout << c; return c; };

انظر المثال التالي لتوضيح فائدة لامدا:

الإصدار < C++‎ 11

// كائن دالي عام لأجل المقارنة struct islessthan { islessthan(int threshold): _threshold(threshold) {} bool operator()(int value) const { return value < _threshold; } private: int _threshold; }; // التصريح عن متجهة const int arr[] = { 1, 2, 3, 4, 5 }; std::vector<int> vec(arr, arr + 5); // إيجاد عدد أصغر من مُدخَل مُعطى - على افتراض أنه سيكون مُدخلا إلى دالة int threshold = 10; std::vector<int>::iterator it = std::find_if(vec.begin(), vec.end(), islessthan(threshold));

الإصدار ≥ C++‎ 11

// التصريح عن متجهة std::vector<int> vec { 1, 2, 3, 4, 5 }; // إيجاد عدد أصغر من مُدخَل مُعطى - على افتراض أنه سيكون مُدخلا إلى دالة int threshold = 10; auto it = std::find_if(vec.begin(), vec.end(), [threshold](int value) { return value < threshold; });

يمكننا تلخيص ما سبق بالجدول التالي:

table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } المعامل التفاصيل default-capture الالتقاط الافتراضي يحدّد كيفيّة التقاط جميع المتغيّرات غير المدرجة، قد يكون عبر ‎=‎ (التقاطًا بالقيمة) أو عبر ‎&‎ (التقاطا بالمرجع). وفي حال حذفها، سيتعذّر الوصول إلى المتغيّرات غير المدرجة ضمن متن لامدا. كما يجب أن يسبق default- capture المعاملُ capture-list. capture-list لائحة الالتقاط يحدّد كيف يمكن الوصول إلى المتغيّرات المحلية داخل متن لامدا، تُلتقط المتغيّرات التي ليست لها سابقة (prefix) بالقيمة (by value) بينما تُلتقط المتغيّرات المسبوقة بـ ‎&‎ بالمرجع. يمكن استخدام ‎this‎ في توابع الأصناف لجعل جميع أعضاء الكائن الذي يشير إليه في المتناول عبر المرجع. ولا يمكن الوصول إلى المتغيّرات غير المدرجة في القائمة إلا إذا كانت القائمة مسبوقة بـ default-capture. argument-list قائمة الوسائط يحدّد وسائط دالّة لامدا. mutable (اختياري) عادة ما تكون المتغيّرات الملتقطة بالقيمة ثابتة (‎const‎). وستكون غير ثابتة عند تحديد ‎mutable‎. وسيُحتفظ بالتغييرات على تلك المتغيّرات بين الاستدعاءات. throw-specification رفع الاعتراضات (اختياري) يحدّد سلوك رفع الاعتراضات في دالّة لامدا، مثل: ‎noexcept‎ أو ‎throw‎‏ (std::exception). attributes السمات (اختياري) سمات دالّة لامدا. على سبيل المثال، إذا كان متن لامدا يلقي دائمًا اعتراضًا، فيمكن استخدام ‎[[noreturn]]‎. نوع القيمة المعادة (اختياري) يحدّد نوع القيمة المُعادة من دالّة لامدا. وهي ضرورية في الحالات التي لا يكون بمقدور المٌصرّف فيها تخمين نوع القيمة المعادة. lambda-body متن لامدا الكتلة التي تحتوي تنفيذ لامدا. تحديد نوع القيمة المُعادة

بالنسبة لدوال لامدا التي تحتوي عبارة return واحدة فقط، أو عدّة عبارات return من نفس النوع، فيمكن للمصرّف أن يستنتج نوع القيمة المُعادة. انظر المثال التالي الذي يعيد قيمة بوليانية لأن "10 < value" هي قيمة بوليانية.

auto l =[](int value) { return value > 10; }

بالنسبة لدوال لامدا التي لها عدّة عبارات return من أنواع مختلفة، فلا يمكن للمصرّف أن يستنتج نوع القيمة المُعادة:

// error: return types must match if lambda has unspecified return type auto l =[](int value) { if (value < 10) { return 1; } else { return 1.5; } };

في هذه الحالة، يجب عليك تحديد نوع القيمة المُعادة بشكل صريح:

// 'double' حُدِّد نوع القيمة المعادة بـ auto l =[](int value)->double { if (value < 10) { return 1; } else { return 1.5; } };

تطابق هذه القواعدُ قواعدَ استنتاج نوع ‎auto‎، ولا تعيد دوال لامدا التي لم يُصرّح بنوع قيمتها المُعادة صراحة مراجعًا أبدًا، لذا إذا كنت تودّ إعادة نوع مرجعي (reference type)، فيجب تحديده بشكل صريح: تعيد copy في المثال التالي قيمة من نوع &X لذا تنسخ المدخلات:

auto copy = [](X& x) { return x; };

لا يحدث نسخ لأن ref في المثال التالي ستعيد قيمة من نوع &X:

auto ref = [](X& x) -> X& { return x; }; الالتقاط بالقيمة Capture by value

إن حدّدتَ اسم المتغيّر في قائمة الالتقاط فإنّّ تعبير لامدا سيلتقطُه بالقيمة، هذا يعني أنّ نوع المغلِّف المُنشأ لتعبير لامدا سيخزّن نسخة من المتغيّر، وهذا يتطّلب أيضًا أن يكون نوع المتغيّر قابلاً للنسخ:

int a = 0; [a]() { return a; // بالقيمة 'a' تم التقاط };

الإصدار < C++‎ 14

auto p = std::unique_ptr<T>(...); [p]() { // Compile error; `unique_ptr` is not copy-constructible return p->createWidget(); };

من C++‎ 14 وصاعدًا، من الممكن تهيئة المتغيّرات على الفور، وهذا يسمح بالتقاط "أنواع النقل فقط" في لامدا.

الإصدار ≥ C++‎ 14

auto p = std::make_unique<T> (...); [p = std::move(p)]() { return p->createWidget(); };

رغم أنّ دوال لامدا يمكن أن تلتقط المتغيّرات بالقيمة عندما تُمرّر باسمائها، إلّا أنّ تلك المتغيّرات لا يمكن تعديلها في متن لامدا افتراضيًا، وذلك لأنّ نوع المغلّف يضع متن لامدا في تصريح من الشكل ‎operator() const‎.

وتُطبَّق ‎const‎ على محاولات الوصول إلى المتغيّرات العضوية (member variables) في نوع المغلّف، والمتغيّرات المُلتقطة التي هي أعضاء في المغلّف (على خلاف المتوقّع):

int a = 0; [a]() { a = 2; // غير جائز decltype(a) a1 = 1; a1 = 2; // جائز };

لإزالة ‎const‎، يجب عليك وضع الكلمة المفتاحية ‎mutable‎ في تعبير لامدا:

int a = 0; [a]() mutable { a = 2; // 'a' يمكن الآن تعديل return a; };

نظرًا لأنّ ‎a‎ التُقِطت بالقيمة، فإنّّ أيّ تعديلات تُجرى عن طريق استدعاء تعبير لامدا لن تؤثر على ‎a‎، ولقد نُسخِت قيمة ‎a‎ في تعبير لامدا عند إنشائه، لذلك فإنّ نسخة ‎a‎ في تعبير لامدا مختلفة عن المتغيّر ‎a‎ الخارجي.

int a = 5 ; auto plus5Val = [a] (void) { return a + 5 ; } ; auto plus5Ref = [&a] (void) {return a + 5 ; } ; a = 7 ; std::cout << a << ", value " << plus5Val() << ", reference " << plus5Ref() ; // "7, value 10, reference 12" تعبيرات لامدا الذاتية الاستداعاء Recursive lambdas

لنفترض أنّنا نرغب في كتابة خوارزمية اقليدس للقاسم المشترك الأكبر ‎gcd()‎ على شكل تعبير لامدا. أولا، سنكتبها على شكل دالة:

int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }

تعبيرات لامدا لا يمكن أن تكون ذاتية الاستدعاء، لأنها غير قادرة على استدعاء نفسها، فلامدا ليس لها اسم، واستخدام ‎this‎ داخل متن لامدا إنّما يشير إلى ‎this‎ المُلتقَط (بافتراض أنّ تعبير لامدا مُنشأ في متن دالة تابعة، وإلا فسيُطلق خطأ)، إذن كيف نحلّ هذه المشكلة؟

استخدام std::function

يمكننا جعل تعبير لامدا يحصل على مرجع إلى كائن ‎std::function‎ لم يُنشأ بعد:

std::function<int(int, int)> gcd = [&](int a, int b){ return b == 0 ? a : gcd(b, a%b); };

هذا سيعمل بدون مشاكل، ولكن ينبغي ألّا تستخدم هذه الطريقة إلّا لُمامًا، إذ أنّها بطيئة (لأنّنا نستخدم محو الأنواع - type erasure - بدلاً من استدعاء الدالّة المباشرة)، كما أنّها هشّة (نسخ ‎gcd‎ أو إعادة ‎gcd‎ سيكسر الشيفرة لأنّ تعبير لامدا يشير إلى الكائن الأصلي)، ولن تعمل مع دوال لامدا العامة.

استخدام مؤشرين ذكيين auto gcd_self = std::make_shared<std::unique_ptr< std::function<int(int, int)> >>(); *gcd_self = std::make_unique<std::function<int(int, int)>>( [gcd_self](int a, int b){ return b == 0 ? a : (**gcd_self)(b, a%b); }; };

هذا يضيف الكثير من الأعمال غير المباشرة (ما يؤدّي إلى زيادة الحِمل)، ولكن يمكن نسخه/إعادته، كما أنّ جميع النسخ تشترك في الحالة، وهذا يتيح لك إعادة تعبير لامدا، وهذا الحل أفضل من الحل المذكور أعلاه.

استخدام Y-combinator

باستخدام بِنية صغيرة مُساعِدة، يمكننا حل جميع هذه المشاكل:

template < class F> struct y_combinator { F f; // لامدا ستُخزَّن هنا // مسبق operator() عامل template < class...Args > decltype(auto) operator()(Args && ...args) const {

ستمرر نفسها هنا إلى f ثم تمرر الوسائط، ويجب أن تأخذ لامدا الوسيط الأول كـ auto&& recurse أو نحوه، نتابع المثال:

return f(*this, std::forward<Args> (args)...); } }; // :دالة مساعِدة تستنبط نوع لامدا template < class F> y_combinator<std::decay_t < F>> make_y_combinator(F && f) { return { std::forward<F> (f) }; } // ( `make_` هناك حلول أفضل من C++17 تذكر أنّ في )

يمكننا تنفيذ ‎gcd‎ على النحو التالي:

auto gcd = make_y_combinator( [](auto&& gcd, int a, int b){ return b == 0 ? a : gcd(b, a%b); } );

‎y_combinator‎ هو أحد مفاهيم حسابيّات لامدا، ويتيح لك العمل بالذاتية دون الحاجة إلى تسمية الدالة، وهذا هو بالضبط ما ينقصنا في دوال لامدا. تستطيع إنشاء تعبير لامدا يأخذ "recurse" كوسيط أوّل، وعندما تريد استخدام الذاتية، يمكنك تمرير الوسائط إلى recurse.

ويعيد ‎y_combinator‎ بعد ذلك كائن دالة يستدعي تلك الدالّة مع وسائطها، ولكن بكائن "recurse" المناسب (أي ‎y_combinator‎ نفسه) كوسيط أوّل، ويوجِّه بقية الوسائط التي مرّرتها إلى ‎y_combinator‎ إلى تعبير لامدا على النحو التالي:

auto foo = make_y_combinator( [&](auto&& recurse, some arguments) { { // اكتب شيفرة تعالج بعض المعاملات });

استدع recurse مع بعض الوسائط الأخرى عند الحاجة لتنفيذ الذاتية (Recursion)، وكذلك نحصل على الذاتية في لامدا دون أيّ قيود أو حِمل كبير.

الالتقاط الافتراضي Default capture

افتراضيًا، لا يمكن الوصول إلى المتغيّرات المحلية التي لم تُحدَّد بشكل صريح في قائمة الالتقاط من داخل متن تعبير لامدا، بيْد أنّه من الممكن ضمنيًا التقاط المتغيّرات المُسمّاة من قبل متن لامدا:

int a = 1; int b = 2; // التقاط افتراضي بالقيمة [=]() { return a + b; }; // بالقيمة a و b تم التقاط // الالتقاط الافتراضي بالمرجع [&]() { return a + b; }; // بالمرجع a و b

ما يزال بالإمكان القيام بالتقاط صريحٍ بجانب الالتقاط الافتراضي الضِّمني، سيعيد الالتقاط الصريح تعريف الالتقاط الافتراضي:

int a = 0; int b = 1; [=, &b]() { a = 2; b = 2; };

في الشيفرة السابقة: لا تجوز a = 2 لأن a ملتقطَة بالقيمة، وتعبير لامدا لا يقبل التغيير، أي ليس mutable، بينما تجوز b = 2 لأن b ملتقَطة بالمرجع.

دوال لامدا في الأصناف والتقاط this

تُعدُّ تعبيرات لامدا الذي تم تقييمها في تابع ما صديقة للصّنف الذي ينتمي إليه ذلك التابع ضمنيًا:

class Foo { private: int i; public: Foo(int val): i(val) {} // تعريف دالة تابعة void Test() { auto lamb = [](Foo &foo, int val) { // (private) تعديل متغير عضو خاص foo.i = val; };

يُسمح لـ lamb أن تصل إلى عضو خاص لأنها صديقة لـ Foo، نتابع المثال:

lamb(*this, 30); } };

مثل هذه التعبيرات ليست صديقة لهذا الصنف فحسب، بل لها نفس إمكانيات الوصول التي يتمتّع بها الصنف الذي صُرِّح عنها فيه. كذلك يمكن لدَوال لامدا التقاط المؤشّر ‎this‎، والذي يمثّل نُسخة الكائن الذي استُدعِيت الدالّة الخارجية عليه، عن طريق إضافة ‎this‎ إلى قائمة الالتقاط، انظر المثال التالي:

class Foo { private: int i; public: Foo(int val): i(val) {} void Test() { // بالقيمة this التقاط المؤشر auto lamb =[this](int val) { i = val; }; lamb(30); } };

عند التقاط ‎this‎، يمكن لتعبير لامدا استخدام أسماء أعضاء الصنف الذي يحتويه كما لو كان في صنفه الحاوي، لذلك تُطبّق ‎this->‎ ضمنيًا على أولئك الأعضاء. يجب الانتباه إلى أنّ ‎this‎ تُلتقط بالقيمة، ولكن ليس بقيمة النوع، بل تُلتقَط بقيمة ‎this‎، وهو مؤشّر، لهذا فإنّ تعبير لامدا لا يملك ‎this‎، وإذا تجاوز عُمرُ تعبير لامدا عمرَ الكائن الذي أنشأه، فقد يصبح غير صالح.

هذا يعني أيضًا أنّ لامدا يمكنها تعديل ‎this‎ حتى لو لم تكن قابلة للتغيير (‎mutable‎)، ذلك أنّ المؤشّر هو الذي يكون ثابتًا ‎const‎ وليس الكائن الذي يؤشّر إليه، إلا إن كان التابع الخارجي دالة ثابتة ‎const‎.

أيضًا، تذكّر أنّ كتل الالتقاط الافتراضية ‎[=]‎ و ‎[&]‎ ستلتقط ‎this‎ ضمنيًا، وكلاهما سيلتقطَانه بقيمة المؤشّر، وفي الحقيقة، فمن الخطأ تحديد ‎this‎ في قائمة الالتقاط عند إعطاء قيمة افتراضية.

الإصدار ≥ C++‎ 17

وتستطيع دوال لامدا التقاط نسخة من كائن ‎this‎ المُنشأ في وقت إنشاء تعبير لامدا، وذلك عن طريق إضافة ‎*this‎ إلى قائمة الالتقاط:

class Foo { private: int i; public: Foo(int val): i(val) {} void Test() { // التقاط نسخة من الكائن المُعطى من قبل المؤشر auto lamb =[*this](int val) mutable { i = val; }; lamb(30); // this->i لا تغيّر } }; الالتقاط بالمرجع Capture by reference

إذا وضعت السابقة ‎&‎ قبل اسم متغيّر محلي، فسيُلتقط المتغيّر بالمرجع، هذا يعني نظريًا أنّ نوع مُغلِّفِ لامدا سيكون له متغيّر مرجعي يُهيَّأُ كمرجع، وسيشير ذلك المرجع إلى المتغيّر المقابل الموجود خارج نطاق تعبير لامدا، وأيّ استخدام للمتغيّر في متن لامدا سوف يشير إلى المتغيّر الأصلي:

// 'a' التصريح عن المتغير int a = 0; // بالمرجع 'a' التصريح عن لامدا تلتقط auto set =[& a]() { a = 1; }; set(); assert(a == 1);

الكلمة المفتاحية ‎mutable‎ ليست مطلوبة لأنّ ‎a‎ نفسها ليست ثابتة. والالتقاط بالمرجع يعني أنّ لامدا يجب ألا تخرج عن نطاق المتغيّرات التي تلتقطها، لذلك يمكنك استدعاء الدوال التي تأخذ دالّة، ولكن لا تستدع دالّة تخزّن لامدا خارج نطاق مراجعك، وكذلك لا تُعِد تعبير لامدا.

تعابير لامدا العامة النوع Generic lambdas

الإصدار ≥ C++‎ 14

يمكن أن تأخذ دوال لامدا وسائط من أيّ نوع، هذا يسمح لهذه الدوال أن تكون أكثر عمومية:

auto twice =[](auto x) { return x + x; }; int i = twice(2); // i == 4 std::string s = twice("hello"); // s == "hellohello"

طُبِّق هذا في C++‎ عبر جعل ‎operator()‎ تزيد تحميل دالّة قالب (template function)، انظر النوع التالي الذي له سلوك مكافئ لسلوك مُغلِّف لامدا أعلاه:

struct _unique_lambda_type { template < typename T> auto operator()(T x) const { return x + x; } };

ليس بالضرورة أن تكون كل المعاملات عامة في تعبير لامدا غير المحدد أو العام (Generic lambda):

[](auto x, int y) { return x + y; }

هنا، تُستنبَط ‎x‎ بناءً على وسيط الدالّة الأوّل، بينما سيكون ‎y‎ دائمًا عددًا صحيحًا (‎int‎)، وقد تأخذ دوال لامدا العامَّة الوسائط بالمرجع أيضًا، وذلك باستخدام القواعد المعتادة لـ ‎auto‎ و ‎&‎، أما إن أُخذ وسيط عام كـ ‎auto&&‎، فسيكون مرجعًا أماميًا (forwarding reference) يشير إلى الوسيط المُمرّر، وليس مرجعًا يمينِيّا (rvalue reference):

auto lamb1 = [](int &&x) {return x + 5;}; auto lamb2 = [](auto &&x) {return x + 5;}; int x = 10; lamb1(x); lamb2(x);

في الشيفرة السابقة، لا تجوز (lamb1(x لوجوب استخدام std::move(x)‎ لأجل معامِلات &&int، بينما تجوز (lamb1(x لأن نوع x يُستنتج على أنه &int. كذلك يمكن أن تكون دوالّ لامدا متغايرة (variadic)، وأن تعيد توجيه وسائطها:

auto lam = [](auto&&... args){return f(std::forward<decltype(args)>(args)...);};

أو:

auto lam = [](auto&&... args){return f(decltype(args)(args)...);};

والتي لن تعمل "بالشكل الصحيح" إلّا مع المتغيّرات من نوع ‎auto&&‎. أيضًا، أحد الأسباب القوية لاستخدام دوال لامدا العامّة هو البنية اللغوية للزيارة (visiting syntax)، انظر:

boost::variant<int, double> value; apply_visitor(value, [&](auto&& e){ std::cout << e; });

هنا، قمنا هنا بالزيارة بأسلوب متعدد الأشكال، لكن في السياقات الأخرى فلا تهم أسماء النوع المُمرّرة:

mutex_wrapped<std::ostream&> os = std::cout; os.write([&](auto&& os){ os << "hello world\n"; });

لا فائدة من تكرار النوع ‎std::ostream&‎ هنا؛ كأنك تذكر نوع المتغيّر في كل مرّة تستخدمه، ولقد أنشأنا هنا زائرًا غير متعدد الأشكال، كما استخدمنا ‎auto‎ هنا لنفس سبب استخدام ‎auto‎ في حلقة ‎for(:)‎.

استخدام دوال لامدا لفك حزم المعاملات المضمنة

الإصدار ≥ C++‎ 14

كان فكّ حزم المعامِلات (Parameter pack unpacking) يتطّلب كتابة دالّة مساعدة في كل مرّة تريد القيام بذلك. مثلًا:

template<std::size_t...Is > void print_indexes(std::index_sequence < Is... >) { using discard = int[]; (void) discard { 0, ((void)( std::cout << Is << '\n' // هي ثابتة في وقت التصريف Is هنا ), 0)... }; } template<std::size_t I> void print_indexes_upto() { return print_indexes(std::make_index_sequence < I> {}); }

يريد ‎print_indexes_upto‎ إنشاء وفكّ حزمة معاملات من الفهارس، ولفعل ذلك، يجب استدعاء دالّة مساعدة. يجب أن تنشئ دالة مساعدة مخصصة في كل مرة تريد فك حزمة معامِلات أنشأتها، ويمكن تجنب ذلك هنا باستخدام دوال لامدا، إذ يمكنك فكّ الحِزَم باستخدام دالة لامدا على النحو التالي:

template<std::size_t I> using index_t = std::integral_constant<std::size_t, I> ; template<std::size_t I> constexpr index_t<I> index {}; template < class = void, std::size_t...Is > auto index_over(std::index_sequence < Is... >) { return[](auto && f) { using discard = int[]; (void) discard { 0, (void( f(index < Is>) ), 0)... }; }; } template<std::size_t N> auto index_over(index_t<N> = {}) { return index_over(std::make_index_sequence < N> {}); }

الإصدار ≥ C++‎ 17

يمكن تبسيط ‎index_over()‎ باستخدام التعبيرات المطوية على النحو التالي:

template<class=void, std::size_t...Is> auto index_over( std::index_sequence<Is...> ) { return [](auto&& f){ ((void)(f(index<Is>)), ...); }; }

بعد ذلك، يمكنك استخدام هذا لتجنّب الحاجة إلى فكّ حزم المعاملات يدويًا عبر تحميل زائد ثانٍ في الشيفرات الأخرى، فذلك سيتيح لك فكّ حزم المعاملات بشكل مضمّن (inline):

template < class Tup, class F> void for_each_tuple_element(Tup&& tup, F&& f) { using T = std::remove_reference_t<Tup> ; using std::tuple_size; auto from_zero_to_N = index_over<tuple_size < T> {} > (); from_zero_to_N( [&](auto i) { using std::get; f(get<i> (std::forward<Tup> (tup))); } ); }

نوع ‎auto i‎ المُمرّر إلى دالة لامدا عبر ‎index_over‎ هو ‎std::integral_constant<std::size_t, ???>‎ الذي يحتوي على تحويل ‎constexpr‎ إلى std::size_t لا يعتمد على حالة this، وعليه نستطيع استخدامه كثابت في وقت التصريف، مثلا عندما نمرّره إلى ‎std::get<i>‎ أعلاه.

سنعيد الآن كتابة المثال أعلاه:

template<std::size_t I> void print_indexes_upto() { index_over(index < I>)([](auto i) { std::cout << i << '\n'; // هي ثابتة في وقت التصريف i هنا }); }

صار المثال أقصر بكثير. انظر إن شئت هذا المثال الحيّ على ذلك.

الالتقاطات المعممة النوع Generalized capture

الإصدار ≥ C++‎ 14

تستطيع دوال لامدا التقاط التعبيرات وليس المتغيّرات فقط، هذا يسمح لدوال لامدا بتخزين أنواع النقل فقط (move-only types):

auto p = std::make_unique<T> (...); auto lamb =[p = std::move(p)]() { p->SomeFunc(); };

هذا ينقل المتغيّر ‎p‎ الخارجي إلى متغيّر لامدا المُلتقط ، ويسمى أيضًا ‎p‎، وتمتلك ‎lamb‎ الآن الذاكرة المخصّصة لـ ‎make_unique‎. وبما أن التغليف (closure) يحتوي على نوع غير قابل للنسخ، فذلك يعني أنّ ‎lamb‎ ستكون غير قابلة للنسخ، لكن ستكون قابلة للنقل رغم هذا:

auto lamb_copy = lamb; // غير جائز auto lamb_move = std::move(lamb); // جائز

الآن أصبحت ‎lamb_move‎ تملك الذاكرة، لاحظ أنّ ‎std::function<>‎ تتطّلب أن تكون القيم المخزّنة قابلة للنسخ، يمكنك كتابة دالة خاصّة بك تتطّلب النقل فقط أو وضع لامدا في غلاف مؤشّر مشترك ‎shared_ptr‎:

auto shared_lambda = [](auto&& f){ return [spf = std::make_shared<std::decay_t<decltype(f)>>(decltype(f)(f))] (auto&&...args)->decltype(auto) { return (*spf)(decltype(args)(args)...); }; }; auto lamb_shared = shared_lambda(std::move(lamb_move));

هنا أخذنا دالة لامدا للنقل فقط ووضعنا حالتها في مؤشّر مشترك، ثم ستُعاد دالة لامدا قابلة للنسخ، ثم التخزين في ‎std::function‎ أو نحو ذلك.

يستخدم الالتقاط المُعمّم استنباط النوع ‎auto‎ لاستنباط نوع المتغيّر، وسيصرّح عن هذه الالتقاطات على أنّها قيم افتراضيًا، لكن يمكن أن تكون مراجع أيضًا:

int a = 0; auto lamb = [&v = a](int add) // مختلفان `a` و `v` تذكّر أنّ اسمَي { v += add; // `a` تعدي }; lamb(20); // ستصبح 20 `a`

يستطيع الالتقاط المعمَّم أن يلتقط تعبيرًا عشوائيًا لكن لا يلزمه التقاط متغيرات خارجية:

auto lamb =[p = std::make_unique<T> (...)]() { p->SomeFunc(); }

هذا مفيد في إعطاء دوال لامدا قيمًا عشوائية يمكنها الاحتفاظ بها وربّما تعديلها دون الحاجة إلى التصريح عنها خارجيًا، بالطبع، هذا لا يكون مفيدًا إلّا إذا كنت تنوي الوصول إلى تلك المتغيّرات بعد أن تكمل لامدا عملها.

التحويل إلى مؤشر دالة

إذا كانت قائمة الالتقاط الخاصّة بلَامدا فارغة، فستُحوَّل لامدا ضمنيا إلى مؤشّر دالة يأخذ نفس الوسائط ويعيد نوع القيمة المُعادة نفسه:

auto sorter =[](int lhs, int rhs)->bool { return lhs < rhs; }; using func_ptr = bool(*)(int, int); func_ptr sorter_func = sorter; // تحويل ضمني

يمكن أيضًا فرض هذا التحويل باستخدام عامل "+" الأحادي:

func_ptr sorter_func2 = +sorter; // فرض التحويل الضمني

سيكون سلوك استدعاء مؤشّر الدالّة هذا مكافئًا لاستدعاء ‎operator()‎ على لامدا، فلا يعتمد مؤشّر الدالّة على وجود مغلّف لامدا، لذلك قد يستمرّ حتى بعد انتهاء مغلّف لامدا. هذه الميزة مفيدة عند استخدام دوال لامدا مع الواجهات البرمجية التي تتعامل مع مؤشّرات الدوال، بدلاً من كائنات دوال C++‎.

الإصدار ≥ C++‎ 14

يمكن أيضًا تحويل دالة لامدا عامة لها قائمة التقاط فارغة إلى مؤشّر دالّة، وإذا لزم الأمر سيُستخدَم استنباط وسيط القالب (template argument deduction) لاختيار التخصيص الصحيح.

auto sorter =[](auto lhs, auto rhs) { return lhs < rhs; }; using func_ptr = bool(*)(int, int); func_ptr sorter_func = sorter; // int استنتاج // لكن السطر التالي غامض // func_ptr sorter_func2 = +sorter; ترقية دوال لامدا إلى C++‎ 03 باستخدام الكائنات الدالية (functor)

دوال لامدا في C++‎ هي اختصارات مفيدة توفّر صياغة مختصرة لكتابة الدوال، ويمكن الحصول على وظيفة مشابهة في C++‎ 03 (وإن كانت مُطولًة) عن طريق تحويل دالّة لامدا إلى كائن دالّي:

// هذه بعض الأنواع struct T1 { int dummy; }; struct T2 { int dummy; }; struct R { int dummy; };

هذه الشيفرة تستخدم دالة لامدا،هذا يعني أنها تستلزم C++11، نتابع المثال:

R use_lambda(T1 val, T2 ref) {

هنا، استعمل auto لأن النوع المُعاد من دالة لامدا مجهول، نتابع:

auto lambda =[val, &ref](int arg1, int arg2)->R { /* متن لامدا */ return R(); }; return lambda(12, 27); } // C++03 صنف الكائن الدالي - صالح في class Functor { // قائمة الالتقاط T1 val; T2 &ref; public: // المنشئ inline Functor(T1 val, T2 &ref): val(val), ref(ref) {} // متن الكائن الدالي R operator()(int arg1, int arg2) const { /* متن لامدا */ return R(); } };

هذا يكافئ use_lambda لكنه يستخدم كائنًا دالّيًا، وهو صالح في C++03:

R use_functor(T1 val, T2 ref) { Functor functor(val, ref); return functor(12, 27); } int main() { T1 t1; T2 t2; use_functor(t1, t2); use_lambda(t1, t2); return 0; }

إذا كانت دالّة لامدا قابلة للتغيير (‎mutable‎)، فاجعل مُعامل الاستدعاء الخاص بالكائن الدالّي غير ثابت، أي:

R operator()(int arg1, int arg2) /*non-const*/ { /* متن لامدا */ return R(); }

هذا الدرس جزء من سلسلة دروس عن C++‎.

ترجمة -بتصرّف- للفصل Chapter 73: Lambdas من كتاب C++ Notes for Professionals

28,343 آبل تكشف عن موعد حدث افتراضي في 10 سبتمبر المقبل عن طريق الخطأ!

أظهر حساب شركة آبل على يوتيوب اليوم موعداً لحدث افتراضي سيعقد في 10 سبتمبر المقبل، حيث وصل إشعار تذكير خاطف للحدث المزمع عقده لعدد من المستخدمين الذين استطاعوا  التقاط صورة للشاشة قل أن تحذفه الشركة؛  والذي على ما يبدو كان بثاً تجريبياً للحدث حسب موقع 9to5mac.

ومن المرجح أن تكون صانعة الآيفون قد شاركت الموعد عن طريق الخطأ في توقع أن يكون مخصصاً للكشف عن سلسلة آيفون 12، على خطى إعلانها عن سلسلة آيفون 11 العام الماضي الذي تم في نفس التاريخ.

لكن بالنظر لليوم الذي يصادفه التاريخ المزعوم فهو يوم الخميس أي على غير عادة آبل في اتخاذ يوم الثلاثاء مكاناً لمؤتمراتها كما تعودنا عليها، مما يثير الشكك في أن يكون حدث 10 سبتمبر مخصصاً للكشف عن آيفون 12!

وكذلك يفتح باب تكهن برغبة آبل الكشف عن عدد من أجهزتها الأخرى مثل جهاز ماك بوك الجديد المدعوم برقاقتها الخاصة آبل سيلكون ” Apple Silicon ” أو آيباد 10.8 بوصة الذي تحدثت عنه الكثير من التسريبات مسبقاً.

ومع الأخد بالتقارير السابقة التي ذكرت احتمال تأخير إطلاق آيفون 12 حتى أكتوبر بسبب الأوضاع الاستثنائية التي مرت بها سلاسل توريد الشركة خلال العام  على إثر جائحة كورونا والإغلاقات التي طالتها؛ يكن الاحتمال الثاني أقرب للواقع بالكشف عن أجهزة أخرى وليس آيفون 12.

وعلى نفس السياق وبالحديث عن الآيفون الجديد من المتوقع أن يأتي بـ 4 نسخ بمواصفات متباينة تخدم شريحة أكبر من المستخدمين مع اختلاف في حجم الشاشة ودعم الكاميرات، هذا في ظل الحديث عن أخذ نسختين من الأربع مكان كل من هاتف Xr و11 برو اللذان ستوقف آبل عن تصنيعهما حسب بعض الاشاعات.

مواضيع ذات صلة:

آيفون 12 برو قد يستخدم شاشة 120 هرتز وبطارية ضخمة [شائعات]

المضدر

9to5mac

التدوينة آبل تكشف عن موعد حدث افتراضي في 10 سبتمبر المقبل عن طريق الخطأ! ظهرت أولاً على عالم التقنية.

28,342 مايكروسوفت لانشر يدعم الوضع الأفقي رسميًا مع عدد من المزايا

يضيف تطبيق مايكروسوفت لانشر بنسخته Microsoft Launcher v6.2 عدة مزايا مهمة بينها الوضع الأفقي.

في شهر يونيو الماضي، وحتى قبل ذلك بأسابيع، أطلقت شركة مايكروسوفت سلسلة من التحديثات التجريبية على لانشرها في أندرويد، وقد أتت هذه النسخ التجريبية بالعديد من المزايا التي لطالما نادى بها مستخدمي التطبيق، لعل أبرزها الدعم للوضع الأفقي، الآن، انتهت فترة التجربة وقد أتاحت الشركة هذه الميزة وأكثر في إصدارها الثابت Microsoft Launcher v6.2.

وبالإضافة إلى دعم الوضع الأفقي، هناك أيضًا إعادة تصميم لموجز مايكروسوفت، ومجموعة جديدة من الخلفيات الجميلة، فضلًا عن تحسينات في الأداء، بالنسبة للأخيرة، فقد أشار فريق عمل التطبيق بأنها لن تكون واضحة دون استخدام منتظم.

رسميًا مايكروسوفت لانشر يدعم الوضع الأفقي وأكثر

فيما يخص بموجز مايكروسوفت، تعتبر التغييرات أكثر جوهرية، فهي لا تزال في نفس المكان، ولكن مع مظهر جديد أكثر تنظيمًا، وذلك من خلال توزيع البطاقات بشكل متساوٍ مع خلفية ضبابية تحتها، مع عدم عرض الكثير من المعلومات على الشاشة الفردية، أما فيما يخص الخلفيات، فموقعها في مجلدي بينج ومايكروسوفت، وقد شملت خيارات لأذواق مختلفة.

أخيرًا وكما أشرنا سابقًا، تحديث مايكروسوفت لانشر 6.2 متاح الآن للتحميل لجميع مستخدمي هواتف أندرويد، ويمكنك الحصول عليه عبر الانتقال لصفحة التظبيق من على متجر جوجل بلاي بالأسفل.

تحميل تحديث تطبيق مايكروسوفت لانشر Microsoft Launcher v6.2.

التدوينة مايكروسوفت لانشر يدعم الوضع الأفقي رسميًا مع عدد من المزايا ظهرت أولاً على عالم التقنية.

28,311 إنفيديا تنشر مقطع فيديو يعرض تفاصيل تصميم معالجات الرسومات بين الفن والعلم

لطالما تابعنا التطور الهائل الذي وصلت إليه تقنيات رسومات الحاسوب خلال السنوات الماضية، خاصة مع إضافة تقنيات مميزة تقرب الرسومات أكثر من الواقع. ولعل شركة إنفيديا كانت عاملًا مهمًا فيما وصلنا إليه الآن من خلال تطوير معالجات رسومات تمنح تجارب مذهلة خاصة مع تقنية تتبع الأشعة التي شاهدناها خلال السنتين الماضيتين.

وبين التطور الذي نشاهده كل عام والتجربة المميزة التي نستمتع بها مع معالجات الرسومات القوية، ربما تساءلنا حول كيفية الوصول لهذه النتائج. وهو ما أجابت عن إنفيديا من خلال معلومات بسيطة ومقطع فيديو قبيل إطلاق أحدث معالجات رسومات للشركة بداية الشهر.

وتشير إنفيديا إلى 4 عناصر أساسية تأخذها بالحسبان عند تطوير معالجات الرسومات:
  • العنصر الحراري: لتوفير حل تبريد مُحسّن لتدفق الهواء يُعاد تصميمه للتغلب على القيود الحالية لتحقيق أقصى كفاءة تبريد.
  • العنصر الميكانيكي: هيكل ميكانيكي أقوى، بما في ذلك زنبرك جديد منخفض الارتفاع يترك مساحة للغطاء الخلفي.
  • الكهرباء: تصميم كهربائي مضغوط مزود بموصل طاقة جديد من 12 سنًا يتيح مساحة أكبر للمكونات والتبريد، وهو متوافق مع الموصلات ذات 8 أسنان في مصادر الطاقة الحالية مع محول مضمن.
  • تصميم المنتج: تصميم متماسك يحتضن الحل الحراري الثوري بينما ينسق بشكل جميل كل عنصر من عناصر بطاقة الرسومات.

تجدر الإشارة إلى أن إنفيديا تستعد لإقامة فعالية خاصة تبث عبر الإنترنت للحديث عن أحدث تقنياتها في 1 سبتمبر المقبل.

لكن للتعريف أكثر بهذه الأمور ومنح الجمهور لمحة بسيطة، قامت الشركة بمحاورة أفضل مهندسيها ومطوريها لمناقشة تقنيات الرسومات بمقطع مصور.

نضع بين أيديكم مقطع إنفيديا:

 

التدوينة إنفيديا تنشر مقطع فيديو يعرض تفاصيل تصميم معالجات الرسومات بين الفن والعلم ظهرت أولاً على عالم التقنية.

28,310 ديزني تضيف مجموعة قنوات جديدة لجمهور الرياضة في المنطقة على ESPN Player

أعلنت شبكة ديزني عن بشرى سارة لجمهور كرة القدم خاصة والرياضة عامة مع إضافة مجموعة قنوات وبرامج وأفلام وثائقية والفعاليات الرياضية المباشرة من الاستديو إلى خدمة ESPN Player في المنطقة العربية.

وأشارت ديزني أن الخدمة ستتوفر جميع بلدان الشرق الأوسط وأفريقيا وأوروبا، بجانب بعض أجزاء من آسيا على أجهزة الحاسوب المكتبية والأجهزة المحمولة واللوحية وأجهزة تلفاز أندرويد.

وتشمل برامج ESPN Player عروض مباشرة وحسب الطلب بما فيها ESPNFC – البرنامج اليومي المختص بتقديم أخبار كرة القدم العالمية، وبرنامج Sports Center Global  الذي يعرض آخر المستجدات لحظة وقوعها، بجانب مجموعة واسعة ومتنوعة من الأفلام الوثائقية الرياضية من ESPN، وتضم عددًا كبيرًا من سلسلة 30For30 الحائزة على جائزتَي بيبودي وإيمي. وتضيف تغطية مميزة لكرة القدم الجامعية للرابطة الوطنية لرياضة الجامعات، وتعرض أكثر من 800 مباراة كرة قدم جامعية مباشرة وحسب الطلب من بداية فعاليات الرابطة إلى موسم مباريات الأبطال ومباراة نهائي البطولة الوطنية.

وسيحظى المشاهد كذلك بمتابعة أكثر من 2,000 من أهم مباريات كرة السلة الجامعية، بما في ذلك دور الأربعة ومباراة نهائي البطولة الوطنية، سيتمكّن المشتركون من متابعة الرحلة بدءًا من “أحد الاختيار” عندما يتم كشف النقاب عن الفِرق المتنافسة، وحتى المباراة النهائية، ويشمل ذلك 67 مباراة.

وتعقيبًا الإطلاق، قال مارتن هيلي، رئيس مبيعات الإعلانات والشراكات في والت ديزني الشرق الأوسط: “لا شك في أن إضافة ESPN Player إلى منصّاتنا الشهيرة للأخبار والمعلومات الرياضية (ESPN.com وESPNCricinfo.com وتطبيق ESPN)، تتيح لنا مواصلة تقديم محتوى رياضي عالمي للجماهير في أنحاء منطقة الشرق الأوسط وشمال إفريقيا. “

وأضاف: “في ظل تعزيز الخدمة التي نقدّمها وبفضل إثرائها بالبرنامجَين اليوميَين SportsCentre وESPNFC لكرة القدم، زادت جاذبية ESPN Player لأوسع قاعدة جماهير إلى الآن. وبعد أن رصدنا الشهرة العالمية لسلسلة الأفلام الوثائقية 30for30 من ESPN – بما في ذلك سلسلة “The Last Dance” المكوّنة من 10 أجزاء – نتطلع أيضًا إلى معرفة رد فعل جماهير الرياضة في أنحاء الشرق الأوسط وشمال إفريقيا للتشكيلة المتنوعة والمتميّزة من الأفلام الوثائقية المتاحة في الخدمة.”

مجموعة متنوعة من العروض ستقدمها ديزني عبر ESPN Player

ستعمل ESPN Player على توفير أكثر من 400 فيلمًا في الوثائقي والطويل؛ بينها الفيلم الوثائقي الحائز على جائزة أوسكار “OJ: Made In America”، والفيلم الوثائقي الذي تم إصداره مؤخرًا بعنوان “LANCE”، وهو تسجيل للأحداث التاريخية بشكل مبهر وشامل وغني بالمعلومات لإحدى أكثر الشخصيات الرياضية الملهمة (ثم سيئة السمعة) على الإطلاق، من تقديم المخرجة القديرة مارينا زينوفيتش.

كذلك فيلم “Be Water” من إخراج باو نغوين، والذي يُلقي نظرة شخصية عن قُرب على حياة رائد الفنون القتالية وأيقونة الثقافة الشعبية، بروس لي، ومصدر حماسه. وفيلم “Rodman: For Better or Worse” الذي يستعرض حياة دنيس رودمان، إحدى أكثر الشخصيات استقطابًا وإثارة للجدل في مجال كرة السلة، فضلًا عن فيلم “Jordan Rides The Bus” الذي يستكشف الأسباب التي دفعت أكثر الرياضيين حبًا للمنافسة إلى التخلي عن كرة السلة للمحترفين، بعد أن قاد فريق الأحلام للتتويج بميدالية ذهبية في دورة الألعاب الأوليمبية التي أقيمت عام 1992 وقاد فريق نيويورك بولز لانتزاع لقب بطولة “NBA” للعام الثالث على التوالي في العام التالي  

ستقدم خدمة ESPN Player برامج رياضية مباشرة وحسب الطلب، كما ستتيح للمشتركين الوصول على مدار الساعة بأربع من قنوات ESPN، وهي ESPNU وThe SEC Network وThe ACC Network وThe Longhorn Network من الولايات المتحدة مباشرةً. كما ستوفر مقتطفات من المباريات وبرامج أصلية وتحليلات وتوقعات للمشجعين طوال الوقت. 

 

التدوينة ديزني تضيف مجموعة قنوات جديدة لجمهور الرياضة في المنطقة على ESPN Player ظهرت أولاً على عالم التقنية.

28,262 "هيكسا".. السيارة الطائرة بـ 18 مروحية قريبا في الخدمة تقوم القوات الجوية الأمريكية بالاختبارات الأخيرة على السيارة الطائرة التي تتسع لنقل راكب واحد عبر مروحياتها الـ 18. الشركة المصنعة تفحص أيضاً إمكانية استخدامها بشكل تجاري قريباً حيث لا تحتاج لرخصة قيادة طيران خاصة.
28,261 فيس بوك تطلق تبويب مستقل خاص بالتسوق عبر تطبيقها

أصبح للتسوق طريقة أسهل عبر شبكة فيس بوك  من خلال تبويب جديد مستقل بذاته خاص بها يظهر ضمن القائمة الجانبية للتطبيق لخدمة التسوق بفيس بوك Facebook Shops.

تقول الشركة أنها تسعى لإتاحة متجر للمستخدمين والعلامات التجارية لعرض منتجاتهم وبيعها بطريقة سهلة ومريحة. سابقاً كان الأمر يتم عبر الصفحات، لكنها الآن أصبحت منظمة اكثر.

وبدلاً من الحاجة للدخول إلى موقع الشركة بعد الضغط على المنتج ومن ثم شراءه من هناك، يمكنك الآن الشراء ضمن تطبيق فيس بوك نفسه.

تعتمد الشركة على تقنيات الذكاء الاصطناعي والرؤية الحاسوبية لتنظيم المنتجات بحيث تضعها في مجموعات حسب العلامة التجارية، اللون، التصميم، الطابع العام. ولو بحثت عن شيء ما مخصص، ستحصل على نتائج بحث مفيدة.

ووفرت فيس بوك للشركات والمتاجر أدوات لتخصيص صفحاتها على خاصية التسوق مثل عرض المنتجات بشكل فردي أو جماعي، المزيد من الإحصائيات وغيرها.

كما توفر خدمة الدعم الفني عبر تطبيق ماسنجر ورسائل انستجرام الخاصة وحتى تطبيق واتساب للرد على استفسارات الزبائن.

يأتي تحسين دعم التسوق الإلكتروني عبر شبكة فيس بوك في زمن يتزايد فيه عدد المستخدمين الذين يعتمدون على التجارة الإلكترونية خاصة مع أزمة فيروس كورونا حول العالم.

الجدير بالذكر أن هذه المزايا كلها تبدأ بالتوفر تدريجياً للمستخدمين في الولايات المتحدة حالياً، وبعدها في مناطق أخرى حول العالم.

المصدر:

The Next Web

التدوينة فيس بوك تطلق تبويب مستقل خاص بالتسوق عبر تطبيقها ظهرت أولاً على عالم التقنية.

28,260 فيت بيت تطلق ساعة Fitbit Sense مع مزايا قياس الإجهاد ودرجة حرارة الجلد وتخطيط القلب الكهربائي

أعلنت شركة فيت بيت “Fitbit” عن إطلاق ساعة Fitbit Sense المزوّدة بأحدث تقنيات النُظم والمستشعرات المبتكرة. بجانب ساعة Fitbit Versa 3 المخصصة للعناية بالصحة واللياقة مع مزايا خاصة كنظام تحديد المواقع، وساعة Fitbit Inspire 2 وقرب إطلاقها في المنطقة عبر المملكة العربية السعودية.

تأتي Fitbit Sense مع شاشة AMOLED بتصميم من المعدن والزجاج، وتتمتع بوجود مستشعر للنشاط الكهربائي للجلد (EDA) متوفر عبر الساعات الذكية، لضبط مستويات التوتر والإجهاد، مع تقنية متقدمة لتتبع معدل ضربات القلب وتطبيق جديد لتخطيط القلب الكهربائي، ومستشعر لقياس درجة حرارة الجلد حول المعصم وبطارية تدوم أكثر من 6 أيام.

تقول الشركة أنها ستقدم مع الساعة فترة تجريبية مجانية لمدة 6 أشهر لخدمة Fitbit Premium، حيث يستطيع المستخدمون الاستفادة من مزايا لوحة المؤشرات الصحية الجديدة، بما فيها مراقبة تغير معدل نبضات القلب ومعدل التنفس وقياس تشبع الأوكسجين بالدم  SpO2، لتعزيز مستويات الصحة والعافية. 

فيما تأتي ساعة Fitbit Versa 3 للعناية بالصحة واللياقة مع مزايا خاصة كنظام تحديد المواقع، وزيادة عمر البطارية لأكثر من 10 أيام حسب وصفها، بجانب إضافة ميزات أكثر لرصد مستويات الصحة واللياقة كبرنامج  Active Zone Minutes.

وستقدم فيت بيت للمستخدمين فترة تجريبية مجانية لمدة عام كامل لخدمة Premium. وهو ما سيضم تحقيق فهم ومتابعة أفضل لحالتهم الصحية خلال هذه الأوقات الاستثنائية، وذلك عبر جعل منتجاتها وأدواتها الفريدة في متناول الجميع.

وتوفر Fitbit Premium المتاحة على كافة ساعات فيت بيت تحليلًا مفصلًا للبيانات ومعلومات مخصصة تربط معطيات مستويات النشاط والنوم ومعدل ضربات القلب، حيث يوفر أدوات متقدمة لتنظيم النوم ومئات التمارين التي تحمل توقيع العلامات الشهير.

مزايا مختلفة Fitbit Sense

تتيح مزايا Fitbit Sense الاطّلاع على كيفية استجابة الجسم للإجهاد باستخدام أدوات تساعد على ضبط مستويات الإجهاد الجسدية والنفسية، حيث تم تطوير هذه الميزة لضبط مستويات الإجهاد. فيما يعمل مستشعر EDA على قياس النشاط الكهربائي للجلد بشكل مباشر عبر معصم اليد، حيث يمكن وضع راحة اليد على الوجه الأمامي للجهاز لرصد التغييرات الكهربائية البسيطة في الجلد.

وتوفر تقنية PurePulse 2.0 الجديدة مع مستشعر جديد متعدد المسارات لقياس معدل ضربات القلب وخوارزمية مطوّرة، لتشكل أحدث ابتكارات الشركة في مجال تتبع معدل ضربات القلب، كما تتيح ميزة أخرى لتقييم الخطورة القلبية عبر توفير إشعارات تُنذر بارتفاع أو انخفاض معدل ضربات القلب على الجهاز.

وتضيف الساعة مستشعر جديد لقياس درجة حرارة الجلد ورصد التغييرات التي قد تشير إلى وجود حمى أو مرض أو بداية دورة حيضية جديدة، وتقول فيت بيت أنه على عكس الفحوصات اللحظية لدرجة الحرارة، يعمل هذا المستشعر على رصد الاختلافات في درجة حرارة الجلد بين ليلة وأخرى، ما يتيح كشف التغيرات البسيطة بشكل أفضل مع مرور الوقت والانتباه إلى المؤشرات غير الطبيعية.

وتُشير الشركة بأن النتائج الأولية لدراستها حول مرض كوفيد-19 توضح أنه يمكن رصد التغييرات في المؤشرات الصحية، بواسطة أجهزة فيت بيت بالتزامن مع ظهور أعراض المرض وحتى قبل ذلك في بعض الحالات.

توفر Fitbit Sense كافة الميزات الذكية الخاصة برصد مستوى الصحة واللياقة والموجودة في ساعات فيت بيت الذكية الأخرى، بما فيها نظام تحديد المواقع المدمج وأكثر من 20 نمطًا للتمارين على الجهاز، وبرنامج SmartTrack لتتبع التمارين بشكلٍ آلي، وبرنامج Cardio Fitness لتقييم مستوى تمارين الكارديو وأدوات النوم المتطورة. 

الزجاج والمعادن وعبر التقنيات المستخدمة تقليدياً لصناعة الغواصات، مما يكسبه خواصاً مقاومة للماء حتى على عمق 50 متراً.  بينما تم تصميم نواة المستشعر الحيوي الداخلي لاستيعاب معظم أجهزة الاستشعار في كافة أجهزة  Fitbit، مما يضفي أقصى درجات الابتكار على أيّة ساعة ذكية من فيت بيت مع الحفاظ على التصميم الأنيق وعمر البطارية الطويل. 

تعزيز سلسلة فيرزا مع  Fitbit Versa 3

أضافت فيت بيت ساعة Fitbit Versa 3 المزوّدة بباقة جديدة من المزايا المريحة والذكية إلى سلسلة فيرزا، لتأتي مع نظام تحديد المواقع المتصل مع الجهاز، خريطة كثافة التمرين وتقنية PurePulse 2.0 المعززة، برنامج Active Zone Minutes لسهولة متابعة أهداف اللياقة البدنية، وكذلك ميزة تتبع الخطوات اليومية. وستوفر الساعة مكبّر صوت وميكروفون مدمج لتلقي المكالمات وتحويلها إلى البريد الصوتي وتعديل مستوى الصوت أثناء الاتّصال.

كما سيتمكن المستخدمون من خلالها استخدام Fitbit Pay كطريقة دفع سريعة وآمنة تضمن للمستخدمين تجنب التلامس والحصول على آلاف التطبيقات والواجهات. 

سعر وتوافر ساعات فيت بيت Fitbit Sense و Fitbit Versa 3 و Fitbit Inspire 2

ستتوفر ساعات Fitbit Sense و Fitbit Versa 3 و Fitbit Inspire 2 في المملكة العربية السعودية مع نهاية سبتمبر عبر أمازون ونمشي ونون ومكتبة جرير وفيرجن ميجاستور وسبورت بوديوم وإكسايت وإكسترا ووفيتنيس نييدز وساكو وتجار تجزئة آخرون. 

وستأتي نسخة Fitbit Sense بسعر 1559 ريال في المملكة العربية السعودية وبتصميم من الستانلس ستيل بتدرجات الأسود/الرمادي والأبيض الناصع/ الذهبي الفاتح.

بينما ستتوفر Fitbit Versa 3 بسعر 1119 ريال سعودي بتصميم من الألمنيوم بتدرجات الأسود/الألمنيوم الأسود والوردي الرملي/ الذهبي الفاتح والأزرق الليلي/الذهبي الفاتح.

فيما ستتوفر ملحقات Fitbit Sense وFitbit Versa 3 للبيع بشكل منفصل وتأتي ضمن تشكيلة من التصاميم، بما في ذلك الأحزمة المنسوجة والمُعاد تدويرها بتقنية REPREVE بتدرجات الكامو والرمادي الداكن والمرجاني وألوان قوس قزح، والأحزمة الرياضية بتدرجات الأسود/ الأبيض الناصع والأخضر/ الأبيض الناصع والرمادي/ الأخضر الزاهي والبطيخي/ الوردي والياقوتي/ الرمادي الضبابي، بالإضافة إلى الأحزمة المغلقة باللون الأسود والأبيض الناصع والأزرق الليلي والوردي الرملي بأسعار تبدأ من 149 ريال سعودي.

أما ساعة Fitbit Inspire 2 فستتوفر في المملكة العربية السعودية سعر 449 ريال سعودي باللون الأسود والأبيض الناصع والوردي الصحراوي. وتتوافر الإكسسوارات للبيع بشكل منفصل وتتضمن أحزمة جلد هوروين الفاخرة بغلاف مزدوج باللون الأزرق الغامق أو الأسود، وأحزمة شبكية من الفولاذ المقاوم للصدأ باللون الفضي والذهبي الوردي، وحزام من السيليكون المطبوع بألوان زاهية، وأحزمة من السيليكون الكلاسيكي باللون الأسود والأبيض الناصع والوردي الصحراوي، بالإضافة إلى حزام جديد مزود بمشبك باللون الأسود، وذلك بأسعار تبدأ من 149 ريال سعودي. 

 على نفس الجانب، سيتوفر اشتراك Fitbit Premium في المملكة العربية السعودية بسعر 9.99 دولار أمريكي شهريًا أو 79.99 دولار أمريكي عند الاشتراك السنوي.

التدوينة فيت بيت تطلق ساعة Fitbit Sense مع مزايا قياس الإجهاد ودرجة حرارة الجلد وتخطيط القلب الكهربائي ظهرت أولاً على عالم التقنية.

الصفحات

أنت هنا