بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
بعض الشرح عن dconf ماهو وبماذا يستخدم.
مقدمة :
ماهو dconf ؟
بشكل بسيط dconf هو قاعدة بيانات يتم فيها تخزين إعدادات البرامج التي تستخدم المكتبة الرسومية Gtk (للأمانة لا أعلم إذا كانت تستخدم من طرف أخر) بعض اﻷمثلة عن هذه البرامج كل مشروع جنوم من واجهة وبرامج وهناك أيضا بعض الواجهات الأخرى مثل unity و cinnamon بالإضافة إلى الكثير من البرامج الاخرى , طبعا ليس شرط أن البرنامج الذي يستخدم مكتبة Gtk الرسومية يجب ان يكون أو يجب عليه تخزين إعدادات برنامجه في dconf اﻷمر على حسب المطور ماذا إختار.
قاعدة بيانات ال dconf شيء مثل ملفات ال registry في ويندوز والتي تكون مخزنة على ما أذكر في هذا المسار c:\windows\system32\config والتي ممكن تغير قيمها من برنامج إسمه registry.exe وهو ليس الوحيد لاكن هو الإفتراضي الذي ياتي مع ويندوز.
قاعدة بيانات ال dconf شيء مثل ملفات ال registry في ويندوز والتي تكون مخزنة على ما أذكر في هذا المسار c:\windows\system32\config والتي ممكن تغير قيمها من برنامج إسمه registry.exe وهو ليس الوحيد لاكن هو الإفتراضي الذي ياتي مع ويندوز.
هل ممكن ان أغير قيم الإعدادات المخزنة في قاعدة بيانات dconf من سطر الأوامر ؟
الجواب نعم من خلال عدة برامج كما registry.exe في ويندوز هناك برنامج إسمه dconf وهو برنامج يعمل من سطر الاوامر لا يشتتكم ان إسمه dconf فهذا برنامج إسمه هكذا أي إذا صح التعبير تم تسميته على إسم ما يتعامل معه ,وهناك برنامج أخر إسمه gsettings و هناك برنامج رسومي إسمه dconf-editor و هناك بعض البرامج المتفرقة التي إستخدمت ما ساشرحه اليوم لتغير بعض الإعدادات المحددة مثل برنامج gnome tweak tool و غيره .
هناك الكثير من البرامج والواجهات في لينكس تخزن إعداداتها في ملفات نصية عادية لاكن قاعدة بيانات dconf ليست نصية ولا يمكن التعامل معها على أنها ملف نصي لاكن ممكن التعامل معها من خلال البرامج التي ذكرتها في الأعلى او من خلال إستخدم كلاس Settings في موديل Gio أي أننا سنستخدم ما إستخدمته البرامج التي ذكرتها في الأعلى .
سنعمل من خلال لغة البرمجة بايثون بالنسبة لباقي اللغات ينفع أيضا لاكن ليس من خلال هذا الشرح ,كل لغة يتوفر لها مكتبة Gtk ممكن إستخدامها لاكن في هذا الشرح وضعت مثال بسيط من خلال بايثون.
لن أشرح في هذا الموضوع كيف ممكن إستخدام dconf لتخزين إعدادات برامجنا من خلال بايثون او غيرها سأشرح فقط كيف أغير قيم الإعدادات المخزنة فيه ,على العموم هذا الموضوع قد يكون مقدمة مهمة تجهز للتقدم بالأمر والإستفادة منه في برامجنا أقصد الإستفادة وفهم ماذا يحدث وليس فقط نسخ لصق للأسطر البرمجية لأن الامر فيه تفاصبل في الحقيقة إعدادات البرامج بالقيم الإفتراضية تخزن في ملف xml في هذا المسار /usr/share/glib-2.0/schemas/ ثم يتم عمل لهم بطريقة ما compile ليتم إدراجهم في قاعدة بيانات ثنائية في الحقيقة إذا كنت تريد بناء توزيعة مبنية على أي توزيعة أخرى وتريد وضع إعداداتك الخاصة هذه الملفات هي مدخلك للأمر طبعا إعدادات الواجهات والبرامج التي تستخدم dconf حيث ممكن عمل لها override أي تجاوز الإعدادات الإفتراضية بإعدادات خاصة بك.
الجواب نعم من خلال عدة برامج كما registry.exe في ويندوز هناك برنامج إسمه dconf وهو برنامج يعمل من سطر الاوامر لا يشتتكم ان إسمه dconf فهذا برنامج إسمه هكذا أي إذا صح التعبير تم تسميته على إسم ما يتعامل معه ,وهناك برنامج أخر إسمه gsettings و هناك برنامج رسومي إسمه dconf-editor و هناك بعض البرامج المتفرقة التي إستخدمت ما ساشرحه اليوم لتغير بعض الإعدادات المحددة مثل برنامج gnome tweak tool و غيره .
هناك الكثير من البرامج والواجهات في لينكس تخزن إعداداتها في ملفات نصية عادية لاكن قاعدة بيانات dconf ليست نصية ولا يمكن التعامل معها على أنها ملف نصي لاكن ممكن التعامل معها من خلال البرامج التي ذكرتها في الأعلى او من خلال إستخدم كلاس Settings في موديل Gio أي أننا سنستخدم ما إستخدمته البرامج التي ذكرتها في الأعلى .
سنعمل من خلال لغة البرمجة بايثون بالنسبة لباقي اللغات ينفع أيضا لاكن ليس من خلال هذا الشرح ,كل لغة يتوفر لها مكتبة Gtk ممكن إستخدامها لاكن في هذا الشرح وضعت مثال بسيط من خلال بايثون.
لن أشرح في هذا الموضوع كيف ممكن إستخدام dconf لتخزين إعدادات برامجنا من خلال بايثون او غيرها سأشرح فقط كيف أغير قيم الإعدادات المخزنة فيه ,على العموم هذا الموضوع قد يكون مقدمة مهمة تجهز للتقدم بالأمر والإستفادة منه في برامجنا أقصد الإستفادة وفهم ماذا يحدث وليس فقط نسخ لصق للأسطر البرمجية لأن الامر فيه تفاصبل في الحقيقة إعدادات البرامج بالقيم الإفتراضية تخزن في ملف xml في هذا المسار /usr/share/glib-2.0/schemas/ ثم يتم عمل لهم بطريقة ما compile ليتم إدراجهم في قاعدة بيانات ثنائية في الحقيقة إذا كنت تريد بناء توزيعة مبنية على أي توزيعة أخرى وتريد وضع إعداداتك الخاصة هذه الملفات هي مدخلك للأمر طبعا إعدادات الواجهات والبرامج التي تستخدم dconf حيث ممكن عمل لها override أي تجاوز الإعدادات الإفتراضية بإعدادات خاصة بك.
أين يتم حفظ ملف قاعدة بيانات dconf ؟
كل مستخدم له ملف قاعدة بيانات خاصة حتى لا تتداخل الأمور وهي تحافظ على السرية وخصوصية كل مستخدم بإعداداته الخاصة به لهذا في كل مجلد منزل لمستخدم ما يوجد ملف قاعدة بيانات dconf في هذا المسار config/dconf. غالبا سيكون إسمه user لاكن ليس شرط في الحقيقة يمكنك ان تحصل على الإسم من خلال قراءة الملف الموجود في هذا المسار etc/dconf/profile/ بالمناسبة في حال قمت بحذف لملف قاعدة البيانات dconf ثم قمت بعمل logout ثم الدخول للنظام سيتم توليد ملف جديد بالإعدادات الإفتراضية المتوفرة في ملفات xml أي ستعمل reset لكل الإعدادات ولكل البرامج التي تخزن إعداداتها فيه.
كل مستخدم له ملف قاعدة بيانات خاصة حتى لا تتداخل الأمور وهي تحافظ على السرية وخصوصية كل مستخدم بإعداداته الخاصة به لهذا في كل مجلد منزل لمستخدم ما يوجد ملف قاعدة بيانات dconf في هذا المسار config/dconf. غالبا سيكون إسمه user لاكن ليس شرط في الحقيقة يمكنك ان تحصل على الإسم من خلال قراءة الملف الموجود في هذا المسار etc/dconf/profile/ بالمناسبة في حال قمت بحذف لملف قاعدة البيانات dconf ثم قمت بعمل logout ثم الدخول للنظام سيتم توليد ملف جديد بالإعدادات الإفتراضية المتوفرة في ملفات xml أي ستعمل reset لكل الإعدادات ولكل البرامج التي تخزن إعداداتها فيه.
لنبدأ :
الأن شرح بعض الأمور لنأخذ مثال عن واجهة Gnome Shell توفر Gnome Shell إذا صح التعبير مسار أو عنوان id خاص بها داخل قاعدة بيانات dconf والذي هو org.gnome.Shell ثم داخل هذا المسار هناك مفاتيح keys ولكل مفتاح قيم ممكن تغيرها أو عمل لها reset وممكن الإستعلام عنها و...إلخ قد يكون المفتاح يحفظ قيمة نصية أو مثلا قائمة list داخلها قيم نصية او مثلا true or false و...إلخ .
لنأخذ مثال من خلال برنامج gsettings الذي تكلمت عنه سابقا ساغير الصورة الخلفية لواجهة جنوم شل .
نلاحظ برنامج gsettings ثم الأمر ماذا أريد ان أفعل مثل تغير قيمة أو إستعلام و...إلخ وهنا أردت ان أغير القيمة لهذا إستخدمت set ثم وضعت المسار ثم وضعت المفتاح المراد تغير قيمته ثم وضعت القيمة والتي هي معنا الان قيمة نصية لمسار الصورة .لنأخذ مثال من خلال برنامج gsettings الذي تكلمت عنه سابقا ساغير الصورة الخلفية لواجهة جنوم شل .
الأن سأقوم باﻷمر من خلال سكربت بايثون .
أولا إستدعيت المكتبات الضرورية .
ثانيا قمت بإنشاء كائن object من class الصنف Settings وأعطيته المسار الذي أريده .
ثم طلبت تغير قيمة مفتاح picture-uri لقيمة نصية التي هي مسار الصورة وهنا نلاحظ انني إستخدمت نوع بيانات خاص ممكن الحصول عليه كما في الصورة نلاحظ حرف ال s يحدد ان القيمة نصية وهو إختصار ل string لو كان مثلا true او fasle نضع حرف b بدل حرف الs وهو إختصار ل bool ولو كانت القيمة int نضع حرف i وهكذا.
طبعا ممكن الإستعلام وعمل reset والكثير من الأمور من خلال Settings و هناك أنواع بيانات أخرى متوفرة في GLib.Variant لاكن سأكتفي بهذا ممكن قرائة وثائق GLib وGio.Settings لمن أراد التوسع أكثر لاكن غالبا هذا ما سنحتاجه .
رابط سكربت إستخدمت فيه Gio.Settings طبعا بالإضافة لأشياء أخرى مثل dbus .
في الصورة السابفة مجرد تنفيذ أمر set_values ستتم التغيرات وإجراءات تغير الصورة الخلفية, ممكن إذا أردنا من خلال delay و apply تغير هذه السياسة بحيث ممكن أن نقوم بتغير أكثر من قيمة ثم عندما نريد نطلب إجراء التغير من خلال apply أظن الامر واضح .
أخيرا :
هذا موضوع قديم كنت اتكلم فيه عن gsettings لاكن لم تكن معلوماتي في وقتها ناضجة كثيرا فهو موضوع قديم جدا على العموم فيه بعض المعلومات الجيدة .
https://arfedora.blogspot.com/2015/10/gnome-shell_23.html
بعض الوثائق الرسمية .
https://developer.gnome.org/gio/stable/GSettings.html
https://developer.gnome.org/glib/2.54/glib-GVariant.html
ذكرت سابقا أنه ممكن عمل override لملفات xml نلاحظ كيف يمكن الأمر من خلال إنشاء ملف بالإعدادات الخاصة بنا وإنهاء إسمه ب gschema.override وممكن ان يبدأ إسمه برقم ثم علامة _ وعندها في حال وجود ملفين بذات الإعدادات ستكون الأسبقية للرقم الاعلى مثلا لنفترض أردت تخطي هذا الملف الموجود في الصورة في الأسفل وهو خاص بفريق فيدورا ممكن عمل ملف بذات الإعدادات المذكورة داخله لاكن سأقوم بتسمية أول الملف برقم أعلى أحببت أن أوضح هذا الشيء بشكل سريع وممكن بعدها مثلا تحزيم هذا الملف وتثبيته أثناء إنشاء التوزيعة وعند كل إنشاء لمستخدم جديد سيتم الأخذ بهذه الإعدادات على انها تتخطى الإعدادات الأساسية .
اخبرا صورة لإحدى محاولاتي وقد نجحت .