આજે થોડો free હતો. Client ના reply ની રાહ જોતોતો અને એના વગર કામ આગળ વધે એવું હતું નઈ. તો મને થયું લાવ ને બીજા કેટલા ગુજરાતી બ્લોગ છે જોઈએ અને research/analisis કરીયે.
તો google કર્યું “gujarati blogs” પેલા જ બે લિંક મળી
- https://topgujaratiblog.wordpress.com/2017/06/07/top-gujarati-blog/
- https://www.indiblogger.in/tag/gujarati
જે મને કામ ની લાગી. બીજા બધી લિંક માં કઈ દમ હતો નઈ. Google result દિવસે ને દિવસે બગડતું જાય છે.
પછી મેં જોયું તો આ લિસ્ટ માં થી અમુક સાઈટ તો બંધ થઈ ગઈ છે. domain expire થઇ ગયું હોય અને હોંશે હોંશે સાઈટ તો બનાવી નાખી હોય પણ 10-15 પોસ્ટ પછી Writer’s block આવી ગયો હોય એટલે પછી પ્રોજેક્ટ abandon કરી દીધો હોય. પણ લિંક તો ચડી ગઈ હોય બીજા ના પેજ માં તો હવે એ તો બીજો સાઈટ owner edit કરે ત્યારે નીકળે.
100 વેબસાઈટ indiblogger ઉપર અને 306 topgujaratiblog ઉપર. હવે આમે આ બધી લિંક 1-1 કરી ને કોણ ચેક કરે કે ચાલે છે કે નઈ. એટલે મને થયું લાવો એનું automation લખી નાખીયે.
ટાર્ગેટ
આ સ્ક્રિપ્ટ માં થી મારે શું જોઈએ? હંમેશા project ની શરૂવાત output થી કરવાની. શું મળવું જોઈએ થી શરુ કરી ને 1-1 સવાલ પૂછતું જવાનું એટલે તમને code અને આખો project ની outline મળી જાય. મારા સવાલો
- ટોપ 10 recently active બ્લોગ ક્યાં?
- સૌથી જુના 10 બ્લોગ ક્યાં ?
- ટોટલ બ્લોગ કેટલા અને આ વર્ષે update થયા હોય એવા કેટલા અને ગ્યા વર્ષે update થયા હોય એવા કેટલા?
મને એવું લાગે છે કે બધા સવાલ ના જવાબ ગોતવા માટે બઉ scripting કરવું પડશે. અત્યારે આપડે જેટલા જવાબ મળે એટલા ગોતીયે
Technical spec
automation માટે મને puppteer ગમે આમ તો. પણ હમણાં playwright ચાલ્યું છે અને એનું docs એન્ડ DX (ડેવલોપર એક્સપેરિઅન્સ) ગમ્યો મને એટલે ઈ use કરશુ.
લેન્ગવેજ તો JavaScript હોય. એમાં કઈ પૂછવા પણું નઈ.
બધી સાઈટ નો ડેટા csv માં store કરશું.
તો હાલો ત્યારે.
જો તમારે ટેકનિકલ coding માં નો પડવું હોય તો scroll કરી ને last section જઈ ને Results જોઈ શકો છો હો.
Code Implementation
Task #1: સાઈટ નું લિસ્ટ ભેગું કરવું
Code
const fs = require('fs');
const { chromium } = require('playwright');
(async () => {
// Launch the browser
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// Navigate to the URL
await page.goto('https://topgujaratiblog.wordpress.com/2017/06/07/top-gujarati-blog/');
// Fetch all the anchor links
const links = await page.$$eval('a', anchors => anchors.map(anchor => anchor.href));
// Write the links to a text file
fs.writeFile('links.txt', links.join('\n'), (err) => {
if (err) throw err;
console.log('Links have been saved to links.txt');
});
// Close the browser
await browser.close();
})();
હવે આને Run કર્યું એટલે ફાઈલ તો મળી પણ એમાં અમુક લિંક repetitive છે એટલે હવે એને કાઢવા માટે નાનું snippet લખવું પડશે
Code
const fs = require('fs');
// Read the file and get the links
fs.readFile('links.txt', 'utf8', (err, data) => {
if (err) throw err;
// Split the file content by newlines to get each link form as an array
const links = data.split('\n').filter(link => link.trim() !== '');
// Remove duplicate links using Set
const uniqueLinks = [...new Set(links)];
// Write the unique links back to the file
fs.writeFile('links.txt', uniqueLinks.join('\n'), (err) => {
if (err) throw err;
console.log('Duplicates removed and file updated with unique links.');
});
});
બેય રન કરતા total 307 સાઈટ નું લિસ્ટ મળ્યું.
હવે બીજી લિંક નો વારો
Code
const fs = require('fs');
const { chromium } = require('playwright');
(async () => {
// Launch the browser
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
let allLinks = [];
let currentPage = 1;
let lastPage = 5; // Set this manually for now based on your observation
while (currentPage <= lastPage) {
// Navigate to the target URL with pagination
const url = `https://www.indiblogger.in/tag/gujarati&p=${currentPage}`;
await page.goto(url);
console.log(`Fetching links from page ${currentPage}`);
// Fetch the anchor tags within h3 with class media-heading
const links = await page.$$eval('h3.media-heading a', anchors => anchors.map(anchor => anchor.href));
allLinks.push(...links);
// Check for pagination to get the number of pages (could be adjusted dynamically)
// If you need to dynamically find the last page:
// lastPage = await page.$$eval('ul.pagination li a', items =>
// Math.max(...items.map(i => parseInt(i.getAttribute('data-id')) || 0))
// );
// Increment to the next page
currentPage++;
}
// Remove duplicate links using Set
const uniqueLinks = [...new Set(allLinks)];
// Write the unique links to a text file
fs.writeFile('indiblogger_all_links.txt', uniqueLinks.join('\n'), (err) => {
if (err) throw err;
console.log('All links have been saved to indiblogger_all_links.txt');
});
// Close the browser
await browser.close();
})();
આ સ્ક્રિપ્ટ run કરી તો બીજી 88 સાઈટ/link મળી. total 394. પછી ડુપ્લીકેટ remove કરવાની script ચલાવી એટલે હવે 386 રઈ.
Task #2: 1-1 site ખોલી ને ચેક કરવી
અમુક સાઈટ માં http જ હતું https નોતું તો અમને ફરીથી retry કરી ને ચેક કરીશું. અને કદાચ logic ખોટું હોય તો ઈ પોતે decision નો લે અને આપણને પૂછે એવું logic રાખ્યું છે. અને હા જો સાઈટ માં કોઈ ગુજરાતી charactor હોય તો જ તો જ એનો મતલબ છે ને આ list માં રેવાનો એટલે એનું પણ logic add કર્યું.
Code
const fs = require('fs');
const readline = require('readline');
const { chromium } = require('playwright');
const path = require('path');
const csvWriter = require('csv-writer').createObjectCsvWriter;
// CSV writer setup
const writer = csvWriter({
path: 'url_check_results2.csv',
header: [
{ id: 'url', title: 'URL' },
{ id: 'isWorking', title: 'Is Working?' },
]
});
// Setup readline for user input
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Gujarati character range (Unicode range for Gujarati characters)
const gujaratiRegex = /[\u0A80-\u0AFF]/;
// Function to check if a URL is working and contains Gujarati characters
async function checkUrl(page, url) {
try {
const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 5000 }); // Timeout after 5 seconds
if (!response || response.status() !== 200) {
return false;
}
// Get the page content and check for at least one Gujarati character
const pageContent = await page.content();
return gujaratiRegex.test(pageContent); // Return true if Gujarati character is found
} catch (error) {
return false; // If any error occurs, mark it as not working
}
}
// Function to get manual user input (Yes/No)
async function getUserConfirmation(url) {
return new Promise((resolve) => {
rl.question(`Manual check required for URL: ${url}. Is it working? (Yes/No): `, (answer) => {
resolve(answer.trim().toLowerCase() === 'yes');
});
});
}
// Main script to process the URLs
(async () => {
// Read the links from the text file
const filePath = path.join(__dirname, 'notworking_links.txt');
const urls = fs.readFileSync(filePath, 'utf8').split('\n').filter(Boolean); // Split by newlines and filter out empty lines
// Launch the browser in non-headless mode
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
let results = [];
// Iterate over each URL and check if it's working
for (let url of urls) {
// for (let i = 38; i < urls.length; i++) {
// let url = urls[i];
if (!url.startsWith('http://') && !url.startsWith('https://')) {
url = `http://${url}`;
}
let isWorking = await checkUrl(page, url);
// If the HTTP version didn't work, try HTTPS
if (!isWorking && url.startsWith('http://')) {
url = url.replace('http://', 'https://');
console.log(`Retrying with HTTPS: ${url}`);
isWorking = await checkUrl(page, url);
}
// If automated check failed, ask user for confirmation
if (!isWorking) {
console.log(`Automated check failed for URL: ${url}`);
isWorking = await getUserConfirmation(url);
}
// Add the result to the list
results.push({ url, isWorking: isWorking ? 'Yes' : 'No' });
console.log(`URL: ${url} - Is Working: ${isWorking ? 'Yes' : 'No'}`);
}
// Write the results to a CSV file
await writer.writeRecords(results)
.then(() => console.log('Results written to url_check_results.csv'));
// Close the browser and readline
await browser.close();
rl.close();
})();
ઉપર ની માથા ફૂટ કાર્ય પછી ખબર પડી કે ignoreHTTPSErrors ના નો ફ્લેગ આવે છે એ પાસ કરી દીધો હોત તો manually https replace નો કરવું પડેત. જે થયું ઈ બીજું શું.
પેલા મેં ઉપર ની સ્ક્રિપ્ટ run કરી પછી મને doubt નેટ ને લીધે કદાચ ખોટા result આવીગયા હોય તો. તો પછી મેં જેમાં “Is Working” No આવ્યું તું એ બધી ફરી થી રન કરી આ script માં તો એમાં થી અમુક ચાલુ નીકળી એટલે એને પછી main લિસ્ટ માં append કરી દીધી
ઉપર ની સ્ક્રિપ્ટ ચલાવી ને 382 સાઈટ હતી એમાં થી 336 માં Yes flag મળ્યો is working નો.
Task #3: Site last ક્યારે update થઈ એ પકડવું
પેલા એક કામ કરીયે sitemap.xml અને feed કઈ કઈ સાઈટ માં છે એ જોઈ લઈએ કારણકે જેમાં ઇ નઈ હોય એને manually ચેક કરવી પડશે.
Code
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');
const { parse } = require('json2csv');
// Read the CSV and process URLs
const processCSV = async (csvFilePath) => {
const rows = [];
// Read and parse the CSV file
fs.createReadStream(csvFilePath)
.pipe(csv())
.on('data', (row) => {
if (row['Is Working?'] === 'Yes') {
rows.push({ url: row.URL });
}
})
.on('end', async () => {
// Process URLs for sitemap.xml and /feed/
const processedData = await checkForSitemapAndFeed(rows);
// Append sitemap and feed columns and save the new CSV file
const newCSVData = processedData.map(item => ({
URL: item.url,
'Is Working?': 'Yes',
'Has Sitemap?': item.hasSitemap ? 'Yes' : 'No',
'Has Feed?': item.hasFeed ? 'Yes' : 'No'
}));
saveCSV(newCSVData, csvFilePath);
});
};
// Check if sitemap.xml and /feed/ exist
const checkForSitemapAndFeed = async (urls) => {
const browser = await chromium.launch({
headless: false
});
const context = await browser.newContext({
ignoreHTTPSErrors: true
});
const page = await context.newPage();
const results = [];
for (const { url } of urls) {
const sitemapUrl = `${url.replace(/\/$/, '')}/sitemap.xml`;
const feedUrl = `${url.replace(/\/$/, '')}/feed/`;
let hasSitemap = false;
let hasFeed = false;
// Check sitemap.xml
try {
const sitemapResponse = await page.goto(sitemapUrl, { timeout: 10000 });
if (sitemapResponse && sitemapResponse.status() === 200) {
hasSitemap = true;
}
} catch (err) {
// Ignore error if sitemap doesn't exist
}
// Check /feed/
try {
const feedResponse = await page.goto(feedUrl, { timeout: 10000 });
if (feedResponse && feedResponse.status() === 200) {
hasFeed = true;
}
} catch (err) {
// Ignore error if feed doesn't exist
}
// Push results
results.push({ url, hasSitemap, hasFeed });
}
await browser.close();
return results;
};
// Save the updated CSV
const saveCSV = (data, originalFilePath) => {
const fields = ['URL', 'Is Working?', 'Has Sitemap?', 'Has Feed?'];
const csvData = parse(data, { fields });
const outputFilePath = path.join(path.dirname(originalFilePath), 'updated_' + path.basename(originalFilePath));
fs.writeFileSync(outputFilePath, csvData);
console.log(`Updated CSV saved at: ${outputFilePath}`);
};
// File path to the deduplicated_urls.csv
const csvFilePath = './deduplicated_urls.csv';
// Start the process
processCSV(csvFilePath);
આ script run કરી એટલે હવે આપડી પાસે 337 સાઈટ વધી જેને આપડે આગળ ના પડાવ માં લઇ જઈસુ.
Task #4: Site માં કેટલા પેજ છે એ કાઢવું
આ વસ્તુ 2-3 રીતે કાઢી શકાય. sitemap થી google થી.
પેલા sitemap થી ને feed થી data લાવીએ
feed થી ડેટા લાવી ને આપડી csv માં date add કરી દઈએ
Code
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');
const { parse } = require('json2csv'); // Keep it as parse(data) for now
const { XMLParser } = require('fast-xml-parser');
// Read the CSV and process URLs
const processCSV = async (csvFilePath) => {
const rows = [];
// Read and parse the CSV file
fs.createReadStream(csvFilePath)
.pipe(csv())
.on('data', (row) => {
rows.push({
url: row.URL,
isWorking: row['Is Working?'],
hasSitemap: row['Has Sitemap?'],
hasFeed: row['Has Feed?'],
lastUpdated: ''
});
})
.on('end', async () => {
// Process URLs where 'Has Feed?' is 'Yes'
const processedData = await fetchLatestPostDate(rows);
// Save the updated CSV file with the latest post date
saveCSV(processedData, csvFilePath);
});
};
// Fetch latest post date from /feed/ if the feed exists
const fetchLatestPostDate = async (urls) => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
ignoreHTTPSErrors: true // Ignore SSL certificate errors
});
const page = await context.newPage();
const parser = new XMLParser();
const results = [];
for (const row of urls) {
if (row.hasFeed === 'Yes') {
const feedUrl = `${row.url.replace(/\/$/, '')}/feed/`;
try {
const response = await page.goto(feedUrl, { timeout: 10000 });
// Only proceed if we have a valid XML response (check the content-type header)
if (response && response.status() === 200 && response.headers()['content-type'].includes('xml')) {
const xmlData = await response.text();
const parsedData = parser.parse(xmlData);
// Attempt to find the latest post date (depends on feed structure, assume RSS/Atom structure)
const latestPostDate = extractLatestPostDate(parsedData);
if (latestPostDate) {
// Convert date to UTC-0
const utcDate = new Date(latestPostDate).toISOString(); // Convert to UTC
row.lastUpdated = utcDate;
}
}
} catch (err) {
// Ignore errors and leave lastUpdated blank
}
}
results.push(row);
}
await browser.close();
return results;
};
// Extract latest post date from the parsed XML (RSS/Atom feed formats)
const extractLatestPostDate = (parsedData) => {
let latestPostDate = null;
// Check for RSS feed format: `<rss><channel><item><pubDate>`
if (parsedData.rss && parsedData.rss.channel && parsedData.rss.channel.item) {
const items = Array.isArray(parsedData.rss.channel.item) ? parsedData.rss.channel.item : [parsedData.rss.channel.item];
latestPostDate = items[0].pubDate || null;
}
// Check for Atom feed format: `<feed><entry><updated>`
if (parsedData.feed && parsedData.feed.entry) {
const entries = Array.isArray(parsedData.feed.entry) ? parsedData.feed.entry : [parsedData.feed.entry];
latestPostDate = entries[0].updated || null;
}
return latestPostDate;
};
// Save the updated CSV
const saveCSV = (data, originalFilePath) => {
// Use parse(data) since the fields option may not be needed
const csvData = parse(data); // Keep parse(data) as it's working for you
const outputFilePath = path.join(path.dirname(originalFilePath), 'updated_' + path.basename(originalFilePath));
fs.writeFileSync(outputFilePath, csvData);
console.log(`Updated CSV saved at: ${outputFilePath}`);
};
// File path to the updated_deduplicated_urls.csv
const csvFilePath = './updated_deduplicated_urls.csv';
// Start the process
processCSV(csvFilePath);
હવે જે સાઈટ માં feed નો હોય એમાં આપડે sitemap.xml થી date લઈ ને same ફાઈલ માં update કરી દેસુ
Code
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');
const { parse } = require('json2csv');
const { XMLParser } = require('fast-xml-parser');
// Read the CSV and process URLs
const processCSV = async (csvFilePath) => {
const rows = [];
// Read and parse the CSV file
fs.createReadStream(csvFilePath)
.pipe(csv())
.on('data', (row) => {
// Only process rows that do not have a lastUpdated value and have 'Has Sitemap?' as 'Yes' and 'Has Feed?' as 'No'
if (!row.lastUpdated && row.hasSitemap === 'Yes') {
rows.push({
url: row.url,
isWorking: row.isWorking,
hasSitemap: row.hasSitemap,
hasFeed: row.hasFeed,
lastUpdated: ''
});
}
})
.on('end', async () => {
// Process the remaining URLs to fetch the latest post date from the sitemap
const processedData = await fetchLatestPostDateFromSitemap(rows, csvFilePath);
// Save the updated CSV file with the latest post date from sitemap
saveCSV(processedData, csvFilePath);
});
};
// Fetch latest post date from sitemap if the site has one and no feed
const fetchLatestPostDateFromSitemap = async (urls, csvFilePath) => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({ ignoreHTTPSErrors: true });
const page = await context.newPage();
const parser = new XMLParser();
const results = [];
for (const row of urls) {
const sitemapUrl = `${row.url.replace(/\/$/, '')}/sitemap.xml`;
try {
const response = await page.goto(sitemapUrl, { timeout: 10000 });
// Only proceed if we have a valid XML response (check the content-type header)
if (response && response.status() === 200 && response.headers()['content-type'].includes('xml')) {
const xmlData = await response.text();
const parsedData = parser.parse(xmlData);
// Extract the latest post date from the sitemap
const latestPostDate = extractLatestPostDateFromSitemap(parsedData);
if (latestPostDate) {
const utcDate = new Date(latestPostDate).toISOString(); // Convert to UTC
row.lastUpdated = utcDate;
}
}
} catch (err) {
// Ignore errors and leave lastUpdated blank
}
results.push(row);
}
await browser.close();
return results;
};
// Extract latest post date from the parsed XML sitemap
const extractLatestPostDateFromSitemap = (parsedData) => {
let latestPostDate = null;
// Check for <urlset> structure in sitemap and extract <lastmod> dates
if (parsedData.urlset && parsedData.urlset.url) {
const urls = Array.isArray(parsedData.urlset.url) ? parsedData.urlset.url : [parsedData.urlset.url];
// Find the latest <lastmod> date
latestPostDate = urls.reduce((latest, url) => {
const lastmod = url.lastmod;
return lastmod && (!latest || new Date(lastmod) > new Date(latest)) ? lastmod : latest;
}, null);
}
return latestPostDate;
};
// Save the updated CSV
const saveCSV = (newData, originalFilePath) => {
// Read the original CSV again to include all rows, including those that were skipped (no sitemap or had feed)
const updatedData = [];
fs.createReadStream(originalFilePath)
.pipe(csv())
.on('data', (row) => {
// Update the lastUpdated field for the rows that have been processed in the sitemap
const updatedRow = newData.find((newRow) => newRow.url === row.url);
if (updatedRow) {
row.lastUpdated = updatedRow.lastUpdated;
}
updatedData.push(row);
})
.on('end', () => {
// Use parse(data) since the fields option may not be needed
const csvData = parse(updatedData); // Keep parse(data) as it's working for you
const outputFilePath = path.join(path.dirname(originalFilePath), 'updated_' + path.basename(originalFilePath));
fs.writeFileSync(outputFilePath, csvData);
console.log(`Updated CSV saved at: ${outputFilePath}`);
});
};
// File path to the updated_updated_deduplicated_urls.csv
const csvFilePath = './updated_updated_deduplicated_urls.csv';
// Start the process
processCSV(csvFilePath);
આમ કરતા હવે ટોટલ 337 સાઈટ છે અને એમાં થી 36 નું lastUpdated નથી આપડી પાસે. હવે આ 36 સાઈટ manually કરવી પડશે.
Manually 1-1 સાઈટ ની લાસ્ટ બ્લોગ પોસ્ટ ગોત્યા પછી પણ 12 સાઈટ એવી છે જે કા તો private કરી દીધી છે કા તો એમાં last post કે પછી update date ગોતવાનો કોઈ રસ્તો નથી.
ફાઇનલ ફાઈલ જોવી હોય તો આ રઇ link 🔽
https://docs.google.com/spreadsheets/d/1KkVS8msHeQxbrmcZjke-CFKNicEIQqS0AWV069UVYz0/edit?usp=sharing
Results
And the Top Gujarati Blog award goes to …… GujaratiGeek
ના ના હવે just kidding હો.
- Award for Most Recently Active Gujarati Blog
URL | Last Updated Date |
https://aasvad.wordpress.com/ | 2024-09-07 |
https://jaywantpandya.wordpress.com/ | 2024-09-07 |
https://rankaar.com/ | 2024-09-07 |
https://gandabhaivallabh.wordpress.com/ | 2024-09-07 |
http://deshgujarat.com/ | 2024-09-07 |
https://ashokvaishnavliesureshare.blogspot.in/ | 2024-09-07 |
https://sureshbjani.wordpress.com/ | 2024-09-06 |
http://sanjayvshah.com/ | 2024-09-06 |
https://govindmaru.wordpress.com/ | 2024-09-06 |
https://vaishnavashok.blogspot.in/ | 2024-09-06 |
2. Award for Most Veteran Blog goes to
URL | Last updated date |
http://ujaas.blogspot.in/ | 2006-08-26 |
https://sneh.wordpress.com/ | 2006-10-16 |
http://kalrav1.blogspot.in/ | 2006-11-07 |
http://collecsaupriya.blogspot.in/ | 2007-02-19 |
https://urmi.wordpress.com/ | 2007-06-10 |
https://himanshugreen.wordpress.com/ | 2008-02-27 |
https://sarjansahiyaaru.wordpress.com/ | 2008-03-26 |
http://sur-sargam.blogspot.in/ | 2008-04-24 |
https://aektinka.wordpress.com/ | 2008-04-29 |
http://shrithakorji.blogspot.in/ | 2008-05-02 |
બીજા stats
Community Statistics | |
Total Blogs | 334 |
Working Blogs | 333 |
Blogs Updated This Year | 70 |
Blogs Updated Last Year | 13 |
2rd કેટેગરી માં બીજું કોઈ ક્યારેય winner જ નઈ થાય. શું લાગે છે આવા એવોર્ડ દર વર્ષે રાખીયે તો? criteria બદલવો પડે કદાચ. Comment કરી ને કો
આ data ઉપર થી બીજું ઘણું થઈ શકે
- જેમકે દર વર્ષે ગુજરાતીઓ કેટલી blog posts લખે છે એનો trend chart ?
- બધા બ્લોગ ને 5-10 category માં મૂકી ને કઈ કેટેગરી માં વધારે blogs છે? એનો chart
- ગુજરાતી લેખકો કેટલું frequent લખે છે?
- વર્ષે વર્ષે ચાલુ અને બંધ બ્લોગ ની સંખ્યા
- બ્લોગ lifespan analisis ચાર્ટ. કેટલા વર્ષ લોકો પોતાની લખવાની કાલા ને વળગી શકે છે?
- Inactivity vs volume. ઓછી પોસ્ટ વાળા બ્લોગ જલ્દી inactive થાય છે કે નઈ?
આમ તો હવે લોકો વિડિઓ અને short video (reels અને shorts) ફોરમેટ ઉપર ચડી ગયા છે. ખબર નઈ આજ થી 200-500 વરસ પછી કોઈ ને ગુજરાતી વાંચતા ય આવડતું હશે કે નઈ.
મને મન થાય કે એ ફોરમેટ માં ય જંપલાવુ પણ બઉ કાય્સ છે એમાં. editing માં બઉ ટાઈમ જાય એમાં તો કેવું લખી નાખ્યું ને ભૂંસી નાખ્યું બસ. અને પાછું એની માટે 2 વસ્તુ જોઈ staff અને paisa જેની અત્યારે મારે તંગી છે.
Summary
તો આજે આપડે શું શીખ્યા?
Internet મોટું છે. ગુજરાતી ઘણા છે. ખાલી ફમ્ફોળતા શીખવાનું છે.
ખુશ રો. સંતોષ રાખો. ગુજરાતી વાંચો અને ગુજરાતી બનો.
🙏
Leave a Reply Cancel reply