Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी एफएफआई मॉड्यूल ट्यूटोरियल (उदाहरण:वीएलसी के साथ एमपी 3 चलाएं)

मैं एक साधारण प्रश्न का उत्तर देना चाहता हूँ…

Ruby में FFI क्या है ?

FFI का मतलब "विदेशी फ़ंक्शन इंटरफ़ेस" है।

यह अन्य प्रोग्रामिंग भाषाओं में परिभाषित कार्यों का उपयोग करने . का एक तरीका है ।

रूबी का एफएफआई मॉड्यूल आपको बाहरी पुस्तकालयों और कोड तक पहुंच प्रदान करता है जो आपके पास अन्यथा नहीं होता।

हम अक्सर इसका इस्तेमाल सी कोड के साथ काम करने के लिए करते हैं।

उदाहरणों में शामिल हैं :

  • आरबी-सूचित करें
  • रूबी-विप्स
  • रूबी-एनएफसी

आप अपने स्वयं के प्रोग्राम लिख सकते हैं जो FFI मॉड्यूल की सहायता से FFI का उपयोग करते हैं।

कैसे?

आइए कुछ कोड उदाहरण देखें!

FFI मूल बातें:लोड हो रहा है और आयात कार्य

आप अपने द्वारा बनाए गए मॉड्यूल में FFI के कार्यों को शामिल करके उसके साथ काम कर सकते हैं।

इसे पसंद करें :

require 'ffi'

module A
  extend FFI::Library
end

फिर, मॉड्यूल के अंदर, हम ffi_lib . का उपयोग करके एक लाइब्रेरी लोड करने जा रहे हैं विधि।

A C लाइब्रेरी, जैसे Windows में "DLL", या Linux में "SO", "प्रतीकों" या फ़ंक्शन परिभाषाओं की एक सूची निर्यात करती है जो एक प्रोग्राम दूसरों के उपयोग के लिए उपलब्ध कराता है।

आइए "libc", C के मानक पुस्तकालय की आवश्यकता है।

यहां बताया गया है :

module A
  extend FFI::Library
  ffi_lib 'c'
end

अब :

आप इस पुस्तकालय से रूबी विधियों के रूप में विशिष्ट कार्यों को आयात कर सकते हैं।

attach_function के साथ विधि।

यहां एक उदाहरण दिया गया है :

module A
  extend FFI::Library
  ffi_lib 'c'

  attach_function :strlen, [:string], :int
end

A.strlen("abc")
# 3
का विस्तार करें

यह कैसे काम करता है?

सबसे पहले, हम जानते हैं कि C में strlen . नामक एक फंक्शन है , यह फ़ंक्शन chars * . लेता है एक तर्क के रूप में।

chars * String . में अनुवाद करता है रूबी में।

फिर…

यह strlen फ़ंक्शन एक मान देता है, जो स्ट्रिंग की लंबाई है।

दूसरे शब्दों में, attach_function 3 पैरामीटर लेता है:

  1. सी फ़ंक्शन का नाम
  2. तर्क प्रकारों की एक सरणी
  3. एक वापसी प्रकार

यह पता लगाने के लिए कि कोई विशेष फ़ंक्शन किस प्रकार के साथ काम करता है, आपको दस्तावेज़ीकरण पढ़ना होगा।

एक और उदाहरण के लिए समय!

अपना खुद का मीडिया प्लेयर बनाएं

आपको खेलने के लिए कई दिलचस्प पुस्तकालय मिल सकते हैं।

Linux में, अधिकांश /usr/lib/ . के अंतर्गत पाए जाते हैं निर्देशिका, उनके नाम में "lib" से शुरू होती है और "so" एक्सटेंशन के साथ समाप्त होती है।

उन्हें इस तरह सूचीबद्ध करें :

ls /usr/lib/lib*.so

इस उदाहरण के लिए, हम VLC की मीडिया प्लेयर लाइब्रेरी का उपयोग करने जा रहे हैं :

/usr/lib/libvlc.so

हमारा लक्ष्य एक mp3 फ़ाइल लोड करना और उसे चलाना है!

आइए इसे शुरू करें :

require 'ffi'

module VLC
  extend FFI::Library
  ffi_lib 'vlc'

  attach_function :libvlc_get_version, [], :string
end
को बढ़ाएं।

यह आपको यह जांचने की अनुमति देता है कि पुस्तकालय सही ढंग से लोड हो रहा है या नहीं और फिर उसका संस्करण प्रिंट करें।

इसे पसंद करें :

VLC.libvlc_get_version
# "3.0.6 Vetinari"

आप एक चौथा पैरामीटर जोड़कर इन विधियों को एक कस्टम नाम दे सकते हैं।

उदाहरण :

attach_function :get_version, :libvlc_get_version, [], :string

तब आप कर सकते हैं :

VLC.get_version

एमपी3 चलाने के लिए अब हमें क्या चाहिए?

यदि हम दस्तावेज़ीकरण को देखें, तो libvlc_media_player_play फ़ंक्शन जाने का रास्ता जैसा दिखता है।

इस फ़ंक्शन को मीडिया प्लेयर "ऑब्जेक्ट" की आवश्यकता है।

मीडिया प्लेयर को मीडिया की जरूरत होती है, और मीडिया को वीएलसी इंस्टेंस की जरूरत होती है।

यह रही प्रक्रिया :

VLC instance -> media -> media_player -> play

मैंने libVLC . के दस्तावेज़ीकरण को पढ़कर इसे एक साथ जोड़ दिया है ।

रूबी में मेमोरी पॉइंटर्स???

सी में आपको कोई ऑब्जेक्ट नहीं मिलेगा, सब कुछ मेमोरी पॉइंटर्स के साथ संभाला जाता है।

मेमोरी पॉइंटर डेटा के साथ एक मेमोरी एड्रेस होता है।

आइए एक कोड उदाहरण देखें :

module VLC
  extend FFI::Library
  ffi_lib 'vlc'

  attach_function :get_version, :libvlc_get_version, [], :string
  attach_function :new, :libvlc_new, [:int, :int], :pointer
end

VLC.new(0, 0)
# FFI::Pointer address=0x000055c6f04ae7b0

कॉल करने के परिणामस्वरूप VLC.new हमें एक पॉइंटर मिलता है।

हमें इसे अन्य सी कार्यों के साथ पास करना होगा जिन्हें इसकी आवश्यकता है।

अब :

पूरा उदाहरण और इसका उपयोग कैसे करें।

module VLC
  extend FFI::Library
  ffi_lib 'vlc'

  attach_function :version, :libvlc_get_version, [], :string

  attach_function :new, :libvlc_new, [:int, :int], :pointer
  attach_function :libvlc_media_new_path, [:pointer, :string], :pointer
  attach_function :libvlc_media_player_new_from_media, [:pointer], :pointer

  attach_function :play, :libvlc_media_player_play, [:pointer], :int
  attach_function :stop, :libvlc_media_player_stop, [:pointer], :int
  attach_function :pause, :libvlc_media_player_pause, [:pointer], :int
end

यह कुछ संगीत चलाने के लिए पर्याप्त है :

vlc    = VLC.new(0, 0)
media  = VLC.libvlc_media_new_path(vlc, "/home/jesus/Downloads/meditation.mp3")
player = VLC.libvlc_media_player_new_from_media(media)

VLC.play(player)

यह किसी भी प्रकार के दृश्य इंटरफ़ेस को खोले बिना संगीत चलाएगा।

आप इसके ऊपर अपना खुद का वेब इंटरफेस बना सकते हैं।

इसे आज़माएं!

सारांश

आपने FFI . की अद्भुत शक्ति के बारे में जान लिया है ! एक रूबी मॉड्यूल जो आपको बाहरी पुस्तकालयों का उपयोग करने की अनुमति देता है जैसे कि वे स्वयं भाषा का हिस्सा थे।

कृपया इस लेख को शेयर करें ताकि अधिक से अधिक लोग इसका आनंद उठा सकें 🙂

पढ़ने के लिए धन्यवाद!


  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी के साथ एक पार्सर कैसे बनाएं

    पार्सिंग स्ट्रिंग्स के एक गुच्छा को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकते हैं। आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं, लेकिन वे हमेशा कार्य के लिए उपयुक्त नहीं होते हैं। उदाहरण के लिए, यह सामान्य ज्ञान है कि नियमित अभिव्यक्तियों के साथ HTML को पार्स करना शायद एक अच्छ

  1. उदाहरण के साथ Redis GEORADIUSBYMEMBER कमांड - Redis Tutorial

    इस ट्यूटोरियल में, हम सीखेंगे कि भू-स्थानिक मूल्य के तत्वों को एक कुंजी पर कैसे संग्रहीत किया जाए, जो विशिष्ट क्षेत्र के अंतर्गत आता है। इसके लिए हम एक Redis GEORADIUSBYMEMBER  . का उपयोग करेंगे आदेश। GEORADIUSBYMEMBER कमांड इस कमांड का उपयोग एक कुंजी पर संग्रहीत भू-स्थानिक मूल्य (सॉर्टेड सेट) के