Kiran Chauhan

Cogito, ergo sum // I think, therefore I am.

Emacs Minipost Pt. 4

Open the Emacs. You should see the following screen.

Remove these two lines (or comments) from the scratch pad and type the following code.

P.S. You might face difficulty while adding the indentation. For now, stay with me and type spaces literally instead of tabs.

#include <stdio.h>

int main(int argc, char** argv) {
  printf("hello, world\n");

  return 0;
}

We know how to save the file, right? Yes, ctrl-x ctrl-s. Press. But, we haven't created the file yet. So, Emacs first ask to create the file and then will save the content of it.

Here, instead of typing the name of the file, you can type the full path if you don't want to save at the default location that Emacs is suggesting and then press Enter.

Congratulation on creating and saving the files using Emacs!

Summary: Now you know how to create and save the file from Emacs only!


ફ્રાન્સ ૧૧ ઓગસ્ટથી અનિચ્છનીય ટેલિમાર્કેટિંગ કોલ્સ પર પ્રતિબંધ મૂકશે

શું તમને માર્કેટિંગ એટલે કે વસ્તુ જાહેરાતના ફોન આવે છે? શું તમે પૂર્વ મંજૂરી વગર આવતા આ પ્રકારના ફોનથી કંટાળી ગયા છો? તો તમારા માટે તો નહીં પણ ફ્રાન્સના લોકો માટે સરકાર કાયદો લાવી રહી છે કે, પૂર્વ મંજૂરી વગર જો ટેલેમાર્કેટિંગના ફોન આવશે તો દંડ થશે.

આ કાયદો ૧૧ ઓગસ્ટથી લાગુ પડશે. નિર્ણય ૧૧ ગ્રાહક સંસ્થાઓની સંયુક્ત માંગ બાદ ફ્રેન્ચ સંસદે મંજૂર કરેલા કાયદા હેઠળ લેવામાં આવ્યો છે. અત્યાર સુધી કેટલીક શરતો સાથે માર્કેટિંગ કૉલ્સની મંજૂરી હતી, પરંતુ નવા નિયમનો મુખ્ય હેતુ લોકોને વારંવાર આવતા અનિચ્છનીય અને પરેશાન કરનારા ફોનથી સુરક્ષિત કરવાનો છે.

નવા કાયદા હેઠળ વ્યક્તિ કે કંપની જો ગ્રાહકની મંજૂરી વિના માર્કેટિંગ ફોન કરશે તો તેના પર દંડ થઈ શકે છે. આવા અનધિકૃત ફોનની ફરિયાદ કરવા માટે જાહેર વેબસાઇટની વ્યવસ્થા પણ કરવામાં આવી છે, જેથી ગ્રાહકો નિયમનો ભંગ કરનારાઓની જાણ કરી શકે. આ પગલાને ફ્રાન્સમાં ગ્રાહક અધિકારોને મજબૂત કરવા અને ટેલિમાર્કેટિંગમાં વધુ કડક નિયંત્રણ લાવવાના મહત્વપૂર્ણ પ્રયાસ તરીકે જોવામાં આવે છે.


ઓપન સોર્સ

કોમ્પ્યુટરના ક્ષેત્રમાં ઓપન સોર્સ(=open source) શબ્દ ઘણો પ્રચલિત છે. કોઈ સોફ્ટવેર ઓપન સોર્સ છે એનો મતલબ એ સોફ્ટવેરનો કોડ વાંચવા માટે ઉપલબ્ધ છે, સુધારા વધારા કરવા માટે ઉપલબ્ધ છે, બીજાને આપવા માટે ઉપલબ્ધ છે, એને બીજાને પૈસાથી વેચવાં માટે ઉપલબ્ધ છે, આનાથી બીજા સોફ્ટવેર બનાવવા માટે ઉપલબ્ધ છે. આ પ્રકારની સ્વતંત્રતા કેટલા અંશે ઉપલબ્ધ છે, એ સોફ્ટવેરના લાઇસન્સ પર આધાર રાખે છે. જેના વિષે આપણે આગળ વાત કરીશું.

આ એક રસપ્રદ વાત થઇ, નહિ?

ધારો કે તમે કોઈ ફિલ્મ પર કામ કરી રહ્યા છો અને એની વાર્તા/કથા(=script) તમે જાહેરમાં મૂકી દીધી છે, અને એ કોઈ બીજા વ્યક્તિ વાપરી શકે, એમાં ફેરફાર કરી ને બીજી કથા બનાવી શકે અને એને મફતમાં કે પૈસાથી બીજાને વેચી શકે!

ધારો કે તમે કોઈ સંગીત/ગીત પર કામ કરી રહ્યા છો એની શબ્દ અને સંગીત રચના તમે જાહેર કરી દીધી છે, કોઈ પણ એનો ઉપયોગ કરીને એ ગીત બનાવી શકે, જાહેરમાં મૂકી શકે, વગાડી શકે, અને મફતમાં કે પૈસાથી વેચી શકે!

તમને એવા વિચાર પણ આવે કે, આમ થોડું હોય, મહેનત એક વ્યક્તિ કરી, અને બીજો પૈસા કમાય? આમ થોડું ઘર ચાલે? જાહેર કરનાર વ્યક્તિ કેવો કહેવાય? વગેરે વગેરે. પણ, કરોડો નહિ તો પણ લાખોની સંખ્યામાં ઓપન સોર્સ સોફ્ટવર ઉપલબ્ધ છે, જેનો તમે ઉપયોગ કરી શકો છો, વાપરી શકો છો, બીજાને આપી શકો છો, એમાં સુધારા-વધારા કરી શકો છે, અને એને મૂળ વ્યક્તિ કે જેને એ સોફ્ટવેર બનાવ્યો એને પૈસા આપ્યા વગર બીજાંને વહેંચી શકો છો.

જે તે કોડ/સોફ્ટવેર કેટલા અંશે ફેરફાર માટે, વેચાણ માટે, ઉપલબ્ધ છે એ એની સાથે વાપરવામાં આવેલ લાઇસન્સ પર આધાર રાખે છે. ઘણા પ્રકારના લાઇસન્સ ઉપલબ્ધ છે, સોફ્ટવેર બનાવનાર વ્યકિત કોઈ પણ લાઇસન્સ વાપરી શકે અને એના આધારે સોફ્ટવેર/કોડની સ્વતંત્રતા નક્કી થાય.

જેમકે, કોઈ વ્યક્તિએ મ્યુઝિક પ્લેયર(=music player) નો સોફ્ટવેર બનાવ્યો અને એનો કોડ એને MIT લાઇસન્સ સાથે જાહેરમાં મુક્યો. તો હવે આ લાઇસન્સ પ્રમાણે કોઈ પણ વ્યક્તિ આ સોફ્ટવેરનો કોડ લઈને પોતાના માટે અલગથી  મ્યુઝિક પ્લેયર બનાવી શકે છે, એમાં સુધારો કરીને વાપરી શકે છે, બીજાને આપી શકે છે, પૈસા લઈને વહેંચી શકે છે, એનો ઉપયોગ કરીને બીજો સોફ્ટવેર - જેમકે વિડિઓ પ્લેયર(=video player) બનાવી ને વહેંચી શકે છે.  અંતે, પોતે ભલે બીજાનો કોડ વાપરીને સોફ્ટવેર બનાવે. પણ પોતાનો સોફ્ટવેરનો કોડ ના પણ આપે. MIT લાઇસન્સમાં જેમ સ્વતંત્રતા મળે છે, એમ જવાબદારી નથી આવતી. એટલે કે, મૂળ વ્યક્તિ પહેલેથી કહી દે છે, કે જો આ સોફ્ટવેરથી કાંઈ નુકસાન થાય તો અમારી જવાબદારી નથી, તમારો ડેટા ઉડી જાય, કોમ્પ્યુટરમાં નુકસાન થાય, ગણતરીમાં નુકસાન થાય તો પણ અમારી જવાબદારી નથી. 

આગળના ફકરામાં એક વાક્યનો ભાગ અહીં ફરીથી લખું, "પોતે ભલે બીજાનો કોડ વાપરીને સોફ્ટવેર બનાવે. પણ પોતાનો સોફ્ટવેરનો કોડ ના પણ આપે." અહીં તમે બીજાનો કોડ લીધો પણ તમે એમાંથી બનાવેલા સોફ્ટવેરનો કોડ અપાતા નથી. એવું જો મૂળ બનાવનારને ના કરવા દેવું હોયતો એ સોફ્ટવેરને GNU GPL લાઇસન્સ સાથે સોફ્ટવેરને જાહેરમાં મૂકી શકે, કેમ કે આ સોફ્ટવેરમાં આગળ જણાવેલ સ્વતંત્રતા તો મળે જ છે પણ એમ એક મુદ્દો વધુ ઉમેરાય છે અને એ છે કે, તમે સોફ્ટવેરમાં સુધારો વધારો કરો તો એ સુધારા વધારા કરાયેલ સોફ્ટવેરનો કોડ પણ બીજાને આપવાનો છે અને એ પણ આજ લાઇસન્સ સાથે જેથી આ સાંકળ તૂટે અહીં. એમાં પણ આગળ જણાવેલ જવાબદારી આવતી નથી.

ઘણા લોકો GPL ને કેન્સર લાઇસન્સ કહે છે, કારણકે એ ફેલાય છે જેમ આગળ કીધું એમ. વધુમાં એ લાઇસન્સથી તમે કોઈ સોફ્ટવેર બીજાનો આપો - મફતમાં કે પૈસાથી તો તમારે એ લાઇસન્સ પ્રમાણે એને કોડ પણ આપવો જ પડે અને એ પણ સ્વતંત્ર છે સુધારા વધારા કરવામાં. આ વાત ખાસ કરીને એવી કંપનીઓને લાગુ પડે છે, જેમણે મૂળ સોફ્ટવેરનો ઉપયોગ કર્યો પણ હવે એમાં સુધારો કરીને ઓપન સોર્સ નથી કરવો, એ સુધારો બહાર પડવો નથી. 

કંપનીઓને પોતાની અલગ દ્રષ્ટિ છે આ વિષયને જોવાની. ઘણી કંપનીઓ સોફ્ટવેરનો કોડ જાહેર નથી કરતી. કેમકે, કોડમાં એમના ઉદ્યોગનું રહસ્ય છે, અથવાતો એમનો સોફ્ટવેર એજ આવકનો સ્ત્રોત છે, જો એ ઓપન સોર્સ કરશે અને બીજો લોકો જાતે કોડમાંથી સોફ્ટવેર બનાવી લેશે તો આવક બંધ થઇ જશે અથવાતો એમની પાસે કોડ જશે તો બીજા પાસે એમાં સુધારા-વધારા કરાવી લેશે - ઓછી કિંમતથી કે મફતમાં. તો ઘણી કંપની ગોપનીયતાના લીધે ઓપન સોર્સ નથી કરતી. ઓપન સોર્સ કરવાથી કોઈ વ્યકિત એ કોડ વાંચશે અને જો એને એમાં ખામી મળી તો એ ખામીથી સોફ્ટવેર હેક કરીને ડેટા ચોરી ચોરી લેશે, વગેરે વગેરે.

તેમ છતાં ઘણી વાર વ્યક્તિ સારા ઉદ્દેશ્ય સાથે કોડને ઓપન સોર્સ કરે છે. એનો ઉપયોગ બીજો વ્યક્તિ, ત્રીજી કંપની વાપરે છે અને એમાંથી પૈસા કમાય છે. જેમકે, મરાક સ્ક્વાયર્સ(=Marak Squires) કે faker.js કરીને એક લાયબ્રેરી બનાવી જે ફેક ડેટા બનાવે, તમારે જેવા જોઈએ એવા. આ લાયબ્રેરી સોફ્ટવેર ટેસ્ટ કરવામાં ખુબ વપરાતી. અને કંપનીઓ કરોડો કમાતી, પણ બનાવનારને કઈ મળતું નહિ એટલે એને લાયબ્રેરી ઉડાડી દીધી. એ સમયે ખુબ અંધાધુંધી ફેલાયી હતી!

બીજો પણ એવો એક કિસ્સો છે, જેમાં વ્યક્તિ સોફ્ટવેર ઓપન સોર્સ કરે છે અને વારસો સુધી જાણવણી કરે છે, પૈસા વગર અને જયારે એમાં કઈ ખામી જોવા મળે છે ત્યારે જે વ્યક્તિ એ સોફ્ટવેર વાપરતો હોય એ બનાવનારને ઝડપથી ખામી દૂર કરવાનું કહે છે, મફતમાં, તરત, ઓર્ડરથી. વળી પોતે એમાંથી પૈસા કમાય છે! 

તો એની સામે સારા ઉદાહરણો પણ જોવા મળે છે. RedHat કરીને કંપની કે જે $32 બિલિયોન એટલેકે 3243224300000.00 રૂપિયામાં IBM એ ખરીદી એ પુરી કંપની ઓપન સોર્સ સોફ્ટવેર પર ચાલે છે, ઓપન સોર્સ સોફ્ટવેરને સારો બનાવી એનો સપોર્ટ આપે છે, વહેંચે છે, અને મૂળ બનાવનાર વ્યક્તિને પણ સમયાંતરે પૈસા આપતા રહે છે, કામમાં મદદ કરતા રહે છે.

ઘણા લોકો સોફ્ટવેરને ઓપન સોર્સ કરીને ઋણ ચૂકવે છે. એમનું એવું માનવું છે, કે બીજા ઓપન સોર્સ સોફ્ટવેરથી જ્ઞાન મળ્યું તો એમાંથી બીજા સોફ્ટવેર બનાવી ઓપન સોર્સ કરીએ જેથી બીજા લોકોને પણ નવા જ્ઞાનનો મોકો મળે.

ઘણા લોકો એને મૂળભૂત હક તરીકે જોવે છે. જેમકે, GNU.org વાળા મને છે કે બધા સોફટરે ઓપન સોર્સ જ હોવા જોઈએ. તમારે એના પૈસા લેવા હોય તો લઇ શકો પણ એનો કોડ તો જાહેર જ હોવો જોઈએ, એમાં શું લખ્યું છે, અમારો કેટલો ડેટા તમે લો છે, બીજું શું શું કરો છ એ બધું શુ લખ્યું છે, એ અમે જોવી શકતા હોવા જોઈએ અને સાથે એમાં સુધારો-વધારો પણ કરી શકતા હોવા જોઈએ. GNU.org વાળાએ ઘણા સોફ્ટવેર ઓપન સોર્સ કર્યા છે GPL લાઇસન્સ સાથે અને કેટલાક તો એવા સોફ્ટવેર છે, જે આખી દુનિયા વાપરે છે, મફતમાં, જો તમે કોમ્પ્યુટરથી ઈન્ટરનેટ વાપરતા હોય તો સમજો કે GNU.org વાળાએ લખેલા ઘણા સોફ્ટવેર વપરાતા હશે અને ત્યારે એ વેબસાઈટ તમે જોઈ શકતા હશો. અને જો તમે એન્ડ્રોઇડ મોબાઇલ વાપરો છો તો  એમાં એમના ઘણા સોફ્ટવેર છે, જે તમને દેખાતા નથી પણ અંદર સતત વપરાય છે.

GNU.org વાળા જયારે બધા જ સોફ્ટવેર ઓપન સોર્સ હોવા જોઈએ એવું મને છે તો ઘણા એવું મને છે, બધા નહી તો અમુક મહત્વના સોફ્ટવેર તો ઓપન સોર્સ જ  હોવા જોઈએ. જેમ કે, Ladybird Browser વાળા બ્રોઉસર બનાવે છે ઓપન સોર્સ અને મફતમાં પણ.

અંતે એક મહત્વની વાતનો ચોખ પડવો છે એ કે - ઓપન સોર્સ મફત હોય શકે અને ના પણ હોય. પણ એનો કોડ તો જાહેર જ હોય.

Emacs Minipost Pt. 3

Go ahead and create a new file with name main.c. Right-click the file and open with Emacs. It should looks like this:

Now, type the following code.

#include <stdio.h>

int main(int argc, char** argv) {
  printf("hello, world\n");

  return 0;
}

After you typed this code, it should look like this.

We need to save the file with this code. To do so, we need to type ctrl+x and then ctrl+s meaning that pressing ctrl and then x and then s while keep pressing ctrl. After successful save, you should see a message at the end of the editor in single line as follows:

Congratulation on modifying and saving the file using Emacs. Go ahead practice now!

Summary: Now you know how to save the file in Emacs - ctrl+x ctrl+s.


ષટ્-કર્મ

આ છ પ્રકારના કર્મોને ઋષિઓએ ષટ્-કર્મ કહ્યાં છે.

૧. શાંતિ કર્મ, 
૨. વશીકરણ, 
૩. સ્તંભન, 
૪. વિદ્વેષણ, 
૫. ઉચ્ચાટન, અને 
૬. મારણ

ષટ્-કર્મ લક્ષણ

જે પ્રયોગથી કોઈપણ પ્રકારના અવરોધ શાંત થાય છે, અથવાતો અનિષ્ઠ ગ્રહોને શાંત કરવામાં આવે છે એને શાંતિ કર્મ કહેવામાં આવે છે. 
જે પ્રયોગથી સ્ત્રી, રાજા, શત્રુ અથવા ઇષ્ટ વશ થાય છે, એટલે કે, પોતાની ઇચ્છા મુજબ વર્તે છે, તેને વશીકરણ કહેવામાં આવે છે. 
જે પ્રયોગથી અગ્નિ, પાણી, દુશ્મનના પરાક્રમ અથવા દુશ્મનની સેનાને રોકવામાં આવે છે અથવાતો અવરોધ ઉત્પન્ન કરી શકાય છે તેને સ્તંભન કર્મ કહેવામાં આવે છે. 
જે પ્રયોગથી બીજા વ્યક્તિના પ્રેમને તોડી નાખવામાં આવે છે તેને વિદ્વેષણ કહેવામાં આવે છે. 
જે પ્રયોગથી વ્યક્તિ પોતાના સ્થાનથી ભાગી જાય છે તેને ઉચ્ચાટન કહેવામાં આવે છે. 
જે પ્રયોગ વ્યક્તિના મૃત્યુનું કારણ બને છે તેને મારણ કહેવામાં આવે છે.

~ રાવણ સંહિતા


જેફ ડીન અને સંજય ઘેમાવતની ગૂગલમાંથી વિદાય

DeepMind(=ડીપ માઇન્ડ) નામથી ગૂગલનો એક વિભાગ છે, જેની અંદર AIનો વિભાગ પણ આવે છે. આ વિભાગના નેતૃત્વમાં કેટલાક ફેરફાર આવ્યા જેના વિષે ગૂગલના CEO સુંદર પિચાઈએ લેખ લખીને માહિતી આપી. આ લિંક પર જઈને એ લેખ વાંચી શકો.

આ લેખના એક ફકરામાં જે વાત કરી છે, એ વિષે અહીં ધ્યાન દોરવું છે અને તે છે, જેફ ડીન અને સંજય ઘેમાવતની ગૂગલમાંથી વિદાય. જેફ અને સંજય ગૂગલમાં આશરે 27-વર્ષથી હતા અને હમણાં એમને ગૂગલમાંથી વિદાયલીધી*. આ એક મોટી વાત છે અને એ એટલી મોટી કે ગૂગલનો શેર 5% પડી ગયો. 

 જેફ અને સંજય ગૂગલમાં "Google Senior Fellows" પદ પર હતાં. લેવલ(=level) 11 તરીકે ઓળખાતા આ પદ પર ફક્ત બેજ વ્યક્તિ હતાં અને તે આ બંને.

લેવલ 1 પર IT સપોર્ટ સ્ટાફ આવે છે. કોલેજમાથી જે એન્જીનીઅર્સ જોડાય એમને લેવલ 2 મળે. જો માસ્ટર ડિગ્રી સાથે એન્જીનીઅર્સ જોડાય તો લેવલ 3 મળે. લેવલ 4 માટે Ph.D. જોઈએ. અને મહેનત કરતાં લેવલ 5 પર પહોંચી શકાય. અને મોટાભાગના એન્જીનીઅર્સ અહીં સુધી જ રહે છે. લેવલ 6 મા તો એવાં 10% જ એન્જીનીઅર્સ આવે છે જેમનાં લીધે કોઈ મોટો પ્રોજેક્ટ સફળ થયો હોય. લેવલ 6 માં રહીને સતત મોટા પ્રોજેક્ટ સફળતાપર્વક આપવાથી લેવલ 7 પર પહોંચી શકાય. લેવલ 8 - Principal Engineers - માં એવા એન્જીનીઅર્સ આવે છે જે ગૂગલની મોટી પ્રોડક્ટ સાથે સંકળાયેલા હોય અને એમનું મહત્વનું યોગદાન હોય. ત્યાર બાદ આવે છે લેવલ - 9 - Distinguished(=પ્રતિષ્ઠિત) Engineers -  જેમનું નામ આદર સાથે લેવાતું હોય ગૂગલમાં. લેવલ 10 એતો સન્માનજનક વાત છે જિંદગી ભરની મહેનતનું. આ લેવલમાં એવા એન્જીનીઅર્સ જે ગૂગલમાં નહિ પણ પુરી દુનિયામાં નિષ્ણાંત હોય જે તે વિષયમાં. અને પછી આવે છે લેવલ 11 - Google Senior Fellows - સૌથી પ્રતિષ્ઠિત ગૂગલનું પદ - જે અત્યાર સુધીમાં ફક્ત બે જ લોકોને મળ્યું છે અને એ છે - જેફ ડીન અને સંજય ઘેમાવતસંદર્ભ, જે હવે ગૂગલ છોડીને જાય છે.

* = જેફ ડીન અને સંજય ઘેમાવતે બીજા મિત્રો સાથે મળીને Discovery Loop નામની કંપની સ્થાપી છે.
# = જેફ ડીન ગૂગલમાં દંતકથા સમાન પાત્ર બની ગયેલ છે એટલે સુધી કે એની આજુબાજુ ઘણી અફવાઓ અને દંતકથાઓ પ્રચલિત છે. કેટલીક એક-લાઈનની હાસ્ય વાતો અહીં વાંચી શકો છો - https://github.com/LRitzdorf/TheJeffDeanFacts


Emacs Minipost Pt. 2

This is a startup screen. When you open Emacs without any file, you'll probably see this startup screen all the time at the start of Emacs. You can customize the startup screen by clicking on "Customize Startup" link from this startup screen and within "To start..." section or you can write following line in .emacs.d file. .emacs.d is a config file and based on the instructions you write in this file, Emacs behave accordingly.

Following are the possible locations of the .emacs.d file.

# GNU/Linux
~/.config/emacs/init.el

# macOS
~/.emacs.d/init.el

# Windows
%USERPROFILE%\.emacs.d\init.el

Navigate and open based on your OS and add following line. This will hide/disable the startup screen permanently.

(setq inhibit-startup-screen t)

Restart the Emacs and you won't see that startup screen on next time!

Summary: With this step, now you know that there is Emacs config file where you can write configuration for the Emacs!

Click here for next Minipost.


Emacs Minipost Pt. 1

Emacs is a wonderful editor. It is one of those software that you should try and learn before you die! I'm not die hard fan of Emacs. Hell! I'm using other editors based and on work (i.e. Code for web development, Sublime for text writing, Notepad++ for copy-paste, nano for config edit, and few more). But, I still have soft corner for the Emacs and I use it whenever possible.

This is the first in the series of miniposts where I'm going to teach (and learning as I'm explaining to you) Emacs. Each post will be a paragraph or two long with one point. Read it, remember it, try it, and practice it!

Go ahead and install the latest version of Emacs from the official website - https://www.gnu.org/software/emacs (as of writing it is v30.2). It is available for all popular OSes. Once the installation is done, launch it, stare it, and then close it. It is standalone software. So, use it in that way - no need to open in terminal. Open it from applications launcher and you're good to go!

Summary: With this step, we've installed the Emacs!

Click here for next Minipost.


મનની વિટંબણાઓ

આગળના લેખમાં આપણે ધનની અચોક્કસતા અને એના નિવારણના ઉપાયો વિષે વાત કરી આ લેખમાં આપણે મનની વિટંબણાઓ (તન, મન, અને ધનમાંથી મન) વિષે વાત કરીશું.

મનનો એક માત્ર ધ્યેય આત્માને આનંદ આપવાનો છે. પણ, આત્મા હજુ ઓળખાયો નથી. શરીરને જ મન આત્મા/સ્વામી મને છે. આથી, મન શરીરને આનંદ આપવાનો પ્રયત્ન કરે છે. એમાં મન સારું/ખરાબ નથી જોતું. આથી ઘણીવાર આનંદ પછી આપણે ઉદ્વેગ પામીએ છીએ. જેમકે, સમોસા ખાવાથી શરીરને આનંદ મળે છે, એટલે ખાતા તો ખાઈ લેવાય છે, પણ પછી બુદ્ધિથી ખબર પડે છે, કે આનાથી હવે ચરબી વધશે, તળેલું તેલ નુકસાન કરશે એટલે આપણે ઉદ્વેગ પામીએ છીએ.

વિટંબણા ત્યારે ઉત્પન્ન થાય છે, જયારે બુદ્ધિથી આપણને ખબર છે, કે આ બરોબર નથી છતાં મન એ શરીરને આનંદ આપવા કરે છે. ઉપાય મુશ્કેલ છે - પણ અશક્ય નથી. ઉપાયમાં 

1. મનનો પ્રાણ શ્વાસોશ્વાસ છે, જો એના પર કાબુ રાખવામાં આવે તો મન પર પણ કાબુ રાખી શકાય છે.
a. પ્રાણાયામથી થઇ શકે પણ એના માટે સમય કાઢવો પડે. સવારે ચાલવામાં અથવા પૂજા વખતે (જો પૂજા ના કરતાં હોય તો કરો!). શરૂઆત 5 મિનિટથી કરવી અને પછી વધારતા 1.5 કલાક સુધી લઇ જવું. અને સમગ્ર જીવન જ પ્રાણાયામ થઇ જાય એવું કરવું.
b. શ્વાસોશ્વાસ ઉપર નજર રાખવી. સતત નજર રાખવી જેથી શરૂઆતના તબક્કામાં ચુકી ના જવાય.
c. હાથમાં કાંઈક એવું પહેરવું કે જે યાદ આપાવે કે આ પ્રક્રિયા ચાલુ જ છે જ્યાં સુધી એ આદત ના થઇ જાય.
2. પોતાને મનથી અલગ કરી દેવું અને તટસ્થ ભાવે એને વિચરણ કરવા દેવો અને એનું નિરીક્ષણ કરવું. મનને બળ આ શરીરથી મળે છે. જો એને શરીરથી દૂર કરવામાં આવે તો એનું બળ જતું રહશે એટલે શાંત થશે.

અહીં એ ખાસ યાદ રાખવાનું કે, જયારે મન ને ખબર પડશે કે એના પર  નિયંત્રણ કરવામાં આવી રહ્યું છે અથવાતો એનો પ્રયાસ કરવામાં આવી રહ્યો છે, એટલે મન ચોક્કસથી બળવો કરશે. ગભરાવું નહિ, પ્રયાસ ચાલુ રાખવા.

સરકાર

સરકારને કરોડ મોઢાં હોય છે
પણ એક આત્મા હોતો નથી
સરકાર અવાજની માલિક છે
અને માલિકનો અવાજ છે

સરકાર વિચારો કરાવી શકે છે
સરકાર લેખકને લખાવી શકે છે
જાદુગરને રડાવી શકે છે
ચિત્રકારને ચીતરાવી શકે છે
ગાયકને ગવડાવી શકે છે
કલાકારને કલા કરાવી શકે છે

એક હાથે તાળી પડાવી શકે છે
રવિવારને સોમવાર બનાવી શકે છે
નવી પેઢીને જૂની કરી શકે છે
જૂનીને પૈસાદાર બનાવી શકે છે

પૈસા છાપી શકે છે, ઘાસ ઉગાડી શકે છે
વીજળી વેચી શકે છે, ઇતિહાસ દાટી શકે છે
અર્થને તંત્ર અને તંત્રને અર્થ આપી શકે છે

સરકારોની ભાગીદારીમાં આ પૃથ્વી ફરે છે
સમય ફરે છે, માણસ ફરે છે
યંત્ર ફરે છે, મંત્ર ફરે છે
પણ એક દિવસ,

ગરીબની આંખ ફરે છે, અને-
સરકાર ફરે છે...

~ ચંદ્રકાંત બક્ષી

બાઇટ જોડકું(=pair) એન્કોડિંગ અલ્ગોરિધમ

આ લેખમાં આપણે byte pair encoding algorithm (બાઇટ જોડકું એન્કોડિંગ અલ્ગોરિધમ) વિષે જાણીશું.

આ તકનીક/અલ્ગોરિધમનો ઉપયોગ AIમાં થાય છે. ખાસ કરીને, tokenizerમાં. AIને આપવામાં આવતી માહિતી/લખાણ(=text) ને જ્યારે tokenરૂપે સંગ્રહ કરવાનો હોય છે, ત્યારે આ તકનીકના ઉપયોગથી tokensને કાર્યક્ષમ(=efficiently) રીતે સંગ્રહ કરી શકાય છે

આ તકનીકને સરળ ભાષામાં સમજીએ.

લખાણમાં અક્ષરો(codingમાં bytes) ના જોડકાં(=pair) એક કરતાં વધુ વખત પુનરાવર્તન થતાં હોય તો એ જોડકાંને લખાણમાં ન વપરાયેલ સ્થાનધારક(=placeholder) થી બદલવામાં આવે છે. આ માહિતી(સ્થાનધારકને કયા જોડકાંથી બદલાવેલ છે) ને લખાણ સાથે સંગ્રહિત કરવામાં આવે છે. જોડકાં બદલવાની પ્રક્રિયા ત્યાં સુધી ચાલુ રહે છે, જ્યાં સુધી જોડકાનું વધુ વખત પુનરાવર્તન જોવા ન મળે.

હવે, આ તકનીકને ઉદાહરણથી સમજીએ.

આપણી પાસે નીચે પ્રમાણે લખાણ(=text) છે.

aaabdaaabac

અહી, aa (pair)નું વધુ વખત પુનરાવર્તન થાય છે. આથી, આ જોડકાંને Z સ્થાનધારકથી બદલી શકાય (Zનો ઉપયોગ કરવાનું કારણ એ આ લખાણમાં નથી). બદલી બાદ લખાણ નીચે પ્રમાણે થશે.

ZabdZabac
Z=aa

હવે, abનું પણ એક કરતાં વધુ વખત પુનરાવર્તન થાય છે, તો આ જોડકાંને Yથી બદલીએ.

ZYdZYac
Y=ab
Z=aa

આગળ, ZYનું એક કરતાં વધુ વખત પુનરાવર્તન થાય છે. તો આ જોડકાંને Xથી બદલીએ.

XdXac
X=ZY
Y=ab
Z=aa

લખાણમાં હવે કોઈ જોડકાનું પુનરાવર્તન થતું નથી. આથી, આ પ્રક્રિયા અહી સમાપ્ત થશે.

તમારે જો અસલ લખાણ પાછું જોતું હોય તો આ પ્રક્રિયાને ઊલટા ક્રમમાં કરવી.

---

chatGPT અને બીજી AI સિસ્ટમમાં લખાણ વિશાળ માત્રામાં હોય છે, આથી એમાં પુનરાવર્તન માટે એક આંકની મર્યાદા(=limit) રાખવામાં આવે છે. જેમ કે, સૌથી વધુ પુનરાવર્તન થતાં ૧,૦૦,૦૦૦ જોડકાંને સ્થાનધારકથી બદલો અને ત્યારબાદ આ પ્રક્રિયાને રોકી દો.

---

કેટલાક સંદર્ભો વધુ વાંચન માટે:


સમજણના બે છેડા

આ વાત મેં મારા સંસ્કૃતના શિક્ષક પાસેથી સાંભળી હતી, એ હું અહી મૂકું છું. 

મારા દાદાના સમયની વાત છે. શુભ પ્રસંગે, અમારા ત્યાં જમણવાર રાખ્યો હતો ગામ આખાનો અને મિષ્ટાનમાં શ્રીખંડ રાખ્યો હતો, એ સમયે પુરા ગામને શ્રીખંડ ખવડાવવો એ બહુ મોટી વાત હતી. છેલ્લે જ્યારે મજૂરોના જમવાનો સમય આવ્યો ત્યારે શ્રીખંડ પતી ગયો. દાદાને કહેવું હતું કે, આખા ગામે શ્રીખંડ ખાધો તો પછી જેને આટલી બધી મહેનત કરી છે, એ મજૂરો કેમ બાકી રહી જાય. એટલે એમણે શહેરથી શ્રીખંડ લેવા માટે માણસો મોકલ્યા અને શ્રીખંડ મગાવ્યો. 

મજૂરો જમવા બેઠા અને એ લોકોને શ્રીખંડ આપવામાં આવ્યો. મજૂરો જમતાં-જમતાં બોલ્યા કે, “જોયું મહેમાનોને ગરમાગરમ શ્રીખંડ આપ્યો અને આપણને છેલ્લે ટાઢો શ્રીખંડ મળ્યો”. 

ત્યારે દાદા એ અંતે કીધું કે, આ લોકોને શ્રીખંડના સ્વાદની ખબર જ નથી, અને એમને ખાતા ખાતા શ્રીખંડના સ્વાદ વિષે ખબર પડશે તો ઠીક છે, બાકી પછી કોઈ આમને સમજાવી નહીં શકે કે, શ્રીખંડ ઠંડો જ હોય.

વાર્તાનો કસબ

વાર્તા લખવાના કોઈ નિયમો છે? હા, દસ હજાર ને દસ નિયમો છે. પણ જો તમારામાં તમપણું હોય, જો બહોળા વાચકસમૂહના હૃદય પર દીર્ઘકાળ રમતી કૃતિ તમારે આલેખવી હોય, તો કદાચ એ દસ હજાર ને દસ પૈકીનો એકેએક નિયમ તમારે તોડવો પડશે. 

દાખલા તરીકે, વાર્તાના ઘાટઘૂટ ('ફોર્મ)ની નિયમબંધી જાળવણી વિશે આપણને ચોખલિયાઓ ઘણું ઘણું સંભળાવે છે. હું પણ ‘ઘાટઘટ’ની જરૂરિયાતનો આગ્રહ રાખનાર છું. હું માનું છે કે, વાર્તાને ઘાટ અપાયો ન હોય તો એ મારી જાય છે. પાત્રોને એકવાર દાખલ કરીને પછી એને ન વાપરનાર વાર્તાકાર પર હું ચિડાઉં છું.  

ચોપડીના પૂર્વાર્ધમાં જ બધા જોરદાર પ્રસંગો આવી બેસે એવા પ્રકારનું સંયોજન કરનાર લેખકને હું અડબૂથ કહું છું. પોતાના પહેલા જ પ્રકરણમાં તત્ત્વજ્ઞાનની કે કોઈ સિદ્ધાંતની ચર્ચા કરનાર વાર્તાકાર પર હું બબડી ઊઠું છું.  

એટલે જ કોઈ વાર્તાકાર પોતાની વાર્તાના પ્રારંભમાં જ મુખ્ય પાત્રોનો સીધેસીધો પરિચય કરાવતો હોય છે, તેમજ તે પાત્રો આગળ ઉપરના કટોકટ પ્રસંગોમાં જે ભાગ ભજવવાનાં હોય છે તેનાં લઘુ સ્વરૂપો તેમને શરૂમાં ભજવતાં દેખાડે છે, ત્યારે હું પ્રસન્ન થાઉં છું કેમકે આ યુક્તિ વાચકોને એકદમ ઉત્કંઠ કરી તેમની નજર બાંધી લે છે.  

દાખલા તરીકે ટોમસ હાર્ડી હમેશાં પોતાનાં નવલોમાં એક જ સચોટ હીકમત વાપરે છે: એનાં પહેલાં પ્રકરણો ઘણુંખરું ખુલ્લા રસ્તા પરના જ કોઈ દૃશ્ય સાથે ઊઘડતાં હોય છે. ઉઘાડા આકાશ તળેનો એ રસ્તો આપણે નિહાળીએ છીએઃ ચોગમ વ્યાપેલી છે વિશાળ, મહાકાય અને અગોચર વ્યક્તિત્વવાળી જંગલી પ્રકૃતિઃ ધીમે ધીમે કોઈ દૂર દૂરની દૃષ્ટિ કિનારી પરથી માનવી ચાલ્યું આવે છે, એ એકલવાયું માનવ—પાત્ર આપણને પોતાના ઉઘાડ પામનારા જીવન—નાટકમાં એકદમ ઘસડી જાય છે. આજે આ હીકમત જૂની થઈ ગઈ હોવા છતાં આપણને લાગે છે કે હાર્ડીને ઘાટઘૂટની સુંદર દૃષ્ટિ હતી, એના અનેક દોષો છતાં હાર્ડી સાચો વાર્તાકાર હતો. 

ને સાચો વાર્તાકાર એટલે? એટલે એ લેખક કે જે પોતાના વાર્તાપ્રવાહની વચ્ચે પોતાના વિચારો, પોતાના મિજાજો, પોતાની ધૂનો, માન્યતાઓ તેમજ શેખીઓના ઘોડા સીધેસીધા કુદાવતો નથી. સાચો વાર્તાકાર એ, કે જે કદી દલીલો લડાવતો નથી, ઉપદેશ દેતો નથી; અરે, ચર્ચા પણ કરતો નથી.  

આ બધું બેશક એનામાં હોવું જોઈએ, ન હોય તો એને ગમાર જાણવો. પણ પોતાની વાર્તામાં એ બધાંને પેસાડતાં પહેલાં એણે તેમનું પ્રત્યક્ષ ઘટનાઓમાં રૂપાંતર કરી નાખવું જોઈએ. જીવનને વિશે જો તેની પાસે કોઈ સિદ્ધાંતો કે મંતવ્યો હોય, તો જીવન પોતે જેમ પોતાના નિયમોને ઘટનાઓરૂપે વ્યક્ત કરે છે તેમ વાર્તાકારે પણ તે મંતવ્યોને દૃષ્ટાંતોરૂપે જ વ્યક્ત કરવાં જોઈએ.  

દલીલોના કરતાં ઘટના (ભલેને કલાકારની ઉપજાવેલી) વધુ ચોટદાર છે. દલીલ એમાં પૂરેપૂરી ચવાઈને હજમ થઈ ગઈ હોય છે. વાર્તાના દેહમાં એનું રુધિર બનીને ઓતપ્રોત વહેવા લાગે છે. વાર્તાકાર વકીલ બનવાને બદલે સર્જક બની રહે છે. ને વકીલ કરતાં નિયંતા વધુ મહાન છે. વાર્તાકારનું એ બળ છે, એનું એ સ્થાન છે.  

દોસ્તોયેવ્સ્કી કેટલો બધો સિદ્ધાંતઅંધ અને વેદિયો આદમી હતો તેનો વિચાર કરો. એની મહાન વાર્તા 'બ્રધર્સ કારામાઝોવ’માં કેટલો રહસ્યવાદ અને કેટલી બધી ધાર્મિક વિચાર-જટિલતા એણે વણી દીધી છે એનો વિચાર કરો. કોઈ ઊતરતા કલાકારે આ બધી સામગ્રીનું કેવું ખીચડું બાફી માર્યું હોત! છતાં આ સાચા કસબી દોસ્તોયેવ્સ્કીએ એમાંથી 'દોન કિહોતે'ના જેટલી જ સીધી, સુગ્રાહ્ય, સચોટ વાર્તા કોતરી કાઢી છે. 

કારણ કે દોસ્તોયેવ્સ્કીમાં કલાકારપણું સર્વાગ્રે વિરાજે છે, બાકીનું બધું તે પછીનો દરજ્જો ભોગવે છે. બાકીનું બધું લેખકમાં હોવું તો જોઈએ અવશ્ય, નહિતર એ માનવ-પ્રાણી જ ન રહી શકે; ને એને એનું વ્યક્તિત્વ જ ન હોઈ શકે. ને લેખકની વાર્તામાં લેખકનું વ્યક્તિત્વ મહત્ત્વનો ભાગ ભજવી જાય છે: માત્ર આડકતરી રીતે જ નહિ, એટલે કે વિષયની સામગ્રીની, વગેરેની પસંદગીમાં જ નહિ, પણ નિરૂપણની રીતિમાં, પ્રયોગોની પસંદગીમાં, અને વાતાવરણના સર્જનમાં સીધો ભાગ પણ લેખકનું વ્યક્તિત્વ બહુ મોટો ભજવે છે. 

રમતના નિયમો તો અરધા કલાકમાં જ શીખાય છે, પણ એ નિયમોને લાગુ પાડીને રમતાં શીખવામાં જિંદગી ખરચાય છે. એ જ સાચું છે વાર્તાલેખનને વિશે. વાર્તાનો ઘાટ આમ ઘડવો, એનો ઉઠાવ તેમ કરવો, વગેરે નિયમો હું ને તમે સહુ જાણીએ છીએ, જાણી શકીએ છીએ. પણ લખવાનું શીખતા આવરદા વીતે છે. 

દાખલા તરીકે ગ્રીક નાટ્યકારોના કાળથી નિયમ એવો ચાલ્યો આવે છે કે તમારાં પાત્રોને સતત ક્રિયાશીલ રાખો તેમજ એકબીજાથી સંકલિત રાખતા રહો, ને પરાકાષ્ટા આવે ત્યાં સુધી ઉત્તરોત્તર તેમની ક્રિયાને વધુ વધુ પ્રકાશિત કરતા રહો. પરાકાષ્ટા આવે, પાત્રો પૂરેપૂરા રજૂ થઈ જાય, એટલે પછી તો વાર્તાકારે વાર્તાને સમેટી લઈ, પાત્રોને એવા કોઈ ચલણી વાતાવરણમાં મૂકી દેવા કે જેમાં તેઓ વાર્તાની સમાપ્તિ પછી પોતાનું જીવન ચાલુ રાખે એવી આશા બાંધી શકાય. 

આ નિયમને તો આજે દરરોજ, અને દરએક પ્રકારે વાર્તાકારો ઉથાપી રહેલ છે. ઉથાપ્યા છતાંય તેઓ ઊગરી જાય છે. કારણ કે, કલામાં તો એક જ નિયમ સાચો છે: ‘ડઝ ઇટ કમ ઑફ? – બરાબર વહે છે પ્રવાહ?' ચોટ પકડે છે? અનેક નામાંકિત વાર્તાકારોએ નિયમોનાં જડ બંધનોને ફગાવી દેવાની ધૃષ્ટતા કરી છે. પણ એ ધૃષ્ટતાને તેમણે પાછી શોભાવી છે. નિયમની દુનિયાની બહાર નીકળીને સૌંદર્ય તેમજ નવીનતા પકડી લાવવાની તેમની શક્તિ હતી. 

છેલ્લાં પચ્ચીસ વર્ષથી તો સારી દુનિયાની વાર્તાસૃષ્ટિ પર આ બંડખોરોએ પોતાની નૂતન પૃદ્ધતિનો પ્રભાવ પાડી લીધો છે છતાં તેમના જેવી શક્તિ વગર તેમના સરખી ધૃષ્ટતા કરવા જનારા કેટલા બધા લેખકો ફસાઈ પડ્યા છે! 

[અધૂરું]
[જન્મભૂમિ]

🥀 કાઠીઓની ઘોડીનાં રૂપગુણ વર્ણવાય ત્યારે કહેવાય કે નાની એક થાળીમાં ય ઘોડી ચારે પગે રમી જાણે.  

સાહિત્યમાં નવલિકાનું—ટૂંકી વાર્તાનું—શ્રેષ્ઠ રૂપ આ કાઠીની ઘોડી સમું હોય. નાના એવા પ્રસંગને કૂંડાળે વાર્તા હળવે પગે રમણ કરે. 

 'ગુજરાત'નો માર્ચ અંક ‘એકલો’ નામની મુરલી ઠાકુરે લખેલી નવલિકા ધરે છે. સ્મશાનમાં એક મુર્દુ બાળી રહેલા ડાઘુઓના નાના—શા વાર્તાલાપમાં જ આખી નવલિકા રચાય છે. ને એના આખા ચિતારમાં જે પરિપૂર્ણતા સાધી શકાઈ છે તે વિરલછે. 

શબના રહ્યાસહ્યા અવશેષોને ‘નાખ થોડું ગ્યાસલેટ ને મૂક એક કાંડી!’ કહી ઝટ પતાવવા અધીર ડાઘુઓ જે નિર્મમ, ટીખળી ભાષામાં આ સળગતા જુવાનના ભગ્નાંશ સ્નેહની વાત કરે છે તેમાંથી જ એ સામાન્ય બની ગયેલ વિષયની માર્મિક કરુણતા ઊઠેછે. 

વિષયો કદી જૂના થતા નથી. જીવનની સમસ્યાઓ તો એ—ની એ જ હોય છે. નવીનતા રહેલી છે એના આયોજનમાં. સાથે ભણનારી કન્યાના સ્નેહમાં નિષ્ફળ બનેલો જુવાન લાગતું નથી કે બહુ બહુ આલેખાયો છે! છતાં આજે ચિતાને બાળવાની ક્રિયા કરતાં કરતાં નર્યા ઠેકડીભર્યા વાર્તાલાપમાં એનો ઉઠાવ થતા વિષયને કેટલી તાજગી મળી ગઈ! 

કથાનું કથન—સ્વરૂપ નવીનતા માગે છે. એકાદ આગગાડીની ટૂંકી મુસાફરીમાં, એકાદ મહેફિલમાં, એકાદ ચિતા પરનાં ટોળટપ્પામાં, અરે, એક આયરીશ લેખકે કરી દેખાડ્યું છે તેમ તો નદી કાંઠે કપડાં ધોતી બે ઓરતોની ગોઠડીમાં પણ નવલિકા પોતાની જાતને કંડારી લે છે. મસાણના વાર્તાલાપનો આ પ્રયોગ નવો જ છે. 

[બે ઘડી મોજ, 29-3-1936]

~ જન્મભૂમિમાં, ઝવેરચંદ મેઘાણી


પ્રારબ્ધ

એક સંત પાસે એક, વહાણવટું કરતા વેપારીભાઈ મળવા આવ્યા. વેપારીની સ્ટીમરો દેશ-પરદેશમાં ફરતી હતી. પણ મહાત્માને મળવા આવ્યા ત્યારે ધંધામાં ભારે ખોટ ગઈ હતી. સ્ટીમરો ડૂબી ગઈ હતી. માથે ખૂબ દેવું થઈ ગયું હતું. મહાત્મા પોતાની ગૂઢ શક્તિથી જોઈ શક્યા કે આના પ્રારબ્ધમાં હમણાં ખોટ જ છે. પાંચ-છ વર્ષ આવું જ ચાલશે. તેનાં પાપકર્મનો ઉદય થતો હતો. જ્યોતિષશાસ્ત્ર પ્રમાણે ભાઈની પનોતી બેઠી હતી. છતાં મહાત્માએ કહ્યું કે જો ભાઈ હમણાં તારો સમય ખરાબ છે. પણ એક ઉપાય છે. જો આ સામે બેઠેલા ભાઈને તારા ધંધામાં ભાગીદાર બનાવે તો તારો ધંધો સારો ચાલવા માંડશે.
 
પેલા વેપારીએ મહાત્માની વાણીમાં શ્રદ્ધા રાખી, પેલા ભાઈને ભાગીદાર બનાવ્યા. આ બીજા ભાઈ પાસે પૈસા નહિ, છેવટે શુકનનો એક રૂપિયો લઈ સ્ટેમ્પ પેપર પર નક્કી કર્યું કે જે કંઈ નફો થાય તેમાં તમારો ભાગ ૨૫ ટકા રહેશે. હવે વેપારી ભાઈનો ધંધો તો ત્રણ વર્ષમાં ખૂબ જ સારો ચાલ્યો. બે-ત્રણ સ્ટીમરો ખરીદી, અઢળક પૈસા આવ્યા, પણ વેપારીભાઈને પેલો બીજો ભાગીદાર આંખમાં કણાની જેમ ખૂંચવા લાગ્યો. થયું કે બધી મહેનત, શક્તિ મારી, જ્યારે આને તો બેઠાં બેઠાં જ ભાગ લેવાનો ! ભાગીદારીના લગભગ દોઢથી બે કરોડ ચૂકવવાના આવ્યા. અલબત્ત, પોતાને તો આનાથી ઘણો બધો નફો થયો હતો છતાં એક રૂપિયાના રોકાણના બદલામાં આટલા બધા રૂપિયા શી રીતે અપાય ? થયું કે મહાત્માજીએ મને ખોટે પાટે ચડાવી દીધો. ભાગીદારને રકમ ચૂકતે કરી ભાગીદારી નાબૂદ કરી દીધી, પણ વિધિની કરામત જુઓ. જે વેપાર સરસ ચાલતો હતો, જેમાં લાખોનું ભાડું મળતું હતું તેમાં તરત જ ખોટ આવી. બે મહિનાની અંદર એક સ્ટીમર અને બીજા બે મહિનામાં બીજી બે સ્ટીમરો ડૂબી ગઈ. વીમાનું પ્રિમિયમ પણ ભરાયું ન હતું.
 
હવે પેલા વેપારીભાઈ તો વળી પાછા સંતને મળવા આવ્યા. રોતાં-કકળતા કહ્યું કે બા૫જી આપના કહેવા પ્રમાણે કર્યું છતાં વેપારમાં તો પાછી ખોટ ઊભી છે. મહાત્માએ કહ્યું કે એ કેમ બને? પેલા બીજા ભાગીદારના નસીબમાં કરોડોની કમાણી છે, તમારા નસીબમાં અઢળક પુરુષાર્થનું બળ છે. મારી ગૂઢ શક્તિથી મેં તમારા બંનેનો સમન્વય કરાવી આપ્યો હતો એટલે આ વાત બને જ નહિ. અંતે વેપારીભાઈને પોતાની ભૂલ સમજાઈ. પેટછૂટી વાત સંતને કરી. સંતે કહ્યું કે 'સંશયાત્મા વિનશ્યતિ'.

~ આજ્ઞાચક્ર પુસ્તકમાંથી, લેખક વિભાકર આર. પંડયા  

કૃષ્ણ, ધર્મ, અને પ્રતિજ્ઞાભંગ

કૃષ્ણને ધર્મ સામેનું જોખમ પજવે છે એટલું પ્રતિજ્ઞા સામેનું કે નિયમ સામેનું જોખમ નથી પજવતું. કૃષ્ણને કોઈ પ્રતિજ્ઞા તૂટે કે નિયમ તૂટે તે સામે એટલો વાંધો નથી, જેટલો ધર્મ તૂટે તેની સામે છે. પ્રતિજ્ઞાભંગ ગૌણ છે અને નિયમભંગ પણ ગૌણ છે, પરંતુ ધર્મની ગ્લાનિ ગૌણ નથી. કૃષ્ણ આવા વ્યાપક ધર્મના સંરક્ષક (ધર્મગોપ્તા) હતા.

મહાભારત - માનવસ્વભાવનું મહાકાવ્ય પુસ્તકમાંથી, લેખક ગુણવંત શાહ


ધનની અચોક્કસતા અને એના નિવારણના ઉપાયો

ધનની અચોક્ક્સતાને દુર કરવાનો ઉપાય છે - દેણું ના કરવું અને બચત કરવી. દેણું ફક્ત બીજા પાસેથી પૈસા ઉછીના લેવાથી જ નથી થતું. ખોટું રોકાણ પણ તમને દેણાંદાર બનાવે છે. કેમકે, છેલ્લે તો એ તમારે માથે જ આવશે ને (જેમ દેણું માથે આવે એમ)! એટલે દેણું ના કરવામાં પૈસા ઉછીના ના લેવાની સાથે ખોટું રોકાણ ના કરવું એ પણ આવે છે.

બચત કરવામાં આવક નો એક હિસ્સો બચત રૂપે મુકવો એટલું જ નથી આવતું. આધુનિક સમયમાં બચતની પરિભાષા બદલવી પડશે. બચત કરવી એટલે આવક વધારવી પણ થાય. કેમ કે, બચતનું સમય સાથે અવમૂલ્ય થતું જાય છે એટલે આવક જ એને સરભર કરી શકે. કુલ આવકનો 10% હિસ્સો તો બચતમાં મુકવાનો જ છે પણ સાથે સાથે આવકના સ્ત્રોત પણ ઉભા કરવા રહ્યા.

આવકના સ્ત્રોત વધારવાથી અનિશ્ચિત્તતા અસરકારક રીતે દૂર થઇ શકે. પણ આવકના સ્ત્રોત વધારવામાં કેટલીક બાબતોનો ખ્યાલ રાખવો જરૂરી છે.

  • આવકનો સ્ત્રોત વધારવામાં હદ કરતા વધુ રોકાણ ના કરવું, એનાથી ન ભરી શકાય એવું દેણું આવવાનો ડર રહે.
  • આવકનો સ્ત્રોત વધારવા જતા ક્યાંક મુખ્ય આવકના સ્ત્રોત વિષે બેધ્યાન ન થવું. એનાથી બીજી આવક તો આવતા આવશે પણ મુખ્ય આવક જવાની સંભાવના વધી જશે.
  • અનૈતિક(=unethical) આવક સંપૂર્ણપણે વિનાશક છે. એ તમને અને જે એ આવકનો ઉપયોગ કરશે એ બધાને અધોગતિ તરફ લઇ જશે.

બજારનું અને તમારી આસપાસનું યોગ્ય અને તલસ્પર્શી વિશ્લેષણ કરવાથી તમને બીજી આવકના સ્ત્રોત માટેના માર્ગો મળી શકે. વિશ્લેષણમાં સમસ્યાઓ પર વધુ ધ્યાન આપો. આ સમસ્યાઓનું સમાધાન જ તમારી આવકનો બીજો સ્ત્રોત બની શકે. સમસ્યાના સમાધાનને પહેલા સમાધાન તરીકે જ મુલવો અને પછી એમાં આવકની ગણતરી કરવી. આમ કરવાથી, ખોટા રોકાણથી બચી શકાય. કેમ કે, કેટલીક સમસ્યાઓનું સમાધાન/નિરાકરણ વગર પૈસે પણ થઇ શકે છે. 

સમસ્યાઓના નિવારણના એક કરતા વધુ રસ્તાઓ છે. તો સમસ્યાને એક દિશાએથી ના વીંધતા અલગ અલગ દિશાઓથી નિવારણના ઘા મારી શકાય છે. જેમકે, GMDC વિસ્તારમાં શુદ્ધ હવાને લગતી સમસ્યાઓ છે. એનો ઉપાય છે, કે તમે ત્યાં શુદ્ધ હવા વેચો. પણ, આ બાલિશ વિચાર છે. કેમ કે, બોટલમાં કોઈ હવા નહિ ખરીદે. તો તમે ત્યાં સુગંધિત પદાર્થ વેચી શકો જે હવાની દુર્ગંધને દૂર કરી શકે. અથવા તો કારખાનાને હવા ખેંચનાર વિશાળ પંખા વેચી શકો જે હવાને ખેંચે. અથવા તો ચીમની માટે જ એવો પદાર્થ વેચો કે જ ધુમાડો બહાર ન આવવા દે. તો આ સમસ્યા લોકોની હતી પણ એનું નિરાકરણ બંને બાજુથી વિચારી શકાય - એ કે જેને સમસ્યા છે, અને એ કે જે સમસ્યાનો સ્ત્રોત છે.

આ ઉપરાંત જયારે તમારા વિચારો આવકના સ્ત્રોત વિશે સતત ચાલુ રહે છે, ત્યારે આકર્ષણના સિદ્ધાંત મુજબ તમને એના માર્ગો આપોઆપ મળી આવશે અથવા તો તમને એવા લોકો મળશે જેની પાસે માર્ગ હોય અને તમારી મદદ ઇચ્છતા હોય. અહીં, આગળ-પાછળનો વિચાર કરીને હા/ના પાડી શકાય. આ ઉપરાંત, તમારા વિચારો ઉપર પણ ધ્યાન રાખવું જરૂરી છે. કેમ કે, જયારે તમે વગર મહેનતની આવક વિષે વિચારતા હશો ત્યારે તમને એવા લોકો મળશે જેમને પણ એવી આવકની ઈચ્છા હોય અથવા જો તમે જલ્દી(=shortcut)થી કમાવા ઇચ્છતા હોય તો તમને એવા લોકો મળશે જેમને પણ એવી રીતથી જ પૈસા કમાવા હોય. અને અંતે જયારે તમે આગળ/પાછળનો વિચાર કર્યા વગર ફક્ત આવક ના સ્ત્રોત વિષે જ વિચાર અને સતત ચિંતન ચાલુ હોય તો તમને ધુતારા પણ મળી શકે.

જો આવકના સ્ત્રોતનો કોઈ એક માર્ગ મળે એમ ના હોયતો એક કરતા વધુ માર્ગ પણ વિચારી શકાય અને એ માર્ગોની અજમાયશ પણ કરી શકાય એમ કરવાથી સફળ થવાની તકો વધશે. અહીં ફરીથી એ ધ્યાન રાખવું ઘટે કે રોકાણ વધુ ના થઇ જાય.

એવા ઘણા કામ છે જે આપણને ખબર છે કે, લાંબા ગાળા સુધી કરી શકાશે નહિ. આ પરિસ્થિતિમાં એવું વિચારવું રહ્યું કે, કેમનું આગળ વધવું. કોઈક વાર એવું પણ બને કે એ કામ આપણે કરવું પડે જેથી એમાંથી થતી આવકનો ભવિષ્યમાં આપણે જે બીજા કામ કરવા ઇચ્છીએ છીએ એમાં રોકાણ કરી શકીએ. ફરીથી અહીં એ ખાસ ધ્યાન રાખવું કે, એ ટૂંકા ગાળાની આવક ખોટા રસ્તેથી ના આવતી હોય.

અંતે બે બાબતોનો ઉલ્લેખ સાથે આ લેખને અલ્પવિરામ રાખીએ.

એક, આવકનો સ્ત્રોત નક્કી થયા બાદ જયારે નફાની ગણતરી કરવામાં આવે ત્યારે એ  વાજબી હોવી જોઈએ. જો તમે કોઈ એક વસ્તુ ઉપર 22% નફફો રાખો છો તો એ 22% વાજબી હોવા જોઈએ, એની પ્રમાણમાં મહેનત હોવી જોઈએ, એના પ્રમાણમાં રોકાણ હોવું જોઈએ, એના પ્રમાણમાં જોખમ હોવું જોઈએ. જો એ વાજબી નથી તો એ આવકનો અમુક ભાગ વગર મહેનતનો છે.

બીજું, પહેલાના સમયમાં આવકના 4 ભાગ પાડવામાં આવતા - 25% ભાગની બચત, 25% ભાગ વાપરવાનો, 25% કરમાં, અને 25% લોકકલ્યાણમાં. પણ આધુનિક સમયમાં આ શક્ય નથી. મુડીવાદે પરિસ્થિતિ ઘણી જટિલ બનાવી દીધી છે. તો પણ 10% લોકકલ્યાણમાં વાપરવું. કેમકે જે તમારી આવક છે, એ ફક્ત તમારી જ નથી. તમે જે જગ્યાએ કારખાનું નાખ્યું છે તે પેલાં ઘણા બધા જીવજંતુનું અને પ્રાણીઓનું ઘર હતું. પ્રાયશ્ચિત સાથે જે સેવા થઇ શકે એ કરવી ઘટે. બાકીતો આ ન દેખાય એવું દેણું જ છે, જે તમારે ઘણા જન્મ સુધી વેઠવું પડશે.


સિંહાસનારૂઢ અન્યાય

કૃષ્ણ: "પણ અન્યાયને સિંહાસન-ચ્યુત કરો ત્યારે તે અટકશે, અન્યાયને પંપાળવાથી નહીં. દુર્યોધન જેવા દુર્જનો જગતમાં ઘણાય છે પણ તે સિંહાસને નથી તેથી તેમનાથી જગતના અનાથોને અન્યાય થઈ શકતો નથી. આ અન્યાય સિંહાસનારૂઢ છે. નથી તે ભીષ્મને ગાંઠતો, નથી દ્રોણને સાંભળતો. ગાંધારીની પ્રાર્થના તો તેના કાનને પણ પહોંચતી નથી તો મારી શી વાત! તે દહાડે કૃષ્ણાની લજ્જાનું રક્ષણ ભીષ્મ, દ્રોણ, વિદુર કરી શક્યા નહીં, ધન્ય છે તે ન્યાયનિષ્ઠ સત્પરાયણ ગાંધારીને. એણે સંતાનને જ ત્યજવાનું કહ્યું પણ ત્યાં સભા સૂનમૂન રહી. એને આપણે નહીં બચાવી શકીએ." 

~ કુરુક્ષેત્ર પુસ્તકમાંથી, લેખક: મનુભાઈ પંચોળી 'દર્શક'

આજનો શબ્દ: નવેણ

નવેણના ઘણા બધા અર્થો છે, પણ એમનો એક અર્થ છે - જ્યાં નાહ્યા ધોયા વગર જઈ ન શકાય એવી જગ્યા. તો તમે પૂજા ઘરને અથવાતો મંદિરને પણ નવેણ કહી શકો. પણ, આ શબ્દ રસોડા સાથે વધુ વપરાય છે. તો તમે રસોડાને બદલે એને નવેણ પણ કહી શકો.


કાવ્યાનુભવ

“કાવ્યાનુભવ લઈ લીધા પછી ભાવક પાછો વ્યવહાર—જગતમાં આવે છે ત્યારે, કાવ્યનો અનુભવ સાથે લઈને આવે છે. તેના પૂર્વના અનુભવમાં કાવ્યનો અનુભવ ઉમેરાય છે, તેની સાથે એકરસ થઈ જાય છે, પરિણામે ભાવક વ્યવહાર—જગતનો અનુભવ પણ કંઈક વધારે રહસ્યપૂર્વક કરતાં શીખે છે. જગતને સમજવાની તેની શક્તિ વધેલી છે. કાવ્યથી તે વધારે સંસ્કારી થયો છે.” - શ્રી રામનારાયણ વિ. પાઠક

~ તર્કબદ્ધ પૃથક્કરણશીલતા વિવેચનની વિઘાતક? લેખ જન્મભૂમિમાં, ઝવેરચંદ મેઘાણી 


હાર્મોની

મહાવિદ્યાલયના પ્રાધ્યાપકને એનાં એક વર્ગનાં વિધાર્થીઓ આમંત્રણ આપ્યું. આમંત્રણ હતું, મહાવિદ્યાલયના વાર્ષિક સમારંભમાં સ્તુતિગાનનું. આ વિધાર્થીઓનું પોતાનુ એક બેન્ડ હતું. પ્રાધ્યાપકએ સમારંભ ગયા, એમને આમનું સ્તુતિગાન ઉપરાંત બીજી સુરાવલીઓ પણ સંભાળી અને ખૂબ ખુશ થઈ ગયા. જેવું એમનું પત્યું કે, પરદા પાછળ ગયા બધાંને અભિનંદન આપવા, આશિષ આપવા. 

પેલાં મળ્યા ગાયક ને. કીધું, "તારુ કામ ખૂબ જ શાનદાર હતું, એમાં પણ છેલ્લે જે, રાગોનું પશ્ચાતસંગીત સાથે મિશ્રણ હતું એતો અદભૂત હતું." પછી મળ્યા, વીણા વગાડનારને. એનાં માટે પણ પ્રાધ્યાપક પાસે ઉદગાર વચનો જ હતા. "અકલ્પનીય. મેં આજે પહેલી વાર વીણાને આટલી રસથી સાંભળી, એમાં પણ તે જે વચમાં, ડ્રમવાળા સાથે તાલ પર તાલ મેળવ્યો હતો એતો રસાકસી વાળો થઈ ગયો હતો. ખૂબ સરસ, ખૂબ આગળ વધો" એમ કરતાં બેન્ડના એક-એક વ્યક્તિને મળ્યા અને બધાને એમને અભિનંદન અને શુભેચ્છાઓ પાઠવી.  

છેલ્લે એક વિધાર્થીને મળ્યા ત્યારે પ્રાધ્યાપકે પૂછ્યું, "તું? તું ક્યાં હતો? તને કેમ ના જોયો મેં?" વિધાર્થી કે, "હું બધાની પાછળ હતો, હું લાઈટીંગનું સંભાળતો હતો" પ્રાધ્યાપકને ત્યારે ખ્યાલ આવ્યો કે, હા આમાં લાઈટિંગ પણ હતી. પણ એ સંગીત સાથે એટલી મળતી આવતી હતી કે, એના હોવાનો અહેસાસ જ ના થયો, જાણે લાઈટ હાર્મોની(=સંવાદિતા)માં કેમ ના હોય! 

ભભકો તમને અલગ પડે છે, પણ હાર્મોનીમાં હોવું એક કળા છે, જે એટલી તો સામાન્ય લાગે છે, કે જાણે શ્વાસ લેવું! પણ જ્યારે એમાં ઓછું-વધુ થાય છે, ત્યારે ખબર પડે છે, ત્યારે હાર્મોનીની સમજાય છે.

તળાવમાં પાણી છે, વર્ષોથી ગામના લોકો એ વાપરે છે, એમના માટે એ મોટી વાત નથી, પણ કાળઝાર ગર્મી અને લાપરવાહીથી એ સૂકાઈ ગયું, પછી અચાનક એનાં ન હોવાનો દુઃખદ અહેસાસ થયો. 

હાર્મોની માધ્યમ માર્ગ છે, ભગવાન બુધ્ધ કહે છે એ.


એકાગ્રતા

એકાગ્રતા કેળવવા માટે જરૂરી છે - બ્રહ્મચર્ય, ધ્યાન, અને સતત અભ્યાસ. પણ આ એક જ માર્ગ નથી. એકગ્રતા અનેક માર્ગેથી આવે છે. દ્રોપદીને પામવાની તીવ્ર ઇચ્છાથી જ અર્જુન મત્સ્યવેધ કરી શક્યો, તો કર્ણની એકાગ્રતા એની અર્જુન પ્રત્યેની વૈર ભાવનાને આભારી હતી, વળી શ્રી રામકૃષ્ણ પરમહંસની એકાગ્રતા એમની ભક્તિને લીધે હતી. 
જીવનમાં સંભાવનાઓ અસીમ છે. એમાં ઉપર જણાવેલ મુખ્યમાર્ગની સાથે આ અપવાદરૂપી કેડીઓ પણ છે. ઘણીવાર મુખ્યમાર્ગ કરતાં કેડીઓ વધારે જલ્દી પહોંચાડવાની.

તમારી કમિટ્સમાં જાહેરાતો બતાવવાનું બંધ કરો!

નોંધ: આ એક ભાષાંતરીત લેખ છે, જેનું ભાષાંતર Stop advertising in your commits! લેખમાંથી કરવામાં આવ્યું છે. 

Co-authored-by: ur mom 

મને સમજાતું નથી કે લોકો શા માટે કંપનીઓની આ પ્રકારની જાહેરાતોને પોતાનાં જાહેર પ્રોજેક્ટમાં ઉમેરવામાં માટે રાજી છે, એ પણ આનંદ સાથે અને મફતમાં (એની સામે એ કંપનીઓ તો તમારી પાસેથી સભ્યપદના નાણા તો વસુલે જ છે). 

"Assisted by blabot", "co-authored-by: slopgpt", "sent from my fartphone" 

શું કામ? આ એક ચોખ્ખી દેખાય એવી જાહેરાત છે. હું શરત મારીને કહી શકું કે તમે એડ-બ્લોકર વાપરતાં હશો, અને છતાં તમે અહીં જાહેરાતને આવવાં દો છો.

બંધ કરો આને. 

"AI"ના વપરાશ વિશે જો તમારે ખુલાસો આપવો પડે એવો હોય તો મર્જ રીક્વેસ્ટ માં લખો કે "generated by an LLM". એમાં કમિટ્સમાં ક્યાં લખવાની જરૂર છે! દૂર રાખો એને કમિટ્સથી. કમિટ્સ ટેક્નિકલ માહિતી માટે છે, ના કે જાહેરાતો માટે. કંપનીઓને આ પ્રકારની જગ્યા આપીને જાહેરાત ન કરવા દો. એનાથી પણ સરળ છે, કે આ પ્રકારના ટૂલ્સ જ ન વાપરો. 

કોઈ પણ પ્રકારની જાહેરાતો જે તમારી કમિટ્સમાં, ઇમેઇલમાં, કે કોઈ અન્ય પ્રકારના મેસેજમાં ઉમેરાય છે, એ બધી બંધ થવી જોઈએ.

આવી જાહેરાતોની જરૂર નથી. 


ભગવાન શ્રી કૃષ્ણની નિઃશસ્ત્ર રહેવાની પ્રતિજ્ઞા

ધૌમ્ય બાજોઠ પર બેસતાં ફરી કહે, 'એક શંકા હવે મટાડશો? યુદ્ધને વિષે આપ આટલા ઉત્સાહી છો તો નિઃશસ્ત્ર રહેવાની પ્રતિજ્ઞા કેમ કરી?' હસતાં હસતાં ઉમેર્યું, 'તો પછી અમને તેવું મન ન થાય?' 

'એ મારું રહસ્ય છે પણ તમે પાંડવોના હિતસ્વી ને કુલગુરુ, તમને કહેવામાં અણઘટતું નથી. પહેલું તો એ કે હું નિઃશસ્ત્ર છું, નિષ્પક્ષ નથી.'

'એ સ્પષ્ટ છે.'

'બીજું, હું યુદ્ધ વિષે ઉત્સાહી નથી. પણ અન્યાયનિવારણ માટે ઉત્સાહી છું. આનંદ શેમાં છે તે તો તમે જાણો છો.' કહી દૂરથી આવતા વેણુ સૂરોમાં તેઓ ઘડીક તલ્લીન થઈ ગયા. પછી આગળ નિશ્વાસ નાખીને કહે, 'પણ એક વાર કૃષ્ણાની લજ્જાને આવરી છે. ફરી ફરી હું જ તે કાર્ય કરું તો તેના પતિઓનું ગૌરવ શું? અર્જુન, ભીમ આ યુદ્ધ જીતે તે મારી મનીષા છે. હું તેમનો સારથિ થાઉં. એ દહાડે તો તેઓ ધર્મદાસ હતા એટલે હું દોડી આવ્યો. કૃષ્ણાની લજ્જા રહી મારો મહિમા થયો પણ પાંડવો નષ્ટતેજ થયા.'

ધૌમ્ય કહે, 'ને સભા પણ.' 

શ્રીકૃષ્ણ કહે, 'સભા હતી જ ક્યાં? ત્યાં તો ભીરુઓ ને સંશયાત્માઓનો શંભુમેળો હતો. તે સભા હોત તો કુરુક્ષેત્રની આ વેળા જ ન આવી હોત.'

~ કુરુક્ષેત્ર પુસ્તકમાંથી, લેખક: મનુભાઈ પંચોળી 'દર્શક'


આજનો શબ્દ: ઊંટવૈદું

એક ગામમાં એક ઊંટ માંદું પડ્યું. ઘરડા લોકોએ ભેગા થઈને તપાસ કરી, તો તેના ગળામાં કશાકનો ડૂચો ભરાયો  હતો તેથી તે ગૂગળાતું હતું એવું જણાયું, એટલે એક શાણા માણસે એના પેટમાં જેરથી લાત મારી. લાત વાગતાં ઊંટ ચમક્યું, ને પેલો ડૂચો ફટ દઈને નીકળી ગયો, ને ઊંટ સારું થઈ ગયું.
આ બનાવ ત્યાં ઊભેલા એક ભાઈને જોવામાં આવ્યો. એ વૈદું કરતા હતા. ગૂંગળામણનો આ સીધો ને સાદો ઈલાજ તરત એના ધ્યાનમાં બેસી ગયો. એક દિવસ એને ત્યાં એક ડોશી આવી. એને ગળામાં કફ ભરાઈ ગયો હતો. તેથી શ્વાસ લેવાતો નહતો. પેલા મુરખ માણસને ઊંટવાળો કિસ્સો યાદ આવ્યો કે પેટમાં લાત મારવાથી ઊંટ સાજું થઈ ગયું હતો, એટલે એણે આ ડોશીની બાબતમાં પણ એ જ ઇલાજ અજમાવ્યો, ને ડોશીના પેટમાં જોરથી પાટુ માર્યું.
ડોશી ત્યાં ને ત્યાં મરી ગઈ લોકો ભેગા થઈ ગયા, ને ડોશીને લાત મારવાનું કારણ પૂછતાં “વૈદરાજે” ઊંટનો દાખલો આપ્યો.
તે ઉપરથી, અનાડી વૈદ, અથવા પોતે નહિ જાણતો હોય તેવો ધંધો કરનારને “ઊંટવૈદ” કહેવામાં આવે છે. 
~ કહેવત-કથાનકો પુસ્તકમાંથી, લેખક સ્વામી શ્રી પ્રણવતીર્થજી


Hollywood Principle

જો તમે વેબ ડેવલપમેન્ટ(=web development) વિષે જાણતાં હોય (કે પછી ના જાણતાં હોય), તો એમાં વેબ ડેવલપમેન્ટ સરળ અને ઝડપી કરવા માટે લાઇબ્રરી(=library) અથવા તો ફ્રેમવર્ક(=framework)નો ઉપયોગ થાય છે. આમતો બંનેનું કામ એક જ છે, પણ લાઇબ્રરી અને ફ્રેમવર્કમાં કેટલોક તફાવત છે. આ તફાવતોમાં મુખ્ય તફાવત છે - હોલીવુડ સિદ્ધાંત(=Hollywood principle).

જો તમે લાયબ્રેરી વાપરતાં હોય તો તમારી જવાબદારી આવે જેનો પણ ઉપયોગ કરતાં હોય એ ફંકશનને કોલ કરવાની. જયારે ફ્રેમવર્કમાં એ જે પ્રમાણે કહે એ રીતે આપણે ફંકશન લખવાનાં અને પછી ઈ જાતેજ કોલ કરી લેશે. તો આ થયો હોલીવુડ સિદ્ધાંત. 

થોડું વિસ્તારથી સમજીએ.

હોલીવુડના કોઈ ચલચિત્રમાં તમારે કામ કરવું હોય તો તમારે એના માટે, અભિનયની કસોટી(=audition) આપવી પડે. કસોટી આપ્યા બાદ, દિગ્દર્શક(=director) કહેશે કે, જે પણ જવાબ હશે એ ફોન કરીને કહીશું, પણ તમે ફોન ના કરતાં, જો હા હશે તો આમે જ સામેથી ફોન કરીશું. તો આ થયો હોલીવુડ સિદ્ધાંત - તમે ના પૂછતાં હું તમને જાતે જ જણાવી દઈશ જો હા હશે તો.

થોડાં સમય પહેલાં, મારી એક વસ્તુ ખરીદવી હતી. તો મેં ભાવ માટે પૂછપરછ કરાવી. ભાવ થોડા વધુ લાગ્યા એટલે મેં મને પોસાતાં ભાવ કીધા. ત્યારે એને મને આ વાત કહી, તમારો ભાવ મને મળી ગયો છે, હું વિચારીને જવાબ આપીશ. પણ તમે ફોન ના કરતા, હું તમને જાતેજ ફોન કરીશ જો આ ભાવમાં મને પોષશે તો. અને મને હોલીવુડ સિદ્ધાંત/પ્રિન્સીપાલ યાદ આવ્યો.


રાજકારણની વાતો

જેને પોતાની શક્તિ અને સમયનો ઉત્તમ ભાગ રાજકારણી વાતોમાં જ રોકવો પડે છે અથવા રોકવામાં મજા પડે છે એ પ્રજાના મને તો પાયા ખવાતા લાગે છે.

~ "સાહિત્ય ઉપર આક્રમણો" લેખ જન્મભૂમિમાં, ઝવેરચંદ મેઘાણી


લહીઆઓ પુસ્તક લખતાં લખતાં સહેજ ઊઠવું હોય અથવા લખવાનું તે દિવસ માટે કે અમુક વખત માટે બંધ કરવું હોય તો  અક્ષર ઉપર અટકતા નથી. કારણ કે તેઓ માને છે કે, સ સંદેહ ધરે.


મહેંદી તે વાવી માળવે ને એનો રંગ ગયો ગુજરાત રે

પાટણના કર્ણદેવ સોલંકીના ભાઈ સાથે માળવાના પરમાર વંશની કુંવરીના વિવાહ થયા અને કહેવત પડી: મહેંદી માળવે, સુગંધ ગુજરાતે. એ કહેવત પરથી કવિ ઈન્દુલાલ ગાંધીએ દિયર-ભોજાઈના સ્નેહનું આલેખન કરતું અદભૂત ગીત લખ્યુ. મહેંદી તે વાવી માળવે ને એનો રંગ ગયો ગુજરાત રે...

હશે, એને વધુ જરૂર હશે!

મહેશે બધાંને કીધું કે, "એવું હોય તો હું અને કાનો અહીં ઉભા રહી તમારા ચપ્પલનું અને સામાનનું ધ્યાન રાખીશું, તમે દર્શન કરી આવો. તમે પાછા આવીને આગળનું જે હોય એ કરજો અને હું ને કાનો પછી દર્શન કરી આવશું." 

ઘરના બધાં સભ્યો પોત-પોતાનાં ચપ્પલ મૂકતા હતા ત્યાં મહેશની પત્ની પણ ભાવિકા મહેશ પાસે આવી ચપ્પલ મૂકતી હતી. એને જોઈને મહેશે કીધું, "આને કુદરતની કરામત કેવાય, જે દિપકભાઈ પહેલા ભગવાનમાં માનતાં ન હતાં એ આજે દીકરીની બાધા પુરી કરવા બળિયા બાપજીના મંદિર આવ્યા છે" ભાવિકાને એ વાત કરતાં સમાનની સાચવણીમાં વધુ રસ હતો એટલે એને ટૂંકમાં જવાબ આપતા, "હોય, માં-બાપ સંતાન માટે બધું કરવાં તૈયાર થઈ જાય અને..." વાક્ય પૂરું નથી થયું ત્યાં બાજુમાં સિક્યોરિટીવાળા દાદા વાત ઉપાડતાં બોલ્યાં, "આને જ કુદરતનો ખેલ કે'વાય ભલભલાંને આ ખેલ રમવો પડે જેમ રમાડે એમ" પણ ભાવિકાને દર્શન કરવાં જવાની ઉતાવળ હતી એટલે એને એનું ચાલુ રાખ્યું કે, "...અને આ બધાં સામાનનું ધ્યાન રાખજો, આઘા પાછા થતાં નહીં, અમે આવી પછી જ ગુલ્લી મારજો" અને ભાવિકા બધા લોકો સાથે દર્શન કરવાં ગઈ. 

કાનાને સિગરેટ પીવાની ઈચ્છા થઇ એટલે એને ગુલ્લી મારી. મહેશને બીજું કાંઈ કામ ન હતું એટલે એને પેલા દાદા પાસે જઈને વાતનો છેડો પકડતા વાત આગળ ચલાવી, "કુદરતનો ખેલ બધાને રમાડે, તમને તો મારા કરતા વધુ અનુભવ હશે, એકાદ અનુભવ તો કહો". 

દાદાની આંખમાં ચમક આવી, આજે ઘણાં સમયે કોઈ એની પાસે આવ્યું છે, અને સંભાળવા માગે છે, અને એ પણ અનુભવ. દાદાએ આંગળી ચીંધી એક દરવાજાને ટેકે બેસેલા બીજા દાદાને દેખાડી વાત ઉપાડી, "એ ખીમો, મારો કુટુંબી ભૈ થાય, મારી ભેગું આયા જ નોકરી કરતો હતો. હવે એને સારું નથી રેતુ એટલે નોકરી નથી રૈ, ત્યાં રોજ બેસે. એનો સમય હતો ત્યારે આયા મંદિરનાં દરવાજા પાસે છાસ-પાણી વેચવાવાળા પાસેથી ઘણું પડાવીને ખાધું. એ દુઃખિયા આને જ્યાં સુધી લાંચમાં છાસની ૩-૪ કોથળી આપે નહિ ત્યાં સુધી આ એમણે મંદિરના દરવાજા પાસે છાસ વેચવાના દે".

"૩-૪ છાશની કોથળી જોતી પીવામાં".

"નારે રે નાં, એક છાશની કોથળી શું અડધી પણ બહુ કે'વાય, આતો શરૂઆતમાં એક માગતો, પછી ધીમે ધીમે લાગ્યું કે આ લોકો મારુ કંઈ કરી નથી શકવાનાં એટલે વધુ નફ્ફટાઈ ચાલુ કરી પેલાં બે માંગવાની ચાલુ કરી, પછી ત્રણ, પછી તો ચાર ને પાંચ પણ, પૂનમના દિવસોમાં તો પૈસા પણ પડાવી લેતો."

"લોભ જાગ્યો આતો"

"મહેનત નથી કરવાની ને!"

"પછી?" 

"એકની પાસેથી છાશ પડાવતો, બીજા પાસેથી પાણી, ત્રીજા પાસેથી રસ તો ચોથા પાસેથી પૈસા. આજ એની નોકરી થઇ ગઈ હતી. બપોર અને સાંજ પડે એટલે ઘરે બૈરી છોકરાં ને આપી આવતો. કોઈક વાર જો પાણીપુરી વાળો મળી જાય તો એનું પણ કરી નાખતો. રોજનું રોજ આવવા માંડ્યું એટલે ઘરનાને પણ આ ખાવાની ટેવ પડી ગઈ. કોઈક દિવસ જો ખાલી હાથે જાય તો ઘરનાં ટોણા મારે."

દાદા ક્યાંક દૂર આકાશમાં જોતા હોય એમ વાત ચાલુ રાખી, "મને એ દિવસ બરોબર યાદ છે, આ બાજુવાળા પરાની સતુડોશીએ છાસ વેચવાનું ચાલુ કર્યું હતું, એનો છોકરો થોડા સમય પેલા દારૂમાં પતી ગયો હતો એટલે, કમાવા માટે છાસ વેચવા આવી હતી, ૭ કોથળી હતી અને આને ૪ એની પાસેથી પડાવી લીધી, ૩ વેચીને ખોટ ખાઈને ગઈ. મેં ના પાડી હતી કે ડોસીને હેરાન ના કર જવાદે એને પણ ના માન્યો અને ૪ કોથળી લઈને ઘરે ચાલતો થયો."

"ડોસી મેં કીધું કે તમારે આપવી જ ન હતી, પણ ડોસીની આંખ ઊંડી ઊતરી ગઈ હતી, જતાં જતા કે'તી ગઈ, હશે એને વધુ જરૂર હશે મારાં કરતાં. ડોસી પછી થી કોઈ દિવસ છાસ વેચવાના ના દેખાણી". 

"આને છેલ્લા ૫ વરસથી પેટની બીમારી થઇ ગઈ છે, ૩-૪ ડોક્ટરને બતાવ્યું. પણ બીમારી પકડાતી નથી. ક્યાંથી પકડાય! કોકની હાય થોડી રિપોર્ટમાં આવે. ઘરના એ ના પાડી દીધી કે હવે બીજા ડોક્ટર ને બતાવવાનાં પૈસા નથી. બીમારી પણ એવી થઈ છે આને, કે કંઈક ખાય એટલે તરત જ બારું. કા ઝાળા કા ઉલટી. આ બધા પાસેથી રોજ પડાવીને ખાય એટલે ઘરે જઈને ઝાળા ઊલટી કરતો. બહુ વધી ગયું એટલે ઘરનાએ કાઢી મુક્યો. નોકરી કરવા જેટલી તાકાત નથી રહી. કઈ ખાય નહિ તો સારું રે. થોડું પાણી ને પ્રવાહી થી ચલાવે છે. પેલા જરૂર ન હતી તો બહુ લઈ લીધું, અને હવે જરૂર છે તો કોઈ આપતું નથી, મળતું નથી. કુદરતના ચોપડામાં બધો હિસાબ છે વ્યાજ સાથે."


વાકછલ

વાસુદેવ કહે. 'સંજય, તું દૂત છે એટલે એમના પક્ષની જ તું વાત કરે તેમાં તારો દોષ નથી. પણ વાકછલ ઈષ્ટ નથી. પ્રશ્ન જ્ઞાની-અજ્ઞાનીનો નથી. ન્યાય-અન્યાયનો છે. અજ્ઞાની અન્યાય કરે તેથી દંડમાંથી બચી જતો નથી. તારાં કહેવા પ્રમાણે માની લઈએ કે દર્યોધન અજ્ઞાની છે. તેને જતો કરો, તો આ સંસારનું શું થાય તે તેં કદી વિચાર્યું છે? મહારાજ તો અંધ અને મમતાબદ્ધ છે. નહીં તો તેમણે ગાંધારીની વિનવણી મુજબ તેનો ત્યાગ કર્યો હોત તે ન જોઈ શકે. પણ તું નથી અંધ. નથી આસક્ત. તું કેમ નથી જોઈ શકતો કે અજ્ઞાનની ઢાલ આગળ ધરી વિચારાય તો જગતમાં કોઈનેય કશો દંડ તો શું કરાય, રોકી પણ ન શકાય. કારણ કે જે જ્ઞાની છે તે પાપ નથી કરતા, અજ્ઞાની-અણસમજુ જ દ્રોહ કરે છે. શિશુપાલ અજ્ઞાની હતો. તેને જ્ઞાન હોત તો રાજસૂય યજ્ઞ વખતે યદ્ધાંતદ્ધ બોલ્યો હોત? અજ્ઞાનના નામે અત્યાચાર થવા દઈએ તો સૃષ્ટિ ચાલે જ કઈ રીતે? જયદ્રથે કૃષ્ણાનું હરણ કર્યું; અજ્ઞાની હતો જવા દો. ભીમને ઝેર દીધું; દેનારા અજ્ઞાની હતા, જવા દો. લાક્ષાગૃહનો રચનાર અજ્ઞાની હતો, જવા દો. મારી આ મહિમાવાન ભગિનીનો કેશપાશ ખેંચનાર દુઃશાસન અજ્ઞાની હતો, જવા દો. આ સ્વીકારીએ તો શું થાય તેનો તને કંઈ ખ્યાલ છે ખરો?' 

સંજય આવાક્ થઈ ગયો હતો. બધા મંત્રમુગ્ધ હતાં.

~ કુરુક્ષેત્ર પુસ્તકમાંથી, લેખક: મનુભાઈ પંચોળી 'દર્શક' 


વાણી

અને ધૌમ્ય ઋષિ (પાંડવોના રાજપુરોહિત) બોલ્યા ‘તેમાં ખોટું થોડું જ છે? ભગવાને વાણી આપી છે તે વેર વધારવા માટે નહિ, વેર ઘટાડવા માટે. ભીમ-દ્રૌપદીએ તે દહાડે મયસભામાં “આંધળાંનાં તો આંધળાં જ હોય'' તે વેણ ન કહ્યું હોત તો આટલી આગ ન થઈ હોત.'

સુવર્ણા (ઋષિ પત્ની) કહે, 'એ તો તમે અતિવ્યાપ્તિ કરો છો, એ નહિ તો બીજું બહાનું કાઢીનેય સુયોધને તો પાંડવોને પજવ્યા જ હોત. લાક્ષાગૃહ વખતે ક્યાં દ્રૌપદી હતાં?'

'તમારી એ વાત સાચી છે પણ તે છતાંય વાણીથી સંધાય પણ છે ને વાણીથી ભંગાય પણ છે. આજે તમે ભાંગ્યું.’ 

~ કુરુક્ષેત્ર પુસ્તકમાંથી, લેખક: મનુભાઈ પંચોળી 'દર્શક'


Let's Build Video Player

,

This is the first article in the series of the articles where we are going to build video player - player. The idea is simple, we will create a minimal video player program and then extend the functionalities of it via "extension articles". Let's see how things will go! I will update the following list as I publish the article(s) in this series.

  1. Let's Build Video Player

tl;dc: Refer this gist to get the final version of player.c code.

You need following:

  1. GCC - sudo apt install build-essential
  2. GTK4 - sudo apt install libgtk-4-dev
  3. GStreamer & plugins - sudo apt install libgstreamer1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good

Go ahead and create a file with name player.c and write the following stub code.

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

If you need brief explanation on this code, refer the Let's Build Terminal Pt. 1 article. Although, it is from "Let's Build Terminal" series but the first part is generic enough to understand such a code.

Use following command to compile and run the program.

gcc player.c `pkg-config --cflags --libs gtk4` && ./a.out

Let's add the header bar. The plan is to have a "Open" button in header bar that allow us to select the video file to open and play.

We can create a header bar using gtk_header_bar_new() function and then give a title to it using gtk_header_bar_set_title_widget(). Finally, we can use gtk_window_set_titlebar() function to set the header bar as title bar of the window.

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

Now, go ahead and create a button using gtk_button_new_with_label() function and then pack it to the header bar.

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

Run the program and it should produce output like this.

When user click on the button, it should open a file dialog to select the video. We need to pass the window instance as user data because it is needed to load the video into the window.

#include <gtk/gtk.h>

static void _on_open_clicked(GtkWidget* button, gpointer data) {

}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

Let's cast and save the window passed as user data and create a file dialog using gtk_file_dialog_new() function.

#include <gtk/gtk.h>

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

In order to actually see the file dialog, we need to call the gtk_file_dialog_open() function. We need to pass 5 arguments - dialog itself, window as parent, NULL as cancellable operation, callback function, and user data.

#include <gtk/gtk.h>

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

We need to define the _on_file_opened() function. But is a asnyc callback. Due to this it accepts these parameters - source object that has started asnyc operation (file dialog) of type GObject*, result of the operation of type GAsyncResult*, and user data.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {

}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

Again, let's get the values of dialog and window from the function parameters.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {
    GtkFileDialog* file_dialog = GTK_FILE_DIALOG(source_object);
    GtkWindow* window = GTK_WINDOW(data);
}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

We need to call the gtk_file_dialog_open_finish() function. This function finish the gtk_file_dialog_open() function and return either the selected file or an error.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {
    GtkFileDialog* file_dialog = GTK_FILE_DIALOG(source_object);
    GtkWindow* window = GTK_WINDOW(data);
    
    GFile* file = NULL;
    GError* error = NULL;
    
    file = gtk_file_dialog_open_finish(file_dialog, res, &error);
}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

If we get the error, we need to stop and free the error memory using g_error_free(). We can also print the error message using g_printerr() function.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {
    GtkFileDialog* file_dialog = GTK_FILE_DIALOG(source_object);
    GtkWindow* window = GTK_WINDOW(data);
    
    GFile* file = NULL;
    GError* error = NULL;
    
    file = gtk_file_dialog_open_finish(file_dialog, res, &error);
    
    if (error) {
        g_printerr("Error opening file %s\n", error->message);
        g_error_free(error);
        return;
    }
}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

But, if we have file, we can proceed with playing the video on the window. Let's create a video widget using gtk_video_new() function and then set it as child of the window.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {
    GtkFileDialog* file_dialog = GTK_FILE_DIALOG(source_object);
    GtkWindow* window = GTK_WINDOW(data);
    
    GFile* file = NULL;
    GError* error = NULL;
    
    file = gtk_file_dialog_open_finish(file_dialog, res, &error);
    
    if (error) {
        g_printerr("Error opening file %s\n", error->message);
        g_error_free(error);
        return;
    }
    
    if (file) {
        GtkWidget* video = gtk_video_new();
        
        gtk_window_set_child(window, video);
    }
}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

Let's create a media stream from the given file using gtk_media_fil_new_from_file() and set this steam to the video using gtk_video_set_media_stream(). Don't forget to unref the file object.

#include <gtk/gtk.h>

static void _on_file_opened(GObject* source_object, GAsyncResult* res, gpointer data) {
    GtkFileDialog* file_dialog = GTK_FILE_DIALOG(source_object);
    GtkWindow* window = GTK_WINDOW(data);
    
    GFile* file = NULL;
    GError* error = NULL;
    
    file = gtk_file_dialog_open_finish(file_dialog, res, &error);
    
    if (error) {
        g_printerr("Error opening file %s\n", error->message);
        g_error_free(error);
        return;
    }
    
    if (file) {
        GtkWidget* video = gtk_video_new();
        
        GtkMediaStream* media = GTK_MEDIA_STREAM(gtk_media_file_new_for_file(file));
        gtk_video_set_media_stream(GTK_VIDEO(video), media);
        
        gtk_window_set_child(window, video);

        g_object_unref(file);
    }
}

static void _on_open_clicked(GtkWidget* button, gpointer data) {
    GtkWindow* window = GTK_WINDOW(data);
    
    GtkFileDialog* file_dialog = gtk_file_dialog_new();
    
    gtk_file_dialog_open(file_dialog, window, NULL, _on_file_opened, window);
}

static void activate(GtkApplication* app, gpointer data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Player");
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 800);
    
    // Header bar.
    GtkWidget* header_bar = gtk_header_bar_new();
    gtk_header_bar_set_title_widget(GTK_HEADER_BAR(header_bar), gtk_label_new("Player"));
    
    // Button.
    GtkWidget* button = gtk_button_new_with_label("Open");
    g_signal_connect(button, "clicked", G_CALLBACK(_on_open_clicked), window);
    gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button);
    
    gtk_window_set_titlebar(GTK_WINDOW(window), header_bar);
    
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char** argv) {
    GtkApplication* app = gtk_application_new("dev.marichi.player", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);
    
    return status;
}

And with these changes, we now have the video player. Go ahead and run the program to confirm the video player!

Yay!


TIL: #include literally copy-paste the content of it

I mean I already knew about this point already but I was still thinking that there will be some magic in-between. It can't be that simple - copy-paste! But, the I watched this video by antirez.

---

Create a file with name print.c and write the following code - yes, just a printf() statement.

printf("hello, world\n");

Create another file with name hello.c and write the following code.

#include <stdio.h>

int main(void) {
    #include "print.c"

    return 0;
}

Now, compile and run the hello.c program (without including print.c in compilation).

gcc hello.c && ./a.out 
hello, world

It prints the output - hello, world as #include directive copy-paste the content of print.c file.

If you need proof then use -E compilation option. It'll print the preprocessed output. Let's also pass -P option to pretty-print the output.

gcc -E –P hello.c

The output is big. So, I truncated to only last few lines.

// ...
// ...
extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
extern int __uflow (FILE *);
extern int __overflow (FILE *, int);

int main(void) {
printf("hello, world\n");
 return 0;
}

There it is!


Subscribe to: Posts (Atom)