❤3
  "أريد مشروعًا لتنفيذه من باب التعلُّم وخدمة الدين/اللغة"
كان هذا عنوانًا لأكثر من نقاشٍ خضته خلال الأيام الماضية، فقررت تلخيص الأفكار التي طُرحت لعلها تُفيد بعض الناس ويخرج للنور منها مشاريع تفيد الجميع بإذن الله.
سأذكر اسم المشروع ونبذة عنه، وأنت عزيزي القارئ تختار ما يناسبك منها لتنفيذه، وأنا مستعد للدعم بالاستضافة واسم النطاق والاستشارة بإذن الله.
🔸 التعرّف على الآيات القرآنية في النصوص
كثيرًا ما نحتاج إلى التعرّف على الآيات القرآنية في نصٍّ طويلٍ أو صفحة من كتاب مثلا، فنحتاج إلى أداة (مكتبة Python، خدمة من خلال API، أو غيرها) نُعطيها النص وتخبرنا أن النص من الحرف س إلى الحرف ص هو الآية رقم ع من السورة رقم ك، ولا داعي لأن يكون "ذكاءً اصطناعيًّا"، يكفي أن يكون مجرد خوارزمية بسيطة تحل المشكلة.
🔸 التعرّف على الأحاديث النبوية في النصوص
شبيهٌ بالمشروع السابق ولكن أصعب منه، فنطاق البيانات مفتوح أكثر ومتشعّب. يكفي أن تبدأ بالكتب الستة مثلا، أو حتى صحيحي البخاري ومسلم، فالتعرّف على أحاديث هذه الكتب أكثر من كافٍ ضمن هذا السياق.
🔸 أداة شاملة لتقييم التشكيل
يوجد الكثير من الأبحاث الخاصة بتشكيل النصوص العربية، ولكن لم أجد إلى الآن مكتبة شاملة معتمدة من الكل تُستخدم في تقييم تشكيل النماذج. كل ورقة بحثية جديدة تكتب Script جديد للقيام بهذا الأمر، فلو وُجد مكتبة مُوحّدة فسيكون خيرا عظيما.
🔸 شرح الشعر العربي
الشعر العربي لا مثيل له، ولكن أكثرنا لا يفهم كثيرًا من المصطلحات، ولو فهم المصطلحات المُستخدمة فلن يفهم سياق كلام الشاعر. فلو وجدت أداة تأخذ بيتُا أو مجموعة أبيات من الشعر ثم تشرحها على مستوى الكلمة والبيت والقصيدة، مع بيان مقصد الشاعر لكان أمرا عظيما.
🔸 إضافة متصفحٍ لمنصة باحث
يوجد واجهة برمجية (API) لمنصة باحث ولكنها غير متاحة بشكل علني إلى الآن 😉 فإذا أردت إنشاء إضافة للمتصفح تُخبر المستخدم أن هذا المقطع موجود على باحث وتُضيف زرًّا لصفحة YouTube للانتقال إلى باحث فسأكون سعيدًا بمشاركة الواجهة البرمجية معك.
🔸 نُسخة مُحسّنة من Yamli
لم أعلم أن Yamli مستخدم بكثرة خصوصا من قِبل المسلمين غير العرب إلا من فترة قريبة، ولكن لا يوجد لديهم مكتبة مفتوحة المصدر أو واجهة برمجية سهلة يمكن استخدامها. فلو وُجد مكتبة بسيطة الاستخدام من خلال JS مثلا ستوفّر الكثير من الوقت والجهد، وسأستخدمها شخصيا في باحث.
🔸 مكانٌ يجمع المشاريع الإسلامية
المشاريع الإسلامية كثيرة جدا، موقع الدرر السنية ومشاريع نُقاية ومشاريع مركز تفسير وغيرها الكثير من المؤسسات، هذا غير المشاريع الفردية والمشاريع المُدارة من قِبل المسلمين الناطقين بغير العربية والمختصة بهم. فلو جُمعت هذه المشاريع في مكان واحد لكان تتبع الجهود وعدم إعادتها أسهل بكثير.
🔸 التصحيح التلقائي للنصوص
هذا مشروعٌ بحثيٌّ متكامل لأي طالب دراسات عليا، وللأسف لا نجد شيئا متميزا لتصحيح الأخطاء في النصوص العربية. كل الموجود مكتبات متناثرة هنا وهناك، قد يصلها تحديثات على فترات متباعدة، أو لا يصلها تحديثات أساسا. نحتاج إلى حل متكامل لهذه المشكلة يدعم اللغة العربية الفصيحة والعامية على حدٍّ سواء، لما بُلينا به من العامية في حياتنا.
أقف عند هذه الأفكار حاليا، ولعل غيري يُضيف غيرها من الأفكار الهادفة لخدمة الدين واللغة.
والسلام عليكم 👋🏻
كان هذا عنوانًا لأكثر من نقاشٍ خضته خلال الأيام الماضية، فقررت تلخيص الأفكار التي طُرحت لعلها تُفيد بعض الناس ويخرج للنور منها مشاريع تفيد الجميع بإذن الله.
سأذكر اسم المشروع ونبذة عنه، وأنت عزيزي القارئ تختار ما يناسبك منها لتنفيذه، وأنا مستعد للدعم بالاستضافة واسم النطاق والاستشارة بإذن الله.
🔸 التعرّف على الآيات القرآنية في النصوص
كثيرًا ما نحتاج إلى التعرّف على الآيات القرآنية في نصٍّ طويلٍ أو صفحة من كتاب مثلا، فنحتاج إلى أداة (مكتبة Python، خدمة من خلال API، أو غيرها) نُعطيها النص وتخبرنا أن النص من الحرف س إلى الحرف ص هو الآية رقم ع من السورة رقم ك، ولا داعي لأن يكون "ذكاءً اصطناعيًّا"، يكفي أن يكون مجرد خوارزمية بسيطة تحل المشكلة.
🔸 التعرّف على الأحاديث النبوية في النصوص
شبيهٌ بالمشروع السابق ولكن أصعب منه، فنطاق البيانات مفتوح أكثر ومتشعّب. يكفي أن تبدأ بالكتب الستة مثلا، أو حتى صحيحي البخاري ومسلم، فالتعرّف على أحاديث هذه الكتب أكثر من كافٍ ضمن هذا السياق.
🔸 أداة شاملة لتقييم التشكيل
يوجد الكثير من الأبحاث الخاصة بتشكيل النصوص العربية، ولكن لم أجد إلى الآن مكتبة شاملة معتمدة من الكل تُستخدم في تقييم تشكيل النماذج. كل ورقة بحثية جديدة تكتب Script جديد للقيام بهذا الأمر، فلو وُجد مكتبة مُوحّدة فسيكون خيرا عظيما.
🔸 شرح الشعر العربي
الشعر العربي لا مثيل له، ولكن أكثرنا لا يفهم كثيرًا من المصطلحات، ولو فهم المصطلحات المُستخدمة فلن يفهم سياق كلام الشاعر. فلو وجدت أداة تأخذ بيتُا أو مجموعة أبيات من الشعر ثم تشرحها على مستوى الكلمة والبيت والقصيدة، مع بيان مقصد الشاعر لكان أمرا عظيما.
🔸 إضافة متصفحٍ لمنصة باحث
يوجد واجهة برمجية (API) لمنصة باحث ولكنها غير متاحة بشكل علني إلى الآن 😉 فإذا أردت إنشاء إضافة للمتصفح تُخبر المستخدم أن هذا المقطع موجود على باحث وتُضيف زرًّا لصفحة YouTube للانتقال إلى باحث فسأكون سعيدًا بمشاركة الواجهة البرمجية معك.
🔸 نُسخة مُحسّنة من Yamli
لم أعلم أن Yamli مستخدم بكثرة خصوصا من قِبل المسلمين غير العرب إلا من فترة قريبة، ولكن لا يوجد لديهم مكتبة مفتوحة المصدر أو واجهة برمجية سهلة يمكن استخدامها. فلو وُجد مكتبة بسيطة الاستخدام من خلال JS مثلا ستوفّر الكثير من الوقت والجهد، وسأستخدمها شخصيا في باحث.
🔸 مكانٌ يجمع المشاريع الإسلامية
المشاريع الإسلامية كثيرة جدا، موقع الدرر السنية ومشاريع نُقاية ومشاريع مركز تفسير وغيرها الكثير من المؤسسات، هذا غير المشاريع الفردية والمشاريع المُدارة من قِبل المسلمين الناطقين بغير العربية والمختصة بهم. فلو جُمعت هذه المشاريع في مكان واحد لكان تتبع الجهود وعدم إعادتها أسهل بكثير.
🔸 التصحيح التلقائي للنصوص
هذا مشروعٌ بحثيٌّ متكامل لأي طالب دراسات عليا، وللأسف لا نجد شيئا متميزا لتصحيح الأخطاء في النصوص العربية. كل الموجود مكتبات متناثرة هنا وهناك، قد يصلها تحديثات على فترات متباعدة، أو لا يصلها تحديثات أساسا. نحتاج إلى حل متكامل لهذه المشكلة يدعم اللغة العربية الفصيحة والعامية على حدٍّ سواء، لما بُلينا به من العامية في حياتنا.
أقف عند هذه الأفكار حاليا، ولعل غيري يُضيف غيرها من الأفكار الهادفة لخدمة الدين واللغة.
والسلام عليكم 👋🏻
❤15👍1
  
  خان المُبرمجين (علي فاضل)
"أريد مشروعًا لتنفيذه من باب التعلُّم وخدمة الدين/اللغة"  كان هذا عنوانًا لأكثر من نقاشٍ خضته خلال الأيام الماضية، فقررت تلخيص الأفكار التي طُرحت لعلها تُفيد بعض الناس ويخرج للنور منها مشاريع تفيد الجميع بإذن الله.  سأذكر اسم المشروع ونبذة عنه، وأنت عزيزي…
تعقيبا على منشور البارحة والذي يمكنك قراءته من هنا:
https://t.me/programmerskhan/81
وبعد اقتراح العديد من الإخوة لأفكار متعددة ومهمة، قررت إنشاء هذا المستودع على GitHub لتدوين الأفكار والملاحظات الخاصة بها بشكل مبدئي ومع الوقت قد يتحول إلى منصة لمتابعة التطوّر في هذه الأفكار والمشاريع:
https://github.com/ieasybooks/ideas
يمكن للجميع الاطلاع على الأفكار وحالة كل فكرة منها، وإن كنت مهتما بواحدة من الأفكار أو أكثر، فأتمنى منك التواصل من خلال المستودع أو مباشرة على الخاص حتى نستغل الجهود ولا يُعاد العمل أكثر من مرة.
والسلام عليكم 👋🏻
https://t.me/programmerskhan/81
وبعد اقتراح العديد من الإخوة لأفكار متعددة ومهمة، قررت إنشاء هذا المستودع على GitHub لتدوين الأفكار والملاحظات الخاصة بها بشكل مبدئي ومع الوقت قد يتحول إلى منصة لمتابعة التطوّر في هذه الأفكار والمشاريع:
https://github.com/ieasybooks/ideas
يمكن للجميع الاطلاع على الأفكار وحالة كل فكرة منها، وإن كنت مهتما بواحدة من الأفكار أو أكثر، فأتمنى منك التواصل من خلال المستودع أو مباشرة على الخاص حتى نستغل الجهود ولا يُعاد العمل أكثر من مرة.
والسلام عليكم 👋🏻
🔥5❤3👍2
  أهمية المجتمعات البرمجية
لم أكن منخرطًا في المجتمعات البرمجية كثيرًا، خصوصا فيما يتعلق بالتقنيات التي أستخدمها كـ Ruby on Rails، ولكن تغيّر هذا الأمر خلال السنتين أو الثلاث الأخيرة، فدخلت في العديد من المجتمعات المتعلقة بالتقنيات التي أستخدمها، وكان هذا من الأسباب التي أدت إلى تطوّر مهاراتي بشكل ملحوظ.
بدأت القصة عندما اشتريت كتاب The Complete Guide to Rails Performance، وأنصح به بشدة، ومن مميزات هذا الكتاب أن للكاتب مجتمعًا خاصًّا بالكتاب، فدخلت هذا المجتمع وبدأت أسأل وأشارك تجاربي وأتعلم من الآخرين.
ثم بدأت في الدخول إلى مجتمعات أخرى كمجتمع GoRails الذي استفدت منه في أمور عديدة متعلقة بتطبيقات الهاتف لـ Rails:
https://discord.gg/NZbfhyEDs5
ومنه تعرفت على مجتمع Joe Masilotti المتخصص تحديدا في تطبيقات الهاتف لـ Rails:
https://discord.gg/gGat7WHD
ثم مجتمع مكتبة Kamal عند ظهورها واستفدت منه جدًّا في تعلّم المكتبة وحل مشاكلها:
https://discord.gg/VkQeWQJy
ومن ثم انضممت إلى المجتمع الأقرب إلى قلبي Naming Things الخاص بمطوّر مكتبة Phlex والذي يهتم بكل ما يتعلّق بلغة Ruby ودمجها بشكل أكثر مع SQLite وغيرها من الأمور غير الاعتيادية:
https://discord.gg/jP8UrXfy
كل هذه مجتمعات على تطبيق Discord، وأخرى على تطبيق Slack كمجتمع Ruby on Rails Link:
https://www.rubyonrails.link
ومجتمع Ruby DX المهتم بتحسين تجربة المستخدم للغة Ruby:
https://join.slack.com/t/ruby-dx/shared_invite/zt-2yd77ayis-yAiVc1TX_kH0mHMBbi89dA
ثم أصبحت هذه عادةً عندي، فكلما تعلمتُ تقنيةً جديدةً، انضممتُ إلى مجتمعها لعدة أسباب منها:
- التعلّم من الآخرين
- السؤال لحل المشاكل
- البحث عن الحلول في الرسائل الموجودة في المجتمع بالفعل (وهذا حدث كثيرا)
منها مجتمعات تتعلق بمحرك البحث MeiliSearch على Slack وحتى مجتمع CloudFlare على Discord، كلها كانت مفيدة وتعلمت منها عدة أمور.
فنصيحتي لكل من يستخدم تقنيةً معينةً أن يُحاول الانخراط في مجتمعاتها والتفاعل مع الأعضاء وطرح الأسئلة حول ما يُشكل عليه، فالناس في هذه المجتمعات غالبًا ما يحبون مساعدة غيرهم، بشكل مُبالغ فيه أحيانًا، حسب تجربتي (على الأقل فيما يتعلّق بـ Ruby و Rails).
والسلام عليكم 👋🏻
لم أكن منخرطًا في المجتمعات البرمجية كثيرًا، خصوصا فيما يتعلق بالتقنيات التي أستخدمها كـ Ruby on Rails، ولكن تغيّر هذا الأمر خلال السنتين أو الثلاث الأخيرة، فدخلت في العديد من المجتمعات المتعلقة بالتقنيات التي أستخدمها، وكان هذا من الأسباب التي أدت إلى تطوّر مهاراتي بشكل ملحوظ.
بدأت القصة عندما اشتريت كتاب The Complete Guide to Rails Performance، وأنصح به بشدة، ومن مميزات هذا الكتاب أن للكاتب مجتمعًا خاصًّا بالكتاب، فدخلت هذا المجتمع وبدأت أسأل وأشارك تجاربي وأتعلم من الآخرين.
ثم بدأت في الدخول إلى مجتمعات أخرى كمجتمع GoRails الذي استفدت منه في أمور عديدة متعلقة بتطبيقات الهاتف لـ Rails:
https://discord.gg/NZbfhyEDs5
ومنه تعرفت على مجتمع Joe Masilotti المتخصص تحديدا في تطبيقات الهاتف لـ Rails:
https://discord.gg/gGat7WHD
ثم مجتمع مكتبة Kamal عند ظهورها واستفدت منه جدًّا في تعلّم المكتبة وحل مشاكلها:
https://discord.gg/VkQeWQJy
ومن ثم انضممت إلى المجتمع الأقرب إلى قلبي Naming Things الخاص بمطوّر مكتبة Phlex والذي يهتم بكل ما يتعلّق بلغة Ruby ودمجها بشكل أكثر مع SQLite وغيرها من الأمور غير الاعتيادية:
https://discord.gg/jP8UrXfy
كل هذه مجتمعات على تطبيق Discord، وأخرى على تطبيق Slack كمجتمع Ruby on Rails Link:
https://www.rubyonrails.link
ومجتمع Ruby DX المهتم بتحسين تجربة المستخدم للغة Ruby:
https://join.slack.com/t/ruby-dx/shared_invite/zt-2yd77ayis-yAiVc1TX_kH0mHMBbi89dA
ثم أصبحت هذه عادةً عندي، فكلما تعلمتُ تقنيةً جديدةً، انضممتُ إلى مجتمعها لعدة أسباب منها:
- التعلّم من الآخرين
- السؤال لحل المشاكل
- البحث عن الحلول في الرسائل الموجودة في المجتمع بالفعل (وهذا حدث كثيرا)
منها مجتمعات تتعلق بمحرك البحث MeiliSearch على Slack وحتى مجتمع CloudFlare على Discord، كلها كانت مفيدة وتعلمت منها عدة أمور.
فنصيحتي لكل من يستخدم تقنيةً معينةً أن يُحاول الانخراط في مجتمعاتها والتفاعل مع الأعضاء وطرح الأسئلة حول ما يُشكل عليه، فالناس في هذه المجتمعات غالبًا ما يحبون مساعدة غيرهم، بشكل مُبالغ فيه أحيانًا، حسب تجربتي (على الأقل فيما يتعلّق بـ Ruby و Rails).
والسلام عليكم 👋🏻
❤8👍2👏1
  هل تحتاج للاحتفاظ بالـ Migrations الخاصة بقاعدة بياناتك؟
بدايةً، الـ Migration، في Ruby on Rails وغيرها، هو ملفٌّ تقوم من خلاله بتعديل هيكلية قاعدة البيانات، كأن تُضيف جدولًا جديدًا أو أن تعدّل خصائص بعض الأعمدة.
المشكلة أن هذه الملفات تكثُر بسرعة، فعلى سبيل المثال، منصة باحث، وخلال سنة ونصف من التطوير، وصل عدد هذه الملفات فيها إلى 72 ملفًّا، هذا وأنا مطوّرٌ واحد 😁
خلال أحد النقاشات سألني أحد الأصدقاء: "هل يجب الاحتفاظ بكل هذه الملفات؟"، وكان الجواب: "بكل تأكيد، فأنت تحتاجها لإعادة إنتاج قاعدة بياناتك مرةً بعد مرة"، وانتهى النقاش هنا، ولكن ظللت أفكر في السؤال.
البارحة، وصدفةً وبدون أي ترتيب، سأل أحد الأشخاص على مجتمع Rails Performance على تطبيق Slack سؤالًا مشابهًا، يقول فيما معناه: "كيف تقومون بأرشفة ملفات الـ Migrations في مشاريعكم؟"، فتتبعت الردود لأجد أحد الأشخاص يرشّح مكتبة
https://github.com/jalkoby/squasher
المكتبة تقوم بدمج الـ Migrations بناء على تاريخ معينٍ في ملفٍّ واحدٍ، بدلًا من الاحتفاظ بكل الملفات متفرقة سنةً بعد سنة، وبكل تأكيد يوجد مكتبات مشابهة لأُطر العمل الأخرى.
أعجبتني الفكرة، وهكذا يمكننا إجابة سؤال صديقي في بداية المنشور، وكذلك نؤكّد على ما ذكرته في المنشور السابق من أهمية المجتمعات البرمجية:
https://t.me/programmerskhan/83
والسلام عليكم 👋🏻
بدايةً، الـ Migration، في Ruby on Rails وغيرها، هو ملفٌّ تقوم من خلاله بتعديل هيكلية قاعدة البيانات، كأن تُضيف جدولًا جديدًا أو أن تعدّل خصائص بعض الأعمدة.
المشكلة أن هذه الملفات تكثُر بسرعة، فعلى سبيل المثال، منصة باحث، وخلال سنة ونصف من التطوير، وصل عدد هذه الملفات فيها إلى 72 ملفًّا، هذا وأنا مطوّرٌ واحد 😁
خلال أحد النقاشات سألني أحد الأصدقاء: "هل يجب الاحتفاظ بكل هذه الملفات؟"، وكان الجواب: "بكل تأكيد، فأنت تحتاجها لإعادة إنتاج قاعدة بياناتك مرةً بعد مرة"، وانتهى النقاش هنا، ولكن ظللت أفكر في السؤال.
البارحة، وصدفةً وبدون أي ترتيب، سأل أحد الأشخاص على مجتمع Rails Performance على تطبيق Slack سؤالًا مشابهًا، يقول فيما معناه: "كيف تقومون بأرشفة ملفات الـ Migrations في مشاريعكم؟"، فتتبعت الردود لأجد أحد الأشخاص يرشّح مكتبة
squasher للقيام بهذه المهمة:https://github.com/jalkoby/squasher
المكتبة تقوم بدمج الـ Migrations بناء على تاريخ معينٍ في ملفٍّ واحدٍ، بدلًا من الاحتفاظ بكل الملفات متفرقة سنةً بعد سنة، وبكل تأكيد يوجد مكتبات مشابهة لأُطر العمل الأخرى.
أعجبتني الفكرة، وهكذا يمكننا إجابة سؤال صديقي في بداية المنشور، وكذلك نؤكّد على ما ذكرته في المنشور السابق من أهمية المجتمعات البرمجية:
https://t.me/programmerskhan/83
والسلام عليكم 👋🏻
❤5
  
  خان المُبرمجين (علي فاضل)
Photo
لِكُلِّ شَيءٍ إِذا ما تَمّ نُقصانُ * فَلا يُغَرَّ بِطيبِ العَيشِ إِنسانُ
هذا كان مقال حالي البارحة مع Ruby on Rails 😁
من يقرأ منشوراتي يظن أن الله لم يخلق في أرضه قبل ولا بعد Rails، وهذه حقيقة من نواحٍ كثيرة، ولكنها كذبة أبريل من نواحٍ أخرى، ومنها ما سأتحدّث عنه اليوم، Turbo Drive وتعاملها مع JavaScript 😅
كما ذكرت في منشوراتٍ سابقة، أحد مهمات Turbo Drive أنها تُعطيك تجربة تطبيقات الصفحة الواحدة (SPA) ولكن دون الحاجة لاستخدام أُطر عمل مثل React، فهي تعترض أي طلب (Request) من تطبيقك وتحوِّله إلى طلب Ajax، ثم تقوم باستبدال جسم الصفحة القديم (Body) بالجسم الجديد القادم من رد الخادم (Response) على الطلب وتدمج رأس الصفحة القديم (Head) مع رأس الصفحة الجديد.
فكرة بسيطة تضمن من خلالها عدم اختفاء الصفحة وظهورها أمام المستخدم، مما يُعطيه انطباعًا مختلفًا عن تطبيقك، ولكن هل لاحظت أمرا؟ لا يوجد تحديث كامل للصفحة، مما يعني أن أي ملفاتٍ جديدة تُضاف إلى رأس الصفحة لن تعمل، كملفات JavaScript و CSS! فتحتاج للتعامل مع هذه الأمور بطريقة مختلفة في Ruby on Rails وفي غالب الأمر يكون التعامل معها صعبًا ومُرهقًا، أو تقوم بإيقاف Turbo Drive وتخسر كل الفوائد 😂
في سياقٍ مختلفٍ طلب مني صديقي المسلم غير الناطق بالعربية دعم Yamli في خانات البحث في منصة باحث، ولمن لا يعرف Yamli (كحالي قبل أسابيع قليلة) فهو يُمكّن المستخدم من الكتابة بالحروف الانجليزية ويقترح عليك كلماتٍ عربيةً تُقابل ما كتبته.
فمثلا، يمكنك كتابة "mhmd" و Yamli يقترح عليك "محمد"، فتضغط على زر إدخال (Enter) وتحصل على الكلمة العربية في خانة الإدخال.
عندما قرأت توثيق (Documentation) Yamli وجدت أنهم يوفّرون ملف JavaScript يمكنك إضافته إلى موقعك، ثم تقوم بإضافة Yamli إلى أي خانة إدخال موجودة في الصفحة من خلال دالة
أضفت الملف إلى منصة باحث ويامليفيت (آسف 😂) خانات البحث في الصفحة الرئيسية وظهرت ميزة Yamli بدون مشاكل ولله الحمد، إلى أن انتقلت من الصفحة الرئيسية إلى صفحة المتحدثين!
اكتشفت أن Yamli يقوم بتجهيز خانات الإدخال التي تريد إضافة الميزة لها عند تحميل الملف الخاص بهم أول مرة، وبما أن Turbo Drive لا يقوم بإعادة تشغيل الملف عند الانتقال بين الصفحات (لأنه لا يوجد تحديث كامل للصفحة)، فلم يقم Yamli بإضافة الميزة إلى خانات الإدخال الخاصة بالصفحة الجديدة.
وهنا يا رعاك الله صرفت ما يقارب الخمس ساعات في محاولة إجبار Yamli على إعادة تشغيل الملف عند الانتقال بين الصفحات وإضافة الميزة إلى خانات الإدخال، ولله الحمد نجح الأمر بعد هذه المدة باستخدام الطريقة الموضّحة في الصورة (لا أدري إن كان بالإمكان أفضل مما كان 😆).
أخيرًا، ميزات Turbo Drive كثيرة، وهذا العيب المذكور في المنشور لا يعني أنها تقنية أو فكرة سيئة، إنما تقنية أو فكرة لها عيوبها، كما لأي شيء في هذه الحياة عيوب وميزات.
والسلام عليكم 👋🏻
ملاحظة: شباب JavaScript أتمنى منكم أخذي بعطفكم 🥲
هذا كان مقال حالي البارحة مع Ruby on Rails 😁
من يقرأ منشوراتي يظن أن الله لم يخلق في أرضه قبل ولا بعد Rails، وهذه حقيقة من نواحٍ كثيرة، ولكنها كذبة أبريل من نواحٍ أخرى، ومنها ما سأتحدّث عنه اليوم، Turbo Drive وتعاملها مع JavaScript 😅
كما ذكرت في منشوراتٍ سابقة، أحد مهمات Turbo Drive أنها تُعطيك تجربة تطبيقات الصفحة الواحدة (SPA) ولكن دون الحاجة لاستخدام أُطر عمل مثل React، فهي تعترض أي طلب (Request) من تطبيقك وتحوِّله إلى طلب Ajax، ثم تقوم باستبدال جسم الصفحة القديم (Body) بالجسم الجديد القادم من رد الخادم (Response) على الطلب وتدمج رأس الصفحة القديم (Head) مع رأس الصفحة الجديد.
فكرة بسيطة تضمن من خلالها عدم اختفاء الصفحة وظهورها أمام المستخدم، مما يُعطيه انطباعًا مختلفًا عن تطبيقك، ولكن هل لاحظت أمرا؟ لا يوجد تحديث كامل للصفحة، مما يعني أن أي ملفاتٍ جديدة تُضاف إلى رأس الصفحة لن تعمل، كملفات JavaScript و CSS! فتحتاج للتعامل مع هذه الأمور بطريقة مختلفة في Ruby on Rails وفي غالب الأمر يكون التعامل معها صعبًا ومُرهقًا، أو تقوم بإيقاف Turbo Drive وتخسر كل الفوائد 😂
في سياقٍ مختلفٍ طلب مني صديقي المسلم غير الناطق بالعربية دعم Yamli في خانات البحث في منصة باحث، ولمن لا يعرف Yamli (كحالي قبل أسابيع قليلة) فهو يُمكّن المستخدم من الكتابة بالحروف الانجليزية ويقترح عليك كلماتٍ عربيةً تُقابل ما كتبته.
فمثلا، يمكنك كتابة "mhmd" و Yamli يقترح عليك "محمد"، فتضغط على زر إدخال (Enter) وتحصل على الكلمة العربية في خانة الإدخال.
عندما قرأت توثيق (Documentation) Yamli وجدت أنهم يوفّرون ملف JavaScript يمكنك إضافته إلى موقعك، ثم تقوم بإضافة Yamli إلى أي خانة إدخال موجودة في الصفحة من خلال دالة
yamlify (الابداع في التسمية 😎).أضفت الملف إلى منصة باحث ويامليفيت (آسف 😂) خانات البحث في الصفحة الرئيسية وظهرت ميزة Yamli بدون مشاكل ولله الحمد، إلى أن انتقلت من الصفحة الرئيسية إلى صفحة المتحدثين!
اكتشفت أن Yamli يقوم بتجهيز خانات الإدخال التي تريد إضافة الميزة لها عند تحميل الملف الخاص بهم أول مرة، وبما أن Turbo Drive لا يقوم بإعادة تشغيل الملف عند الانتقال بين الصفحات (لأنه لا يوجد تحديث كامل للصفحة)، فلم يقم Yamli بإضافة الميزة إلى خانات الإدخال الخاصة بالصفحة الجديدة.
وهنا يا رعاك الله صرفت ما يقارب الخمس ساعات في محاولة إجبار Yamli على إعادة تشغيل الملف عند الانتقال بين الصفحات وإضافة الميزة إلى خانات الإدخال، ولله الحمد نجح الأمر بعد هذه المدة باستخدام الطريقة الموضّحة في الصورة (لا أدري إن كان بالإمكان أفضل مما كان 😆).
أخيرًا، ميزات Turbo Drive كثيرة، وهذا العيب المذكور في المنشور لا يعني أنها تقنية أو فكرة سيئة، إنما تقنية أو فكرة لها عيوبها، كما لأي شيء في هذه الحياة عيوب وميزات.
والسلام عليكم 👋🏻
ملاحظة: شباب JavaScript أتمنى منكم أخذي بعطفكم 🥲
❤7👍1
  لغة Ruby واستهلاك الذاكرة 😅
مشروع منصة باحث كان أول مشروعٍ كبيرٍ لي أكتبه بإطار عمل Ruby on Rails بعد سنوات من استخدامه في مشاريع مختلفة صغيرة أخرى.
بعد إطلاق منصة باحث، كنت مهتما بمتابعة استهلاكها للمعالج والذاكرة وتحسين الأداء، ومن الملاحظات التي كنت ألاحظها بشدة أن استهلاك الذاكرة يبدأ صغيرًا على الخادم ثم يزداد مع مرور الوقت، فقد يبدأ بـ 1.5GB ويصل إلى 20GB بعد أسابيع من تشغيل المنصة.
فكنت أُعيد نشر المنصة (Re-deploy) على فترات متباعدة لإعادة الذاكرة إلى نظام التشغيل وتخفيف الضغط عن الخادم، ولكن لماذا كان يحدث هذا الأمر؟
لغة Ruby مكتوبة بلغة C، وهو ما يسمى CRuby أو MRI اختصارًا لـ Matz's Ruby Interpreter و Matz هو اسم مُنشئ اللغة، الياباني Yukihiro Matsumoto.
يوجد نُسخ أخرى من لغة Ruby مكتوبة بـ Java كـ JRuby و TruffleRuby، ولكن هذا ليس موضوعنا.
النسخة الأصلية تستخدم لغة C، مما يعني أنها تستخدم
الجميل في هذه البدائل أنها بدائل مباشرة، لا تحتاج إلى الكثير من الإعدادات (على الأقل في حالة
بعد استبدال
بكلمات أخرى، استقر استهلاك الذاكرة عند 2.3GB، وهذا بعد أشهر من تشغيل المنصة دون إعادة نشرها.
الخبر الجميل أنه وبداية من Rails 7.2 هذه الإعدادات تأتي جاهزةً مع المشروع من ناحية تثبيت
يمكنك قراءة هذه المقالة في المقارنة بين
https://lf-hyperledger.atlassian.net/wiki/spaces/BESU/pages/22156632/Reduce+Memory+usage+by+choosing+a+different+low+level+allocator
والسلام عليكم 👋🏻
مشروع منصة باحث كان أول مشروعٍ كبيرٍ لي أكتبه بإطار عمل Ruby on Rails بعد سنوات من استخدامه في مشاريع مختلفة صغيرة أخرى.
بعد إطلاق منصة باحث، كنت مهتما بمتابعة استهلاكها للمعالج والذاكرة وتحسين الأداء، ومن الملاحظات التي كنت ألاحظها بشدة أن استهلاك الذاكرة يبدأ صغيرًا على الخادم ثم يزداد مع مرور الوقت، فقد يبدأ بـ 1.5GB ويصل إلى 20GB بعد أسابيع من تشغيل المنصة.
فكنت أُعيد نشر المنصة (Re-deploy) على فترات متباعدة لإعادة الذاكرة إلى نظام التشغيل وتخفيف الضغط عن الخادم، ولكن لماذا كان يحدث هذا الأمر؟
لغة Ruby مكتوبة بلغة C، وهو ما يسمى CRuby أو MRI اختصارًا لـ Matz's Ruby Interpreter و Matz هو اسم مُنشئ اللغة، الياباني Yukihiro Matsumoto.
يوجد نُسخ أخرى من لغة Ruby مكتوبة بـ Java كـ JRuby و TruffleRuby، ولكن هذا ليس موضوعنا.
النسخة الأصلية تستخدم لغة C، مما يعني أنها تستخدم
malloc بشكل افتراضي لحجز الذاكرة، وحسب فهمي البسيط المتواضع فطريقة عمل malloc ليست الأفضل، ويوجد العديد من البدائل لـ malloc مثل jemalloc و tcmalloc و mimalloc.الجميل في هذه البدائل أنها بدائل مباشرة، لا تحتاج إلى الكثير من الإعدادات (على الأقل في حالة
jemalloc)، فكل ما تحتاجه هو تثبيت مكتبة libjemalloc2 على نظام تشغيل Linux ثم إضافة مسارها إلى متغير LD_PRELOAD، على سبيل المثال:export LD_PRELOAD="$(echo /usr/lib/*/libjemalloc.so.2)"
بعد استبدال
malloc بـ jemalloc في منصة باحث استقر استهلاك الذاكرة عند 4.8GB، أكثر من نصفها (2.5GB تحديدًا) مُستهلكة من قِبل نموذج الذكاء الاصطناعي المستخدم في المنصة.بكلمات أخرى، استقر استهلاك الذاكرة عند 2.3GB، وهذا بعد أشهر من تشغيل المنصة دون إعادة نشرها.
الخبر الجميل أنه وبداية من Rails 7.2 هذه الإعدادات تأتي جاهزةً مع المشروع من ناحية تثبيت
jemalloc على الـ Docker image الخاصة بالمشروع، وكذلك استخدامه في docker-entrypoint.يمكنك قراءة هذه المقالة في المقارنة بين
malloc وبدائلها:https://lf-hyperledger.atlassian.net/wiki/spaces/BESU/pages/22156632/Reduce+Memory+usage+by+choosing+a+different+low+level+allocator
والسلام عليكم 👋🏻
🔥6❤2👍1
  ما هو الحد الذي يجب عليك تعلمه في مجال البرمجة التنافسية (Competitive Programming)؟
عندما بدأت الدراسة الجامعية، لم أكن أعرف عن وجود شيء يسمَّى "البرمجة التنافسية"، غير أني وبالصدفة البحتة وجدت موقع HackerRank وبدأت حل بعض المسائل الموجودة عليه والمخصصة للغة Ruby، كان هذا في غالب ظني سنة 2016.
بعد فترة بسيطة، نظّم زملاء لنا في سنوات متقدمة محاضرة للتعريف بالبرمجة التنافسية، وكنت من الحاضرين، وفي نهايتها كنت متحمسا جدا للانضمام إلى هذه المسابقة وتعلم أساليب حل أسئلتها وكيفية التفكير فيها.
بدأت التدريب مع العديد من الطلبة الآخرين في العام نفسه فحضرنا التدريبات المختلفة وحللنا الأسئلة وشاركنا في المسابقات على المواقع والمسابقات المحلية والإقليمية والحمدلله تعلمنا الكثير من الأمور، فجزى الله خيرا من علّمنا.
ولكن خلال هذه الرحلة كان منا من اهتم بالبرمجة التنافسية بشكل كبير جدا وترك ما سواها وكان منا من أخذ منها الشيء القليل وركّز على غيرها من الأمور والقليلون من توسَّطوا وأدَّعي أنني كنت من الفئة المتوسطة (الغرور ↖️).
خلال 4 سنوات في الجامعة كنت أحاول الجمع بين البرمجة التنافسية وتعلّم أمورٍ أخرى من تطوير المواقع وتطبيقات الهاتف وحتى تطبيقات سطح المكتب. ما كنت أتعلمه في البرمجة التنافسية كان أساس التطوّر في باقي المجالات من ناحية التفكير وطريقة الكتابة.
فنصيحتي لمن يسأل دائما هل أتعلم البرمجة التنافسية وأصرف فيها وقتي؟ فالجواب نعم ولكن باعتدال. حاول أن تصل إلى مرحلة تستطيع فيها حل أسئلة A و B و C من موقع CodeForces بأريحية.
هذا الحد جيد بشكل عام في تطوير طريقة تفكيرك وتحسين أداءك في مقابلات العمل، وبشكل موازٍ حاول تعلّم تطوير تطبيقات الهاتف أو المواقع (حسب رغبتك وما تميل إليه نفسك).
وإذا أردتُ وضع قائمة بالمواضيع التي يحسن بك تعلمها فستنقسم القائمة إلى 3 أجزاء:
- التقنيات
- هياكل البيانات
- الخوارزميات
من الجزء الأول يمكنك تعلّم:
- Cumulative Sum
- Frequency Array
- Two Pointers
- الأعداد الأولية وما يتعلّق بالرياضيات بشكل عام
من الجزء الثاني يمكنك تعلّم:
- Pair
- Stack
- Queue
- Vector
- Set
- Map
- Priority Queue
- Trie
- Segment Tree
ومن الجزء الثالث يمكنك تعلّم:
- Binary Search
- Recursion
- Graph (DFS, BFS, Dijkstra, Minimum Spanning Tree, and Topological Sort)
- Dynamic Programming
بعد هذه الأساسيات، يمكنك التعمّق في أمور أخرى إذا وجدت لديك القدرة والوقت مثل:
- Disjoint Set
- Meet in the Middle
- Ternary Search
- 2D Cumulative Sum
- Maxflow
وغيرها الكثير من الأمور المتقدمة والتي لن تستخدمها في حياتك العملية غالبًا، ولكن من الجميل أن تعرفها (صدّقني 😁).
وإذا سألت عن المصادر، فقد شرحت جزءًا كبيرا من هذه المواضيع في قائمة التشغيل هذه:
https://youtube.com/playlist?list=PLxg8EAtENLXJ1o8SF0wKO7ZRRAacZbHn5
كما يمكنك الاستفادة من المصدر الأساس في هذا المجال باللغة العربية، قناة أخونا مصطفى سعد:
https://www.youtube.com/c/ArabicCompetitiveProgramming
أما المواقع المتخصصة فهي كثيرة منها:
- https://codeforces.com
- https://atcoder.jp
- https://onlinejudge.org
- https://www.spoj.com
- https://leetcode.com
والسلام عليكم 👋🏻
عندما بدأت الدراسة الجامعية، لم أكن أعرف عن وجود شيء يسمَّى "البرمجة التنافسية"، غير أني وبالصدفة البحتة وجدت موقع HackerRank وبدأت حل بعض المسائل الموجودة عليه والمخصصة للغة Ruby، كان هذا في غالب ظني سنة 2016.
بعد فترة بسيطة، نظّم زملاء لنا في سنوات متقدمة محاضرة للتعريف بالبرمجة التنافسية، وكنت من الحاضرين، وفي نهايتها كنت متحمسا جدا للانضمام إلى هذه المسابقة وتعلم أساليب حل أسئلتها وكيفية التفكير فيها.
بدأت التدريب مع العديد من الطلبة الآخرين في العام نفسه فحضرنا التدريبات المختلفة وحللنا الأسئلة وشاركنا في المسابقات على المواقع والمسابقات المحلية والإقليمية والحمدلله تعلمنا الكثير من الأمور، فجزى الله خيرا من علّمنا.
ولكن خلال هذه الرحلة كان منا من اهتم بالبرمجة التنافسية بشكل كبير جدا وترك ما سواها وكان منا من أخذ منها الشيء القليل وركّز على غيرها من الأمور والقليلون من توسَّطوا وأدَّعي أنني كنت من الفئة المتوسطة (الغرور ↖️).
خلال 4 سنوات في الجامعة كنت أحاول الجمع بين البرمجة التنافسية وتعلّم أمورٍ أخرى من تطوير المواقع وتطبيقات الهاتف وحتى تطبيقات سطح المكتب. ما كنت أتعلمه في البرمجة التنافسية كان أساس التطوّر في باقي المجالات من ناحية التفكير وطريقة الكتابة.
فنصيحتي لمن يسأل دائما هل أتعلم البرمجة التنافسية وأصرف فيها وقتي؟ فالجواب نعم ولكن باعتدال. حاول أن تصل إلى مرحلة تستطيع فيها حل أسئلة A و B و C من موقع CodeForces بأريحية.
هذا الحد جيد بشكل عام في تطوير طريقة تفكيرك وتحسين أداءك في مقابلات العمل، وبشكل موازٍ حاول تعلّم تطوير تطبيقات الهاتف أو المواقع (حسب رغبتك وما تميل إليه نفسك).
وإذا أردتُ وضع قائمة بالمواضيع التي يحسن بك تعلمها فستنقسم القائمة إلى 3 أجزاء:
- التقنيات
- هياكل البيانات
- الخوارزميات
من الجزء الأول يمكنك تعلّم:
- Cumulative Sum
- Frequency Array
- Two Pointers
- الأعداد الأولية وما يتعلّق بالرياضيات بشكل عام
من الجزء الثاني يمكنك تعلّم:
- Pair
- Stack
- Queue
- Vector
- Set
- Map
- Priority Queue
- Trie
- Segment Tree
ومن الجزء الثالث يمكنك تعلّم:
- Binary Search
- Recursion
- Graph (DFS, BFS, Dijkstra, Minimum Spanning Tree, and Topological Sort)
- Dynamic Programming
بعد هذه الأساسيات، يمكنك التعمّق في أمور أخرى إذا وجدت لديك القدرة والوقت مثل:
- Disjoint Set
- Meet in the Middle
- Ternary Search
- 2D Cumulative Sum
- Maxflow
وغيرها الكثير من الأمور المتقدمة والتي لن تستخدمها في حياتك العملية غالبًا، ولكن من الجميل أن تعرفها (صدّقني 😁).
وإذا سألت عن المصادر، فقد شرحت جزءًا كبيرا من هذه المواضيع في قائمة التشغيل هذه:
https://youtube.com/playlist?list=PLxg8EAtENLXJ1o8SF0wKO7ZRRAacZbHn5
كما يمكنك الاستفادة من المصدر الأساس في هذا المجال باللغة العربية، قناة أخونا مصطفى سعد:
https://www.youtube.com/c/ArabicCompetitiveProgramming
أما المواقع المتخصصة فهي كثيرة منها:
- https://codeforces.com
- https://atcoder.jp
- https://onlinejudge.org
- https://www.spoj.com
- https://leetcode.com
والسلام عليكم 👋🏻
❤11🔥1
  طرح أحد الإخوة سؤالًا ملخصه: "ماذا أنشر وكيف أنشر؟".
الجواب من وجهة نظري وباختصار شديد: "أنشر تجربتك وما تعرفه، حتى لو كانت المعلومة بسيطة وترى أنها معروفة للجميع مسبقًا".
على سبيل المثال، كان منشور البارحة منشورًا تقنيًّا تحدّثت فيه عن استهلاك الذاكرة في لغة Ruby وكيف حللت المشكلة في منصة باحث، يمكنك قراءته من هنا:
https://t.me/programmerskhan/92
ومنشور اليوم كان منشورًا تعليميًّا قصصيًّا أكثر منه منشورًا تقنيًّا أتحدث فيه عن تجربتي وبعض النصائح في مجال البرمجة التنافسية، يمكنك قراءته من هنا:
https://t.me/programmerskhan/93
كان تفاعل الناس مع منشور اليوم ضعف تفاعلهم مع منشور البارحة على منصة قبيلة وقناتي على تطبيق Telegram وأكثر بـ 4 أضعاف تقريبا على LinkedIn، مع أنني توقعت العكس تمامًا.
فما أريد قوله، شارك ما تعرفه ولو كان من وجهة نظرك بسيطًا، ولا داعي لتعقيد الأمور ومحاولة طرح المواضيع الشيّقة 😁
الجواب من وجهة نظري وباختصار شديد: "أنشر تجربتك وما تعرفه، حتى لو كانت المعلومة بسيطة وترى أنها معروفة للجميع مسبقًا".
على سبيل المثال، كان منشور البارحة منشورًا تقنيًّا تحدّثت فيه عن استهلاك الذاكرة في لغة Ruby وكيف حللت المشكلة في منصة باحث، يمكنك قراءته من هنا:
https://t.me/programmerskhan/92
ومنشور اليوم كان منشورًا تعليميًّا قصصيًّا أكثر منه منشورًا تقنيًّا أتحدث فيه عن تجربتي وبعض النصائح في مجال البرمجة التنافسية، يمكنك قراءته من هنا:
https://t.me/programmerskhan/93
كان تفاعل الناس مع منشور اليوم ضعف تفاعلهم مع منشور البارحة على منصة قبيلة وقناتي على تطبيق Telegram وأكثر بـ 4 أضعاف تقريبا على LinkedIn، مع أنني توقعت العكس تمامًا.
فما أريد قوله، شارك ما تعرفه ولو كان من وجهة نظرك بسيطًا، ولا داعي لتعقيد الأمور ومحاولة طرح المواضيع الشيّقة 😁
❤6👍3
  
  خان المُبرمجين (علي فاضل)
Photo
الكمال عدو الإنجاز
عندما أضفت ميزة تسجيل الدخول باستخدام Google إلى منصة باحث بتاريخ 7 من شهر 4 سنة 2024، كان هناك مشكلة أنني أُنشئ كلمة مرور عشوائية لهذا المستخدم، وليس هناك طريقة يمكنه من خلالها تغيير كلمة المرور، وبالتالي لا يستطيع تغيير أي شيء في حسابه كالاسم الأول والأخير والبريد الإلكتروني.
لم يكن هناك تبعات كبيرة بسبب هذه المشكلة، فتعديل هذه البيانات ليس بالشيء المهم حقيقةً، إلى أن أطلقت تطبيقات الهاتف الخاصة بالمنصة.
في تطبيقات الهاتف، لا يوجد زر لتسجيل الدخول باستخدام Google (نُحاول حل هذه المشكلة الأخرى 😆)، فيجب على المستخدم تسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور، ولكنه لا يستطيع تغيير كلمة المرور ليُسجّل دخوله، وهكذا يدور المستخدم في حلقة مفرغة ولله الحمد 😂
أيضا لم تكن هذه مشكلة كبيرة في حالة منصة باحث، فمستخدمي تطبيق الهاتف عددهم قليل، وعدد المستخدمين المُسجّلين أقل، فلم أهتم للأمر كثيرًا.
في سياق مختلف، نشرت منشورا قبل 3 أيام أتحدث فيه عن ميزة جديدة أضفتها إلى منصة باحث وهي تمكين المستخدم من الكتابة باستخدام Yamli، يمكنك قراءته من هنا:
https://t.me/programmerskhan/91
ولكن لم أكن أريد تمكين هذه الميزة لكل مستخدمي المنصة، كنت أريد تمكينها بناء على طلب المستخدم من خلال إضافة خيار "تمكين Yamli" في صفحة إعدادات المستخدم.
أضفت هذا الخيار ونشرت الميزة، ثم طلبت من صديقي الذي طلبها في البداية تجربتها، وكانت المفاجأة، لا يستطيع صديقي تفعيل الميزة لأنه سجّل دخوله باستخدام Google، وليس لديه كلمة مرور لحسابه 😁
هنا أدركت أنه يجب علي إصلاح هذه المشكلة في المنصة.
بدأت في حل المشكلة بعد إضافة ميزة Yamli بيوم، وكان حلها سهلا، مجرد 200 سطر لتعديل الواجهة وطريقة تعامل المنصة مع هذا النوع من المستخدمين، والحمدلله حُلّت المشكلة بعد أكثر من 10 أشهر من وجودها 🥳
هذه المشكلة وغيرها من المشاكل موجودة في باحث وغيرها من المشاريع التي أعمل عليها، ومنها مشاكل أعلم بوجودها ومنها ما لا أعلم بوجوده، ولكن هل هذا يمنع إظهار هذه المشاريع وبدء الاستفادة منها؟ بالتأكيد لا!
لا يجب عليك إنشاء مُنتج كامل لتظهر به أمام الناس ويبدأ الآخرون بالاستفادة منه، كل ما عليك هو توفير مُنتج يعمل بأقل عدد من المشاكل، لا أكثر ولا أقل.
وهذا المبدأ موجود في المشاريع غير الربحية والشركات الكبرى والمشاريع مفتوحة المصدر وفي كل مكان في العالم، والاخطاء التي نجدها في مواقع ومنتجات الشركات العملاقة خير دليل على ذلك.
وإذا سألتني: "هل يوجد من انتبه لهذه المشكلة خلال الـ 10 أشهر؟"، فالجواب نعم، شخص واحد بعد 5 أيام من إضافة ميزة تسجيل الدخول باستخدام Google، وراسل المنصة لحلها، وانت تعرف الباقي.
والسلام عليكم 👋🏻
عندما أضفت ميزة تسجيل الدخول باستخدام Google إلى منصة باحث بتاريخ 7 من شهر 4 سنة 2024، كان هناك مشكلة أنني أُنشئ كلمة مرور عشوائية لهذا المستخدم، وليس هناك طريقة يمكنه من خلالها تغيير كلمة المرور، وبالتالي لا يستطيع تغيير أي شيء في حسابه كالاسم الأول والأخير والبريد الإلكتروني.
لم يكن هناك تبعات كبيرة بسبب هذه المشكلة، فتعديل هذه البيانات ليس بالشيء المهم حقيقةً، إلى أن أطلقت تطبيقات الهاتف الخاصة بالمنصة.
في تطبيقات الهاتف، لا يوجد زر لتسجيل الدخول باستخدام Google (نُحاول حل هذه المشكلة الأخرى 😆)، فيجب على المستخدم تسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور، ولكنه لا يستطيع تغيير كلمة المرور ليُسجّل دخوله، وهكذا يدور المستخدم في حلقة مفرغة ولله الحمد 😂
أيضا لم تكن هذه مشكلة كبيرة في حالة منصة باحث، فمستخدمي تطبيق الهاتف عددهم قليل، وعدد المستخدمين المُسجّلين أقل، فلم أهتم للأمر كثيرًا.
في سياق مختلف، نشرت منشورا قبل 3 أيام أتحدث فيه عن ميزة جديدة أضفتها إلى منصة باحث وهي تمكين المستخدم من الكتابة باستخدام Yamli، يمكنك قراءته من هنا:
https://t.me/programmerskhan/91
ولكن لم أكن أريد تمكين هذه الميزة لكل مستخدمي المنصة، كنت أريد تمكينها بناء على طلب المستخدم من خلال إضافة خيار "تمكين Yamli" في صفحة إعدادات المستخدم.
أضفت هذا الخيار ونشرت الميزة، ثم طلبت من صديقي الذي طلبها في البداية تجربتها، وكانت المفاجأة، لا يستطيع صديقي تفعيل الميزة لأنه سجّل دخوله باستخدام Google، وليس لديه كلمة مرور لحسابه 😁
هنا أدركت أنه يجب علي إصلاح هذه المشكلة في المنصة.
بدأت في حل المشكلة بعد إضافة ميزة Yamli بيوم، وكان حلها سهلا، مجرد 200 سطر لتعديل الواجهة وطريقة تعامل المنصة مع هذا النوع من المستخدمين، والحمدلله حُلّت المشكلة بعد أكثر من 10 أشهر من وجودها 🥳
هذه المشكلة وغيرها من المشاكل موجودة في باحث وغيرها من المشاريع التي أعمل عليها، ومنها مشاكل أعلم بوجودها ومنها ما لا أعلم بوجوده، ولكن هل هذا يمنع إظهار هذه المشاريع وبدء الاستفادة منها؟ بالتأكيد لا!
لا يجب عليك إنشاء مُنتج كامل لتظهر به أمام الناس ويبدأ الآخرون بالاستفادة منه، كل ما عليك هو توفير مُنتج يعمل بأقل عدد من المشاكل، لا أكثر ولا أقل.
وهذا المبدأ موجود في المشاريع غير الربحية والشركات الكبرى والمشاريع مفتوحة المصدر وفي كل مكان في العالم، والاخطاء التي نجدها في مواقع ومنتجات الشركات العملاقة خير دليل على ذلك.
وإذا سألتني: "هل يوجد من انتبه لهذه المشكلة خلال الـ 10 أشهر؟"، فالجواب نعم، شخص واحد بعد 5 أيام من إضافة ميزة تسجيل الدخول باستخدام Google، وراسل المنصة لحلها، وانت تعرف الباقي.
والسلام عليكم 👋🏻
❤5👍4
  
  خان المُبرمجين (علي فاضل)
Photo
البيانات الهرمية في قاعدة البيانات
أعمل حاليا على إضافة ميزة جديدة إلى منصة باحث (قريبًا 🚀) وتحتاج هذه الميزة إلى ترتيب البيانات هرميًّا، فكل صف من صفوف الجدول يُعبّر عن عنصرٍ وهذا العنصر قد يكون له ابن أو مجموعة أبناء، وهكذا إلى أن نحصل على شجرة من البيانات.
هذا التمثيل للبيانات مهم ومنتشر في حياتنا فيمكنك من خلاله تمثيل فئات المنتجات (مثلا: فئة البقالة تحتها منتجات الألبان ومنتجات اللحوم) أو تمثيل الموظفين في الشركة حسب أقسامهم (مثلا: قسم تكنولوجيا المعلومات تحته قسم الصيانة وقسم المشتريات).
كنت أظن الأمر سهلا ولا يوجد فيه الكثير من التعقيدات، مجرد جدول في قاعدة البيانات مع عمودٍ باسم
ولكن قبل البدء في التنفيذ قررت البحث والقراءة عن الأمر، فاكتشفت الخيارات الكثيرة المتاحة لك عند تمثيل هذا النوع من البيانات، ومنها الخيار المذكور في الفقرة السابقة والمسمى بـ "أب-ابن" (Parent-Child).
استخدام هذا النوع سهلٌ جدًّا في Ruby on Rails، تحتاج إلى إضافة العمود ثم تعريف العلاقة في الـ Model كما هو موضّح في الصورة. بهذه الطريقة يمكنك الوصول إلى أب أي عنصر من خلال دالة
هذا الخيار يُوّفر لك سرعة كبيرة في إضافة العناصر الجديدة، فأنت تحتاج إلى كتابة صفٍّ واحدٍ فقط، ولكن القراءة فيه تكون بطيئة، فإذا وُجد عنصر يبعد عن الجذر الخاص به بمسافة 5 عناصر، فستحتاج إلى 4 استعلامات على قاعدة البيانات لتصل إلى الجذر، لذلك يُنصح به إذا كان أطول مسارٍ في شجرة بياناتك لا يتعدَّى عنصرين أو ثلاثة عناصر كحد أقصى.
النوع الثاني يسمى المسار الملموس (Materialized Path)
في هذا النوع أنت تحتفظ بكل آباء العنصر إلى أن تصل إلى الجذر في كل صف من صفوف الجدول، فلا تحتاج إلى الكثير من الاستعلامات لتصل إلى جذر عنصرٍ مُعيّن لأنك تمتلك المسار كاملًا من العنصر إلى الجذر، ولكن الكتابة في هذا النوع مكلفة وحجم البيانات المُخزّنة أكبر.
يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى
https://github.com/stefankroes/ancestry
النوع الأخير يسمى المجموعات المتداخلة (Nested Sets)
وهذا النوع أعقدهم، ولكنه يوفّر قراءة سريعة جدًّا لعناصر الشجرة. يعمل هذا النوع بمبدأ مُشابه لمبدأ عمل الـ Segment Tree، والتي شرحتها في هذا المقطع:
https://www.youtube.com/live/U_sZY8WTX-Y
سريعًا، يستخدم هذا النوع 3 أعمدة وهي
يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى
https://github.com/collectiveidea/awesome_nested_set
قررت الابتعاد عن الخيار الأول والأخير في باحث واستخدام الخيار الثاني، فالكتابة في حالتي قليلة والقراءة هي الأساس، ولا حاجة للتعقيد الإضافي من الخيار الأخير.
هل استخدمت أي نوع من هذه الأنواع سابقًا ؟.؟ وهل تعرف أنواعًا أخرى؟ شاركنا لنستفيد 😁
والسلام عليكم 👋🏻
أعمل حاليا على إضافة ميزة جديدة إلى منصة باحث (قريبًا 🚀) وتحتاج هذه الميزة إلى ترتيب البيانات هرميًّا، فكل صف من صفوف الجدول يُعبّر عن عنصرٍ وهذا العنصر قد يكون له ابن أو مجموعة أبناء، وهكذا إلى أن نحصل على شجرة من البيانات.
هذا التمثيل للبيانات مهم ومنتشر في حياتنا فيمكنك من خلاله تمثيل فئات المنتجات (مثلا: فئة البقالة تحتها منتجات الألبان ومنتجات اللحوم) أو تمثيل الموظفين في الشركة حسب أقسامهم (مثلا: قسم تكنولوجيا المعلومات تحته قسم الصيانة وقسم المشتريات).
كنت أظن الأمر سهلا ولا يوجد فيه الكثير من التعقيدات، مجرد جدول في قاعدة البيانات مع عمودٍ باسم
parent_id من خلاله تعرف الأب لكل صف من صفوف الجدول، وإذا كان الصف بدون parent_id، فهذا يعني أنه جذر في هذه الشجرة، سهلة.ولكن قبل البدء في التنفيذ قررت البحث والقراءة عن الأمر، فاكتشفت الخيارات الكثيرة المتاحة لك عند تمثيل هذا النوع من البيانات، ومنها الخيار المذكور في الفقرة السابقة والمسمى بـ "أب-ابن" (Parent-Child).
استخدام هذا النوع سهلٌ جدًّا في Ruby on Rails، تحتاج إلى إضافة العمود ثم تعريف العلاقة في الـ Model كما هو موضّح في الصورة. بهذه الطريقة يمكنك الوصول إلى أب أي عنصر من خلال دالة
parent والوصول إلى أبناء أي عنصر من خلال دالة children.هذا الخيار يُوّفر لك سرعة كبيرة في إضافة العناصر الجديدة، فأنت تحتاج إلى كتابة صفٍّ واحدٍ فقط، ولكن القراءة فيه تكون بطيئة، فإذا وُجد عنصر يبعد عن الجذر الخاص به بمسافة 5 عناصر، فستحتاج إلى 4 استعلامات على قاعدة البيانات لتصل إلى الجذر، لذلك يُنصح به إذا كان أطول مسارٍ في شجرة بياناتك لا يتعدَّى عنصرين أو ثلاثة عناصر كحد أقصى.
النوع الثاني يسمى المسار الملموس (Materialized Path)
في هذا النوع أنت تحتفظ بكل آباء العنصر إلى أن تصل إلى الجذر في كل صف من صفوف الجدول، فلا تحتاج إلى الكثير من الاستعلامات لتصل إلى جذر عنصرٍ مُعيّن لأنك تمتلك المسار كاملًا من العنصر إلى الجذر، ولكن الكتابة في هذا النوع مكلفة وحجم البيانات المُخزّنة أكبر.
يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى
ancestry، يمكنك الاطلاع عليها من هنا:https://github.com/stefankroes/ancestry
النوع الأخير يسمى المجموعات المتداخلة (Nested Sets)
وهذا النوع أعقدهم، ولكنه يوفّر قراءة سريعة جدًّا لعناصر الشجرة. يعمل هذا النوع بمبدأ مُشابه لمبدأ عمل الـ Segment Tree، والتي شرحتها في هذا المقطع:
https://www.youtube.com/live/U_sZY8WTX-Y
سريعًا، يستخدم هذا النوع 3 أعمدة وهي
level و left و right لتمثيل مستوى العناصر في الشجرة وبداية ونهاية العناصر المُنتمية لكل عنصرٍ من عناصر الشجرة. باستخدام هذه الأعمدة يمكنك الاستعلام عن أبناء عنصر من العناصر بسرعة كبيرة، ولكن كسابقه، الكتابة فيه مكلفة.يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى
awesome_nested_set، يمكنك الاطلاع عليها من هنا:https://github.com/collectiveidea/awesome_nested_set
قررت الابتعاد عن الخيار الأول والأخير في باحث واستخدام الخيار الثاني، فالكتابة في حالتي قليلة والقراءة هي الأساس، ولا حاجة للتعقيد الإضافي من الخيار الأخير.
هل استخدمت أي نوع من هذه الأنواع سابقًا ؟.؟ وهل تعرف أنواعًا أخرى؟ شاركنا لنستفيد 😁
والسلام عليكم 👋🏻
❤5
  اكتب بالعربية
لا يختلف اثنان على أن الكتابة بالعربية أمرٌ صعب في مجالِ التقنية بشكل عام، فمعظم المصطلحات ليس لها ترجمة، وإن وُجدت ترجمة، فقد تكون غير مستساغة لدى المتلقِّي.
ولكن رغم كل هذه الصعوبات، الأمر يستحق المجاهدة والمُحاولة، فلا ترتقي الأمم بلغة غيرها ولا تبدأ النهضة إلا بترجمة العلوم وإنتاجها بلغة القوم.
عن نفسي، أكتب بسهولة أكبر في مجالي عند استخدام الإنجليزية، ولكن أبذل بعض الجهد في استخدام العربية سواءً كان في المحادثات الشخصية أو في توثيق البرمجيات، ومن أمثلة ذلك مكتبتيْ تفريغ وتحويل:
- https://github.com/ieasybooks/tafrigh
- https://github.com/ieasybooks/tahweel
بدأت بكتابة التوثيق الخاص بمكتبة تفريغ باللغة العربية، ثم عند استقراره استخدمت الذكاء الاصطناعي لترجمته إلى الإنجليزية وتوفيره كنسخة ثانية (وليست أساسية) للتوثيق في المستودع.
كذلك، بدأت بكتابة توثيق تحويل باللغة العربية، لكنني لم أرَ حاجة إلى ترجمته إلى الإنجليزية بعد.
وعلى الهامش، سأكون متواجدًا في Leap هذه السنة في الرياض من الأحد الموافق 09/02 إلى الأربعاء الموافق 12/02، إن كنتَ حاضرًا، فلنلتقِ 😁
والسلام عليكم 👋🏻
لا يختلف اثنان على أن الكتابة بالعربية أمرٌ صعب في مجالِ التقنية بشكل عام، فمعظم المصطلحات ليس لها ترجمة، وإن وُجدت ترجمة، فقد تكون غير مستساغة لدى المتلقِّي.
ولكن رغم كل هذه الصعوبات، الأمر يستحق المجاهدة والمُحاولة، فلا ترتقي الأمم بلغة غيرها ولا تبدأ النهضة إلا بترجمة العلوم وإنتاجها بلغة القوم.
عن نفسي، أكتب بسهولة أكبر في مجالي عند استخدام الإنجليزية، ولكن أبذل بعض الجهد في استخدام العربية سواءً كان في المحادثات الشخصية أو في توثيق البرمجيات، ومن أمثلة ذلك مكتبتيْ تفريغ وتحويل:
- https://github.com/ieasybooks/tafrigh
- https://github.com/ieasybooks/tahweel
بدأت بكتابة التوثيق الخاص بمكتبة تفريغ باللغة العربية، ثم عند استقراره استخدمت الذكاء الاصطناعي لترجمته إلى الإنجليزية وتوفيره كنسخة ثانية (وليست أساسية) للتوثيق في المستودع.
كذلك، بدأت بكتابة توثيق تحويل باللغة العربية، لكنني لم أرَ حاجة إلى ترجمته إلى الإنجليزية بعد.
وعلى الهامش، سأكون متواجدًا في Leap هذه السنة في الرياض من الأحد الموافق 09/02 إلى الأربعاء الموافق 12/02، إن كنتَ حاضرًا، فلنلتقِ 😁
والسلام عليكم 👋🏻
❤9👍1🔥1