SlideShare uma empresa Scribd logo
1 de 20
IOクラスの入出力メソッドについて cuzic 2010/04/24 第42回 Ruby/Rails 勉強会@関西
自己紹介 cuzic 「きゅーじっく」と読みます。 ×quzic × cusic 「リファクタリング Ruby エディション」 の読書会を計画しています。 @ JR 尼崎駅徒歩2分(小田公民館) 日程未定 Kent Beck 著  最近 JavaScriptの勉強中 関数が First-Class Object でいいね。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
IO クラス みんな知っているよね? puts “Hello, World!” STDOUT や STDIN は IO のインスタンス open(“/tmp/tempfile”) do |io| ~end ファイル入出力だけでなく、ネットワーク処理などにも IO クラスを利用。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
Ruby のIO はかしこい Ruby のスレッドとうまく連携 ブロックする IO#read/IO#writeは内部的にselect(2) を利用。上手に他のスレッドを実行 高水準 IO と低水準  IO の両方が利用可能 高水準IO : FILE構造体(stdio)を使う printf(3) や puts(3)  低水準IO : file descriptor を使う read(2) など エラーが生じると例外を raise。 EAGAIN、EINTR、EWOULDBLOCK とか 低レベルのシステムコールも数多く利用可能 fcntl (2) 、fsync (2) などに加え、BasicSocketではgetsockopt(2) や recv(2) なども利用可能 2010/04/24 第42回 Ruby/Rails 勉強会@関西
IO#read (1) IO#readlength 長さを指定したいときはふつう これを使う。 buffer = nil open(“/dev/urandom”) do |io|  buffer = io.read 10 end p buffer #=> "16X220017uT3632t" 2010/04/24 第42回 Ruby/Rails 勉強会@関西
IO#read (2) IO#readlength, buffer 実は 第二引数を指定可能。事前にメモリ割り当てすることで高速化。 require ‘benchmark’ buffer = “ “ * 1000 Benchmark.measure do    open(“/dev/zero”) do |io| 1000_000.times do        io.read 1000, buffer    end   endend.display #=>  1.5000   0.0000   1.5000 (  1.3980) (比較) 58.8900   4.3440  63.2340 ( 62.6950) 2010/04/24 第42回 Ruby/Rails 勉強会@関西
IO#sysread IO#sysreadは IO#readとどう違うの? IO#read は 受信バッファ を経由する IO#sysreadは 受信バッファ を経由しない 受信バッファ って? IO はファイル以外にもいろいろ扱う ネットワーク( TCP/UDP 等)とか 欲しい length のデータがそろうまで、内部的にデータを貯めておいたり 取り出されるのに先立って、データを保存しておいたり 2010/04/24 第42回 Ruby/Rails 勉強会@関西
受信バッファ ,[object Object]
反面、ブロック(待ち)が発生してしまう。高速化の障壁になることも・・・。・待たずに別の処理をしたいのに・・・。・ある分だけでいいからすぐ欲しいのに・・・。2,000 Byte 欲しいなぁ。。。 受信バッファ ( 1,500Byte) パケット1000Byte パケット1000Byte まだないから、ちょっと待っとこっと。(ブロックの発生)
IO#readと IO#sysread IO#readを使うと欲しい長さだけ取得可能IO#sysreadを使うと待ちが生じない r, w = IO.pipe str = "0123456789" Thread.startdo w.writestr   sleep 10 w.writestr end puts Time.now.strftime("%H:%M:%S") buffer = r.read 15 # ここで、ブロック(待ちが発生)する puts Time.now.strftime("%H:%M:%S") puts buffer #=> “012345678901234” r, w = IO.pipe str = "0123456789" Thread.startdo w.writestr   sleep 10 w.writestr end puts Time.now.strftime("%H:%M:%S") buffer = r.sysread 15# すぐに次の行に移る puts Time.now.strftime("%H:%M:%S") puts buffer #=> “0123456789”
混ぜるな危険 待ちをできるかぎり少なくしたいけど、、、 IO#readと IO#sysreadは同時利用不可 受信バッファの都合で、同時に使うとバグの元 IO#gets、IO#each_lineなど、みんな IO#sysreadとは同時利用できません・・・。 けど、どうしても同時に使いたい!!! そんなあなたに耳よりな話があります!! IO#read_nonblock IO#readpartial 2010/04/24 第42回 Ruby/Rails 勉強会@関西
IO#readpartial Ruby 1.8.3 以降で利用可能 受信バッファにデータがある場合は、とりにいかない
IO#readpartial IO#readpartialでは受信バッファに貯めることはしない
IO#read_nonblock Ruby 1.8.5 以降で利用可能 IO#readpartialと同様に IO#read等との同時利用が可能 取り出せるものが何もないときは、例外が発生する 何か取り出せるものがあれば、それを返す
各メソッドの動作 IO#read (ブロッキングモード) 確実にlength のデータを返す 足りてなかったら、データの到着を待つ IO#readpartial 求める length のデータがそろってなくても、ある分だけ返す 返すべきデータが何もなければブロックする。 けど、なんかデータが到着したら、それを返す。 IO#read_nonblock 返すべきデータがなければ例外を raise する。ブロックしない。 IO#sysread (ノンブロッキングモード) IO#read等と混用できない点を除いて、IO#read_nonblockと同じ動作 どの Ruby でも問題なく動く。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
細かい違いを整理する
いつ使うの? IO#readpartiallength 取り出せるものが何かあれば取り出したいが、何もなければ、ブロックして欲しいとき length を大きな値として、ネットワークプログラミングなどで利用したり。 IO#sysreadと違い、IO#read等と共存可能 IO#read_nonblocklength 一切ブロックさせずに IO を利用したい場合 IO#sysreadと違い、IO#read等と共存可能 IO#sysreadlength 文字数がずっと短い IO#sysread使いこそが真の漢(?)。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
具体的な利用例は? Mongrel Ruby で書かれた Web サーバ 一部で readpartialを利用している SecureRandom Ruby 1.8.7 以降標準添付 安全な乱数生成機 /dev/urandomを readpartialで読み込み※ Unix 環境の場合 EventMachine 非同期サーバを作るフレームワーク 一部で read_nonblockを利用している 2010/04/24 第42回 Ruby/Rails 勉強会@関西
まとめ 「リファクタリング Ruby エディション」読書会を計画中 Ruby の IO はかしこい 低水準のことも高水準のこともできちゃう IO#readの第2引数は高速化に役立つ こともある。 IO#readpartialはネットワークプログラミングなどで重宝する
ご静聴ありがとうございました。

Mais conteúdo relacionado

Mais procurados

Sharding with sql alchemy
Sharding with sql alchemySharding with sql alchemy
Sharding with sql alchemyAkira Matsuzaki
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)Akihiro Kuwano
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ota42y
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!デベロッパーネットワーク
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 
CI/CDツール比較してみた
CI/CDツール比較してみたCI/CDツール比較してみた
CI/CDツール比較してみたShoya Kai
 
企業システムにSELinuxを適用するときの検討事項
企業システムにSELinuxを適用するときの検討事項企業システムにSELinuxを適用するときの検討事項
企業システムにSELinuxを適用するときの検討事項Atsushi Mitsu
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめMitsutoshi Kiuchi
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討Masahito Zembutsu
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
 

Mais procurados (20)

PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
Sharding with sql alchemy
Sharding with sql alchemySharding with sql alchemy
Sharding with sql alchemy
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)インフラエンジニアってなんでしたっけ(仮)
インフラエンジニアってなんでしたっけ(仮)
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
CI/CDツール比較してみた
CI/CDツール比較してみたCI/CDツール比較してみた
CI/CDツール比較してみた
 
企業システムにSELinuxを適用するときの検討事項
企業システムにSELinuxを適用するときの検討事項企業システムにSELinuxを適用するときの検討事項
企業システムにSELinuxを適用するときの検討事項
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 

Mais de Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 

Mais de Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Rake
RakeRake
Rake
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 

Último

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Ruby 勉強会 第42回 発表資料 IO について

  • 2. 自己紹介 cuzic 「きゅーじっく」と読みます。 ×quzic × cusic 「リファクタリング Ruby エディション」 の読書会を計画しています。 @ JR 尼崎駅徒歩2分(小田公民館) 日程未定 Kent Beck 著 最近 JavaScriptの勉強中 関数が First-Class Object でいいね。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 3. IO クラス みんな知っているよね? puts “Hello, World!” STDOUT や STDIN は IO のインスタンス open(“/tmp/tempfile”) do |io| ~end ファイル入出力だけでなく、ネットワーク処理などにも IO クラスを利用。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 4. Ruby のIO はかしこい Ruby のスレッドとうまく連携 ブロックする IO#read/IO#writeは内部的にselect(2) を利用。上手に他のスレッドを実行 高水準 IO と低水準 IO の両方が利用可能 高水準IO : FILE構造体(stdio)を使う printf(3) や puts(3) 低水準IO : file descriptor を使う read(2) など エラーが生じると例外を raise。 EAGAIN、EINTR、EWOULDBLOCK とか 低レベルのシステムコールも数多く利用可能 fcntl (2) 、fsync (2) などに加え、BasicSocketではgetsockopt(2) や recv(2) なども利用可能 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 5. IO#read (1) IO#readlength 長さを指定したいときはふつう これを使う。 buffer = nil open(“/dev/urandom”) do |io| buffer = io.read 10 end p buffer #=> "16X220017uT3632t" 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 6. IO#read (2) IO#readlength, buffer 実は 第二引数を指定可能。事前にメモリ割り当てすることで高速化。 require ‘benchmark’ buffer = “ “ * 1000 Benchmark.measure do open(“/dev/zero”) do |io| 1000_000.times do io.read 1000, buffer end endend.display #=> 1.5000 0.0000 1.5000 ( 1.3980) (比較) 58.8900 4.3440 63.2340 ( 62.6950) 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 7. IO#sysread IO#sysreadは IO#readとどう違うの? IO#read は 受信バッファ を経由する IO#sysreadは 受信バッファ を経由しない 受信バッファ って? IO はファイル以外にもいろいろ扱う ネットワーク( TCP/UDP 等)とか 欲しい length のデータがそろうまで、内部的にデータを貯めておいたり 取り出されるのに先立って、データを保存しておいたり 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 8.
  • 10. IO#readと IO#sysread IO#readを使うと欲しい長さだけ取得可能IO#sysreadを使うと待ちが生じない r, w = IO.pipe str = "0123456789" Thread.startdo w.writestr sleep 10 w.writestr end puts Time.now.strftime("%H:%M:%S") buffer = r.read 15 # ここで、ブロック(待ちが発生)する puts Time.now.strftime("%H:%M:%S") puts buffer #=> “012345678901234” r, w = IO.pipe str = "0123456789" Thread.startdo w.writestr sleep 10 w.writestr end puts Time.now.strftime("%H:%M:%S") buffer = r.sysread 15# すぐに次の行に移る puts Time.now.strftime("%H:%M:%S") puts buffer #=> “0123456789”
  • 11. 混ぜるな危険 待ちをできるかぎり少なくしたいけど、、、 IO#readと IO#sysreadは同時利用不可 受信バッファの都合で、同時に使うとバグの元 IO#gets、IO#each_lineなど、みんな IO#sysreadとは同時利用できません・・・。 けど、どうしても同時に使いたい!!! そんなあなたに耳よりな話があります!! IO#read_nonblock IO#readpartial 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 12. IO#readpartial Ruby 1.8.3 以降で利用可能 受信バッファにデータがある場合は、とりにいかない
  • 14. IO#read_nonblock Ruby 1.8.5 以降で利用可能 IO#readpartialと同様に IO#read等との同時利用が可能 取り出せるものが何もないときは、例外が発生する 何か取り出せるものがあれば、それを返す
  • 15. 各メソッドの動作 IO#read (ブロッキングモード) 確実にlength のデータを返す 足りてなかったら、データの到着を待つ IO#readpartial 求める length のデータがそろってなくても、ある分だけ返す 返すべきデータが何もなければブロックする。 けど、なんかデータが到着したら、それを返す。 IO#read_nonblock 返すべきデータがなければ例外を raise する。ブロックしない。 IO#sysread (ノンブロッキングモード) IO#read等と混用できない点を除いて、IO#read_nonblockと同じ動作 どの Ruby でも問題なく動く。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 17. いつ使うの? IO#readpartiallength 取り出せるものが何かあれば取り出したいが、何もなければ、ブロックして欲しいとき length を大きな値として、ネットワークプログラミングなどで利用したり。 IO#sysreadと違い、IO#read等と共存可能 IO#read_nonblocklength 一切ブロックさせずに IO を利用したい場合 IO#sysreadと違い、IO#read等と共存可能 IO#sysreadlength 文字数がずっと短い IO#sysread使いこそが真の漢(?)。 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 18. 具体的な利用例は? Mongrel Ruby で書かれた Web サーバ 一部で readpartialを利用している SecureRandom Ruby 1.8.7 以降標準添付 安全な乱数生成機 /dev/urandomを readpartialで読み込み※ Unix 環境の場合 EventMachine 非同期サーバを作るフレームワーク 一部で read_nonblockを利用している 2010/04/24 第42回 Ruby/Rails 勉強会@関西
  • 19. まとめ 「リファクタリング Ruby エディション」読書会を計画中 Ruby の IO はかしこい 低水準のことも高水準のこともできちゃう IO#readの第2引数は高速化に役立つ こともある。 IO#readpartialはネットワークプログラミングなどで重宝する
  • 21. おまけ( io/nonblock) Ruby 1.8 / 1.9 には io/nonblockというノンブロッキングモードにするライブラリがあるが・・・ 正直、私にはよく分かりません・・・。 期待した動作をしないし、、、 昔のバージョンでは効果があった??? Cygwin にはない??? open の第2引数は効果があるみたいopen(“/tmp/fifo”, IO::NONBLOCK | IO::RDONLY)