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!
ફ્રાન્સ ૧૧ ઓગસ્ટથી અનિચ્છનીય ટેલિમાર્કેટિંગ કોલ્સ પર પ્રતિબંધ મૂકશે
શું તમને માર્કેટિંગ એટલે કે વસ્તુ જાહેરાતના ફોન આવે છે? શું તમે પૂર્વ મંજૂરી વગર આવતા આ પ્રકારના ફોનથી કંટાળી ગયા છો? તો તમારા માટે તો નહીં પણ ફ્રાન્સના લોકો માટે સરકાર કાયદો લાવી રહી છે કે, પૂર્વ મંજૂરી વગર જો ટેલેમાર્કેટિંગના ફોન આવશે તો દંડ થશે.
આ કાયદો ૧૧ ઓગસ્ટથી લાગુ પડશે. નિર્ણય ૧૧ ગ્રાહક સંસ્થાઓની સંયુક્ત માંગ બાદ ફ્રેન્ચ સંસદે મંજૂર કરેલા કાયદા હેઠળ લેવામાં આવ્યો છે. અત્યાર સુધી કેટલીક શરતો સાથે માર્કેટિંગ કૉલ્સની મંજૂરી હતી, પરંતુ નવા નિયમનો મુખ્ય હેતુ લોકોને વારંવાર આવતા અનિચ્છનીય અને પરેશાન કરનારા ફોનથી સુરક્ષિત કરવાનો છે.
નવા કાયદા હેઠળ વ્યક્તિ કે કંપની જો ગ્રાહકની મંજૂરી વિના માર્કેટિંગ ફોન કરશે તો તેના પર દંડ થઈ શકે છે. આવા અનધિકૃત ફોનની ફરિયાદ કરવા માટે જાહેર વેબસાઇટની વ્યવસ્થા પણ કરવામાં આવી છે, જેથી ગ્રાહકો નિયમનો ભંગ કરનારાઓની જાણ કરી શકે. આ પગલાને ફ્રાન્સમાં ગ્રાહક અધિકારોને મજબૂત કરવા અને ટેલિમાર્કેટિંગમાં વધુ કડક નિયંત્રણ લાવવાના મહત્વપૂર્ણ પ્રયાસ તરીકે જોવામાં આવે છે.
ઓપન સોર્સ
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!
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!
મનની વિટંબણાઓ
સરકાર
બાઇટ જોડકું(=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.
- Let's Build Video Player
tl;dc: Refer this gist to get the final version of player.c code.
You need following:
- GCC -
sudo apt install build-essential - GTK4 -
sudo apt install libgtk-4-dev - 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_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!









