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.
10 + 9 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

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

رقم الخبر عنوان الخبر التفاصيل
27,742 سوني تطرح فيديو تشويقي ليد التحكم DualSense وتقنية الصوت ثلاثي الأبعاد في PS5

في إعلان تشويقي جديد من سوني جاءت الشركة بقرابة الدقيقة عبر فيديو يركز على نظام الصوت ثلاثي الأبعاد في وحدة ألعابها القادمة بلايستيشن 5 “PS5” وكذلك التلميح إلى ميزات في يد التحكم المخصصة له DualSense بدعمها خصائص جديدة على لوحة اللمس والأزرار الأمامية.

ووفقاً للإعلان وعدت سوني بتجربة لعب فريدة تجعل اللاعبين على بلايستيشن 5 “PS5” يشعرون أكثر على حد تعبيرها، حيث من الواضح من أن تقنية الصوت ستجلب معها جواً من الإثارة يزيد من الاندماج والاستمتاع باللعب مع العتاد القوي الذي سبق وكشفت عنه الشركة.

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

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

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

وللمتشوقين لوحدة الألعاب ومحبيها لم تشير سوني بعد لموعد الإطلاق أو تاريخ بدء الحجز المسبق؛ في ظل الحديث عن رغبة الشركة في المحافظة على سعر معقول وكذلك احتمال وصول PS5 السوق قبل وحدة ألعاب مايكروسوفت Xbox Series X.

المصدر:

engadget

 

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

27,727 تحديث Lightroom الأخير على iOS يتسبب في فقدان صور بعض المستخدمين للأبد

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

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

وكان أحد مستخدمي Lightroom الذين عانوا من المشكلة قد كتب على منصة Reddit بأنه تواصل مع خدمة العناية بالعملاء لشركة أدوبي لمدة تجاوزت 4 ساعات على مدار اليومين الماضيين؛ لكنهم في نهاية المطاف قد أبلغوه أن لا حل للمشكلة وما فقده من بيانات وصور لا يمكن استرداده.

وعلى منصة توتير كان قد اشتكى مستخدم أخر قائلاً بأنه فقد قرابة 800 صورة وأداوت وإعدادت مسبقة لتعديل الصور مدفوعة الثمن تساوي مئات الدولارات على حد قوله.

فيما اعتذر ممثل الشركة Rikk Flohr عن خلل Lightroom أمس الأربعاء دون الإشارة إلى النطاق الذي طالته المشكلة بالتحديد؛ غير أنه أوضح أنها أثرت فقط على البيانات والإعدادت المسبقة التي لم يتم مزامنها على سحابة أدوبي.

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

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

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

تطبيق لايت روم “ Lightroom ” من أدوبي يأتي بخيارات تصدير متقدمة ودورس تفاعلية

المصدر

The Verge

التدوينة تحديث Lightroom الأخير على iOS يتسبب في فقدان صور بعض المستخدمين للأبد ظهرت أولاً على عالم التقنية.

27,726 تيك توك حذفت أكثر من 380 ألف فيديو بسبب خطاب الكراهية

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

تقول الشركة أنها منذ بداية العام الجاري وحتى اليوم حذفت أكثر من 380 ألف فيديو و 64 ألف تعليق في الولايات المتحدة لمخالفتها قواعد خطاب الكراهية. كما حظرت أكثر من 1300 مستخدم.

هذه المرة الأولى التي تنشر بها تيك توك هذا النوع من الإحصائيات، مع أنها لا تضمن أن المنصة أصبحت خالية من خطاب الكراهية ، لكنها خطوة نحو ذلك.

وتؤكد تيك توك أنها تقدم تدريب مكثف لموظفيها لحجب مثل هكذا فيديوهات تحرض على الكراهية وتمنع ظهورها في نتائج البحث.

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

المصدر:

TikTok Newsroom

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

27,725 تسريب بيانات شخصية لـ 235 مليون مستخدم من يوتيوب وتيك توك وانستجرام

انكشفت قاعدة بيانات غير محمية تحوي بيانات شخصية حول 235 مليون مستخدم تم تجميعها من خدمات كبرى مثل انستجرام و تيك توك و يوتيوب.

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

تم تجميع تلك البيانات بطريقة تجريف الويب Web scraping والتي تقوم بها بوتات مبرمجة لجمع البيانات من صفحات الويب بصورة آلية. لا يعتبر تجريف الويب عملية قرصنة كما أنها ليست محظورة لأنها تجمع بيانات مكشوفة بالأصل للعموم.

إلا أن شركات الشبكات الاجتماعية عادة تمنع إجراء مثل هذه العمليات على مستخدميها لحماية بياناتهم.

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

وعندما تواصلت شركة الحماية مع الشركة صاحبة القاعدة تم تحويل طلبها إلى شركة Social Data التي مقرها هونغ كونغ واعترفت بالوصول غير المصرح به للقاعدة التي تحوي البيانات الشخصية لملايين المستخدمين على يوتيوب و انستجرام و تيك توك وغيرها، ونفت علاقتها مع شركة Deep Social.

وأكدت Social Data أن ما قامت به ليس اختراقاً بل يمكن لأي شخص لديه وصول إلى الانترنت أن يجمع مثل هذه البيانات.

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

يذكر أن شركة الأمن والحماية نفسها اكتشفت العام الماضي قاعة بيانات تحوي بيانات عن 267 مليون مستخدم فيس بوك.

المصدر:

Comparitech

التدوينة تسريب بيانات شخصية لـ 235 مليون مستخدم من يوتيوب وتيك توك وانستجرام ظهرت أولاً على عالم التقنية.

27,704 إدارة الذاكرة في dot NET

تُخزَّن الكائنات المُنشئة باستخدام العَامِل new بقسم الكَوْمَة المُدار في الذاكرة (managed heap). يُوفِّر اطار عمل ‎.Net كَانِس المُهملات (Garbage Collector)، والذي يُدير الذاكرة ويُنْهِي (finalize) الكائنات المهملة دون أيّ تَدَخُّل صريح من المُبرمج.

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

مفهوم الكائنات الحية والكائنات الميتة

كقاعدة عامة، يُعدّ الكائن حيًّا (live object) إذا ما زال بالإِمكان إعادة اِستخدَامه، ويُعدّ مَيتًا (dead object) إذا أصبح ذلك غير ممكن. ما يُحدِّد إِمكانية الاستخدَام مِن عدمه هو وجود مُتغيّر أو حَقْل واحد على الأقل يَحمِل مَرجِعًا (reference) إلى مكان الكائن بالذاكرة. في حالة خروج كل مُتغيّرات مَراجِع كائن ما -هذا إن وُجدت أساسًا في مرحلة ما أثناء التَّنفيذ- من النطاق (scope)، يُعدّ الكائن مَيتًا ويُنْهَى (finalize) عند إجراء عملية كَنْس.

مثال 1

في الشيفرة التالية، نُعرِّف النوع FinalizableObject، والذي يَحوِي فقط باني النوع (constructor) ومُنْهِيه (finalizer):

public class FinalizableObject { public FinalizableObject() { Console.WriteLine("Instance initialized"); } ~FinalizableObject() { Console.WriteLine("Instance finalized"); } }

نُنشئ كائنًا من هذا النوع:

new FinalizableObject();

مما يُنتِج الخْرج التالي بالرغم مِن أننا لم نَستخدِم الكائن بَعْد:

<namespace>.FinalizableObject initialized

لن يُنْهَى الكائن حتى يَنتهي عَمَل البرنامج، والذي يؤدي في الواقع إلى إنهاء جميع الكائنات وتحرير مساحتها من قسم الكَوْمَة بالذاكرة. ومع ذلك يُمكنك استدعاء التابع Collect لإجبار كَانِس المُهملات (Garbage Collector) على إجراء عملية كَنْس خلال لحظة معينة، كالتالي:

new FinalizableObject(); GC.Collect();

مما يُنتِج الخْرج التالي:

<namespace>.FinalizableObject initialized <namespace>.FinalizableObject finalized

أُنْهيت جميع الكائنات الميتة غير المُستخدَمة (dead objects)، وحُرِّرت مساحتها من قسم الكَوْمَة بالذاكرة بمجرد اِستدعاء كَانِس المُهملات.

مثال 2

بِفَرْض أن كلًا من النوعين FinalizableObject1 و FinalizableObject2 مُشتقَّين من النوع FinalizableObject المُعرَّف مُسبقًا ويَرِثا نفس سُلوك طباعة رسائل التهيئة والإنهاء، نُنشِئ الكائنات التالية:

var obj1 = new FinalizableObject1(); var obj2 = new FinalizableObject2(); obj1 = null; // (1) GC.Collect(); // (2)

يكون الخْرج كالتالي:

<namespace>.FinalizableObject1 initialized <namespace>.FinalizableObject2 initialized <namespace>.FinalizableObject1 finalized

(1) لمّا أُسْنِدت القيمة الفارغة null إلى المُتغيّر obj1 (كان يَحمِل مَرجِعا إلى الكائن من النوع FinalizableObject1)، أصبح مِن غير الممكن -بطبيعة الحال- الولوج لهذا الكائن مرة أُخرى وبالتالي عُدّ ميتًا. ولذلك عندما اُستدعِي كَانِس المُهملات في وقت لاحق من تنفيذ الشيفرة (2)، أنهاه وحرَّر مساحته بقسم الكَوْمَة بالذاكرة، ويَظهَر ذلك جَلّيًا من خلال طباعة عبارة المُنْهِي (finalizer). على النقيض، ما يزال هناك مَرجِع للكائن من النوع FinalizableObject2 وبالتالي عُدّ حيًّا ولم يُنْهَ.

مثال 3

بِفَرْض أن النوع FinalizableObject يَحمِل خاصية عَلّنية (public) من نفس نوعه تُسمَّى OtherObject. ماذا سيحُدث لو كان هناك كائنين ميتين، يَحمِل كلًا منهما مَرجِعًا للآخر؟ كالتالي:

var obj1 = new FinalizableObject1(); var obj2 = new FinalizableObject2(); obj1.OtherObject = obj2; obj2.OtherObject = obj1; obj1 = null; // لم يعد هناك مَرجِع للكائن من النوع FinalizableObject1 obj2 = null; // لم يعد هناك مَرجِع للكائن من النوع FinalizableObject2 // لكن كلا منهما ما يزال يحمل مرجعا للآخر GC.Collect()

يكون الخْرج كالتالي:

<namespace>.FinalizedObject1 initialized <namespace>.FinalizedObject2 initialized <namespace>.FinalizedObject1 finalized <namespace>.FinalizedObject2 finalized

على الرغم من أن كِلاَ الكائنين يَحمِل مَرجِعا إلى الكائن الآخر، يَقوُم كانس المُهملات بإنهائهما ويُحرِّر مساحتهما من قسم الكَوْمَة بالذاكرة؛ وذلك لعدم وجود أي مَرجِع لهما ضِمْن كائن حيّ.

المَراجِع الضعيفة (Weak References)

المَراجِع الضعيفة WeakReference هي -كأيّ مَرجِع- تُشير إلى مكان كائن مُعين بالذاكرة. لا يُعوِّل كَانِس المُهملات على وجود المَراجِع الضعيفة (weak references) عند تقديره لحالة الكائن من حيث كَوْنه حيًا أو ميتًا. وبالتالي، لا يَمنع وجود مَرجِع ضعيف إلى كائن معين كَانِس المُهملات من إنهاء هذا الكائن وتَحرير مساحته بالذاكرة، ومن هنا كان عَدّها ضعيفة (weak).

انظر المثال التالي:

var weak = new WeakReference<FinalizableObject>(new FinalizableObject()); GC.Collect();

يُنتِج الخْرج التالي:

<namespace>.FinalizableObject initialized <namespace>.FinalizableObject finalized

حَذَفَ كَانِس المُهملات -عند اِسْتِدْعائه- الكائن من قسم الكَوْمَة بالذاكرة على الرغم من وجود مَرجِعًا إليه من النوع WeakReference داخل النطاق (scope). نَستنتِج من ذلك:

أولًا: مِن غيْر الآمن أن تَفترِض أن المساحة المُخصَّصة بقسم الكَوْمَة لكائن مُشار إليه بمَرجِع ضعيف لا تزال صالحة.

ثانيًا: عندما تحتاج إلى تحصيل (dereference) قيمة مَرجِع ضعيف، اِستخدِم التابع TryGetTarget أولًا والذي يُعيد قيمة منطقية تُحدِّد إذا ما حُرِّرت مساحته بالذاكرة أم لا، ثم اُكتب شيفرة لمُعالجة كِلاَ الحالتين. كالتالي:

var target = new object(); var weak = new WeakReference<object>(target); target = null; // فحص ما إذا كان الكائن ما زال مُتاحًا if(weak.TryGetTarget(out target)) { // يُمكنك استخدام الكائن هنا } else { // لا ينبغي استخدام الكائن هنا }

تُوفِّر جميع إصدارات إطار عمل ‎.NET نسخة غير مُعمَّمة من النوع WeakReference والتي تَعمَل بنفس الطريقة. في المقابل، دُعِّمت النسخة المُعمَّمة منذ اصدار 4.5.

انظر المثال التالي للنسخة الغيْر مُعمَّمة:

var target = new object(); var weak = new WeakReference(target); target = null; if (weak.IsAlive) { target = weak.Target; // يُمكنك استخدام الكائن هنا } else { // لا ينبغي استخدام الكائن هنا } التابع Dispose والمنهيات (finalizers)

إذا أردت التأكد من تحرير الموارد (resources) التي يَستخدِمها كائن مُعين بمجرد أن يَخْرُج من النطاق ويُصبح من غير الممكن اِستخدَامه -خاصة إن كانت الموارد مُستَنزِفة للذاكرة أو غير مُدارة مثل التَعامُل مع الملفات فقد يُبلَّغ عن اعتراض عند محاولة فتح ملف للقراءة ولا يُغلَق مِقبَض الملف (file handle) كما يَنبغي-، صَرِّح عن كَوْن نوع الكائن من الواجهة IDisposable والتي تحتوي على تابع وحيد هو Dispose لا يَستقبِل أي مُعامِلات:

public interface IDisposable { Dispose(); }

ثم نفِّذ تابعها Dispose داخل النوع المَذكور بحيث يكون هذا التابع مَسئولًا عن تحرير تلك الموارد.

بخلاف المُنْهِيات (finalizers) التي تُستَدعَى دائمًا عند انتهاء فترة حياة الكائن، يَقع عاتِق اِستِدعاء التابع Dispose على المُبرمِج وهو ما ليس مَضْمُونًا. يُمكن للمُبرمِج اِستِدعاء التابع Dispose صراحةً، كالمثال التالي:

private void SomeFunction() { // هيئ كائن يستهلك موارد مستنزفة للذاكرة var disposableObject = new ClassThatImplementsIDisposable(); // ‫استدعي التابع Dispose disposableObject.Dispose(); // (1) }

(1): يَخرُج المُتغيّر disposableObject من النطاق (scope). مع ذلك، لا يُمكننا الجزم بموعد إنهاء (finalize) الكائن لنفسه، ولذلك يَضمَن اِستِدعاء التابع Dispose تحرير موارده المُستَنزِفة للذاكرة.

ربما تَستَدعِيها كذلك صراحةً داخل كُتلة finally، كالمثال التالي:

StreamReader sr; string textFromFile; string filename = "SomeFile.txt"; try { sr = new StreamReader(filename); textFromFile = sr.ReadToEnd(); } finally { if (sr != null) sr.Dispose(); }

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

string textFromFile; string filename = "SomeFile.txt"; using (StreamReader sr = new Streamreader(filename)) { textFromFile = sr.ReadToEnd(); }

يُعدّ التَعامُل مع الأنواع التي يَكون إطار العمل مسؤولًا عن تَنشِئة كائناتها مثال آخر. في هذه الحالة، عادة ما يُشتقّ النوع الجديد من نوع أساسي (base). مثلًا، عندما تُعْلِن عن نوع مُتَحكِم جديد (controller)، يَرِث من النوع الأساسي System.Web.Mvc.ControllerBase. فإذا كان النوع الأساسي يُنفِّذ الواجهة IDisposable، غالبًا ما يَعني ذلك أن اطار العمل سيَستَدعِي التابع Dispose بطريقة سليمة، ولكن هذا ليس مَضْمُونًا.

لا يُعدّ التابع Dispose بديلًا للمُنْهِي (finalizer)، لكن ينبغي أن تَستخدِم كليهما بحسب الغرض:

  • يُحرِّر المُنْهِي الموارد -على أيّ حال- لتَجَنُّب حُدوث أي تَسرُّب للذاكرة (memory leaks).
  • يُحرِّر التابع Dispose الموارد بمجرد إنتهاء الحاجة إليها؛ لتخفيف الضغط على الذاكرة المُخصَّصة (memory allocation) عامةً.
استخدام النوع SafeHandle لتغليف الموارد غير المُدارة

عند كتابة مُغلِّف (wrapper) لموارد غير مُدارة، اِحرص على أن يُشتقّ المُغلِّف من النوع SafeHandle بدلًا من أن تُنفِّذ الواجهة IDisposable أو تُنشِئ مُنْهِي (finalizer) بنفسك، حيث يُنفِّذ هذا النوع بالفعل الواجهة من أجلك، ويُهيِئ المُنْهِيات (finalizers) تهيئة مناسبة، كما يَضمَن تَّنفيذ شيفرة التحرير.

يجب أن يَكون النوع المُشتقّ من الصنف SafeHandle صغيرًا وبسيطًا لتقليل احتمالية تَسريب المِقبَض (handle). يتأكد النوع SafeHandle من تحرير أي موارد غيْر مُدارة حتى في حالة حدوث تَسريب لكائنات المُغلِّف.

انظر المثال التالي:

using System.Runtime.InteropServices; class MyHandle : SafeHandle { public override bool IsInvalid => handle == IntPtr.Zero; public MyHandle() : base(IntPtr.Zero, true) { } public MyHandle(int length) : this() { SetHandle(Marshal.AllocHGlobal(length)); } protected override bool ReleaseHandle() { Marshal.FreeHGlobal(handle); return true; } }

تنبيه: لا يَتعدَّى المثال بالأعلى كَوْنِه مجرد محاولة لاستعراض طريقة اِشتقاق SafeHandle. وعليه وجب التنبيه أنه من العبث تَخصيص جزء من الذاكرة بهذه الطريقة.

تحرير الكائنات وإنهائها بشكل سليم

يَستهدِف كلًا من التابع Dispose والمُنْهِيات (finalizer) ظرفًا مختلفًا. ولذلك، من الضروري للأنواع التي تَستخدِم موارد مُستَنزِفة للذاكرة أن تُنفِّذ كلتا الطريقتين. وبالنتيجة، نحصل على نوع يُمكنه التعامُل المُلائم مع كِلاَ المَوقِفيّن المُحتملين:

  • اِستدعاء المُنْهِي فقط.
  • اِستدعاء التابع Dispose أولًا ثم اِستدعاء المُنْهِي فيما بعد.

أحد الحلول هو كتابة شيفرة التنظيف (cleanup) بطريقة قابلة للتنفيذ أكثر من مرة بدون وجود اختلاف بالنتيجة. تَعتمِد تلك القابلية على طبيعة عملية التنظيف نفسها، على سبيل المثال:

  • لا تُحدِث محاولة إغلاق اتصال بقاعدة بيانات (connection) تم إغلاقه مُسبقّا فرقًا.

  • قد يؤدي تحديث عَداد إلى نتائج خاطئة عند اِستدعاء الشيفرة مرتين بدلًا من مرة واحدة.

حل آخر هو التأكد من تَّنفيذ شيفرة التنظيف (cleanup) مرة واحدة فقط بغض النظر عن السياق الخارجي، وهو ما يُمكن عادةً تحقيقه باستخدام مُتغيّر راية (flag) مُخصَّص لهذا الغرض. كالتالي:

public class DisposableFinalizable1: IDisposable { private bool disposed = false; ~DisposableFinalizable1() { Cleanup(); } public void Dispose() { Cleanup(); } private void Cleanup() { if(!disposed) { // ضمن الشيفرة الفعلية المسئولة عن تحرير الموارد هنا disposed = true; } } }

كذلك يمكن تحقيقه باِستدعاء التابع SuppressFinalize()‎ في حالة اِستدعاء التابع Dispose. يُوفِّر كانس المُهملات هذا التابع الذي يَسمَح بتخطي تَّنفيذ المُنْهِي (finalizer)، كالتالي:

public class DisposableFinalizable2 : IDisposable { ~DisposableFinalizable2() { Cleanup(); } public void Dispose() { Cleanup(); GC.SuppressFinalize(this); } private void Cleanup() { // ضمن الشيفرة الفعلية المسئولة عن تحرير الموارد هنا } }

ترجمة -وبتصرف- للفصلين Memory management و Garbage Collection من كتاب ‎.NET Framework Notes for Professionals

27,703 لوسيد آير أسرع سيارة كهربائية شحنًا في العالم بمنظومة يزيد جهدها عن 900 فولت 

كشفت شركة لوسيد موتورز أن سيارتها لوسيد آير ستكون أسرع سيارة كهربائية في العالم من حيث الشحن، وذلك مع منظومة بطاريات ليثيوم أيون يزيد جهدها عن 900 فولت تستطيع قطع مسافة 32 كم مقابل كل دقيقة شحن، ما يتيح لها قطع مسافة 483 كم بعد شحن خلايا بطاريتها لمدة 20 دقيقة فقط.

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

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

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

ستحظى لوسيد آير بإمكانات رائدة من ناحية قدرات الشحن، منها:
  • القدرة على الشحن السريع باستخدام التيار المستمر وقطع 20 ميل في الدقيقة، حيث يزيد أعلى معدل شحن عن 300 كيلوواط.
  • منظومة كهربائية بجهد فائق يتجاوز 900 فولت.
  • وحدة شحن مدمجة بقدرة 19.2 كيلوواط، تدعم سرعات شحن باستخدام التيار المتناوب تصل إلى 129 كم بالساعة.
  • قدرة مدمجة لتعزيز الشحن، وإمكانية الشحن السريع باستخدام المستوى الأول والثاني من التيار المتناوب، وحتى المستوى الثالث الأكثر قوةً في التيار المستمر، وذلك بالاستفادة من موصل عالمي موحّد لنظام الشحن المشترك يمكن استخدامه في أي من محطات الشحن العامة.
  • قدرة مدمجة ومتطورة للشحن ثنائي الاتجاه، لمواكبة التطورات المستقبلية في نقل الطاقة من السيارة للشبكة وإلى غيرها من السيارات.
الشحن في المحطات العامة والمنزل

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

وبالتعاون مع شركة إليكتريفاي أمريكا، سيتمكّن ملاك السيارة الكهربائية ممن استلموا سياراتهم في الولايات المتحدة من شحنها بشكل مجاني وبسرعة أعلى من أي سيارة أخرى متوفرة. حيث تعمل إليكتريفاي أمريكا في الوقت الحالي على بناء أكبر شبكة من محطات الشحن فائقة السرعة والتي تتراوح قدرتها بين 150-350 كيلوواط، عبر شبكتها المتنامية التي تضم أكثر من 2000 وحدة شحن في الولايات المتحدة الأمريكية. وسيتمكّن أصحاب سيارات لوسيد آير من تحديد مواقع محطات الشحن التابعة لإليكتريفاي أمريكا ومعرفة مدى توافرها في الوقت الحقيقي بسهولة.

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

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

 

التدوينة لوسيد آير أسرع سيارة كهربائية شحنًا في العالم بمنظومة يزيد جهدها عن 900 فولت  ظهرت أولاً على عالم التقنية.

27,670 ثورة علمية ـ روبوت على شكل خنفساء يعمل بمادة كحولية بدل البطارية صمم علماء روبوتا بالغ الضآلة، يقارب الخنفساء الصغيرة في الحجم، والمهم أنه هذا الروبوت لا يحتاج لبطارية للعمل وإنما يستخدم مادة كحولية لكي يتمكن من الزحف والتسلق وحمل شحنات على ظهره لساعتين تقريبا.
27,650 روبوت شبيه بحشرة حقيقية.. لا يحتاج إلى بطاريات

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

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

ويبلغ طول هذا الروبوت 15 مليمتراً فقط ما يجعله من "أخف الروبوتات التي صممت حتى الآن ومن أكثرها استقلالية" وفق ما أكد مخترعه شيوفنغ يانغ لوكالة فرانس برس.

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

وتكمن المشكلة في أن الروبوتات تحتاج إلى محركات تكون عادة كبيرة الحجم وتحتاج إلى تيار كهربائي ما يجعل وجود البطاريات ضرورياً.

إلى ذلك تزن أصغر البطاريات المتاحة راهناً 10 إلى 20 مرة أكثر من الخنفساء النمرية وهي حشرة وزنها 50 ميلغراماً استخدمها فريق العلماء مرجعاً في عملهم.

الوقود السائل

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

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

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

حمولة تزيد 2,6 مرة عن وزنه

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

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

وأوضح يانغ أن "روبيتل" قادر على نقل حمولة تزيد 2,6 مرة عن وزنه على الظهر وأن يتنقل مدة ساعتين بخزان وقود ممتلئ، مؤكداً أنه "بالمقارنة يبلغ وزن أصغر روبوت زاحف يعمل ببطارية، غراماً واحداً ويعمل لمدة 12 دقيقة تقريباً".

عمليات تفتيش وإنقاذ

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

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

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

27,637 الدرس 36: التعبيرات النمطية Regular expressions في Cpp

التعبيرات النمطية (تُسمّى أحيانًا regexs أو regexps) هي صِيغ نصّية تمثّل الأنماط التي يمكن مطابقتها في السلاسل النصّية، وقد تدعم التعبيرات النمطيّة التي قُدِّمت في C++‎ 11 -اختياريًا- إعادة مصفوفة من السلاسل النصّية المطابِقة، أو صيغة نصّية أخرى تحدّد كيفيّة استبدال الأنماط المتطابقة في السلاسل النصية.

الصياغة الأولى للدالة regex_match:

bool regex_match(BidirectionalIterator first, BidirectionalIterator last, smatch& sm, const regex& re, regex_constraints::match_flag_type flags)

يمثّل BidirectionalIterator أيَّ مُكرّر محارف يوفّر عامليْ الزيادة (increment) والإنقَاص (decrement). والوسيط smatch يمكن أن يكون كائنًا ‎cmatch‎ أو أيّ متغيّر آخر من الصنف ‎match_results‎ يقبل النوع ‎BidirectionalIterator‎، ويمكن حذف هذا الوسيط إذا لم تكن بحاجة إلى إعادة نتائج التعبير النمطي. وتعيد ما إذا كان التعبير ‎re‎ يطابق كامل تسلسل المحارف المُعُرّف بواسطة ‎first‎ و ‎last‎.

الصياغة الثانية للدالة regex_match:

bool regex_match(const string& str, smatch& sm, const regex re&, regex_constraints::match_flag_type flags)

قد تكون string من النّوع ‎const char*‎ أو قيمة نصّية يسارية، وتُحذَف الدوالّ التي تقبل سلسلة نصيّة يمينية R- بشكل صريح. الوسيط smatch يمكن أن يكون كائنًا ‎cmatch‎ أو أيّ متغيّر آخر من الصنف ‎match_results‎ يقبل سلسلة نصية. ويمكن حذف الوسيط ‎smatch‎ إذا لم تكن بحاجة إلى إعادة نتائج التعبير النمطي .تعيد الدالة regex_match ما إذا كان التعبير ‎re‎ قد طابق كامل السلسلة النصية str.

أمثلة عن regex_match و regex_search const auto input = "Some people, when confronted with a problem, think \"I know, I'll use regular expressions.\""s; smatch sm; cout << input << endl;

إن انتهى input بعلامة تنصيص تحتوي كلمة تبدأ بالكلمة "reg" وكلمة أخرى تبدأ بـ "ex" فالتقط الجزء السابق من input.

if (regex_match(input, sm, regex("(.*)\".*\\breg.*\\bex.*\"\\s*$"))) { const auto capture = sm[1].str(); cout << '\t' << capture << endl; // الخرج: "\tSome people, when confronted with a problem, think\ n ";

ابحث في الجزء الملتقط عن "a problem" أو "problems #".

if (regex_search(capture, sm, regex("(a|d+)\\s+problems?"))) { const auto count = sm[1] == "a"s ? 1 : stoi(sm[1]); cout << '\t' << count << (count > 1 ? " problems\n" : " problem\n"); // الخرج: --> "\t1 problem\ n " cout << "Now they have " << count + 1 << " problems.\n"; // الخرج: "Now they have 2 problems\ n " } }

هذا مثال حيّ على ذلك.

مثال عن مُكرّر التعبيرات النمطية regex_iterator

تُعد ‎regex_iterator‎ خيارًا ممتازًا عند معالجة الخرج الملتقَط بشكل متكرر، وسيعيد تحصيل ‎regex_iterator‎ كائن ‎match_result‎، وهذا يفيد في الالتقاطات الشرطية (conditional captures) أو الالتقاطات المترابطة.

لنقل أنّنا نريد تقطيع (tokenize) مقتطف من شيفرة C++‎:

enum TOKENS { NUMBER, ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION, EQUALITY, OPEN_PARENTHESIS, CLOSE_PARENTHESIS };

يمكننا تقطيع هذه السلسلة النصّية:

const auto input = "42/2 + -8\t=\n(2 + 2) * 2 * 2 -3"s‎

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

vector<TOKENS> tokens; const regex re { "\\s*(\\(?)\\s*(-?\\s*\\d+)\\s*(\\)?)\\s*(?:(\\+)|(-)|(\\*)|(/)|(=))" }; for_each(sregex_iterator(cbegin(input), cend(input), re), sregex_iterator(), [& ](const auto &i) { if (i[1].length() > 0) { tokens.push_back(OPEN_PARENTHESIS); } tokens.push_back(i[2].str().front() == '-' ? NEGATIVE_NUMBER : NON_NEGATIVE_NUMBER); if (i[3].length() > 0) { tokens.push_back(CLOSE_PARENTHESIS); } auto it = next(cbegin(i), 4); for (int result = ADDITION; it != cend(i); ++result, ++it) { if (it->length() > 0 U) { tokens.push_back(static_cast<TOKENS> (result)); break; } } }); match_results<string::const_reverse_iterator > sm; if (regex_search(crbegin(input), crend(input), sm, regex { tokens.back() == SUBTRACTION ? "^\\s*\\d+\\s*-\\s*(-?)" : "^\\s*\\d+\\s*(-?)" })) { tokens.push_back(sm[1].length() == 0 ? NON_NEGATIVE_NUMBER : NEGATIVE_NUMBER); }

هذا مثال حيّ.

ينبغي أن يكون وسيط ‎regex‎ قيمة يسارية (L-value)، إذ أنّ القيم اليمينيّة لن تعمل.

المراسي (Anchors)

توفّر C++‎ أربع مراسي فقط:

  • ‎^‎ - تمثّل بداية السلسلة النصّية
  • ‎$‎ - تمثّل نهاية السلسلة النصّية
  • ‎\b‎ - تمثّل محرف ‎\W‎ أو بداية أو نهاية السلسلة النصّية.
  • ‎\B‎ - تمثّل محرف ‎\w‎.

في المثال التالي سنحاول التقاط عددٍ مع إشارَتِه:

auto input = "+1--12 * 123/+1234"s; smatch sm; if (regex_search(input, sm, regex { "(?:^|\\b\\W)([+-]?\\d+)" })) { do { cout << sm[1] << endl; input = sm.suffix().str(); } while (regex_search(input, sm, regex { "(?:^\\W|\\b\\W)([+-]?\\d+)" })); }

هذا مثال حيّ

لاحظ أنّ المرساة لا تستهلك أيّ محرف.

مثال على استخدام regex_replace

تأخذ هذه الشيفرة عدّة أنماط من الأقواس، وتعيد تنسيقها إلى نمط K&R أو كيرنيجان وريتشي (إشارة إلى أسلوب الأقواس المستخدم في نواة يونكس الأولى).

const auto input = "if (KnR)\n\tfoo();\nif (spaces) {\n foo();\n}\nif (allman)\n{\n\tfoo();\n}\nif (horstmann)\n{\tfoo();\n}\nif (pico)\n{\tfoo(); }\nif (whitesmiths)\n\t{\n\tfoo();\n\t}\n"s; cout << input << regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1{\n\t$2\n}\n") << endl;

مثال حيّ.

مثال على استخدام regex_token_iterator

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

const auto input = "please split,this,csv, ,line,\\,\n"s; const regex re{ "((?:[^\\\\,]|\\\\.)+)(?:,|$)" }; const vector<string> m_vecFields{ sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator() }; cout << input << endl; copy(cbegin(m_vecFields), cend(m_vecFields), ostream_iterator<string>(cout, "\n"));

مثال حي.

ينبغي أن يكون الوسيط ‎regex‎ قيمة يسارية (L-value)، فالقِيم اليمينيّة (R-value) لن تعمل.

المحدِّدات الكمية

لنفترض أنّ لدينا سلسلة نصية ثابتة (‎const string input‎) تحتوي رقم هاتف وعلينا أن نتحقّق من صحّته. يمكن أن نبدأ بطلب مدخلات رقمية مع أيّ عدد من المحدِّدات الكمية ‎regex_match(input, regex("\\d*"))‎، أو مع محدِّد كمي ‎regex_match(input, regex("\\d+"))‎ واحد أو أكثر، بيْد أنّ كليهما سيفشلان إذا كانت المدخلات ‎input‎ تحتوي على سلسلة نصّية رقمية غير صالحة مثل: "123".

سنستخدم n أو أكثر من المحدِّدات الكمية للتحقّق من أنّنا حصلنا على 7 أرقام على الأقل:

regex_match(input, regex("\\d{7,}"))

سيضمن هذا أنّنا سنحصل على العدد الصحيح من أرقام الهاتف، لكن يمكن أن تحتوي ‎input‎ أيضًا على سلسلة رقمية أطول ممّا ينبغي مثل: "123456789012"، لذلك فالحلّ هو استخدام محدِّد كمي بين n و m بحيث يكون عدد أحرف ‎input‎ محصورًا بين 7 و 11 رقمًا

regex_match(input, regex("\\d{7,11}"));

هذا أفضل، لكن ما تزال هنا مشكلة، إذ ينبغي أن ننتبه إلى السلاسل الرقمية غير القانونية التي تقع في النطاق [7، 11]، مثل: "123456789"، لذا دعنا نجعل رمز البلد (country code) اختياريًا عبر استخدام محدِّد كمي كسول(lazy quantifier):

regex_match(input, regex("\\d?\\d{7,10}"))

من المهمّ أن تعلم أنّ المحدِّد الكمي الكسول يحاول مطابقة أقل عدد ممكن من المحارف، وعليه فإنّّ الطريقة الوحيدة للمطابقة هي إذا كانت هناك فعليًا 10 محارف متطابقة مع ‎\d{7,10}‎. (لمطابقة الحرف الأول بطمع (greedy)، سيكون علينا استخدام: ‎\d{0,1}‎}.) يمكن ضمّ المحدِّد الكمي الكسول (lazy quantifier) إلى أيّ محدِّد كمي آخر.

الآن، كيف يمكننا جعل رمز المنطقة اختياريًا، وعدم قبول رمز الدولة إلّا في حال كان رمز المنطقة موجودًا؟

regex_match(input, regex("(?:\\d{3,4})?\\d{7}"))

تتطّلب ‎\d{7}‎ في هذا التعبير النمطي النهائي سبعة أرقام، ومسبوقة -اختياريًا- إما بثلاثة أو أربعة أرقام. لاحظ أنّنا لم نضم المحدِّد الكسول : ‎\d{3,4}?\d{7}‎، إذ أنّ ‎\d{3,4}?‎ يمكن أن يطابق إمّا 3 أو 4 محارف، بيْد أنّه يُفضّل الاكتفاء بـ 3 محارف، ( لهذا يُسمّونه كسولًا). بدلاً من ذلك، جعلنا المجموعة غير الملتقِطة (non-capturing group) لا تنجح في المُطابقة إلّا مرّة واحدة على الأكثر، مع تفضيل عدم التطابق. وهذا يتسبّب في منع التطابق إذا لم تتضمن ‎input‎ رمز المنطقة، كما في: "1234567".

أود أن أشير في ختام موضوع المحدِّدات الكمية، إلى محدِّد آخر يمكنك استخدامه، وهو المحدِّد الكمي المُتملِّك (possessive quantifier). كلا المحدِّديْن سواءً المكمّم القنوع أو المكمّم المتملّك، يمكن ضمّهما إلى أيّ مكمّم آخر. وظيفة المكمّم المتملّك الوحيدة هي مساعدة محرّك التعبير النمطي عبر إخباره بأخذ ما أمكن من الأحرف المطابقة وعدم التخلي عنها حتى لو تسبّب ذلك في فشل التعبير النمطي.

على سبيل المثال، التعبير التالي لا معنى له: regex_match(input, regex("\\d{3,4}+\\d{7}))‎‎ لأنّ مُدخلًا ‎input‎ مثل:" 1234567890 " لن يُطابَق بالتعبير ‎‎\d{3,4}+‎، وسيُطابق دائمًا بأربعة محارف، حتى لو كانت مطابقة 3 محارف كافية لإنجاح التعبير النمطي.

يُستخدم المحدِّد المتملّك عادة عندما تحدّ الوحدة المحدَّدة كميًا عددَ المحارف القابلة للمطابقة. على سبيل المثال:

regex_match(input, regex("(?:.*\\d{3,4}+){3}"))

يمكن استخدامها إذا كانت ‎input‎ تحتوي أيًّا ممّا يلي:

123 456 7890 123-456-7890 (123)456-7890 (123) 456 - 7890

بيْد أنّ فائدة هذا التعبير النمطي تظهر عندما تتضمّن ‎input‎ مُدخلاً غير صالح، مثل:

12345 - 67890

بدون استخدام المحدِّد الكمي المتملّك، سيتعيّن على محرّك التعبير النمطي الرجوع واختبار كل توليفات ‎‎.*‎‎، سواء مع 3 أو 4 محارف للتحقّق ممّا إن كان يستطيع العثور على تركيبة مطابقة. سيبدأ التعبير النمطي، باستخدام المحدِّد المتملّك، من حيث توقّف المحدِّد المتملّك الثاني، أي المحرف "0"، ثمّ سيحاول محرّك التعبير النمطي ضبط ‎.*‎ للسماح بمطابقة ‎\d{3,4}‎؛ وفي حال تعذّر ذلك سيفشل التعبير النمطي، ولن يرجِع للخلف للتحقّق ممّا إذا كان من الممكن إنجاح المطابقة عبر إعادة ضبط ‎.*‎ في مرحلة أبكر.

تقطيع سلسلة نصية Splitting a string

هذا مثال توضيحيّ على كيفية تقسيم سلسلة نصّية:

std::vector<std::string> split(const std::string &str, std::string regex) { std::regex r{ regex }; std::sregex_token_iterator start{ str.begin(), str.end(), r, -1 }, end; return std::vector<std::string>(start, end); } split("Some string\t with whitespace ", "\\s+"); // "Some", "string", "with", "whitespace"

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

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

27,636 تويتر تكشف عن تقرير الشفافية للنصف الثاني من 2019

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

ووفقاً لتقرير الشركة المعلن من مركز تويتر للشفافية والمتاح للجميع قد فاقت عدد طلبات المعلومات من الجهات الحكومية عن مالكي بعض الحسابات في الفترة الممتدة من يونيو إلى ديسمبر من العام الماضي 2019 قد فاقت 26.2 ألف طلب بزيادة بلغت 26%. عن العام السابق.

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

بالنسبة لعمليات المتابعة على المنصة قامت تويتر خلال فترة الستة أشهر بفرض سياساتها على 2.4 مليون حساب ما بين إغلاق وتوقيف وحذف؛ كما كشفت معلومات حول 83.6 حساب مرتبطة بالصين وروسيا وتركيا وقامت بايقافها لانتهاكها سياسات المنصة.

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

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

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

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

تويتر تتيح ترجمة النبذة التعريفية للحسابات على أندرويد و iOS

تويتر 

التدوينة تويتر تكشف عن تقرير الشفافية للنصف الثاني من 2019 ظهرت أولاً على عالم التقنية.

الصفحات

أنت هنا