SlideShare ist ein Scribd-Unternehmen logo
1 von 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はネットワークプログラミングなどで重宝する
ご静聴ありがとうございました。

Weitere ähnliche Inhalte

Was ist angesagt?

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけらAtsushi Nakamura
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015Toru Yamaguchi
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術Yuji Hato
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】DeNA
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409稔 小林
 
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio都元ダイスケ Miyamoto
 
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜Hideki Takase
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロdigitalghost
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについてmametter
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏Yusuke Hirao
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をするjiro4989
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 

Was ist angesagt? (20)

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
ゼロから始めるQ#
ゼロから始めるQ#ゼロから始めるQ#
ゼロから始めるQ#
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio
認証の標準的な方法は分かった。では認可はどう管理するんだい? #cmdevio
 
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 

Mehr von 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
 
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
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 

Mehr von 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 のワンライナーについて
 
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 の制御構造とリテラルについて
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 

Kürzlich hochgeladen

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Kürzlich hochgeladen (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

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)