Anagram Server adalah aplikasi berbasis Node.js yang memaparkan API berbasis REST untuk melakukan pencarian terkait anagram terhadap kamus kata. Fitur utamanya adalah menemukan anagram yang diketahui untuk kata yang diberikan.
Selain itu, set anagram (kelompok kata yang merupakan anagram satu sama lain) dapat ditanya dengan kardinalitas (jumlah kata dalam set) atau panjang kata. Dimungkinkan juga untuk menanyakan apakah serangkaian kata yang diberikan terdiri dari set anagram.
Kamus kata -kata yang dapat ditanyakan oleh anagram dapat ditambahkan, dihapus dari, atau sepenuhnya dibersihkan melalui API. Ketika dikonfigurasi sebagai layanan hanya memori (yaitu, perubahan yang tidak bertahan di seluruh layanan restart), server anagram memuat satu set standar kata-kata bahasa Inggris saat startup (lihat app.js
).
Akhirnya, sejumlah statistik tentang kamus yang dimuat dapat ditanya melalui API.
Instal node.js jika perlu
Instal dependensi NPM
npm install
npm start
Secara default, aplikasi melayani permintaan melalui port 3000. Untuk mengganti ini, Anda dapat memperbarui skrip start di package.json
untuk meneruskan nomor port alternatif ke perintah node. Misalnya:
"start": "node src/app.js -p 8080"
Anda mungkin perlu secara eksplisit mengizinkan lalu lintas yang masuk di port yang efektif. Misalnya, untuk membuka port 3000 di Linux hingga reboot berikutnya:
sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
Pasang Docker jika perlu
Bangun gambar Docker
sudo docker build -t anagram-server .
sudo docker run -p 3000:3000 anagram-server
Anda mungkin lebih suka memetakan ke port host alternatif (misalnya, -p 8080:3000
).
Server Anagram dikirimkan dengan skrip tes Ruby.
Perhatikan bahwa secara default server anagram preloads kata -kata dari dictionary.txt
pada startup.
Script uji berada di subfolder test
paket sumber dan dapat dijalankan secara individual seperti itu:
ruby anagram_test.rb
ruby anagram_test_2.rb
Server Anagram dapat diuji secara manual dengan cURL
atau alat seperti Postman. Misalnya (dari baris perintah di jendela terminal baru host aplikasi):
curl -i "http://localhost:3000/anagrams/shout.json"
Karena secara default server anagram preloads kata -kata dari dictionary.txt
pada startup, Anda mungkin ingin menghapus kamus dengan perintah berikut sebelum pengujian:
curl -i -X DELETE "http://localhost:3000/words.json"
Untuk pengujian jarak jauh, ganti "LocalHost" dengan IP host aplikasi di anagram_client.rb
dan dalam perintah sampel dokumen ini.
Juga perbarui nomor port di anagram_client.rb
dan di perintah sampel jika menjalankan server anagram dengan port selain default (3000).
Suatu kata dianggap valid jika berisi kombinasi huruf besar dan huruf Inggris atau huruf kecil atau tanda hubung. Kata yang valid mungkin tidak dimulai atau diakhiri dengan tanda hubung.
Upaya untuk mendapatkan atau menghapus kata -kata yang tidak valid menghasilkan 400 Bad Request
.
Upaya untuk memposting kata -kata yang tidak valid menghasilkan 204 No Content
.
Kata benda yang tepat dianggap sebagai kata apa pun yang memiliki semua huruf kecil kecuali untuk huruf pertama (yang harus menjadi huruf besar) dan huruf pertama setelah tanda hubung (yang mungkin huruf besar atau huruf kecil).
Beberapa contoh adalah: Bahasa Inggris, Zulu, Jean-Christophe
Kata benda yang tepat dianggap berbeda dari versi huruf kecil mereka. Misalnya, Abigail dan Abigail adalah dua kata yang berbeda (dan anagram satu sama lain).
Kata benda yang tepat selalu dimasukkan dalam hasil kecuali secara eksplisit dikecualikan (lihat excludeProperNouns
parm dari GET /anagrams/:word.json
).
Untuk kenyamanan, server anagram memungkinkan pencocokan kata benda yang tepat dengan versi kecil mereka dalam beberapa kasus. Misalnya, saat menanyakan anagram:
$ curl -i "http://localhost:3000/anagrams/aaru.json?includeInput=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "anagrams": [
"Aaru",
"aura"]
}
Arsitektur server anagram terdiri dari 4 lapisan (dari tingkat terendah ke tertinggi):
Adaptor adalah kelas yang menyediakan operasi khusus toko, iterasi, dan CRUD khusus yang digunakan oleh server anagram. Secara khusus, adaptor menyediakan semantik untuk mengaitkan string kunci ke serangkaian nilai, menambah dan menghapus dari set nilai per kunci, meminta untuk set oleh kunci, dan mengulangi pasangan kunci/set.
Adaptor ini mengabstraksi spesifik dari mekanisme penyimpanan yang mendasari dari logika layanan untuk memfasilitasi bertukar satu teknologi penyimpanan dengan yang lain. Nilai abstraksi ini adalah untuk memberikan jalur peningkatan yang mudah karena alternatif penyimpanan yang lebih menguntungkan muncul dan untuk memungkinkan opsi skalabilitas yang fleksibel.
Misalnya, layanan ini awalnya dapat diluncurkan sebagai server aplikasi tunggal dengan adaptor yang membungkus instance MySQL di server yang sama. Ketika skalabilitas, failover, dan kebutuhan kinerja meningkat, kami dapat menukar adaptor dengan satu yang membungkus instance Redis yang tetap ada dan mereplikasi data di beberapa server. Spesifik tentang bagaimana data disimpan, di -cache, dan/atau direplikasi transparan untuk layanan anagram.
Anagram server dikirimkan dengan memoryAdapter ( adapters/MemoryAdapter.js
), yang menggunakan peta JavaScript untuk menyimpan dan meminta data. Adaptor ini memiliki aplikasi yang terbatas karena tidak memberikan manfaat dari persistensi di server restart, tetapi berfungsi sebagai fondasi yang baik untuk pengujian dan memamerkan fitur server anagram.
Proyek ini mendefinisikan antarmuka untuk mengimplementasikan adaptor dalam adapters/adapter-template.js
. File ini dapat digunakan sebagai boilerplate dalam mendefinisikan adaptor baru.
Antarmuka adaptor berbasis janji karena API untuk teknologi penyimpanan cenderung asinkron. Secara teoritis ini menambah waktu respons sejak janji diselesaikan melalui antrian acara, tetapi efek ini dapat diabaikan dalam ruang lingkup permintaan jaringan.
Transaksi
Metode add()
dan delete()
dari adaptor memerlukan toko yang mendasari untuk mendukung transaksi karena logikanya melibatkan permintaan data, kemudian beroperasi di toko berdasarkan hasil kueri.
Hasil kloning
MemoryAdapter get()
dan each()
metode mengembalikan array nilai peta langsung ke anagramservice. Ini membutuhkan ketekunan atas nama kode layanan anagram untuk menghindari mutasi yang tidak disengaja dari hasil yang disediakan oleh metode ini.
Mengkloning hasil dalam memori adapter sebelum mengembalikannya akan menjadi langkah bijak dalam mengurangi bug di masa depan, memastikan konsistensi antarmuka, dan memberikan sedikit keheranan bagi konsumen, tetapi juga melibatkan tambahan (walaupun kemungkinan diabaikan).
AnagramService adalah kelas yang menyediakan logika bisnis untuk server anagram. Ini membutuhkan contoh adaptor untuk diteruskan ke konstruktornya.
Kelas AnagramService mempertahankan jumlah kata dan anagram dan mengimplementasikan metode yang secara langsung mendukung API REST.
Kelas ini tinggal di AnagramService.js
.
server.js
mengekspor satu fungsi startServer()
yang membuat server rest (melalui restify) dan instantiates anagramservice.
startServer()
memerlukan instance adaptor dan secara opsional menerima nomor port ke mana permintaan layanan dan jalur opsional ke file teks untuk prepopulasi kamus dari.
Daging server.js
adalah set fungsi respons server yang menguraikan permintaan HTTP individu, memanggil metode layanan anagrams yang relevan, dan mengeluarkan respons dengan pembungkus objek yang sesuai dan kode respons HTTP.
app.js
adalah titik masuk untuk server anagram. Ini adalah file sederhana yang menentukan adaptor untuk menjalankan layanan dengan dan sumber preload data opsional.
Ini adalah satu -satunya file yang perlu diubah saat bertukar satu adaptor untuk yang lain.
Versi saat ini dari app.js
menjalankan AnagramServer dengan memoryAdapter dan preloads dictionary.txt
pada startup.
Di bawah ini adalah beberapa ide untuk mengembangkan server anagram lebih lanjut.
GET /anagrams/:word.json
Kembalikan serangkaian kata -kata JSON yang merupakan anagram dari kata yang dilewatkan dalam url.
Jika kata yang disahkan itu sendiri bukan kata yang diketahui (yaitu, bukan di kamus), array kosong dikembalikan (bahkan jika anagram yang diketahui dapat dibentuk dari kata yang disahkan).
Untuk kenyamanan, kata yang dilewati sebagai huruf kecil akan cocok dengan bentuk kata benda yang tepat.
Contoh:
$ 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>
Kembalikan serangkaian kata JSON yang merupakan anagram dari kata yang diteruskan dalam URL, tetapi batasi jumlah hasil yang dikembalikan .
Contoh:
$ 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
Kembalikan serangkaian kata JSON yang merupakan anagram dari kata yang diteruskan dalam URL, termasuk kata input itu sendiri .
Kata input biasanya tidak termasuk dalam hasil anagram karena sebuah kata tidak secara konvensional dianggap sebagai anagram dari dirinya sendiri.
$ 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
Kembalikan serangkaian kata -kata JSON yang merupakan anagram dari kata yang diteruskan di URL, menghilangkan kata benda yang tepat .
Kata benda yang tepat biasanya termasuk dalam hasil anagram.
$ 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>
Kembalikan semua set anagram yang memiliki kardinalitas minimum dan/atau maksimum (jumlah anagram dalam set).
Baik Cardinalitymin atau CardinalityMax dapat dihilangkan.
Contoh:
$ 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>
Kembalikan semua set anagram yang memiliki panjang kata minimum dan/atau maksimum.
Baik lengeng atau lengthmax dapat dihilangkan.
Contoh:
$ 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
Kembalikan semua set anagram dengan kardinalitas maksimum.
Contoh:
$ 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
Kembalikan semua set anagram dengan panjang kata maksimum.
Contoh:
$ 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>
Tentukan apakah satu set kata adalah anagram satu sama lain.
Semua kata yang disahkan harus diketahui (yaitu, dalam kamus) agar ini benar.
Contoh:
$ 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
Return Anagram hanya diperhitungkan. Setiap set anagram dalam kamus menambah N-1 ke jumlah ini, di mana n adalah jumlah anagram dalam set.
Contoh:
$ curl -i "http://localhost:3000/anagrams?count=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "counts": { "anagram": 20043 }}
GET /words?count=true
Mengembalikan jumlah kata dalam kamus.
Contoh:
$ curl -i "http://localhost:3000/words?count=true"
HTTP/1.1 200 OK
Content-Type: application/json
...
{ "counts": { "word": 235886 }}
GET /words?stats=true
Kembalikan beberapa statistik tentang kata -kata dalam kamus.
Contoh:
$ 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
Mengambil serangkaian kata JSRAY dan menambahkannya ke kamus.
Contoh:
$ 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
Hapus satu kata dari kamus.
Jika kata yang disahkan itu sendiri bukan kata yang diketahui (yaitu, bukan dalam kamus), 404
dikembalikan.
Contoh:
$ curl -i -X DELETE "http://localhost:3000/words/care.json"
HTTP/1.1 204 No Content
...
DELETE /words/:word.json?includeAnagrams=true
Hapus satu kata dan semua anagramnya dari kamus.
Jika kata yang disahkan itu sendiri bukan kata yang diketahui (yaitu, bukan dalam kamus), tidak ada yang dihapus dan 404
dikembalikan.
Contoh:
$ curl -i -X DELETE "http://localhost:3000/words/acre.json?includeAnagrams=true"
HTTP/1.1 204 No Content
...
DELETE /words.json
Hapus semua konten dari kamus.
Contoh:
$ curl -i -X DELETE "http://localhost:3000/words.json"
HTTP/1.1 204 No Content
...