टेम्पलेट इंजिन वापरून कोड जनरेशनच्या जगाचा शोध घ्या. कोड निर्मिती स्वयंचलित करणे, उत्पादकता वाढवणे आणि प्रकल्पांमध्ये सुसंगतता राखणे शिका.
कोड जनरेशन: टेम्पलेट इंजिनसाठी एक सर्वसमावेशक मार्गदर्शक
सॉफ्टवेअर डेव्हलपमेंटच्या सतत बदलणाऱ्या जगात कार्यक्षमता आणि देखभालक्षमता (maintainability) अत्यंत महत्त्वाची आहे. या समस्यांचे निराकरण करणारे एक शक्तिशाली तंत्रज्ञान म्हणजे कोड जनरेशन. कोड जनरेशन म्हणजे उच्च-स्तरीय वर्णन किंवा मॉडेलमधून सोर्स कोड, कॉन्फिगरेशन फाइल्स किंवा इतर गोष्टी स्वयंचलितपणे तयार करणे. या दृष्टिकोनामुळे विकासाचा वेळ लक्षणीयरीत्या कमी होऊ शकतो, कोडची सुसंगतता सुधारते आणि देखभाल सोपी होते. अनेक कोड जनरेशन सिस्टमच्या केंद्रस्थानी टेम्पलेट इंजिन असतात. हे सर्वसमावेशक मार्गदर्शक कोड जनरेशनमध्ये टेम्पलेट इंजिनची भूमिका, त्यांचे फायदे, सामान्य प्रकार आणि व्यावहारिक उपयोग शोधते.
टेम्पलेट इंजिन म्हणजे काय?
टेम्पलेट इंजिन हा एक सॉफ्टवेअर घटक आहे जो आउटपुट मजकूर तयार करण्यासाठी टेम्पलेटला डेटा मॉडेलसह जोडण्यासाठी डिझाइन केलेला आहे. कोड जनरेशनच्या संदर्भात, टेम्पलेट लक्ष्य कोडची रचना आणि सिंटॅक्स परिभाषित करते, तर डेटा मॉडेल टेम्पलेट भरण्यासाठी आवश्यक असलेली विशिष्ट मूल्ये आणि माहिती प्रदान करते. मूलत:, टेम्पलेट इंजिन एका कोड फॅक्टरीप्रमाणे काम करते, जे पूर्वनिर्धारित ब्लूप्रिंट्स आणि डायनॅमिक डेटावर आधारित कोड तयार करते.
याचा विचार मेल मर्जसारखा करा. तुमच्याकडे एक मानक पत्र (टेम्पलेट) आणि नावे व पत्त्यांची यादी (डेटा मॉडेल) आहे. मेल मर्ज प्रक्रिया प्रत्येक प्राप्तकर्त्यासाठी वैयक्तिक पत्रे तयार करण्यासाठी या दोन्हींना एकत्र करते. टेम्पलेट इंजिन हेच काम करतात, पण कोडसोबत.
कोड जनरेशनसाठी टेम्पलेट इंजिन वापरण्याचे फायदे
कोड जनरेशनसाठी टेम्पलेट इंजिन वापरण्याचे अनेक महत्त्वपूर्ण फायदे आहेत:
- वाढलेली उत्पादकता: कोड निर्मिती स्वयंचलित केल्याने डेव्हलपर्स अधिक क्लिष्ट आणि सर्जनशील कार्यांवर लक्ष केंद्रित करू शकतात. पुनरावृत्ती होणारा बॉयलरप्लेट कोड लिहिण्याऐवजी, ते टेम्पलेट्स परिभाषित करू शकतात आणि काही सोप्या कमांडसह कोड तयार करू शकतात.
- सुधारित कोड सुसंगतता: टेम्पलेट्स एक प्रमाणित रचना आणि शैली लागू करतात, ज्यामुळे निर्माण केलेला कोड कोडिंग नियमावली आणि सर्वोत्तम पद्धतींचे पालन करतो याची खात्री होते. ही सुसंगतता कोड रिव्ह्यू सोपे करते आणि त्रुटींची शक्यता कमी करते. कल्पना करा की जगभर पसरलेली एक मोठी डेव्हलपमेंट टीम आहे. टेम्पलेट इंजिन वापरल्याने प्रत्येकाने त्यांच्या स्थानाची पर्वा न करता समान कोडिंग मानकांचे पालन केले आहे याची खात्री होते.
- कमी झालेल्या चुका: पुनरावृत्ती होणाऱ्या कामांचे मॅन्युअल कोडिंग काढून टाकल्याने, टेम्पलेट इंजिन मानवी चुकांचा धोका कमी करतात. टेम्पलेट्सची कसून चाचणी केली जाते, आणि कोणत्याही चुका लवकर ओळखून दुरुस्त केल्या जातात.
- सुलभ देखभाल: जेव्हा बदल आवश्यक असतात, तेव्हा टेम्पलेटमध्ये बदल करणे हे अनेक कोड फाइल्स मॅन्युअली अपडेट करण्यापेक्षा खूप सोपे आणि जलद असते. यामुळे कोडच्या देखभालीशी संबंधित खर्च आणि प्रयत्न कमी होतात. जर तुम्हाला तुमच्या सर्व जनरेट केलेल्या फाइल्समधील कॉपीराइट सूचना अपडेट करायची असेल, तर तुम्हाला फक्त एकदाच टेम्पलेट बदलावे लागेल.
- अॅब्स्ट्रॅक्शन आणि चिंतेचे पृथक्करण (Separation of Concerns): टेम्पलेट इंजिन तुम्हाला कोडची रचना त्याच्या डेटामधून वेगळी करण्याची परवानगी देतात, ज्यामुळे कोड अधिक मॉड्युलर आणि समजण्यास सोपा होतो. हे चिंतेचे पृथक्करण कोडची रचना आणि देखभालक्षमता सुधारते.
- जलद प्रोटोटाइपिंग: टेम्पलेट इंजिन डेव्हलपर्सना त्वरीत कोड स्केलेटन तयार करण्याची आणि विविध डिझाइनसह प्रयोग करण्याची परवानगी देऊन जलद प्रोटोटाइपिंग सुलभ करतात.
टेम्पलेट इंजिनचे सामान्य प्रकार
अनेक टेम्पलेट इंजिन उपलब्ध आहेत, प्रत्येकाची स्वतःची ताकद आणि कमकुवतता आहे. येथे काही सर्वात लोकप्रिय पर्यायांवर एक नजर टाकली आहे:
Jinja2 (पायथॉन)
Jinja2 हे पायथॉनसाठी एक शक्तिशाली आणि मोठ्या प्रमाणावर वापरले जाणारे टेम्पलेट इंजिन आहे. ते त्याच्या लवचिकतेसाठी, प्रभावी सिंटॅक्ससाठी आणि उत्कृष्ट कामगिरीसाठी ओळखले जाते. Jinja2 टेम्पलेट इनहेरिटन्स, स्वयंचलित HTML एस्केपिंग आणि सँडबॉक्स एक्झिक्यूशन यांसारख्या वैशिष्ट्यांना समर्थन देते.
उदाहरण:
टेम्पलेट (user.html
):
<h1>User Profile</h1>
<p>Name: {{ user.name }}</p>
<p>Email: {{ user.email }}</p>
पायथॉन कोड:
from jinja2 import Environment, FileSystemLoader
# Data
user = {
'name': 'Alice Smith',
'email': 'alice.smith@example.com'
}
# Load template environment
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('user.html')
# Render template
output = template.render(user=user)
print(output)
आउटपुट:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
FreeMarker (जावा)
FreeMarker हे जावा-आधारित टेम्पलेट इंजिन आहे जे बऱ्याच काळापासून आहे आणि त्याच्या स्थिरतेसाठी आणि वैशिष्ट्यांच्या संचासाठी ओळखले जाते. हे बहुतेकदा वेब ॲप्लिकेशन्स आणि कोड जनरेशन टूल्समध्ये वापरले जाते.
उदाहरण:
टेम्पलेट (user.ftl
):
<h1>User Profile</h1>
<p>Name: ${user.name}</p>
<p>Email: ${user.email}</p>
जावा कोड:
import freemarker.template.*;
import java.io.*;
import java.util.*;
public class FreeMarkerExample {
public static void main(String[] args) throws Exception {
// Configuration
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("."));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
cfg.setFallbackOnNullLoopVariable(false);
// Data
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice Smith");
user.put("email", "alice.smith@example.com");
// Load template
Template template = cfg.getTemplate("user.ftl");
// Render template
StringWriter writer = new StringWriter();
template.process(user, writer);
System.out.println(writer.toString());
}
}
आउटपुट:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
Velocity (जावा)
Velocity हे आणखी एक जावा-आधारित टेम्पलेट इंजिन आहे जे FreeMarker सारखेच आहे. हे बहुतेकदा वेब ॲप्लिकेशन्समध्ये आणि अहवाल व इतर मजकूर-आधारित दस्तऐवज तयार करण्यासाठी वापरले जाते.
उदाहरण:
टेम्पलेट (user.vm
):
<h1>User Profile</h1>
<p>Name: $user.name</p>
<p>Email: $user.email</p>
जावा कोड:
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import java.io.*;
import java.util.*;
public class VelocityExample {
public static void main(String[] args) throws Exception {
// Initialize Velocity
VelocityEngine ve = new VelocityEngine();
ve.init();
// Data
VelocityContext context = new VelocityContext();
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice Smith");
user.put("email", "alice.smith@example.com");
context.put("user", user);
// Load template
Template template = ve.getTemplate("user.vm");
// Render template
StringWriter writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer.toString());
}
}
आउटपुट:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
Mustache and Handlebars (जावास्क्रिप्ट)
Mustache आणि Handlebars हे हलके, लॉजिक-लेस टेम्पलेट इंजिन आहेत जे जावास्क्रिप्ट वातावरणात लोकप्रिय आहेत. ते त्यांच्या सोप्या सिंटॅक्स आणि वापरण्यास सुलभतेसाठी ओळखले जातात.
उदाहरण (Handlebars):
टेम्पलेट (user.hbs
):
<h1>User Profile</h1>
<p>Name: {{name}}</p>
<p>Email: {{email}}</p>
जावास्क्रिप्ट कोड:
const Handlebars = require('handlebars');
const fs = require('fs');
// Data
const user = {
name: 'Alice Smith',
email: 'alice.smith@example.com'
};
// Load template
const source = fs.readFileSync('user.hbs', 'utf8');
const template = Handlebars.compile(source);
// Render template
const output = template(user);
console.log(output);
आउटपुट:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
टेम्पलेट इंजिनसह कोड जनरेशनचे व्यावहारिक उपयोग
टेम्पलेट इंजिनचा वापर विविध कोड जनरेशन कार्यांसाठी केला जाऊ शकतो:
- बॉयलरप्लेट कोड तयार करणे: टेम्पलेट इंजिन पुनरावृत्ती होणाऱ्या कोड संरचनांची निर्मिती स्वयंचलित करू शकतात, जसे की क्लास डेफिनिशन, डेटा ॲक्सेस ऑब्जेक्ट्स (DAOs), आणि API एंडपॉइंट्स.
- कॉन्फिगरेशन फाइल्स तयार करणे: टेम्पलेट इंजिन पूर्वनिर्धारित टेम्पलेट्स आणि कॉन्फिगरेशन डेटावर आधारित विविध स्वरूपांमध्ये (उदा., XML, JSON, YAML) कॉन्फिगरेशन फाइल्स तयार करू शकतात. उदाहरणार्थ, वेगवेगळ्या वेब सर्व्हरसाठी Nginx कॉन्फिगरेशन फाइल्स तयार करणे.
- यूजर इंटरफेस तयार करणे: टेम्पलेट इंजिनचा वापर यूजर इंटरफेससाठी HTML, CSS, आणि JavaScript कोड तयार करण्यासाठी केला जाऊ शकतो. हे विशेषतः डायनॅमिक वेब पेजेस आणि मोबाइल ॲप्लिकेशन्स तयार करण्यासाठी उपयुक्त आहे.
- डेटाबेस स्कीमा तयार करणे: टेम्पलेट इंजिन डेटा मॉडेलवर आधारित डेटाबेस टेबल्स, इंडेक्स आणि निर्बंध परिभाषित करण्यासाठी SQL स्क्रिप्ट्स तयार करू शकतात.
- डोमेन-विशिष्ट भाषा (DSLs) लागू करणे: टेम्पलेट इंजिनचा वापर DSLs तयार करण्यासाठी केला जाऊ शकतो जे डेव्हलपर्सना क्लिष्ट लॉजिक अधिक संक्षिप्त आणि वाचनीय पद्धतीने व्यक्त करण्यास अनुमती देतात. टेम्पलेट इंजिन नंतर DSL कोडला एक्झिक्यूटेबल कोडमध्ये रूपांतरित करते. DSL चा वापर व्यवसायाचे नियम परिभाषित करण्यासाठी किंवा संस्थेमध्ये विशिष्ट कार्य स्वयंचलित करण्यासाठी केला जाऊ शकतो.
- API क्लायंट जनरेशन स्वयंचलित करणे: API परिभाषा (उदा., OpenAPI/Swagger) दिल्यास, टेम्पलेट इंजिन विविध प्रोग्रामिंग भाषांमध्ये क्लायंट SDK तयार करू शकतात, ज्यामुळे बाह्य API सह एकत्रीकरण प्रक्रिया सोपी होते.
- दस्तऐवजीकरण तयार करणे: टेम्पलेट इंजिन कोड टिप्पण्या किंवा डेटा मॉडेलमधून दस्तऐवजीकरण तयार करू शकतात, ज्यामुळे दस्तऐवजीकरण अद्ययावत आणि कोडशी सुसंगत असल्याची खात्री होते.
- कोड स्कॅफोल्डिंग: प्रोजेक्ट प्रकारानुसार (उदा., वेब ॲप, REST API) पूर्व-परिभाषित कोडसह प्रारंभिक प्रोजेक्ट संरचना (डिरेक्टरीज, फाइल्स) तयार करणे.
योग्य टेम्पलेट इंजिन निवडणे
योग्य टेम्पलेट इंजिन निवडणे अनेक घटकांवर अवलंबून असते:
- प्रोग्रामिंग भाषा: तुमच्या प्रोग्रामिंग भाषेशी सुसंगत असलेले टेम्पलेट इंजिन निवडा.
- प्रकल्पाच्या गरजा: तुमच्या कोड जनरेशन कार्यांची गुंतागुंत आणि विविध टेम्पलेट इंजिनद्वारे ऑफर केलेल्या वैशिष्ट्यांचा विचार करा.
- कामगिरी: विविध टेम्पलेट इंजिनच्या कामगिरीचे मूल्यांकन करा, विशेषतः जर तुम्ही मोठ्या प्रमाणात कोड तयार करत असाल.
- सिंटॅक्स आणि वापर सुलभता: असे टेम्पलेट इंजिन निवडा ज्याचा सिंटॅक्स तुम्हाला शिकण्यास आणि वापरण्यास सोपा वाटतो.
- समुदाय समर्थन: मजबूत समुदाय आणि पुरेशी दस्तऐवजीकरण असलेले टेम्पलेट इंजिन शोधा.
- सुरक्षितता: टेम्पलेटमध्ये दुर्भावनापूर्ण कोड इंजेक्ट होण्यापासून रोखण्यासाठी टेम्पलेट इंजिन सँडबॉक्स एक्झिक्यूशनसारखी योग्य सुरक्षा वैशिष्ट्ये ऑफर करते याची खात्री करा. हे विशेषतः महत्त्वाचे आहे जर तुम्ही वापरकर्त्यांना स्वतःचे टेम्पलेट्स परिभाषित करण्याची परवानगी देत असाल.
टेम्पलेट इंजिन वापरण्यासाठी सर्वोत्तम पद्धती
टेम्पलेट इंजिन वापरण्याचे फायदे जास्तीत जास्त करण्यासाठी, या सर्वोत्तम पद्धतींचे पालन करा:
- टेम्पलेट्स काळजीपूर्वक डिझाइन करा: सु-संरचित आणि पुन्हा वापरता येण्याजोगे टेम्पलेट्स तयार करा जे समजण्यास आणि देखरेख करण्यास सोपे आहेत.
- आवृत्ती नियंत्रण वापरा (Use Version Control): बदल ट्रॅक करण्यासाठी आणि इतर डेव्हलपर्ससोबत सहयोग करण्यासाठी तुमचे टेम्पलेट्स आवृत्ती नियंत्रण प्रणालीमध्ये साठवा.
- टेम्पलेट्सची कसून चाचणी करा: तुमचे टेम्पलेट्स योग्य कोड तयार करतात याची खात्री करण्यासाठी वेगवेगळ्या डेटा मॉडेल्ससह त्यांची चाचणी करा.
- टेम्पलेट्सचे दस्तऐवजीकरण करा: तुमच्या टेम्पलेट्ससाठी स्पष्ट आणि संक्षिप्त दस्तऐवजीकरण द्या, त्यांचे उद्देश आणि वापर स्पष्ट करा.
- लॉजिकला टेम्पलेट्सपासून वेगळे करा: तुमच्या टेम्पलेट्समध्ये क्लिष्ट लॉजिक समाविष्ट करणे टाळा. त्याऐवजी, लॉजिकला वेगळ्या मॉड्यूल्समध्ये हलवा आणि त्यांना टेम्पलेट्समधून कॉल करा.
- टेम्पलेट इनहेरिटन्स वापरा: सामान्य घटक आणि कार्यक्षमता सामायिक करणाऱ्या टेम्पलेट्सची श्रेणी तयार करण्यासाठी टेम्पलेट इनहेरिटन्सचा फायदा घ्या. यामुळे कोडची पुनरावृत्ती कमी होते आणि देखभाल सोपी होते.
- इनपुट डेटा सॅनिटाइज करा: क्रॉस-साइट स्क्रिप्टिंग (XSS) हल्ल्यांसारख्या सुरक्षा भेद्यता टाळण्यासाठी नेहमी इनपुट डेटा सॅनिटाइज करा.
- आंतरराष्ट्रीयीकरणाचा (i18n) विचार करा: जर तुमच्या जनरेट केलेल्या कोडला एकाधिक भाषांना समर्थन देण्याची आवश्यकता असेल, तर तुमचे टेम्पलेट्स वेगवेगळ्या भाषा स्वरूप आणि अनुवादांना सामावून घेण्यासाठी डिझाइन करा.
प्रगत तंत्रे
मूलभूत टेम्पलेटिंगच्या पलीकडे, अनेक प्रगत तंत्रे आहेत जी तुमची कोड जनरेशन क्षमता आणखी वाढवू शकतात:
- मेटा-प्रोग्रामिंग: टेम्पलेट्स तयार करण्यासाठी टेम्पलेट्स वापरणे. हे अत्यंत लवचिक आणि डायनॅमिक कोड जनरेशनला अनुमती देते.
- मॉडेल-चालित विकास (MDD): कोड जनरेशन प्रक्रियेसाठी इनपुट म्हणून औपचारिक मॉडेल (उदा., UML) वापरणे. हे उच्च पातळीचे अॅब्स्ट्रॅक्शन सक्षम करते आणि क्लिष्ट प्रणालींचा विकास सोपा करते. अशी साधने अस्तित्वात आहेत जी टेम्पलेट इंजिन वापरून UML आकृत्यांना स्वयंचलितपणे कोड स्केलेटनमध्ये रूपांतरित करतात.
- कोड ट्रान्सफॉर्मेशन: टेम्पलेट इंजिन वापरून विद्यमान कोडला वेगवेगळ्या स्वरूपात किंवा संरचनांमध्ये रूपांतरित करणे. हे कोड रिफॅक्टरिंग, नवीन तंत्रज्ञानावर स्थलांतरित होणे किंवा वेगवेगळ्या प्लॅटफॉर्मसाठी कोड तयार करण्यासाठी उपयुक्त ठरू शकते.
सुरक्षिततेची काळजी
टेम्पलेट इंजिन वापरताना सुरक्षितता अत्यंत महत्त्वाची आहे, विशेषतः अशा ॲप्लिकेशन्समध्ये जे वापरकर्त्याने प्रदान केलेला डेटा हाताळतात. येथे काही प्रमुख सुरक्षा विचार आहेत:
- इनपुट व्हॅलिडेशन: टेम्पलेट इंजिनला डेटा देण्यापूर्वी नेहमी इनपुट डेटा सत्यापित आणि सॅनिटाइज करा. हे दुर्भावनापूर्ण कोड इंजेक्शन आणि इतर सुरक्षा भेद्यता टाळण्यास मदत करते.
- सँडबॉक्सिंग: टेम्पलेट्सची क्षमता मर्यादित करण्यासाठी सँडबॉक्सिंगला समर्थन देणारे टेम्पलेट इंजिन वापरा. हे टेम्पलेट्सला संवेदनशील संसाधनांमध्ये प्रवेश करण्यापासून किंवा अनियंत्रित कोड कार्यान्वित करण्यापासून प्रतिबंधित करते.
- एस्केपिंग: क्रॉस-साइट स्क्रिप्टिंग (XSS) हल्ले टाळण्यासाठी आउटपुट डेटा योग्यरित्या एस्केप करा.
- eval() वापरणे टाळा: तुमच्या टेम्पलेट्समध्ये
eval()
फंक्शन किंवा तत्सम रचना वापरणे टाळा, कारण ते महत्त्वपूर्ण सुरक्षा धोके निर्माण करू शकतात. - टेम्पलेट इंजिन अद्ययावत ठेवा: सुरक्षा भेद्यता पॅच करण्यासाठी आणि नवीनतम सुरक्षा वैशिष्ट्यांचा लाभ घेण्यासाठी आपले टेम्पलेट इंजिन नियमितपणे नवीनतम आवृत्तीवर अद्यतनित करा.
निष्कर्ष
टेम्पलेट इंजिन कोड जनरेशन स्वयंचलित करण्यासाठी, उत्पादकता सुधारण्यासाठी आणि कोडची सुसंगतता राखण्यासाठी शक्तिशाली साधने आहेत. टेम्पलेट इंजिनचे फायदे, प्रकार आणि सर्वोत्तम पद्धती समजून घेऊन, डेव्हलपर्स त्यांचा विकास कार्यप्रवाह सुव्यवस्थित करण्यासाठी आणि उच्च-गुणवत्तेचे सॉफ्टवेअर तयार करण्यासाठी त्यांचा फायदा घेऊ शकतात. जसे सॉफ्टवेअर डेव्हलपमेंट विकसित होत राहील, तसे टेम्पलेट इंजिनसह कोड जनरेशन हे गुंतागुंत हाताळण्यासाठी आणि कार्यक्षमता सुधारण्यासाठी एक महत्त्वपूर्ण तंत्र राहील. जागतिक स्तरावर सेवांना अखंडपणे जोडणारे API क्लायंट तयार करण्यापासून ते आंतरराष्ट्रीय संघांमध्ये कोड शैलींचे मानकीकरण करण्यापर्यंत, टेम्पलेट इंजिन वापरण्याचे फायदे स्पष्ट आहेत. कोड जनरेशनचा स्वीकार करा आणि तुमच्या विकास प्रक्रियेत परिवर्तन घडवण्यासाठी त्याची क्षमता अनलॉक करा.
अधिक शिक्षण
- तुमच्या निवडलेल्या टेम्पलेट इंजिनचे (Jinja2, FreeMarker, Velocity, Mustache, Handlebars) दस्तऐवजीकरण वाचा.
- तुमच्या प्रोग्रामिंग भाषा आणि फ्रेमवर्कसाठी विशिष्ट कोड जनरेशन साधनांचा शोध घ्या.
- विविध कोड जनरेशन तंत्रांसह प्रयोग करा आणि तुमच्या गरजा पूर्ण करणारे तंत्र ओळखा.