ઓપનલેયર્સમાં રાસ્ટર એડિટિંગ સાથે પ્રારંભ કરવું
શું તમે ક્યારેય રાસ્ટર ઈમેજીસને સંપાદિત કરવા માટે વેબ ટૂલ બનાવવા માગતા હતા? 🌍 દાખલા તરીકે, બહુકોણનો ઉપયોગ કરીને `.tif` ફાઇલના ચોક્કસ વિસ્તારોને સંશોધિત કરવા અને પસંદ કરેલા પિક્સેલને નવા મૂલ્યો સોંપવા? આ ખ્યાલ જિયોસ્પેશિયલ એપ્લિકેશન્સ માટે શક્તિશાળી હોઈ શકે છે પરંતુ પ્રથમ નજરમાં પડકારરૂપ લાગે છે.
એક સાધનની કલ્પના કરો જે વપરાશકર્તાઓને રાસ્ટર નકશો લોડ કરવા, રુચિના ક્ષેત્ર પર આકાર દોરવા અને અંતર્ગત ડેટાને તરત જ સંશોધિત કરવાની મંજૂરી આપે છે. આ પ્રકારની કાર્યક્ષમતા જમીન વ્યવસ્થાપન, આબોહવા અભ્યાસ અથવા તો શહેરી આયોજન માટે જરૂરી હોઈ શકે છે. 🎨 જો કે, સરળ ઉદાહરણો શોધવું નિરાશાજનક હોઈ શકે છે.
આવા ટૂલ બનાવવાની મારી પોતાની સફરમાં, મને સમજાયું કે કેટલાં દુર્લભ વ્યવહારુ ઉદાહરણો છે, ખાસ કરીને ઓપનલેયર્સનો ઉપયોગ કરતી વખતે. મને વપરાશકર્તાઓને રાસ્ટર ડેટા સાથે ગતિશીલ રીતે ક્રિયાપ્રતિક્રિયા કરવા સક્ષમ કરવા માટે એક માર્ગની જરૂર છે, સંપાદનો ક્લાયંટ બાજુ પર તરત જ પ્રતિબિંબિત થાય છે. પ્રારંભ કરવા માટે તેને થોડી ખોદકામ અને સર્જનાત્મક સમસ્યા-નિરાકરણની જરૂર પડી.
આ લેખ તમને સરળ રાસ્ટર એડિટર બનાવવા માટેના પ્રારંભિક પગલાઓ દ્વારા માર્ગદર્શન આપશે. તમે ઓપનલેયર્સને કેવી રીતે એકીકૃત કરવું તે શીખી શકશો, વપરાશકર્તાઓને બહુકોણ દોરવા દો અને તે બહુકોણમાં પિક્સેલ મૂલ્યો અપડેટ કરો. પછી ભલે તમે આમાં નવા હોવ અથવા તમારી OpenLayers ટૂલકીટને વિસ્તૃત કરવા માંગતા હો, આ ટીપ્સ તમને જમણા પગથી પ્રારંભ કરાવશે! 🚀
આદેશ | ઉપયોગનું ઉદાહરણ |
---|---|
Draw.on('drawend') | જ્યારે વપરાશકર્તા OpenLayers માં બહુકોણ દોરવાનું સમાપ્ત કરે છે ત્યારે ઇવેન્ટ શ્રોતાની નોંધણી કરે છે. બહુકોણ કોઓર્ડિનેટ્સ ગતિશીલ રીતે મેળવવા માટે વપરાય છે. |
GeoTIFF.fromArrayBuffer() | રાસ્ટર ડેટા મેનીપ્યુલેશન માટે પરવાનગી આપીને, બાઈનરી બફરમાંથી જીઓટીઆઈએફએફ ઑબ્જેક્ટ બનાવે છે. બેકએન્ડ પર `.tif` ફાઇલોને હેન્ડલ કરવા માટે આવશ્યક. |
image.readRasters() | GeoTIFF ઇમેજમાંથી રાસ્ટર ડેટાને એરેમાં વાંચે છે, ડેટાના પિક્સેલ-બાય-પિક્સેલ મેનીપ્યુલેશનને સક્ષમ કરે છે. |
fs.writeFileSync() | સંશોધિત `.tif` તરત જ ડિસ્ક પર સાચવવામાં આવે તેની ખાતરી કરીને, અપડેટ કરેલ રાસ્ટર ડેટાને ફાઇલમાં સિંક્રનસ રીતે લખે છે. |
TileLayer | OpenLayers માં ટાઇલ સ્તર બનાવે છે, સામાન્ય રીતે નકશા દૃશ્યમાં રાસ્ટર અથવા વેક્ટર ડેટા પ્રદર્શિત કરવા માટે વપરાય છે. |
OSM | OpenStreetMap માટે વપરાય છે. ઓપનલેયર્સમાં આ ડિફૉલ્ટ ટાઇલ સ્ત્રોત છે જે વિઝ્યુઅલ સંદર્ભ માટે બેઝ મેપ લેયર પ્રદાન કરે છે. |
bodyParser.json() | આવનારી JSON વિનંતીઓને પાર્સ કરવા Express.js માં મિડલવેર. અગ્રભાગમાંથી બહુકોણ અને મૂલ્ય ડેટાને હેન્ડલ કરવા માટે નિર્ણાયક. |
request(app).post() | બેકએન્ડ સર્વર પર પોસ્ટ વિનંતીનું અનુકરણ કરવા અને તેના પ્રતિભાવને માન્ય કરવા માટે જેસ્ટ સાથે યુનિટ પરીક્ષણમાં વપરાય છે. |
Modify | OpenLayers ક્રિયાપ્રતિક્રિયા જે વપરાશકર્તાઓને હાલની સુવિધાની ભૂમિતિને બદલવાની મંજૂરી આપે છે, જેમ કે બહુકોણ દોર્યા પછી તેને ટ્વિક કરવું. |
fetch('/edit-raster') | બહુકોણ ડેટા મોકલવા અને રાસ્ટર ફેરફાર શરૂ કરવા માટે ફ્રન્ટ એન્ડથી બેકએન્ડ સર્વર પર HTTP વિનંતી કરે છે. |
સરળ રાસ્ટર સંપાદકના મિકેનિક્સનું અન્વેષણ કરવું
અમે બનાવેલી સ્ક્રિપ્ટ્સનો હેતુ ક્લાયંટ-સાઇડ ઇન્ટરેક્ટિવિટી અને સર્વર-સાઇડ રાસ્ટર પ્રોસેસિંગ વચ્ચેના અંતરને દૂર કરવાનો છે. ફ્રન્ટએન્ડ પર, અમે ઓપનલેયર્સ લાઇબ્રેરીનો ઉપયોગ કરીએ છીએ, જે રેન્ડરિંગ અને જીઓસ્પેશિયલ ડેટા સાથે ક્રિયાપ્રતિક્રિયા કરવામાં શ્રેષ્ઠ છે. વપરાશકર્તા નકશા પર સીધો બહુકોણ દોરે છે, જે પછી રસના પ્રદેશને વ્યાખ્યાયિત કરવા માટે પ્રક્રિયા કરવામાં આવે છે. `ડ્રો` અને `મોડિફાઇ` ક્રિયાપ્રતિક્રિયાઓનો લાભ લઈને, અમે વપરાશકર્તાઓ માટે સંપાદિત કરવા માટે વિસ્તારો પસંદ કરવાનું અથવા સમાયોજિત કરવાનું સરળ બનાવીએ છીએ. એકવાર બહુકોણ ફાઇનલ થઈ જાય, પછી કોઓર્ડિનેટ્સ કેપ્ચર કરવામાં આવે છે અને આનયન વિનંતી દ્વારા બેકએન્ડ પર મોકલવામાં આવે છે. આ અભિગમ ગતિશીલ અને સાહજિક સંપાદન અનુભવ પ્રદાન કરે છે, જે જમીન-ઉપયોગ આયોજન અથવા પર્યાવરણીય વિશ્લેષણ જેવા કાર્યો માટે જરૂરી છે. 🌍
બેકએન્ડ પર, અમે રાસ્ટર મેનીપ્યુલેશન માટે `GeoTIFF.js` લાઇબ્રેરી સાથે Node.js નો ઉપયોગ કરીએ છીએ. પ્રાપ્ત બહુકોણ કોઓર્ડિનેટ્સ પ્રદેશની અંદર પિક્સેલ્સને શોધવા અને તેમના મૂલ્યોને સંશોધિત કરવા માટે પ્રક્રિયા કરવામાં આવે છે. ઉદાહરણ તરીકે, જો તમે નકશા પર કોઈ ચોક્કસ વિસ્તારને ઉચ્ચ ઊંચાઈ ધરાવતા અથવા તીવ્ર જમીન-ઉપયોગ તરીકે ચિહ્નિત કરવા માંગતા હો, તો તમે તે ક્ષેત્રના પિક્સેલને એક નવું મૂલ્ય સોંપી શકો છો. અપડેટ કરેલા રાસ્ટરને પછી `fs.writeFileSync()` નો ઉપયોગ કરીને `.tif` ફાઇલમાં પાછું લખવામાં આવે છે, ફેરફારો સતત છે તેની ખાતરી કરીને. આ મોડ્યુલર બેકએન્ડ ડિઝાઇન માપનીયતા માટે નિર્ણાયક છે, બેચ પ્રોસેસિંગ અથવા બહુવિધ સંપાદનો જેવી વધારાની સુવિધાઓને મંજૂરી આપે છે.
`GeoTIFF.fromArrayBuffer()` અને `readRasters()` જેવા આદેશો રાસ્ટર ડેટાને કાઢવા અને તેની હેરફેર કરવા માટે મુખ્ય છે. આ ફંક્શન્સ `.tif` ફાઇલને મેમરીમાં લોડ કરે છે અને તેના ડેટા એરેને વાંચે છે, પિક્સેલ-સ્તરના ફેરફારોને સક્ષમ કરે છે. દાખલા તરીકે, જો વપરાશકર્તા વન વિસ્તારની રૂપરેખા આપે છે, તો બેકએન્ડ બહુકોણની અંદરના તમામ પિક્સેલને પૂર્વવ્યાખ્યાયિત "ફોરેસ્ટ" મૂલ્યમાં સમાયોજિત કરી શકે છે. આ અભિગમ ખાતરી કરે છે કે રાસ્ટર સચોટ રહે છે અને વાસ્તવિક-વિશ્વની પરિસ્થિતિઓને પ્રતિબિંબિત કરે છે. આ વિશિષ્ટ આદેશો વિના, જીઓસ્પેશિયલ રાસ્ટરનું સંપાદન નોંધપાત્ર રીતે વધુ બોજારૂપ અને ઓછું કાર્યક્ષમ હશે. 🚀
એકંદર ઉકેલ અત્યંત સ્વીકાર્ય છે. ઉદાહરણ તરીકે, એક શહેરી આયોજન પ્રોજેક્ટની કલ્પના કરો જ્યાં વિવિધ વિભાગો એક જ રાસ્ટર પર કામ કરે છે પરંતુ તેમની જરૂરિયાતોને આધારે વિવિધ સંપાદનો કરે છે. સ્ક્રિપ્ટોનું મોડ્યુલરાઇઝેશન કરીને, દરેક વિભાગ અન્યને અસર કર્યા વિના સ્વતંત્ર રીતે તેમના વિભાગની પ્રક્રિયા કરી શકે છે. વધુમાં, બેકએન્ડ તર્કને ચકાસતા એકમ પરીક્ષણો સાથે, તમે સુનિશ્ચિત કરી શકો છો કે સંપાદનો દરેક વખતે યોગ્ય રીતે લાગુ થયા છે. આ વ્યાપક સેટઅપ માત્ર રાસ્ટર સંપાદનને સુલભ બનાવે છે પરંતુ વિકાસકર્તાઓને વૈવિધ્યસભર એપ્લિકેશનો માટે ટૂલને વિસ્તારવા માટે સશક્ત બનાવે છે, જે તેને ભવિષ્યના ભૌગોલિક પ્રોજેક્ટ્સ માટે પાયાનો પથ્થર બનાવે છે. ✨
ઓપનલેયર્સ સાથે રાસ્ટર એડિટર બનાવવું: ફ્રન્ટએન્ડ અને બેકએન્ડ સોલ્યુશન્સ
આ સોલ્યુશન ફ્રન્ટએન્ડ માટે OpenLayers સાથે JavaScript અને બેકએન્ડ માટે Geotiff.js લાઇબ્રેરી સાથે Node.js નો ઉપયોગ કરે છે. તેમાં સમજણની સરળતા માટે સ્પષ્ટ ટિપ્પણીઓ સાથે મોડ્યુલર, ફરીથી વાપરી શકાય તેવા અને ઑપ્ટિમાઇઝ કોડનો સમાવેશ થાય છે.
// Frontend Script: OpenLayers for Drawing and Editing Polygons
import 'ol/ol.css';
import { Map, View } from 'ol';
import { Tile as TileLayer } from 'ol/layer';
import { OSM } from 'ol/source';
import { Draw, Modify } from 'ol/interaction';
import GeoTIFF from 'geotiff';
// Initialize the map
const rasterSource = new TileLayer({ source: new OSM() });
const map = new Map({
target: 'map',
layers: [rasterSource],
view: new View({
center: [0, 0],
zoom: 2,
}),
});
// Add Draw Interaction
const draw = new Draw({ type: 'Polygon' });
map.addInteraction(draw);
// Capture Polygon and Send to Server
draw.on('drawend', async (event) => {
const coordinates = event.feature.getGeometry().getCoordinates();
const response = await fetch('/edit-raster', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ coordinates, value: 255 }),
});
console.log(await response.json());
});
સર્વર-સાઇડ સ્ક્રિપ્ટ: રાસ્ટર પ્રક્રિયા માટે Node.js અને GeoTIFF
આ સ્ક્રિપ્ટ અગ્રભાગમાંથી બહુકોણ ઇનપુટ પર આધારિત રાસ્ટર અપડેટ્સને હેન્ડલ કરવા માટે Geotiff.js લાઇબ્રેરી સાથે Node.js નો ઉપયોગ કરે છે. સર્વર GeoTIFF ફાઇલને ગતિશીલ રીતે સંશોધિત કરે છે.
// Backend Script: Node.js Server with GeoTIFF Processing
const express = require('express');
const bodyParser = require('body-parser');
const GeoTIFF = require('geotiff');
const fs = require('fs');
const app = express();
app.use(bodyParser.json());
// Endpoint to Modify Raster
app.post('/edit-raster', async (req, res) => {
const { coordinates, value } = req.body;
const tiffFile = fs.readFileSync('./raster.tif');
const tiff = await GeoTIFF.fromArrayBuffer(tiffFile.buffer);
const image = await tiff.getImage();
const data = await image.readRasters();
// Logic to update raster pixels within the polygon
// ... Modify the raster data based on coordinates ...
fs.writeFileSync('./updated-raster.tif', Buffer.from(data));
res.json({ message: 'Raster updated successfully!' });
});
app.listen(3000, () => console.log('Server running on port 3000'));
એકમ પરીક્ષણ: રાસ્ટર ફેરફાર તર્કને માન્ય કરો
આ એકમ પરીક્ષણ જેસ્ટનો ઉપયોગ કરીને બેકએન્ડ કાર્યક્ષમતાને માન્ય કરે છે. તે સુનિશ્ચિત કરે છે કે બહુકોણ ઇનપુટના આધારે રાસ્ટર પિક્સેલ યોગ્ય રીતે અપડેટ થયેલ છે.
// Unit Test: Jest Test for Raster Modification
const request = require('supertest');
const app = require('../server');
test('Raster update works correctly', async () => {
const response = await request(app)
.post('/edit-raster')
.send({ coordinates: [[0, 0], [10, 10], [10, 0]], value: 255 });
expect(response.body.message).toBe('Raster updated successfully!');
});
અદ્યતન તકનીકો સાથે રાસ્ટર સંપાદનને વધારવું
ઓપનલેયર્સ સાથે રાસ્ટર એડિટર બનાવતી વખતે, મોટા રાસ્ટર ફાઇલોની હેરફેરની કામગીરીની અસરને વારંવાર અવગણવામાં આવતી એક બાબત છે. જેમ કે `.tif` ફાઇલોમાં ઉચ્ચ-રિઝોલ્યુશન ડેટા હોઈ શકે છે, તેમને રીઅલ-ટાઇમમાં લોડ કરવું અને સંશોધિત કરવું ક્લાયંટ અને સર્વર સંસાધનો બંનેને પડકારી શકે છે. આને સંબોધવા માટે, વિકાસકર્તાઓ ટાઇલિંગ જેવી તકનીકોનો ઉપયોગ કરી શકે છે, જે સરળ પ્રક્રિયા માટે રાસ્ટરને નાના ભાગોમાં વિભાજિત કરે છે. આ ટાઇલ્સને વ્યક્તિગત રીતે અપડેટ કરી શકાય છે અને ફરીથી એકસાથે ટાંકા કરી શકાય છે, ચોકસાઇ સાથે સમાધાન કર્યા વિના પ્રભાવમાં નોંધપાત્ર સુધારો કરે છે. 🖼️
ધ્યાનમાં લેવાનું બીજું નિર્ણાયક લક્ષણ એ પૂર્વવત્ અને ફરીથી કાર્યક્ષમતાને અમલમાં મૂકવું છે. રાસ્ટર એડિટિંગ ઘણી વખત પુનરાવર્તિત પ્રક્રિયા છે, જ્યાં વપરાશકર્તાઓ ફેરફારોને અંતિમ સ્વરૂપ આપતા પહેલા બહુવિધ ફેરફારોનું પરીક્ષણ કરી શકે છે. સંપાદનોનો ઇતિહાસ જાળવી રાખીને, વિકાસકર્તાઓ વપરાશકર્તાઓને તેમના ફેરફારો દ્વારા સરળતાથી નેવિગેટ કરવાની મંજૂરી આપી શકે છે. આ રાસ્ટર ડેટાના સ્નેપશોટ સ્ટોર કરીને અથવા કાર્યક્ષમતા માટે ફક્ત બદલાયેલ પિક્સેલ્સને ટ્રૅક કરીને પ્રાપ્ત કરી શકાય છે. આ સુવિધા ઉપયોગીતા ઉમેરે છે અને રિમોટ સેન્સિંગ અથવા કૃષિ આયોજન જેવા વ્યાવસાયિક વર્કફ્લો માટે સાધનની અપીલને વધારે છે.
છેલ્લે, અલગ-અલગ રાસ્ટર ફોર્મેટ માટે સપોર્ટને એકીકૃત કરવાથી ટૂલના કાર્યક્રમોને વિસ્તૃત કરી શકાય છે. જ્યારે `.tif` ફાઇલો લોકપ્રિય છે, ત્યારે `.png` અથવા `.jpeg` જેવા ફોર્મેટનો ઉપયોગ નાના ડેટાસેટ્સ અથવા વેબ-આધારિત વિઝ્યુલાઇઝેશન માટે થઈ શકે છે. 'GeoTIFF.js' જેવી લાઇબ્રેરીઓને ફોર્મેટ્સ વચ્ચે સીમલેસ ટ્રાન્ઝિશન સક્ષમ કરવા માટે કન્વર્ટર સાથે જોડી શકાય છે. આવી સુગમતા એ સુનિશ્ચિત કરે છે કે રાસ્ટર એડિટર માત્ર એક વિશિષ્ટ સાધન જ નથી પણ વિવિધ ઉદ્યોગો માટે અનુકૂલનક્ષમ પણ છે, જે તેને વિકાસકર્તાઓ માટે બહુમુખી પસંદગી બનાવે છે. 🌐
રાસ્ટર એડિટર બનાવવા વિશે સામાન્ય પ્રશ્નો
- ની ભૂમિકા શું છે GeoTIFF.js રાસ્ટર એડિટિંગમાં?
- GeoTIFF.js વિકાસકર્તાઓને JavaScriptમાં `.tif` ફાઇલો લોડ અને હેરફેર કરવાની મંજૂરી આપે છે, જે તેને ક્લાયંટ અથવા સર્વર-સાઇડ રાસ્ટર ઑપરેશન માટે આવશ્યક બનાવે છે.
- રાસ્ટર સંપાદન કાર્યક્ષમતામાં ટાઇલિંગ કેવી રીતે સુધારે છે?
- મોટા રાસ્ટર્સને નાની ટાઇલ્સમાં વિભાજીત કરીને, એડિટર માત્ર જરૂરી વિભાગોની પ્રક્રિયા કરે છે અને તેમાં ફેરફાર કરે છે, મેમરી અને કોમ્પ્યુટેશન લોડ ઘટાડે છે.
- શું હું ટૂલ સાથે અન્ય રાસ્ટર ફોર્મેટનો ઉપયોગ કરી શકું?
- હા, `.png` અથવા `.jpeg` જેવા ફોર્મેટ કન્વર્ટર અથવા લાઇબ્રેરીનો ઉપયોગ કરીને સપોર્ટ કરી શકાય છે જેમ કે sharp પ્રીપ્રોસેસ અને પોસ્ટપ્રોસેસ ડેટા માટે.
- હું પૂર્વવત્/રીડો કાર્યક્ષમતાને કેવી રીતે અમલમાં મૂકી શકું?
- રાસ્ટર ડેટાના સ્નેપશોટ સ્ટોર કરીને અથવા સંશોધિત પિક્સેલ મૂલ્યોને ટ્રૅક કરીને સંપાદન ઇતિહાસ જાળવી રાખો. આ ફેરફારોને એકીકૃત રીતે પાછું લાવવાની મંજૂરી આપે છે.
- રીઅલ-ટાઇમ રાસ્ટર એડિટિંગ સાથે કયા પડકારો ઉભા થઈ શકે છે?
- ઉચ્ચ-રિઝોલ્યુશન ડેટાને હેન્ડલ કરવું, ઝડપી સર્વર-ક્લાયન્ટ સંચાર સુનિશ્ચિત કરવો અને સંપાદનો વચ્ચે સુમેળ જાળવવો એ વિકાસકર્તાઓનો સામનો કરતા સામાન્ય પડકારો છે.
તમારી રાસ્ટર એડિટિંગ જર્ની વીંટાળવી
OpenLayers સાથે રાસ્ટર એડિટર બનાવવું શક્તિશાળી જીઓસ્પેશિયલ ક્ષમતાઓ અને ઇન્ટરેક્ટિવ સુવિધાઓને જોડે છે. વર્કફ્લો ક્લાયન્ટ દ્વારા દોરેલા બહુકોણને સર્વર-સાઇડ રાસ્ટર પ્રોસેસિંગ સાથે લિંક કરીને ચોક્કસ પિક્સેલ સંપાદનને સક્ષમ કરે છે. જેવા સાધનો GeoTIFF.js ઉચ્ચ-રિઝોલ્યુશન ડેટા માટે પણ `.tif` ફાઇલોને સરળ રીતે હેન્ડલિંગ કરો. 🎨
ભલે તમે પર્યાવરણીય પ્રોજેક્ટ, શહેરી આયોજન અથવા ડેટા વિઝ્યુલાઇઝેશન પર કામ કરી રહ્યાં હોવ, આ ટૂલ અપાર સુગમતા પ્રદાન કરે છે. તેને ટાઇલીંગ, ફોર્મેટ સપોર્ટ અને પૂર્વવત્/રીડો વિકલ્પો સાથે વધારીને, તમે ચોક્કસ જરૂરિયાતોને અનુરૂપ એક મજબૂત ઉકેલ બનાવી શકો છો. યોગ્ય અભિગમ સાથે, રાસ્ટર સંપાદન કાર્યક્ષમ અને સુલભ બંને બને છે. 🚀
રાસ્ટર એડિટિંગ માટે સંસાધનો અને સંદર્ભો
- ઇન્ટરેક્ટિવ નકશા માટે OpenLayers નો ઉપયોગ કરવા વિશેની વિગતો સત્તાવાર OpenLayers દસ્તાવેજીકરણમાંથી મેળવવામાં આવી હતી. મુલાકાત ઓપન લેયર્સ .
- GeoTIFF ફાઇલો અને રાસ્ટર મેનીપ્યુલેશનને હેન્ડલ કરવા અંગેની આંતરદૃષ્ટિ આમાંથી આવી છે GeoTIFF.js લાઇબ્રેરી દસ્તાવેજીકરણ.
- સર્વર-સાઇડ રાસ્ટર પ્રક્રિયા પદ્ધતિઓ પર લેખો અને ચર્ચાઓ દ્વારા પ્રેરિત હતી GIS સ્ટેક એક્સચેન્જ .
- પરફોર્મન્સ ઑપ્ટિમાઇઝેશન તકનીકો જેમ કે ટાઇલિંગ અને રીઅલ-ટાઇમ એડિટિંગ અભિગમો બ્લોગ્સ પરથી સ્વીકારવામાં આવ્યા હતા મધ્યમ જીઓસ્પેશિયલ પ્રોગ્રામિંગ વિશે.
- એકમ પરીક્ષણ અને વપરાશકર્તાની ક્રિયાપ્રતિક્રિયા માટે વધારાની પ્રેરણા શેર કરેલા ઉદાહરણોમાંથી મેળવવામાં આવી હતી સ્ટેક ઓવરફ્લો .