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 ...
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 ...
رقم الخبر | عنوان الخبر | التفاصيل |
---|---|---|
51,231 | مدخل إلى إدارة الموارد (Resources) وتخصيصها في Cpp |
إدارة الموارد هي إحدى أصعب الأشياء في C و C++، لكن C++ توفّر لنا العديد من الطرق التي نصمم بها إدارة الموارد في برامجنا، وسنحاول في هذا المقال أن نشرح بعض هذه الطرق. تقنية RAII: تخصيص الموارد يكافئ التهيئةتقنية RAII وتدعى اكتساب أو تخصيص الموارد هي تهيئة (Resource Acquisition Is Initialization) هو مصطلح شائع في إدارة الموارد، ويستخدم المؤشّرات الذكية (smart pointer) لإدارة الموارد في حالة الذاكرة الديناميكية، وتُمنح الموارد المكتسبة ملكية مؤشر ذكي أو مدير موارد مكافئ مباشرة عند استخدام أسلوب RAII. ولا يمكن الوصول إلى المورد إلا من خلال ذلك المدير، مما يمكِّن المدير من تتبّع مختلف العمليات الجارية على المورد. على سبيل المثال، تحرِّر الكائنات من النوع std::auto_ptr مواردها تلقائيًا عندما تخرج عن النطاق، أو عندما تُحذف بطريقة أخرى. #include <memory> #include <iostream> using namespace std; int main() { { auto_ptr ap(new int(5)); cout << *ap << endl; // تطبع 5 } }في المثال السابق، كان المورد هو الذاكرة الديناميكية، ودُمِّر auto-ptr ثم حُرِّر مورده تلقائيًا. الإصدار ≥ C++ 11 كانت المشكلة الرئيسية في كائنات std::auto_ptr أنّها لا يمكن أن تُنسخ دون نقل الملكية: #include <memory> #include <iostream> using namespace std; int main() { auto_ptr ap1(new int(5)); cout << *ap1 << endl; // تطبع 5 auto_ptr ap2(ap1); cout << *ap2 << endl; // تطبع 5 cout << ap1 == nullptr << endl; }تفسير الشيفرة السابقة:
وبسبب دلالات النسخ الغريبة تلك فإنّ هناك قيودًا على استخدام std::auto_ptr، مثل أنها لا يمكن أن تُستخدم في الحاويات، وذلك لمنع حذف الذاكرة مرتين: فإذا كان لدينا كائنين من النوع auto_ptrs يملكان نفس المورد، سيحاول كلا الكائنين تحريره عند تدميرهما. ومن المهم منع تحرير المورد الذي سبق تحريره من قبل، إذ سيؤدي ذلك التحرير الثاني إلى حدوث مشاكل، لكن بأي حال فإن std::shared_ptr لديه طريقة لتجنب ذلك، مع عدم نقل الملكية أثناء النسخ. #include <memory> #include <iostream> using namespace std; int main() { shared_ptr sp2; { shared_ptr sp1(new int(5)); // sp1 إعطاء الملكيّة إلى cout << *sp1 << endl // تطبع 5 sp2 = sp1; // يملك كلاهما المورد ،sp1 من sp2 نسخ cout << *sp1 << endl; // تطبع 5 cout << *sp2 << endl; // تطبع 5 } // الملكية الحصرية للمورد sp2 عن النطاق وتدميره، أصبح لـ sp1 خروج cout << *sp2 << endl; } // عن النطاق، وتحرير المورد sp2 خروج القفل Lockingهذا مثال عن قفل سيّء: std::mutex mtx; void bad_lock_example() { mtx.lock(); try { foo(); bar(); if (baz()) { mtx.unlock(); // ينبغي فتح القفل عند كل نقطة خروج return; } quux(); mtx.unlock(); // يحدث فتح القفل العادي هنا } catch (...) { mtx.unlock(); // ينبغي فرض فتح القفل في حال طرح اعتراض throw; // والسماح للاعتراض بالاستمرار } }تلك طريقة خاطئة لتنفيذ عمليتي القفل والفتح لكائنات المزامنة (mutex)، ولا بدّ أن يتحقّق المُبرمِجُ من أنّ جميع التدفّقات (flows) الناتجة عن إنهاء الدالّة تؤدّي إلَى استدعاء unlock()، وذلك للتأكد أنّ فتح القفل باستخدام unlock() سيحرّر الكائن المزامنة الصحيح. وهذه عمليات هشة كما وضحنا أعلاه، لأنّها تتطّلب من المطوّرين متابعة النمط يدويًا. ويمكن حلّ هذه المشكلة باستخدام صنف مُصمّم خصّيصًا لتنفيذ تقنية RAII: std::mutex mtx; void good_lock_example() { std::lock_guard<std::mutex > lk(mtx); // المنشئ يقفل. // المدمِّر يفتح! // تضمن اللغة استدعاء المدمر. foo(); bar(); if (baz()) { return; } quux(); }lock_guard هو قالب صنف بسيط للغاية يستدعي lock() ويمرّر إليه الوسيط المُمرّر إلى مُنشئه ويحتفظ بمرجع إلى ذلك الوسيط، ثمّ يستدعي unlock() على الوسيط في مدمّره، ممّا يعني ضمان فتح قفل mutex عند خروج lock_guard عن النطاق. ولا يهم سبب الخروج عن النطاق سواءً كان ذلك بسبب اعتراض أو عودة مبكّرة، ذلك أن جميع الحالات سيتمّ التعامل معها، وسيفتح القفل بشكل صحيح بغض النظر عن سير البرنامج. ScopeSuccessالإصدار ≥ C++ 17 نستطيع باستخدام int std::uncaught_exceptions() أن ننفذ إجراءً لم يكن لينفَّذ إلّا في حالة النجاح (عدم رفع اعتراض في النطاق). وقد كانت bool std::uncaught_exception() فيما سبق تسمح برصد العمليّات الجارية لفكّ المكدّس (stack unwinding). انظر: #include <exception> #include <iostream> template < typename F> class ScopeSuccess { private: F f; int uncaughtExceptionCount = std::uncaught_exceptions(); public: explicit ScopeSuccess(const F &f): f(f) {} ScopeSuccess(const ScopeSuccess &) = delete; ScopeSuccess &operator=(const ScopeSuccess &) = delete; // f() might throw, as it can be caught normally. ~ScopeSuccess() noexcept(noexcept(f())) { if (uncaughtExceptionCount == std::uncaught_exceptions()) { f(); } } }; struct Foo { ~Foo() { try { ScopeSuccess logSuccess { []() { std::cout << "Success 1\n"; } }; // نجاح النطاق // أثناء فكّ المكدّس Foo حتى في حال تدمير // 0 < std::uncaught_exceptions() // std::uncaught_exception() == true } catch (...) {} try { ScopeSuccess logSuccess { []() { std::cout << "Success 2\n"; } };تزيد القيمة المعادة من std::uncaught_exceptions، … throw std::runtime_error("Failed"); }وتنقص القيمة المعادة من std::uncaught_exceptions … catch (...) { } } }; int main() { try { Foo foo; throw std::runtime_error("Failed"); // std::uncaught_exceptions() == 1 } catch (...) { // std::uncaught_exceptions() == 0 } }سيكون الخرج: Success 1 ScopeFail (C++ 17)الإصدار ≥ C++ 17 يمكننا تنفيذ إجراء معيّن لا يُنفَّذ إلّا عند الفشل (رفع اعتراض في النطاق) بفضل int std::uncaught_exceptions()، وكانت bool std::uncaught_exception() تسمح سابقًا برصد إن كانت هناك عملية جارية لفك المكدّس. #include <exception> #include <iostream> template < typename F> class ScopeFail { private: F f; int uncaughtExceptionCount = std::uncaught_exceptions(); public: explicit ScopeFail(const F &f): f(f) {} ScopeFail(const ScopeFail &) = delete; ScopeFail &operator=(const ScopeFail &) = delete;يجب ألا ترفع ()f وإلا فستستدعى std::terminate، نتابع المثال … ~ScopeFail() { if (uncaughtExceptionCount != std::uncaught_exceptions()) { f(); } } }; struct Foo { ~Foo() { try { ScopeFail logFailure { []() { std::cout << "Fail 1\n"; } }; // نجاح النطاق // أثناء فكّ المكدّس Foo حتى في حال تدمير // 0 < std::uncaught_exceptions() في حال // std::uncaught_exception() == true أو سابقا } catch (...) {} try { ScopeFail logFailure { []() { std::cout << "Failure 2\n"; } };تزيد القيمة المعادة من std::uncaught_exceptions …. throw std::runtime_error("Failed"); }تقل القيمة المعادة من std::uncaught_exceptions …. catch (...) { } } }; int main() { try { Foo foo; throw std::runtime_error("Failed"); // std::uncaught_exceptions() == 1 } catch (...) { // std::uncaught_exceptions() == 0 } }سيكون الخرج: Failure 2 Finally/ScopeExitإذا لم ترد كتابة أصناف خاصّة للتعامل مع بعض الموارد، فاكتب صنفًا عامًا على النحو التالي: template < typename Function> class Finally final { public: explicit Finally(Function f): f(std::move(f)) {} ~Finally() { f(); } // (1) انظر أدناه Finally(const Finally &) = delete; Finally(Finally &&) = default; Finally &operator=(const Finally &) = delete; Finally &operator=(Finally &&) = delete; private: Function f; }; // عندما يخرج الكائن المُعاد عن النطاق f تنفيذ الدالة template < typename Function> auto onExit(Function && f) { return Finally<std::decay_t < Function>> { std::forward<Function> (f) }; }وهذا مثال على استخدام ذلك الصنف: void foo(std::vector<int> &v, int i) { // ... v[i] += 42; auto autoRollBackChange = onExit([ &]() { v[i] -= 42; }); // ... `foo(v, i + 1)` شيفرة تكرارية }ملاحظة (1): يجب أخذ الملاحظات التالية حول تعريف المدمّر في الاعتبار عند التعامل مع الاعتراضات: Finally() noexcept { f(); }: std::terminate // تُستدعى في حال رفع اعتراض Finally() noexcept(noexcept(f())) { f(); } // إلّا في حال رفع اعتراض أثناء فك المكدّس terminate() لا تُستدعى Finally() noexcept { try { f(); } catch (...) { /* ignore exception (might log it) */} } ) // لا تُستدعى std::terminate، لكن لا نستطيع معالجة الخطأ (حتى في حالة عدم فك المكدّس كائنات المزامنة وأمان الخيوط Mutexes & Thread Safetyقد تحدث مشكلة إن حاولت عدّة خيوط الوصول إلى نفس المورد، فلنفترض مثلًا أنّ لدينا خيطًا يضيف العدد 1 إلى متغيّر. فأوّل شيء يفعله هو أنّه يقرأ المتغيّر، ثم يضيف واحدًا إليه، ثم يعيد تخزينه مرّة أخرى. لنفترض الآن أنّنا هيّأنا ذلك المتغيّر عند القيمة 1، ثم أنشأنا نُسختين من ذلك الخيط، فبعد أن ينتهي كلا الخيطين، نتوقّع أن تكون قيمة ذلك المتغيّر هي 3، لكن هناك بعض المشاكل التي قد تحدث هنا، سنفصلها في الجدول التالي: الخيط 1 الخيط 2 المرحلة 1 قراءة 1 من المتغير المرحلة 2 قراءة 1 من المتغير المرحلة 3 إضافة 1 إلى 1 للحصول على 2 المرحلة 4 إضافة 1 إلى 1 للحصول على 2 المرحلة 5 تخزين 2 في المتغير المرحلة 6 تخزين 2 في المتغير 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; }في نهاية العملية، تُخزّن القيمة 2 في المتغيّر بدلًا من 3، ذلك أن الخيط 2 يقرأ المتغيّر قبل أن يُحدِّث الخيط 1 ذلك المتغيّر. ما الحلّ إذن؟ يكون الحل في كائنات المزامنة … . كائن المزامنة (mutex) هو كائن لإدارة الموارد، ومُصمّم لحل هذا النوع من المشاكل. فعندما يحاول خيط ما الوصول إلى مورد، فإنّه يستحوذ على كائن المزامنة لذلك المورد (resource's mutex). ويحرّر ذلك (releases) الخيطُ كائن المزامنة بمجرّد الانتهاء من العمل على المورد. وعند استحواذ خيط على كائن مزامنةٍ فإنّ كلّ الاستدعاءات للاستحواذ على ذلك الكائن لن تعود إلى أن يُحرَّر. لفهم ذلك بشكل أفضل، فكّر في كائن المزامنة كطابور انتظار في متجر كبير، إذ تنتقل الخيوط في الطابور لمحاولة الاستحواذ على كائن المزامنة، ثم تنتظر الخيوط التي تسبقُها حتى تنتهي، ثم تستخدم المورد، ثم تخرج عن الطابور عن طريق تحرير كائن المزامنة. فلو حَاول الجميع الوصول إلى المورد في نفس الوقت ستحدث فوضى كبيرة. الإصدار ≥ C++ 11 المكتبة std::mutexهي تطبيق كائن المزامنة في C++ 11. #include <thread> #include <mutex> #include <iostream> using namespace std; void add_1(int& i, const mutex& m) { // الدالة التي ستُنفّذ في الخيط m.lock(); i += 1; m.unlock(); } int main() { int var = 1; mutex m; cout << var << endl; // تطبع 1 thread t1(add_1, var, m); // إنشاء خيط مع وسائط thread t2(add_1, var, m); // إنشاء خيط آخر t1.join(); t2.join(); // انتظار انتهاء الخيطين cout << var << endl; // تطبع 3 }هذا الدرس جزء من سلسلة دروس عن C++. ترجمة -بتصرّف- للفصل Chapter 83: RAII: Resource Acquisition Is Initialization والفصل Chapter 132: Resource Management من كتاب C++ Notes for Professionals |
51,192 | أمازون تبدأ تغليف كوكب الأرض بالإنترنت |
اشترت شركة أمازون تسع عمليات إطلاق من المشروع المشترك بين بوينغ ولوكهيد مارتن ULA لإرسال الأقمار الصناعية لمشروعها المسمى كويبر Kuiper التي تبث الإنترنت إلى الفضاء، فيما تمثل أول اتفاقية إطلاق لعملاقة التجارة الإلكترونية. ورفضت أمازون الإفصاح عن عدد الأقمار الصناعية التي يحملها كل إطلاق. وتخطط الشركة لبناء ما يسمى كوكبة مكونة من 3236 قمرًا صناعيًا في الفضاء لجلب الإنترنت إلى المناطق الريفية من العالم التي لديها اتصال ضئيل أو معدوم. كما تمثل الكوكبة تعزيزًا كبيرًا للبنية التحتية لمنصتها العملاقة للحوسبة السحابية AWS. وكانت التفاصيل المتعلقة بالشبكة شحيحة منذ أن وافقت لجنة الاتصالات الفيدرالية على إطلاق شبكة الأقمار الصناعية في شهر يوليو 2020. وتواجه أمازون منافسة شديدة أيضًا من شركات OneWeb وسبيس إكس التي تنشر شبكات الإنترنت ذات النطاق العريض في المدار الأرضي المنخفض، وفقا للبوابة العربية للأخبار التقنية. وتطلب لجنة الاتصالات الفيدرالية من أمازون إطلاق ما لا يقل عن نصف شبكة كويبر الخاصة بها – ما يقرب من 1618 قمرًا صناعيًا – بحلول شهر يوليو 2026. وتساعد مهام صاروخ Atlas V أمازون على تحقيق هذا الهدف، لكن يمكن للشركة استخدام صواريخ أخرى أيضًا. وتستخدم سبيس إكس، التي تتفوق بكثير على أمازون مع كوكبة الإنترنت الخاصة بها، صاروخها Falcon 9 لنقل 1355 قمرًا صناعيًا من أصل 12000 قمر صناعي لشبكتها ستارلينك حتى الآن. وأطلقت OneWeb نحو 146 قمرًا صناعيًا من قرابة 650 قمراً صناعياً مخطط لها لشبكتها، كما تخطط شركة أخرى، Telesat، لإطلاق 300 قمرًا صناعيًا. وقال نائب رئيس امازون للتكنولوجيا لمشروع كويبر: صممت الأقمار الصناعية للمشروع لتلائم أنواعًا مختلفة من الصواريخ، لكن صفقة ULA توفر لنا صاروخًا موثوقًا لإطلاق أقمار كويبر للمرة الأولى. وتدور أقمار كويبر الصناعية حول الأرض على ارتفاعات تتراوح بين 590 و 630 كيلومتر. وتقول أمازون: إن نماذج كويبر الأولية أثبتت سرعات تصل إلى 400 ميغابت في الثانية، ويستمر الأداء في التحسن في المستقبل. وفي العام الماضي، كشفت الشركة عن تصميمات للهوائيات التي يستخدمها العملاء للاستفادة من إنترنت كويبر. ويمكن لهذه الهوائيات أيضًا الاتصال بالأقمار الصناعية الأخرى في المدارات الثابتة بالنسبة للأرض، أو المدارات الأعمق على بعد 22000 ميل على الأقل. وتعهدت أمازون باستثمار 10 مليارات دولار في مشروع كويبر، ولديها أكثر من 500 شخص يعملون فيه، ويركز فريقها على ابتكار تقنية جديدة لجعل النطاق العريض في المتناول وبأسعار معقولة. وأصبح المدار الأرضي المنخفض، حيث تعمل جميع أقمار الإنترنت الخاصة بهذه الشركات، مزدحمًا مع تقدم سبيس إكس في نشر أقمار ستارلينك. |
51,191 | فيسبوك يوقف كلوب هاوس عند حده.. بميزات صوتية |
أعلن موقع فيسبوك عن مجموعة من الميزات الصوتية الجديدة في إطار منافسته مع تطبيق "كلوب هاوس". وتتضمن الميزات الجديدة؛ ميزة الغرف الصوتية الخاصة بالمحادثات المباشرة، إضافة إلى المقاطع الصوتية لمشاركة الرسائل الصوتية القصيرة مع ميزة بث جديد. وبالرغم من ذلك، لم يطلق الموقع هذه الميزات بعد، إلا أنه سيتم إطلاق ميزة "الغرف الصوتية" في الصيف القادم. وميزة الغرف الصوتية هي الأكثر تشابهًا مع تطبيق كلوب هاوس التي ستسمح للمستخدمين بالمشاركة في المحادثات المباشرة على كل من فيسبوك وماسنجر. ومن المقرر أن يختبر "فيسبوك" الميزة داخل المجموعات وعلى مجموعة من الشخصيات العامة حتى يتمكنوا من مشاركة الأفكار مع جماهيرهم وإنشاء منتديات للنقاش. كما يعمل فيسبوك على ميزة البث الصوتي التي ستسمح للمستخدمين بتصفح وتنزيل والاستماع إلى البودكاست مباشرة من تطبيق فيسبوك، كما سيتمكن المستخدمون من الاستماع إلى المقاطع الصوتية أثناء فتح التطبيق. |
51,190 | آبل تعلن عن مفاجآت.. إصدار طال انتظاره! |
قد يعاني كثيرون من الإجهاد بسبب الفعاليات الافتراضية بعد عام من مكالمات الفيديو، لكن هذا الأمر لا ينطبق على ما يبدو على شركة (آبل)، التي تخطط للإعلان عن منتجات جديدة خلال حدث على الإنترنت، بدون (آيفون) اليوم الثلاثاء، في أول فعالية من نوعها للشركة عام 2021. ويتوقع محللون إصدار أجهزة (آي باد) جديدة، فضلا عن إصدارات ملونة جديدة محتملة من (آي ماك). كما قد تعرض الشركة شيئًا يسمى (إير تاغز)، والذي يبدو أنه جهاز تتبع بحجم العملة المعدنية يمكنه متابعة الأشياء التي لا تريد أن تفقدها - سلحفاتك أو هاتفك أو فنجان القهوة أو ربما أطفالك الصغار! منتجات مختلفةإلى ذلك، قال دانييل آيفز، المحلل في "ويب باش"، إن آبل ستطلق أنواعا مختلفة من المنتجات. وأضاف "في هذه البيئة الافتراضية، كان إطلاق منتجات آبل ناجحًا للغاية في جذب المطورين والمستهلكين حول مجموعة منتجاتها الجديدة. آبل علامة تجارية فريدة وإطلاق المنتجات هو عمودها الفقري." وإلى جانب أجهزة آي باد- ومن بينها آي باد برو، وآي باد ميني- توقع آيفز أن تقدم آبل قلما جديدا للفن اليدوي، والكتابة باستخدام طرق معينة من آي باد - وبعض التلميحات حول أجهزة (إير بودز-3) اللاسلكية الجديدة. إصدار طال انتظارهإلى ذلك، يتوقع إطلاق سماعات الأذن تلك في فعالية افتراضية منفصلة أوائل الصيف. يشار إلى أنه في الخريف، من المرجح أن تعقد آبل (فعالية آيفون) التي طال انتظارها، حيث ستكشف النقاب عن (آي فون-13). |
51,189 | تعرف على برنامج ترادوس (Trados) وأهم الأقسام به |
تعرفنا في المقالة السابقة على فوائد برنامج ترادوس وكيف يمكنه مساعدتك في عملك كمترجم عن طريق توفير الكثير من الوقت والجهد. سنتعرف في هذه المقالة على كيفية الحصول على برنامج ترادوس، وما هي الأقسام الرئيسية (tabs) به. كيفية الحصول على برنامج ترادوسوازنا في المقالة السابقة بين أسعار برنامج ترادوس والخطط المختلفة التي تعرضها الشركة، يمكنك الرجوع إليها لتعلم ما يناسبك منها، والشراء من الموقع الرسمي للشركة، أما إذا كنت لم تحسم أمرك بعد، فيمكنك الاستفادة من التجربة المجانية التي توفرها الشركة لمدة ثلاثين يومًا، مع العلم أنه لا يمكنك الاستفادة من هذه التجربة المجانية إذا كان قد سبق لك تثبيت أي نسخة من برنامج (SDL Trados Studio 2021) أو قد استفدت من تلك التجربة المجانية مسبقًا. كل ما عليك فعله هو أن تملأ البيانات المطلوبة في الرابط أعلاه-لا تقلق لن يطلبوا منك بيانات بطاقتك الائتمانية- وتضغط إرسال (Submit) وتبدأ عملية التنزيل خلال ثوان، لتبدأ رحلتك الماتعة والقيمة في استخدام واحد من أفضل وأشهر برامج الترجمة بمساعدة الحاسوب (CAT Tools) على الإطلاق. كيفية تثبيت برنامج ترادوستثبيت برنامج ترادوس عملية سلسة وسهلة للغاية، لكن قبل شرحها يجب أن تتأكد من أن لديك الإمكانيات التالية على حاسوبك: *- يُفضل أن تستخدم متصفح غوغل كروم (Google Chrome) أو فايرفوكس (Firefox) كمتصفحك الافتراضي.
بعد إتمام عملية التنزيل، اضغط على الايقونة وستبدأ عملية التثبيت فورًا، وعند اكتمالها سيظهر لديك على سطح المكتب رمزًا مختصرًا للبرنامج، اضغط عليه، والآن مبارك أصبحت مستعدًا للعمل على برنامج ترادوس. واجهة المستخدم والأقسام الرئيسيةبمجرد ضغطك على الرمز المختصر لبرنامج ترادوس، سيفتح معك البرنامج تلقائيًا وستظهر لديك واجهة المستخدم التالية (قد تكون هناك بعض التغييرات الطفيفة نظرًا لاختلاف نسخ البرنامج)، ستجد الأقسام الرئيسية التي سأشرحها تباعًا: قسم الترحيب (Welcome)وهو أول قسم ستجده مفتوح أمامك بصورة افتراضية، وبها أربعة أقسام فرعية: الصفحة الرئيسية (Home)، ابدأ (Get Started)، مصادر أكثر (More Resources)، وأخر الأخبار (Latest News). الصفحة الرئيسية (Home)في بداية ذلك القسم، ستجد خيارًا بسحب الملف (drag) أو البحث عنه (browse) الذي ترغب في ترجمته، وأسفل منه ستجد خيارًا بفتح حزمة المشروع (Open Project Package)، وهذا إذا كنت ترغب في العمل على ملف أُرسل لك في الصيغة الخاصة لمشروعات ترادوس. يأتي بعده، فتح مشروع مشارك مع مجموعة (Open Trados GroupShare Project)، وهذا إذا كنت تريد العمل ضمن فريق على نفس الملف، وأخيرًا هناك سحابة اللغة (Language Cloud) وهي تزودك بمصادر للترجمة الآلية العصبية. ابدأ (Get Started)بهذا القسم عدة روابط تزودك بمصادر للتعلم الذاتي لاستخدام البرنامج، بعض هذه الروابط للقراءة والبعض الأخر فيديوهات توضيحية، كما به رابط القناة الرسمية على اليوتيوب والتي يمكنك من خلالها متابعة كل جديد تنشره الشركة عن برامجها. مصادر أكثر (More Resources)بهذا القسم إرشادات أيضًا ولكنها ربما أكثر تحديدًا عن القسم السابق، فستجد ملاحظات عن الإصدار الذي تستخدمه بالإضافة إلى رابط لنظام المساعدة تبحث فيه عن أي مشكلة قد تواجهك أثناء استخدامك للبرنامج والحل المقترح لها. علاوة على دليل الانتقال من إصدار لأخر، فإذا كنت تستخدم مثلًا إصدار 2019 وتريد تحديثه لتستخدم إصدار 2021 فسيزودك هذا الدليل بالفروق الجوهرية بين الإصدارين ليجعل استخدامك أسهل. وأخيرًا، يوجد بذلك القسم رابط لمتجر التطبيقات الخاص بـ(SDL) والذي يحتوي على العديد من التطبيقات المجانية -لكن يُشترط حصولك على رخصة لاستخدام البرنامج- التي تثري من تجربتك في استخدام البرنامج. أخر الأخبار (Latest News)هذا القسم هو الأخير ضمن قسم الترحيب، وهو يعرض تلقائيًا الأخبار الجديدة للشركة وجميع المستجدات بها. قسم "المشاريع" (Projects)تظهر بهذا القسم جميع المشاريع الموجودة سواء التي لم تبدأ العمل بها بعد أو التي تعمل عليها أو التي أتممتها. هناك أربعة أقسام فرعية بهذا القسم وكل قسم فرعي به عدة أقسام أخرى، لذا سأشرح فقط أهم تلك الأقسام وأكثرها استخدامًا. أهم ما في قسم "الصفحة الرئيسية" (Home) المندرج تحت قسم "المشاريع" (Projects)يحتوي هذا القسم على أهم الوظائف التي ستحتاجها أثناء استخدامك للبرنامج، بدايةً من إنشاء "مشروع جديد" (New Project) إلى فتح مشروع قائم بالفعل، إلى تحكم في ضبط مشروعك (Project Settings). بالإضافة إلى القيام بمهمات مجمعة (Batch Tasks) والتي تحتوي على عشرات المهمات، أهمها على الإطلاق تحديث ذاكرة الترجمة الرئيسية وتحديث ذاكرة ترجمة المشروع. أظن تلك هي أهم الوظائف وأكثرها استخدامًا في ذلك القسم لننتقل إلى القسم التالي الملفات (Files). قسم الملفات (Files)ولا يوجد الكثير في هذا القسم للتعرف عليه، فهو يختص بإظهار الملفات التي يحتوي عليها كل المشروع وإضافة المزيد منها من خلال (Add Files) أو حذفها (Delete Files). قسم التقارير (Reports)أيضًا لا يوجد الكثير لنستعرضه في هذا القسم، فهو يظهر لك مختلف التقارير التي يقوم بها وهناك عدة تقارير، أهمها تقرير تحليل الملفات (Analyze Files) وهو يظهر العديد من الاحصائيات كعدد الإجمالي للكلمات وكم كلمة مكررة وكم كلمة جديدة وكم كلمة يوجد توافق بينها وبين الكلمات الموجودة بذاكرات الترجمة وما هي نسبة هذا التوافق إلى أخره. قسم المحرر (Editor)يُعد هذا القسم من أهم الأقسام إذ أن غالبية المهام التي ستقوم بها موجودة به. فبعد إنشاء المشروع واضافة الملفات إليه، ستفتح هذا القسم لتبدأ العمل على الترجمة. هناك قسمان مشتركان بين قسم المشاريع وقسم المحرر، ألا وهما: ضبط المشروع (Project Settings) هذا القسم به العديد من المزايا وهي في حالة إغفالك لإنشاء ذاكرة ترجمة أو قاعدة بيانات فيمكنك تدارك هذا الأمر عن طريق إنشاء ذاكرات ترجمة أو استخدام ذاكرات موجودة بالفعل، من خلال هذا القسم. وأما القسم الثاني فهو: مهمات مجمعة (Batch Tasks) الذي سبق وأن أعطيت نبذة عنه في قسم المشاريع. يلي ذلك الأقسام خاصة بالتنسيق، مع العلم بأن البرنامج يطبق التنسيق الخاص بالملف الأصلي على الملف الهدف تلقائيًا، لكن فائدة هذا القسم تأتي في حالة رغبتك إدخال تنسيقات إضافية. ثم قسم الإدراج السريع (Quick Insert) في حالة رغبت في إدراج بعض الرموز أو أردت تظليل نصًا محددًا. يليه بحث التماثل (Concordance Search) وهي وظيفة مهمة جدًا إذ تمكنك من البحث في جميع الذاكرات الترجمة عن كلمة أو عبارة ما وإظهار النتائج لها، ومن ثم التنقل بين الترجمات السابقة لها واختيار أحدها لتطبيقه. قسم المصطلحات (Terminology) وهذا القسم لن يكون مفعلًا إلا إذا أنشأت قاعدة بيانات (Term Base) عند إنشائك للمشروع، وهو يمكنك من إظهار الترجمات للمصطلحات وإضافة مصطلحات جديدة، أما البحث فيمكنك القيام به في قواعد البيانات المختلفة الموجودة لديك عن طريق المستطيل الذي يقع تحت قسم إجراءات الخلايا (Segment Actions) وهو يُسمى (Termbase Search). غالبًا لن تحتاج للقسم التالي ألا وهو التأكيد (Confirm) -لأنني سأشرح اختصارًا سريعًا يُغني عن استخدامه- والمقصود به التأكيد على صحة الترجمة ومن ثم إضافتها لذاكرة الترجمة. إجراءات الخلايا (Segment Actions) أيضًا غالبًا لن تحتاج لهذا القسم إلا إذا رغبت في دمج عدة خلايا مع بعضها أو شعرت أن هناك خلية كبيرة وأردت تقسيمها لخليتين (المقصود بالخلية هي تلك الحقول التي يقسم ترادوس الملف إليها ويكون مقابل كل خلية خلية فارغة لتضيف الترجمة فيها). قسم الملاحة (Navigation) وذلك إذا أردت الانتقال لخلية معينة وهو يتيح لك الانتقال إما برقم الخلية أو فئتها-المقصود بالفئة: خلية غير مترجمة، أو الخلية التي يوجد توافق بنسبة 100% بينها وبين خلية سابقة...إلخ- أو حالتها-مسودة، مُترجمة، غير مُترجمة…إلخ- أو الخلايا التي بها تعليقات. وأخيرًا قسم التحرير وبه وظائف البحث(Find) والاستبدال(Replace) واختيار الكل (Select All) وهذا أيضًا يوجد اختصارات -سنشرحها في وقتها- تغنينا عن اللجوء إليه. هناك خياران مهمان في قسم المراجعة (Review) بقسم المحرر ألا وهما تتبع التغيير (Track Change) وهو يعمل على الملف الهدف في حالة مراجعة ترجمة ملف مثلًا وتريد إبراز ما قمت بتغييره. والخيار الآخر هو التدقيق الاملائي (Spell Check) هو يعمل بصورة مشابهة لتلك الموجودة في برنامج مايكروسوفت وورد. الخاتمةذلك كان عرضًا سريعًا لأهم الأقسام الموجودة بترادوس وأكثرها استخدامًا، والآن بعدما أصبح البرنامج مألوفًا لديك وكسرت حاجز الخوف، استعد لإطلاق أول مشاريعك على ترادوس والذي ستتعلم كيفية إنشائه في المقالة الثالثة. اقرأ أيضًا
|
51,183 | أجنة قرود بخلايا جذعية بشرية .. معضلة أخلاقية! | طرح إنتاج أجنة قرود زرعت فيها خلايا جذعية بشرية من قبل فريق عمل أمريكي صيني أسئلة أخلاقية بين العلماء: متى يمكن اعتبار هذه الأجنة بشرية وهل لها حق الحياة؟ |
51,163 | الأحداث المتعلقة بالنصوص: النسخ واللصق والقص والكتابة والتعديل ومعالجتها في جافاسكربت |
لنتناول مختلف اﻷحداث التي ترافق تحديث المُعطيات. الحدث: changeيقع الحدث change عند تمام تغيّر العنصر. بالنسبة للمُدخلات النصّيّة، ذلك يعني أنّ الحدث يقع عندما تفقد التركيز. على سبيل المثال، عند الكتابة في الحقل النصيّ أدناه، لا يكون هناك أيّ حدث. لكن عندما ننقل التركيز إلى مكان آخر، كالنقر على زرّ مثلا، سيكون لدينا الحدث change: <input type="text" onchange="alert(this.value)"> <input type="button" value="Button">See the Pen JS-events-change-input-ex1 by Hsoub (@Hsoub) on CodePen. بالنسبة للعناصر الأخرى select وinput type=checkbox/radio ، فإنّ الحدث يقع بعد تغيّر التحديد مباشرة: <select onchange="alert(this.value)"> <option value="">Select something</option> <option value="1">Option 1</option> <option value="2">Option 2</option> <option value="3">Option 3</option> </select>See the Pen JS-events-change-input-ex2 by Hsoub (@Hsoub) on CodePen. الحدث: inputيقع الحدث input كلّما غيّر المستخدم القيمة التي في المُدخل. وبخلاف أحداث لوحة المفاتيح، يقع هذا الحدث عند كلّ تغيّر في القيمة، حتى لو لم يكن ناجما عن أفعال لوحة المفاتيح، كاللصق بواسطة الفأرة أو استعمال التعرّف على الصوت لإملاء النصّ. على سبيل المثال: <input type="text" id="input"> oninput: <span id="result"></span> <script> input.oninput = function() { result.innerHTML = input.value; }; </script>See the Pen JS-events-change-input-ex3 by Hsoub (@Hsoub) on CodePen. إذا أردنا معالجة جميع التغيّرات في <input> فإنّ هذا الحدث هو الخيار اﻷمثل. في المقابل، لا يقع input عند أفعال لوحة المفاتيح أو غيرها من اﻷفعال التي لا تؤدّي إلى تغيّر القيمة، مثل الضغط على مفاتيح اﻷسهم ⇦ و⇨ في المُدخل. ملاحظة: لا يمكن منع أيّ شيء في oninput يقع الحدث input بعد تغيّر القيمة، ولذا لا يمكننا استعمال event.preventDefault() هناك -- قد فات الآوان، لن يكون لذلك أيّ أثر. الأحداث: cut وcopy وpasteتقع هذه اﻷحداث عند قصّ/نسخ/لصق قيمة ما، وهي تنتمي إلى الصنف ClipboardEvent، وتُمكّن من الوصول إلى المُعطيات التي قُصّت/أُلصقت. يمكننا أيضا استخدام event.preventDefault() معها لإلغاء الفعل، فلا يتمّ بذلك نسخ/لصق أيّ شيء. على سبيل المثال، تمنع الشيفرة أدناه وقوع أيّ من هذه اﻷحداث، وتُظهر ماذا نحاول قصّه/نسخه/لصقه: <input type="text" id="input"> <script> input.oncut = input.oncopy = input.onpaste = function(event) { alert(event.type + ' - ' + event.clipboardData.getData('text/plain')); return false; }; </script>See the Pen JS-events-change-input-ex4 by Hsoub (@Hsoub) on CodePen. يُرجى التنبّه إلى أنّه لا يمكن نسخ/لصق النصّ فقط، بل أيّ شيء، مثل نسخ ملفّ في مدير الملفّات في نظام التشغيل، ولصقه. هذا لأنّ clipboardData تتضمّن الواجهة DataTransfer، التي تُستخدم في السحب والإفلات والنسخ/اللصق. تُعدّ هذه الأمور خارجة قليلا عن موضوعنا الآن، لكن يمكنك أن تجد التوابع الخاصّة بها في المواصفة. . تنبيه: ClipboardAPI: قيود تتعلّق بسلامة المستخدم الحافظة هي شيء "عموميّ" على مستوى نظام التشغيل. لذا فإنّ معظم المتصفّحات تمكّن من الوصول إلى الحافظة قراءة وكتابة لكن في نطاق بعض أفعال المستخدم فقط بداعي السلامة، كما في معالجات اﻷحداث onclick مثلا. ويُمنع كذلك توليد أحداث "مخصّصّة" للحافظة باستخدام dispatchEvent في جميع المتصفّحات باستثناء Firefox. الملخصأحداث تغيير المعطيات: الحدث الوصف الخصائص change عند تغيّر قيمة ما بالنسبة للمُدخلات النصّيّة، يقع عند فقدانها التركيز. input عند كلّ تغيّر في المُدخلات النصّية يقع مباشرة، على خلاف change. cut/copy/paste عند أفعال القصّ/النسخ/اللصق. يمكن منع الفعل، وتتيح الخاصّيّةُ event.clipboardData إمكانيّة القراءة من/الكتابة في الحافظة. 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; } التمارين حاسبة الإيداعاﻷهميّة: 5 أنشئ واجهة تُمكّن من إدخال القيمة المودعة في البنك إضافة إلى النسبة، ثمّ تحسب كم ستصبح القيمة بعد مدّة مُعيّنة من الزمن. كما في المثال من هنا. يجب أن يُعالج أيّ تغيّر في المُدخل مباشرة. المعادلة هي كالتالي: // القيمة الابتدائيّة للنقود :initial // تعني 0.05 مثلا، %5 سنويّا :interest // كم عاما من الانتظار :years let result = Math.round(initial * (1 + interest * years));أنجز التمرين في البيئة التجريبيّة الحلافتح الحلّ في البيئة التجريبيّة ترجمة -وبتصرف- للمقال Events: change, input, cut, copy, paste من سلسلة Browser: Document, Events, Interfaces لصاحبها Ilya Kantor |
51,143 | «أوبو رينو 5 برو 5 جي» يُشعل المنافسة على هواتف الفئة المتوسطة |
أطلقت شركة «أوبو» هاتف «رينو5 برو 5 جي» (Oppo Reno5 Pro 5G) في المنطقة العربية أخيراً، الذي يُعد من أفضل هواتف الفئة المتوسطة، بمواصفاته المتقدمة ووظائفه المميزة للاعبين ومحبي التصوير، مع تميزه بدعم تقنية الشحن فائق السرعة التي تسمح بشحن الهاتف من الصفر إلى شحنة كاملة خلال 30 دقيقة فقط. وقد اختبرت «الشرق الأوسط» الهاتف، ونذكر هنا ملخص التجربة. مزايا متقدمة |
51,142 | أفضل أدوات التحكّم لـ2021 |
احتاج الكثيرون لبعض الوقت قبل تحديث أنظمة المشاهدة في منازلهم خلال الجائحة. ولكن في النهاية، إذا اضطرّ الإنسان للبقاء حبيس منزله، فلا بدّ له من الاعتماد على تجهيزات تلفزيونية خارقة. التحكم من بُعد |
51,141 | هل حان وقت تجربة متصفّح إلكتروني جديد؟ |
تحوّل استخدام المتصفحات الإلكترونية إلى عادة بالنسبة لمعظم النّاس. إذا كنتم تستخدمون «مايكروسوفت إدج» لتصفّح شبكة الإنترنت، فهذا يعني أنّكم غالباً تعملون ببرنامج ويندوز. وإذا كنتم تستخدمون متصفّح «سافاري»، فهذا يعني غالباً أنّكم من زبائن آبل. أمّا في حال كنتم من مستخدمي «كروم»، فهذا يعني أنّكم تملكون هاتفا أو لابتوباً من غوغل، أو أنكم حمّلتم متصفّح غوغل على جهازكم الخاص بعد استخدامه على الكومبيوتر في المدرسة أو العمل. |