Ruby FFIモジュールチュートリアル(例:VLCでMP3を再生)
簡単な質問に答えたい…
RubyのFFIとは ?
FFIは「ForeignFunctionInterface」の略です。
これは、他のプログラミング言語で定義された関数を使用する方法です。 。
RubyのFFIモジュールを使用すると、他の方法ではアクセスできない外部ライブラリとコードにアクセスできます。
これは、Cコードを操作するためによく使用されます。
例にはが含まれます :
- rb-inotify
- ルビー-vips
- ruby-nfc
FFIモジュールを使用して、FFIを使用する独自のプログラムを作成できます。
どのように?
いくつかのコード例を見てみましょう!
FFIの基本:関数の読み込みとインポート
作成するモジュールにFFIの機能を含めることで、FFIを操作できます。
このように :
require 'ffi' module A extend FFI::Library end
次に、モジュール内で、ffi_lib
を使用してライブラリをロードします。 メソッド。
Windowsの「DLL」やLinuxの「SO」などのCライブラリは、プログラムが他のユーザーが使用できるようにする「シンボル」または関数定義のリストをエクスポートします。
Cの標準ライブラリである「libc」を要求しましょう。
方法は次のとおりです :
module A extend FFI::Library ffi_lib 'c' end
今 :
このライブラリから特定の関数をRubyメソッドとしてインポートできます。
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
に変換されます Rubyで。
次に…
このstrlen
関数は、文字列の長さである値を返します。
つまり、attach_function
3つのパラメータを取ります:
- C関数の名前
- 引数タイプの配列
- 返品タイプ
ドキュメントを読んで、特定の関数がどのタイプで機能するかを確認する必要があります。
別の例の時間です!
独自のメディアプレーヤーを構築する
さまざまな興味深いライブラリを見つけることができます。
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"
4番目のパラメータを追加することで、これらのメソッドにカスタム名を付けることができます。
例 :
attach_function :get_version, :libvlc_get_version, [], :string
それならできます :
VLC.get_version
今mp3を再生するには何が必要ですか?
ドキュメントを見ると、libvlc_media_player_play
関数は進むべき道のように見えます。
この機能には、メディアプレーヤーの「オブジェクト」が必要です。
メディアプレーヤーにはメディアが必要であり、メディアにはVLCインスタンスが必要です。
プロセスは次のとおりです :
VLC instance -> media -> media_player -> play
libVLC
のドキュメントを読んで、これをまとめました。 。
Rubyのメモリポインタ???
Cでは、オブジェクトは見つかりません。すべてがメモリポインタで処理されます。
メモリポインタは、データを含むメモリアドレスです。
コード例を見てみましょう :
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
を呼び出した結果 ポインタを取得します。
それを必要とする他のC関数に渡す必要があります。
今 :
完全な例とその使用方法。
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)
これにより、視覚的なインターフェイスを開かなくても音楽が再生されます。
この上に独自のWebインターフェイスを構築できます。
試してみてください!
概要
FFI
の驚くべき力について学びました !言語自体の一部であるかのように外部ライブラリを使用できるようにするRubyモジュール。
より多くの人が楽しめるように、この記事を共有してください🙂
読んでくれてありがとう!
-
Rubyでパーサーを構築する方法
構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ
-
例を含むRedisGEORADIUSBYMEMBERコマンド–Redisチュートリアル
このチュートリアルでは、特定の領域に該当するキーに格納されている地理空間値の要素を取得する方法について学習します。このために、Redis GEORADIUSBYMEMBERを使用します コマンド。 GEORADIUSBYMEMBERコマンド このコマンドは、キーに格納されている地理空間値(Sorted Set)の1つ以上のメンバーを返すために使用されます。これらのメンバーは、経度、指定されたメンバーの緯度値、および半径の引数を使用して計算された領域の境界内にあります。この面積は、指定されたメンバーの経度、緯度の値を円の中心位置として使用し、指定された単位の半径を円の半径として使用して計算