خادم Anagram هو تطبيق قائم على Node.js يعرض واجهة برمجة تطبيقات قائمة على الراحة لإجراء عمليات البحث المتعلقة بـ Anagram مقابل قاموس الكلمات. ميزةها الأساسية هي العثور على الجناح المعروف لكلمة معينة.
بالإضافة إلى ذلك ، يمكن الاستعلام عن مجموعات الجناح الجنسي الجنسي الإضافي (مجموعات من الكلمات التي هي جنسيا من بعضها البعض) بواسطة Cardinality (عدد الكلمات في المجموعة) أو طول الكلمة. من الممكن أيضًا الاستعلام عن ما إذا كانت مجموعة معينة من الكلمات تشتمل على مجموعة جنسياً.
يمكن إضافة قاموس الكلمات التي يمكن الاستعلام عن جناح الإقامة ضدها ، أو حذفها ، أو مسحها بالكامل عبر واجهة برمجة التطبيقات. عند تكوينه كخدمة الذاكرة فقط (أي ، لا يتم استمرار التغييرات عبر إعادة تشغيل الخدمة) ، فإن خادم anagram يسبق مجموعة قياسية من الكلمات الإنجليزية عند بدء التشغيل (انظر app.js
).
أخيرًا ، يمكن الاستعلام عن عدد من الإحصائيات حول القاموس المحمّل عبر API.
تثبيت node.js إذا لزم الأمر
تثبيت تبعيات NPM
npm install
npm start
بشكل افتراضي ، يقدم التطبيق الطلبات عبر المنفذ 3000. لتجاوز هذا ، يمكنك تحديث البرنامج النصي Start in package.json
لتمرير رقم منفذ بديل إلى أمر العقدة. على سبيل المثال:
"start": "node src/app.js -p 8080"
قد تحتاج إلى السماح صراحة بحركة المرور الواردة على المنفذ الفعال. على سبيل المثال ، لفتح المنفذ 3000 على Linux حتى إعادة التشغيل التالي:
sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
تثبيت Docker إذا لزم الأمر
بناء صورة Docker
sudo docker build -t anagram-server .
sudo docker run -p 3000:3000 anagram-server
قد تفضل تعيين منفذ مضيف بديل (على سبيل المثال ، -p 8080:3000
).
يشحن خادم anagram مع البرامج النصية للاختبار الياقوت.
لاحظ أنه افتراضيًا ، يقوم خادم anagram بتحويل الكلمات من dictionary.txt
على بدء التشغيل.
توجد البرامج النصية للاختبار في المجلد الفرعي test
للحزمة المصدر ويمكن تشغيله بشكل فردي مثل:
ruby anagram_test.rb
ruby anagram_test_2.rb
يمكن اختبار خادم Anagram يدويًا باستخدام cURL
أو أداة مثل Postman. على سبيل المثال (من سطر الأوامر في نافذة طرفية جديدة لمضيف التطبيق):
curl -i "http://localhost:3000/anagrams/shout.json"
نظرًا لقيامه افتراضيًا بالكلمات المسبقة لخادم Anagram من dictionary.txt
على بدء التشغيل ، فقد ترغب في مسح القاموس مع الأمر التالي قبل الاختبار:
curl -i -X DELETE "http://localhost:3000/words.json"
بالنسبة للاختبار عن بُعد ، استبدل "مضيف محلي" بمضيف التطبيق IP في anagram_client.rb
وفي أوامر عينة من هذا المستند.
قم أيضًا بتحديث رقم المنفذ في anagram_client.rb
وفي أوامر العينة إذا كان تشغيل خادم Anagram مع منفذ آخر غير الافتراضي (3000).
تعتبر الكلمة صالحة إذا كانت تحتوي على أي مجموعة من الحروف الأبجدية الإنجليزية الكبيرة والصغيرة أو الواصلة. قد لا تبدأ كلمة صالحة أو تنتهي باستخدام الواصلة.
محاولات الحصول على أو حذف كلمات غير صالحة تؤدي إلى 400 Bad Request
.
محاولات نشر كلمات غير صالحة تؤدي إلى 204 No Content
.
يعتبر الاسم المناسب أي كلمة تحتوي على جميع الأحرف الصغيرة باستثناء الحرف الأول (الذي يجب أن يكون أحرفًا كبيرة) والحرف الأول بعد الواصلة (التي قد تكون كبيرة أو صغيرة).
بعض الأمثلة هي: اللغة الإنجليزية ، الزولو ، جان كريستوف
تعتبر الأسماء المناسبة متميزة عن إصداراتها الصغيرة. على سبيل المثال ، أبيجيل وأبيجيل كلمتين متميزتين (و anagrams لبعضهما البعض).
يتم تضمين الأسماء المناسبة دائمًا في النتائج ما لم يتم استبعادها بشكل صريح (انظر excludeProperNouns
Parm of GET /anagrams/:word.json
).
للراحة ، يتيح Sanagram Server مطابقة الأسماء المناسبة مع إصداراتها الصغيرة في بعض الحالات. على سبيل المثال ، عند الاستعلام عن الجناح:
$ curl -i "http://localhost:3000/anagrams/aaru.json?includeInput=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"Aaru",
"aura"]
}
تتكون بنية خادم Anagram من 4 طبقات (من أدنى مستوى إلى أعلى):
المحول هو فئة توفر عمليات الاستعلام الأساسي الخاصة بالمتجر والتكرار و CRUD التي يستخدمها خادم Anagram. على وجه التحديد ، يوفر المحول دلالات لربط سلسلة مفاتيح بمجموعة من القيم ، مع إضافة وحذف من مجموعة القيم لكل مفتاح ، والاستعلام عن مجموعة من مفاتيح/مفتاح/مجموعة تكرار.
يقوم المحول بتجريد تفاصيل آلية التخزين الأساسية من منطق الخدمة من أجل تسهيل تبديل تقنية التخزين لآخر. تتمثل قيمة هذا التجريد في توفير مسار ترقية سهل مع ظهور بدائل تخزين أكثر ملاءمة وللسماح بخيارات قابلية التوسع المرنة.
على سبيل المثال ، قد يتم طرح الخدمة في البداية كخادم تطبيق واحد مع محول يلف مثيل MySQL على نفس الخادم. مع زيادة قابلية التوسع والفشل والأداء ، قد نقوم بتبديل المحول لتلقي مثيل Redis الذي يستمر ويكرر بياناته عبر خوادم متعددة. تفاصيل كيفية تخزين البيانات وتخزينها مؤقتًا و/أو تكرارها شفافة لخدمة الجنوس.
يشحن خادم anagram مع MemoryAdapter ( adapters/MemoryAdapter.js
) ، والذي يستخدم خريطة JavaScript لتخزين البيانات والاستعلام عنها. يحتوي هذا المحول على تطبيق محدود لأنه لا يوفر فائدة الثبات عبر إعادة تشغيل الخادم ، ولكنه بمثابة أساس جيد لاختبار ميزات خادم Anagram.
يحدد المشروع واجهة لتنفيذ المحولات في adapters/adapter-template.js
. يمكن استخدام هذا الملف كـ Boilerplate في تحديد محولات جديدة.
تعتمد واجهة المحول على أساس الوعد لأن واجهات برمجة التطبيقات لتقنيات التخزين تميل إلى أن تكون غير متزامنة. من الناحية النظرية ، يضيف هذا وقت الاستجابة لأن الوعود يتم حلها عبر قائمة انتظار الحدث ، ولكن هذا التأثير ضئيل في نطاق طلب الشبكة.
المعاملات
تتطلب طرق add()
و delete()
للمحول من المتجر الأساسي دعم المعاملات لأن منطقها يتضمن الاستعلام عن البيانات ، ثم العمل على المتجر استنادًا إلى نتائج الاستعلام.
نتائج الاستنساخ
MemoryAdapter get()
each()
أساليب إرجاع صفائف قيمة خريطة الخريطة مباشرة إلى الخدمات الجنسية الجنسية. وهذا يتطلب العناية نيابة عن رمز الخدمات الجنسية لتجنب الطفرة العرضية للنتائج التي تقدمها هذه الطرق.
سيكون استنساخ النتائج داخل MemoryAdapter قبل إعادتها خطوة حكيمة في تخفيف الحشرات المستقبلية ، وضمان اتساق الواجهة ، وتوفر أقل من الدهشة للمستهلكين ، ولكنه يشمل أيضًا النفقات العامة (وإن كان من المحتمل أن يكون ضئيلًا).
AnagramService هو فئة توفر منطق العمل لخادم Anagram. يتطلب تمرير مثيل محول إلى مُنشئه.
تحتفظ فئة جنسي الأمواج بتعدادات الكلمة و anagram وتنفذ الأساليب التي تدعم مباشرة واجهة برمجة تطبيقات REST.
يعيش هذا الفصل في AnagramService.js
.
server.js
تصدير دالة واحدة startServer()
تقوم بإنشاء خادم REST (عبر إعادة التكرار) و instantiates anagramservice.
يتطلب startServer()
مثيل محول ويقبل اختياريًا رقم منفذ يمكن منه طلب الخدمة ومسار اختياري إلى ملف نصي لتثبيت القاموس من.
لحوم server.js
هي مجموعة وظائف استجابة الخادم التي تتم تحليل طلبات HTTP الفردية ، واتصل أساليب الخدمات الجنسية ذات الصلة ، وإصدار الاستجابات باستخدام رموز استجابة الكائنات المناسبة ورموز استجابة HTTP.
app.js
هي نقطة الدخول لخادم جنسيجي. إنه ملف بسيط يحدد المحول لتشغيل الخدمة ومصدر التحميل المسبق للبيانات الاختيارية.
هذا هو الملف الوحيد الذي يحتاج إلى تغيير عند تبديل محول لآخر.
يقوم الإصدار الحالي من app.js
بتشغيل جنسي الإقامة مع dictionary.txt
MemoryAdapter و MemoryAdapts.
فيما يلي بعض الأفكار لمزيد من تطوير خادم جنسيجي.
GET /anagrams/:word.json
إرجاع مجموعة JSON من الكلمات التي تم تمريرها من الكلمة التي تم تمريرها في عنوان URL.
إذا كانت الكلمة التي تم تمريرها نفسها ليست كلمة معروفة (أي ، ليس في القاموس) ، يتم إرجاع صفيف فارغ (حتى لو كان يمكن تشكيل جنسيات المعروفة من الكلمة التي تم تمريرها).
للراحة ، سوف تتطابق كلمة تم تمريرها كأحرف صغيرة.
مثال:
$ curl -i "http://localhost:3000/anagrams/care.json"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"Acer",
"acre",
"crea",
"race"]
}
GET /anagrams/:word.json?limit=<integer>
إرجاع مجموعة JSON من الكلمات التي تم إقرارها من الكلمة التي تم تمريرها في عنوان URL ، ولكن تحد من عدد النتائج التي تم إرجاعها .
مثال:
$ curl -i "http://localhost:3000/anagrams/care.json?limit=2"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"Acer",
"acre"]
}
GET /anagrams/:word.json?includeInput=true
إرجاع مجموعة JSON من الكلمات التي هي جنسيات من الكلمة التي تم تمريرها في عنوان URL ، بما في ذلك كلمة الإدخال نفسها .
لا يتم تضمين كلمة الإدخال عادةً في نتائج جنسيجي لأن كلمة ما لا تعتبر تقليديًا جنسياً لنفسها.
$ curl -i "http://localhost:3000/anagrams/care.json?includeInput=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"Acer",
"acre",
"care",
"crea",
"race"]
}
GET /anagrams/:word.json?excludeProperNouns=true
إرجاع مجموعة JSON من الكلمات التي تم تمريرها من الكلمة التي تم تمريرها في عنوان URL ، مما يحذف الأسماء المناسبة .
عادة ما يتم تضمين الأسماء المناسبة في نتائج الجنسية.
$ curl -i "http://localhost:3000/anagrams/care.json?limit=2&excludeProperNouns=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"acre",
"crea"]
}
GET /anagrams?cardinalityMin=<integer>&cardinalityMax=<integer>
إرجاع جميع مجموعات جنسيجي التي تحتوي على حد أدنى و/أو أقصى عدد من العهد (عدد الانحراف في المجموعة).
يمكن حذف إما cardinalitymin أو cardinalityMax.
أمثلة:
$ curl -i "http://localhost:3000/anagrams?cardinalityMin=3&cardinalityMax=4"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"anagramsByCardinality": {
"cardinalityMin": 3,
"cardinalityMax": 4,
"anagrams": [
["Aaronic", "Nicarao", "ocarina"],
["abater", "artabe", "eartab", "trabea"],
["Abe", "bae", "Bea"],
...
]
}
}
# Return all words that have anagrams
$ curl -i "http://localhost:3000/anagrams?cardinalityMin=2"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"anagramsByCardinality": {
"cardinalityMin": 2,
"anagrams": [
["A", "a"],
["aal", "ala"],
["aam", "ama"],
...
]
}
}
GET /anagrams?lengthMin=<integer>&lengthMax=<integer>
إرجاع جميع مجموعات جنسيجي التي لها الحد الأدنى و/أو الحد الأقصى لطول الكلمة.
يمكن حذف الطول أو الطول.
مثال:
$ curl -i "http://localhost:3000/anagrams?lengthMin=10&lengthMax=11"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"anagramsByLength": {
"lengthMin": 10,
"lengthMax": 11,
"anagrams": [
["ablastemic", "masticable"],
["aborticide", "bacterioid"],
["acalyptrate", "Calyptratae"],
...
]
}
}
GET /anagrams?maxCardinality=true
إرجاع جميع مجموعات الجناح الجنسي مع الحد الأقصى للرقم.
مثال:
$ curl -i "http://localhost:3000/anagrams?maxCardinality=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"maxCardinalityAnagrams": {
"maxCardinality": 11,
"anagrams": [
["angor", "argon", "goran", "grano", "groan", "nagor", "Orang", "orang", "organ", "rogan", "Ronga"]
]
}
}
GET /anagrams?maxLength=true
إرجاع جميع مجموعات الجناح الجنسي مع الحد الأقصى لطول الكلمة.
مثال:
$ curl -i "http://localhost:3000/anagrams?maxLength=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"maxLengthAnagrams": {
"maxLength": 22,
"anagrams": [
["cholecystoduodenostomy", "duodenocholecystostomy"],
["hydropneumopericardium", "pneumohydropericardium"]
]
}
}
GET /anagrams?areAnagrams=<comma-delimited list of words>
تحديد ما إذا كانت مجموعة من الكلمات هي جنسيا من بعضها البعض.
يجب أن تكون جميع الكلمات التي تم تمريرها معروفة (أي في القاموس) حتى يكون هذا صحيحًا.
مثال:
$ curl -i "http://localhost:3000/anagrams?areAnagrams=acer,acre,race"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"anagramAffinity": {
"areAnagrams": true,
"words": ["acer", "acre", "race"]
}
}
GET /anagrams?count=true
إرجاع التهم الجنسية فقط. تضيف كل مجموعة من أنواع الجنسيات في القاموس N-1 إلى هذا العدد ، حيث N هو عدد الانحراف في المجموعة.
مثال:
$ curl -i "http://localhost:3000/anagrams?count=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "counts": { "anagram": 20043 }}
GET /words?count=true
إرجاع عدد الكلمات في القاموس.
مثال:
$ curl -i "http://localhost:3000/words?count=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "counts": { "word": 235886 }}
GET /words?stats=true
إرجاع بعض الإحصاءات حول الكلمات في القاموس.
مثال:
$ curl -i "http://localhost:3000/words?stats=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"stats": {
"wordCount": 235886,
"anagramCount": 20043,
"minWordLength": 1,
"maxWordLength": 24,
"medianWordLength": 4,
"averageWordLength": 9.569126612007494,
"minCardinality": 2,
"maxCardinality": 11,
"medianCardinality": 2,
"averageCardinality": 2.3111140184470464
}
}
POST /words.json
يأخذ مجموعة JSON من الكلمات ويضيفها إلى القاموس.
مثال:
$ curl -i -X POST -d '{ "words": ["Canadas", "acandas", "Smurfs", "care"] }' "http://localhost:3000/words.json"
HTTP/1.1 201 Created
Content-Type: application/json
...
{
"counts": {
"word": 3,
"anagram": 1
},
"words": ["/anagrams/Canadas", "/anagrams/acandas", "/anagrams/Smurfs"]
}
DELETE /words/:word.json
حذف كلمة واحدة من القاموس.
إذا كانت الكلمة التي تم تمريرها نفسها ليست كلمة معروفة (أي ، وليس في القاموس) ، يتم إرجاع 404
.
مثال:
$ curl -i -X DELETE "http://localhost:3000/words/care.json"
HTTP/1.1 204 No Content
...
DELETE /words/:word.json?includeAnagrams=true
احذف كلمة واحدة وكل من جنسياتها من القاموس.
إذا كانت الكلمة التي تم تمريرها نفسها ليست كلمة معروفة (أي ، ليس في القاموس) ، فلا يتم حذف أي شيء وإعادة 404
.
مثال:
$ curl -i -X DELETE "http://localhost:3000/words/acre.json?includeAnagrams=true"
HTTP/1.1 204 No Content
...
DELETE /words.json
مسح جميع المحتويات من القاموس.
مثال:
$ curl -i -X DELETE "http://localhost:3000/words.json"
HTTP/1.1 204 No Content
...