المشكلة الوحيدة ستكون إذا كنت غير راضٍ عن أسماء المستخدمين التي يختارها البرنامج النصي. لذلك إذا كنت لا تهتم بحدوث شيء كهذا:
clan|nickname → clan_nickname
[clan]nickname → clan_nickname2
فمن المحتمل أن تكون بخير، ويبدو من غير المحتمل جدًا أن يكون لديك شخصان في نفس العشيرة بنفس اسم الشهرة ولكن بأحرف إضافية مختلفة، لذلك أعتقد أنك ستكون بخير على الأرجح.
للأسف، اضطررنا في النهاية إلى إنشاء نص الهجرة الخاص بنا بالكامل. النص الذي كان متاحًا في ذلك الوقت (نهاية عام 2022) لم يكن بالتأكيد في حالة “منتهية”. كانت أجزاء من التعليمات البرمجية المشار إليها مفقودة وأخرى لم يكن لها أي معنى على الإطلاق.
من بين الأجزاء التي اضطررنا إلى التعامل معها، كان إعادة تسمية أسماء المستخدمين التي لم تكن تحترم معيار discourse. كان لدينا أكثر من 10 آلاف مستخدم، لذا قمنا ببساطة بتعيين اسم المستخدم إلى حقل “اسم المستخدم” الذي لا يحتوي على مثل هذه القيود، وعندما كان اسم المستخدم ينتهك أيًا من القواعد، قمنا بتغييره إلى سلسلة md5 لاسم المستخدم. ثم تركنا المستخدمين لمدة شهر لتغيير اسم المستخدم الخاص بهم بحرية حتى يتمكنوا من تغييره مرة أخرى إلى شيء يشبه اسمهم الأصلي.
إليك مقتطف من التعليمات البرمجية:
public static string ParseName(string text)
{
var reservedName = new string[] { "user", "system", "moderators" };
var result = NormalizeText(text);
// If reserved change it
if (reservedName.Contains(result, StringComparer.OrdinalIgnoreCase))
result = text.ToLower().ToMD5();
// Invalid alphanumeric
else if (!Regex.IsMatch(result, @\"^[a-zA-Z0-9_.-]*$\"))
result = text.ToLower().ToMD5();
// Invalid repeated
else if (Regex.IsMatch(result, @\"[-_.]{2,}\"))
result = text.ToLower().ToMD5();
// Invalid trailing char
else if (Regex.IsMatch(result, @\"/[\\p{L}\\p{N}]+$\"))
result = text.ToLower().ToMD5();
// Confusing extensions
else if (Regex.IsMatch(result, @\"/\\.(js|json|css|htm|html|xml|jpg|jpeg|png|gif|bmp|ico|tif|tiff|woff)$/i\"))
result = text.ToLower().ToMD5();
// Starting and ending dots
else if (result.StartsWith(".") || result.EndsWith("."))
result = text.ToLower().ToMD5();
// No more than 60 character
result = result.Truncate(60);
return result;
}
استخدمنا هذا الملف كمرجع لتحديد ما يجب اعتباره قيدًا. ربما تم تغييره في غضون ذلك، لذا ترقب ذلك.
لا، لقد انتقلنا من البرنامج النصي لأنه كان بطيئًا للغاية في معالجة منتدى يحتوي على أكثر من 10 ملايين رد.
لقد أنشأنا كل شيء من البداية في C#. استغرق الأمر حوالي 4-5 ساعات لترحيل كل شيء باستثناء الصور الرمزية وإنشاء إعادة توجيه لمطابقة تنسيقات عناوين URL المختلفة. ستؤدي جولة ثانية من البرنامج النصي مع معلمة محددة أيضًا إلى تحديث الصورة الرمزية لكل مستخدم نشط في الأشهر الستة الماضية وإضافة جميع عمليات إعادة التوجيه الضرورية عن طريق فحص الردود والبحث عن تنسيق عنوان URL القديم.
استغرق ذلك أكثر أو أقل يومين، ولكنه كان شيئًا يمكن أن يحدث في الخلفية لأن الشيء المهم بالنسبة لنا كان تشغيل المنتدى وتشغيله بكل المحتوى في أقل من يوم.
على سبيل المثال، تتخطى البرامج النصية الحالية المحتوى الموجود، لذا من المحتمل أن يستغرق الاستيراد النهائي أقل من ساعة، خاصة إذا أخبرتها بتاريخ أحدث البيانات التي تم استيرادها. سيكون التشغيل الأول مؤلمًا للغاية، على الرغم من ذلك.
نعم، أعرف أنه استؤنف أيضًا ولكن بعض المحتوى القديم كان في حالة فوضى كبيرة (كان لدى المنتدى ترحيل في أوائل عام 2000) لدرجة أن البرنامج النصي كان يفشل في معظم الأوقات أو يتباطأ بسرعة كبيرة.
صدقني، لو كان بإمكاننا تجنب 3 أشهر من الكتابة والاختبار، لكنا فعلنا ذلك!