কম্পিউটার

রুবি এফএফআই মডিউল টিউটোরিয়াল (উদাহরণ:ভিএলসি দিয়ে MP3 চালান)

আমি একটি সহজ প্রশ্নের উত্তর দিতে চাই...

রুবিতে এফএফআই কি ?

এফএফআই মানে "ফরেন ফাংশন ইন্টারফেস"।

এটি অন্যান্য প্রোগ্রামিং ভাষায় সংজ্ঞায়িত ফাংশনগুলি ব্যবহার করার একটি উপায়৷ .

রুবির এফএফআই মডিউল আপনাকে বাহ্যিক লাইব্রেরি এবং কোডে অ্যাক্সেস দেয় যা অন্যথায় আপনার কাছে থাকবে না।

আমরা প্রায়ই এটি সি কোডের সাথে কাজ করতে ব্যবহার করি।

উদাহরণ অন্তর্ভুক্ত :

  • rb-inotify
  • রুবি-ভিপস
  • রুবি-এনএফসি

আপনি FFI মডিউলের সাহায্যে আপনার নিজের প্রোগ্রামগুলি লিখতে পারেন যা FFI ব্যবহার করে৷

কিভাবে?

আসুন কয়েকটি কোড উদাহরণ দেখি!

FFI বেসিকস:লোডিং এবং ইম্পোর্টিং ফাংশনগুলি

আপনি FFI এর সাথে কাজ করতে পারেন আপনার তৈরি একটি মডিউলে এর ফাংশনগুলি অন্তর্ভুক্ত করে৷

এরকম :

'ffi'module A প্রসারিত FFI::Libraryend প্রয়োজন

তারপর, মডিউলের ভিতরে, আমরা ffi_lib ব্যবহার করে একটি লাইব্রেরি লোড করতে যাচ্ছি পদ্ধতি।

একটি সি লাইব্রেরি, যেমন উইন্ডোজে "DLL" বা লিনাক্সে "SO", "প্রতীক" বা ফাংশন সংজ্ঞাগুলির একটি তালিকা রপ্তানি করে যা একটি প্রোগ্রাম অন্যদের ব্যবহার করার জন্য উপলব্ধ করে।

আসুন “libc”, C-এর স্ট্যান্ডার্ড লাইব্রেরি প্রয়োজন।

এখানে কিভাবে :

মডিউল A প্রসারিত FFI::Library ffi_lib 'c'end

এখন :

আপনি রুবি পদ্ধতি হিসাবে এই লাইব্রেরি থেকে নির্দিষ্ট ফাংশন আমদানি করতে পারেন৷

attach_function সহ পদ্ধতি।

এখানে একটি উদাহরণ আছে :

মডিউল A প্রসারিত FFI::Library ffi_lib 'c' attach_function :strlen, [:string], :intendA.strlen("abc")# 3

এটি কিভাবে কাজ করে?

প্রথমত, আমরা জানি যে C-তে strlen নামে একটি ফাংশন আছে , এই ফাংশনটি chars * নেয় একটি যুক্তি হিসাবে।

chars * String-এ অনুবাদ করে রুবিতে।

তারপর…

এই strlen ফাংশন একটি মান প্রদান করে, যা স্ট্রিংয়ের দৈর্ঘ্য।

অন্য কথায়, attach_function 3 প্যারামিটার লাগে:

  1. C ফাংশনের নাম
  2. আর্গুমেন্ট প্রকারের একটি অ্যারে
  3. একটি রিটার্ন টাইপ

একটি নির্দিষ্ট ফাংশন কোন ধরনের কাজ করে তা জানতে আপনাকে ডকুমেন্টেশন পড়তে হবে।

অন্য উদাহরণের জন্য সময়!

আপনার নিজস্ব মিডিয়া প্লেয়ার তৈরি করুন

আপনি খেলার জন্য অনেক আকর্ষণীয় লাইব্রেরি খুঁজে পেতে পারেন৷

লিনাক্সে, বেশিরভাগ /usr/lib/ এর অধীনে পাওয়া যায় ডিরেক্টরি, তাদের নামে "lib" দিয়ে শুরু করে এবং "so" এক্সটেনশন দিয়ে শেষ হয়।

তাদেরকে এভাবে তালিকাভুক্ত করুন :

ls /usr/lib/lib*.so

এই উদাহরণের জন্য, আমরা VLC-এর মিডিয়া প্লেয়ার লাইব্রেরি ব্যবহার করতে যাচ্ছি :

/usr/lib/libvlc.so

আমাদের লক্ষ্য হল একটি mp3 ফাইল লোড করা এবং এটি চালানো!

এটি দিয়ে শুরু করা যাক :

'ffi'module VLC প্রসারিত FFI::Library ffi_lib 'vlc' attach_function :libvlc_get_version, [], :stringend

এটি আপনাকে লাইব্রেরিটি সঠিকভাবে লোড হচ্ছে কিনা তা পরীক্ষা করতে এবং তারপরে এর সংস্করণ মুদ্রণ করতে দেয়৷

এরকম :

VLC.libvlc_get_version# "3.0.6 Vetinari"

আপনি 4র্থ প্যারামিটার যোগ করে এই পদ্ধতিগুলোকে একটি কাস্টম নাম দিতে পারেন।

উদাহরণ :

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

তাহলে আপনি করতে পারেন :

VLC.get_version

এখন mp3 চালানোর জন্য আমাদের কী দরকার?

আমরা যদি ডকুমেন্টেশন দেখি, libvlc_media_player_play ফাংশন যেতে পথ মত দেখায়.

এই ফাংশনটির একটি মিডিয়া প্লেয়ার "অবজেক্ট" প্রয়োজন৷

একটি মিডিয়া প্লেয়ার একটি মিডিয়া প্রয়োজন, এবং একটি মিডিয়া একটি VLC উদাহরণ প্রয়োজন.

প্রক্রিয়াটি এখানে আছে :

VLC উদাহরণ -> media -> media_player -> play

আমি libVLC এর জন্য ডকুমেন্টেশন পড়ে এটিকে একত্রিত করেছি .

রুবিতে মেমরি পয়েন্টার???

সি-তে আপনি কোনো বস্তু পাবেন না, সবকিছু মেমরি পয়েন্টার দিয়ে পরিচালনা করা হয়।

একটি মেমরি পয়েন্টার হল ডেটা সহ একটি মেমরি ঠিকানা৷

একটি কোড উদাহরণ দেখি :

মডিউল VLC FFI::Library ffi_lib 'vlc' attach_function :get_version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointerendVLC.new(0,0) # FFI::পয়েন্টার ঠিকানা=0x000055c6f04ae7b0

VLC.new কল করার ফলে আমরা একটি পয়েন্টার পাই।

আমাদের এটিকে অন্যান্য সি ফাংশনগুলির সাথে পাস করতে হবে যা এটির প্রয়োজন।

এখন :

সম্পূর্ণ উদাহরণ এবং এটি কীভাবে ব্যবহার করবেন।

মডিউল VLC FFI::Library ffi_lib 'vlc' attach_function :version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointer attach_function :libvlc_pather:, :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_new_from_media, [:pointer] :libvlc_media_player_pause, [:pointer], :intend

কিছু ​​মিউজিক চালানোর জন্য এটাই যথেষ্ট :

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. রুবির সাথে সিলেকশন সর্ট বোঝা

  2. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  3. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন

  4. উদাহরণ সহ Redis GEORADIUSBYMEMBER কমান্ড - Redis টিউটোরিয়াল