著者ã®ç”°ä¸å“²ã•ã‚“ (@tanaka_akr) ã‹ã‚‰çŒ®æœ¬ã‚’ã„ãŸã ãã¾ã—ãŸï¼ *1
本(電å版)をもらã£ãŸã®ã¯ RubyKaigi ã®å‰æ—¥ã®å¤œã€‚翌日㫠TRICK 2015 ã®ç™ºè¡¨ã‚’控ãˆã¦ã„ã¾ã—ãŸãŒã€èªã¿å§‹ã‚ã‚‹ã¨é¢ç™½ã™ãŽã¦ã€ç™ºè¡¨å‰ã¾ã§ã«èªã¿çµ‚ãˆã¦ã¾ã—ãŸã€‚ã¡ãªã¿ã«çŒ®æœ¬ã¨ã¯åˆ¥ã«ã‚¸ãƒ¥ãƒ³ã‚¯å ‚ RubyKaigi 店ã§ä¸€å†Šè²·ã„ã¾ã—ãŸã€‚(サインもã‚ãŸï¼‰
自分ãŒæ€ã£ãŸã€èªè€…層ã”ã¨ã®å‹æ‰‹ãªç´¹ä»‹ã‚’書ã„ã¦ã¿ã¾ã™ã€‚
普通㮠Ruby ユーザã¸ã®ç´¹ä»‹
åプãƒã‚»ã‚¹ã‚’èµ·å‹•ã™ã‚‹ Process#system ã€#spawn ã€open3.rb *2 ã‚ãŸã‚Šã‚’使ã£ãŸã“ã¨ãŒã‚ã‚‹ã§ã—ょã†ã‹ï¼Ÿ C ã® system 関数ã¯ä½¿ãˆãªã„åã¨ã—ã¦æœ‰åã§ã™ãŒã€Ruby ã® Process#system ãŸã¡ã¯ãƒ—ãƒã‚»ã‚¹èµ·å‹•ã«é–¢ã—ã¦ã€Œã“ã‚“ãªã“ã¨ã§ããŸã‚‰ã„ã„ãªã€ã¨æ€ã†ã“ã¨ãŒã€ãŸã„ã¦ã„ã§ãã¾ã™ã€‚ã—ã‹ã‚‚ã€ç°¡å˜ãƒ»ãƒãƒ¼ã‚¿ãƒ–ルã«ã€‚ãŸã¨ãˆã°ã“ã®è¾ºã‚Šã®è¨è¨ˆã‚’ã—ãŸã®ãŒã€è‘—者㮠akr ã•ã‚“ã§ã™ã€‚
ã“ã®æœ¬ã§ã¯ã€Ruby ã® I/O ã€ãƒ—ãƒã‚»ã‚¹ã€æ™‚刻ãªã©ã€ã„ã‚ん㪠API è¨è¨ˆäº‹ä¾‹ãŒã‚ªãƒ ニãƒã‚¹æ–¹å¼ã§èª¬æ˜Žã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚ãã¾ã§ã‚±ãƒ¼ã‚¹ã‚¹ã‚¿ãƒ‡ã‚£ã®æœ¬ãªã®ã§ã€API è¨è¨ˆã®ã‚„り方を体系的ã«æ‰‹å–り足å–ã‚Šæ•™ãˆã¦ãれるã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ç¯€ã”ã¨ã«æ•™è¨“ãŒçŸãã¾ã¨ã‚られã¦ã„ã‚‹ã®ã§ã€Ruby ã§ãƒ©ã‚¤ãƒ–ラリã¨ã‹ä½œã‚‹ã¨ãã«é‡è¦ãªç¤ºå”†ã‚’得られるã¯ãšã€‚汎用性ã®é«˜ãã†ãªæ•™è¨“ã®ä¾‹ã‚’ã„ãã¤ã‹å¼•ç”¨ã—ã¦ãŠãã¾ã™ã€‚
- 「使ã„ã‚„ã™ã„ã¨ã„ã†ã®ã¯ã€å®Ÿéš›ã«ä½¿ã†çŠ¶æ³ã§ã®ä½¿ã„ã‚„ã™ã•ãŒé‡è¦ã§ã™ã‹ã‚‰ã€å®Ÿéš›ã«ä½¿ã†çŠ¶æ³ã‚’調ã¹ã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€ï¼ˆ1.05節 0ãƒã‚¤ãƒˆèªã‚“ã ã¨ãã«ä½•ã‚’è¿”ã™ï¼Ÿ - 用例を探ã—ã¦è‰¯ã„挙動を判æ–ã™ã‚‹ï¼‰
- 「プãƒã‚°ãƒ©ãƒžãŒé–“é•ã£ãŸæ–¹æ³•ã‚’使ã£ã¦ã—ã¾ã†ã®ã‚’é¿ã‘ã€æ£ã—ã„方法ã«èª˜å°Žã—ã¦ã„ã¾ã™ã€‚ã€ï¼ˆ2.03節 Socket.ip_address_list - 自ホストã®IPアドレスをæ£ã—ãç°¡å˜ã«å¾—る)
- 「プãƒã‚°ãƒ©ãƒžã®æ—¢ã«æŒã£ã¦ã„る知è˜ã‚’利用ã—ã¦å¦ç¿’ã—ã‚„ã™ã„ã‚‚ã®ã¨ã™ã‚‹ã®ãŒç‹™ã„ã§ã™ã€‚ã€ï¼ˆ5.04節 Integer#bit_lengthメソッド - 用途ã¨å‰ä¾‹ã‚’調ã¹ã‚‹ï¼‰
ä»–ã«ã¯ã€使いやすいライブラリ API デザイン(akr さんの RubyKaigi 2006 の発表) ã‚’èªã‚“ã§æ„ŸéŠ˜ã‚’å—ã‘ãŸã‚‰ã€èªã‚“ã§æã¯ãªã„ã¨æ€ã„ã¾ã™ã€‚
特ã«ã€Ruby ã«æ©Ÿèƒ½æ案をã—ãŸã„ã¨ã‹è€ƒãˆã¦ã‚‹äººã¯èªã‚€ã¨ã„ã„ã§ã™ã‚ˆã€‚ã‚ã‚ã›ã¦èªã¿ãŸã„:matz を説得する方法(akr さんの RubyKaigi 2008 の発表)
ã¾ãŸã€ã€ŒI/Oã€ã€Œã‚½ã‚±ãƒƒãƒˆã€ã€Œãƒ—ãƒã‚»ã‚¹ã€ãªã©ã€UNIX システムプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°å¯„ã‚Šã®å†…容ãŒå¤šã‚ã§ã™ã€‚Ruby ã§ãã†ã„ã†ã“ã¨ã‚’ã‚„ã‚ŠãŸã„人ã«ã¯ã¨ã¦ã‚‚å‚考ã«ãªã‚‹ã¨æ€ã„ã¾ã™ã€‚å¿…èªã¨è¨€ã£ã¦ã‚‚ã„ã„ã‹ã‚‚?
æ´æˆ¦ã® Ruby ユーザã¸ã®ç´¹ä»‹
Ruby をよã使ã£ã¦ã„る人ãªã‚‰ä½•ã¨ãªãæ„Ÿã˜ã¦ã‚‹ã¨æ€ã†ã‚“ã§ã™ãŒã€Ruby ã®çµ„ã¿è¾¼ã¿ã‚¯ãƒ©ã‚¹ã£ã¦çŽ‰çŸ³æ··æ·†ãªã‚“ã§ã™ã‚ˆã。ãªã‚“ã¨ã„ã†ã‹ã€è¨è¨ˆãƒ»å®Ÿè£…ã®ç†Ÿè€ƒåº¦ã«ãƒ ラãŒã‚ã‚‹ *3 。ãã®ä¸ã§ã€ãµã¨ä½•ã‹æ„Ÿå¿ƒã™ã‚‹ã“ã¨ã®ã‚る部分ã¯ã€ãŸã„ã¦ã„ akr ã•ã‚“ãŒèƒŒå¾Œã«ã„ã¾ã™ã€‚
ãã†ã„ã†éƒ¨åˆ†ãŒã©ã‚Œã»ã©ã®ç†Ÿæ…®ã‚’é‡ãã¦è¨è¨ˆã•ã‚Œã¦ããŸã‹ã€ã“ã®æœ¬ã‚’èªã‚ã°åˆ†ã‹ã‚Šã¾ã™ã€‚ãれもã€èƒŒæ™¯çŸ¥è˜ã®èª¬æ˜Žã‚’å«ã‚ã¦ã€æ¥µã‚ã¦ç†è·¯æ•´ç„¶ã¨ã‚ã‹ã‚Šã‚„ã™ã説明ã—ã¦ãã‚Œã¾ã™ã€‚Ruby マニアã«ã¨ã£ã¦ã“ã‚“ãªè²´é‡ãªæœ¬ã¯ãªã„ã§ã™ã€‚
Ruby 以外ã®ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžãƒ¦ãƒ¼ã‚¶ã¸ã®ç´¹ä»‹
Ruby ã‚’é¡Œæã¨ã—㦠API è¨è¨ˆã®ã‚±ãƒ¼ã‚¹ã‚¹ã‚¿ãƒ‡ã‚£ã‚’紹介ã™ã‚‹æœ¬ãªã®ã§ã€Ruby を知らãªã„人ã«ã‚‚èªã¿ã‚„ã™ã„ã¨ã¯è¨€ã„ã«ãã„ã§ã™ãŒã€ã—ã‹ã—ä»–ã«é¡žæ›¸ã£ã¦ã‚ã‚‹ã‚“ã§ã™ã‹ã *4 。言語やライブラリ㮠API è¨è¨ˆã«ã¤ã„ã¦è€ƒãˆã¦ã¿ãŸã„人ã¯èªã‚€ã¨ã„ã„ã‚“ã˜ã‚ƒãªã„ã§ã—ょã†ã‹ã€‚ã¤ã„ã§ã« Ruby を使ã£ã¦ã¿ãŸããªã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
追記:akr ã•ã‚“ãŒã€ŽAPIデザインの極意 Java/NetBeansアーキテクト探究ノートã€ã¨ã„ã†é¡žæ›¸ã‚’æ•™ãˆã¦ãã‚Œã¾ã—ãŸã€‚ã“ã¡ã‚‰ã¯äº’æ›æ€§æœ€å„ªå…ˆã¨ã„ã†æ„Ÿã˜ã ãã†ã§ã™ã€‚
Ruby 以外ã®ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžã®é–‹ç™ºã«æºã‚ã£ã¦ã„る人ã¸ã®ç´¹ä»‹
ã‚ãªãŸã®è¨€èªžã® I/O 周りã€ãƒ—ãƒã‚»ã‚¹å‘¨ã‚Šã€æ™‚刻周りã«ã¤ã„ã¦ã€è¨è¨ˆä¸å‚™ã‚„機能ä¸è¶³ã‚’知るã“ã¨ãŒã§ãã¾ã™ã€‚ã„や実際ã®ã¨ã“ã‚ã€ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžã®ã„ã‚ゆる泥è‡ã„部分㮠API è¨è¨ˆã«ã¤ã„ã¦ã„ã‚ã„ã‚書ã„ã¦ã‚ã‚‹ã®ã§ã€é‡å®ã™ã‚‹ã¯ãšã€‚
実用的ãªãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžã‚’作りãŸã„ã¨æ€ã£ã¦ã„る人ã¸ã®ç´¹ä»‹
ãã‚ŒãŒã©ã‚Œã ã‘é ã„é“ã®ã‚Šãªã®ã‹ã‚’痛感ã•ã›ã¦ãã‚Œã¾ã™ã€‚評価器ã¨ã‹ GC ã¨ã‹ã ã‘ã§ã¯å®Ÿç”¨çš„ãªãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°è¨€èªžã¯ä½œã‚Œãªã„ã®ã§ã™â€¦â€¦ã€‚
プãƒã‚°ãƒ©ãƒžã§ã¯ãªã„人ã¸ã®ç´¹ä»‹
世界å„国ã®å¤‰æ…‹ã‚µãƒžãƒ¼ã‚¿ã‚¤ãƒ ã«ã¤ã„ã¦è±†çŸ¥è˜ãŒå¾—られã¾ã™ã€‚
Ruby 開発者ã¸ã®ç´¹ä»‹
ãˆã€ã¾ã èªã‚“ã§ãªã„ã®ï¼Ÿ
*1:自分㨠akr ã•ã‚“ã¨ã¯ Ruby コミッタã¤ãªãŒã‚Šã§ã™ã€‚
*2:1.8 ã®ã“ã‚ã® open3.rb を知ã£ã¦ã„る人ã¯ãƒã‚¬ãƒ†ã‚£ãƒ–ãªå°è±¡ã‚’æŒã£ã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€Ruby 1.9 㧠akr ã•ã‚“ãŒå¤§æ”¹ä¿®ã—ã¦ç¾åœ¨ã¯å®‰å¿ƒãƒ»å®‰å…¨ã® akr プãƒãƒ€ã‚¯ãƒˆã«ãªã£ã¦ã¾ã™ã€‚詳ã—ã㯠3 ç« ã«æ›¸ã„ã¦ã‚る。
*3:ãŸã¨ãˆã°ã€ã‚«ãƒãƒ¬ãƒƒã‚¸ API ã¨ã‹ã²ã©ã„ã§ã™ã‚ˆã。カãƒãƒ¬ãƒƒã‚¸æ¸¬å®šã‚’ç´°ã‹ã制御ã§ããªã„ã¨ã‹ã€ãƒ‘スカãƒãƒ¬ãƒƒã‚¸ã¸ã®æ‹¡å¼µæ€§ã‚’å…¨ã考ãˆã¦ãªã„ã¨ã‹ã€‚
*4:å¼·ã„ã¦è¨€ãˆã° C 言語㮠rationale ã¨ã‹ï¼Ÿ