ããã«ã¡ã¯ã@yuskuboã§ãã æ¬è¨äºã¯ ããããã¬ã¼ãã³ Advent Calendar 2021 ã®13æ¥ç®ã®è¨äºã§ãã æ¦è¦ RubyKaigi 2021ã§Rubyã®æ°ããdebuggerã§ããdebug.gemãç´¹ä»ããã¾ãããï¼Ruby 3.1ããã¯æ¨æºã©ã¤ãã©ãªã«ãªãäºå®ã¨ã®ãã¨ã§ãã ããããã¬ã¼ãã³ã§ã¯ãããã¾ã§byebug gemã¨pry gemãå©ç¨ãã¦ãã¾ããããä»å¾ã®ãã¼ã¸ã§ã³ã¢ãã対å¿ã®ãã¨ãèæ ®ãã¦debug.gemã¸ç§»è¡ããæ¥ã ã®æ¥åã§ä½¿ã£ã¦ãã¾ãã æ¬è¨äºã§ã¯ãç§ããã使ã£ã¦ããdebug.gemã®æ©è½ãããã¤ãããã¯ã¢ãããã¦ç´¹ä»ãã¦ããã¾ãããããç¥ããªãã£ãï¼ããããããªãã¨ãã§ãããã ï¼ãã¨ãããã¨ã1ã¤ã§ããå±ãã§ããã°å¬ããã§ãã 対象èªè debug.gemãã¾ã 使ã£ããã¨ãªãããåºæ¬çãªä½¿ç¨æ¹æ³ãç¥ãããã¨ããæ¹ debug.gemã¯æ¢ã«
æ°ãããããã¬ã«ä¹ãæãã¦ãããã°ããã»ã¹ãå¤æ´ããã®ãã¤ãåå«ã«ãªããã¨ãããã§ããããæ¬è¨äºã«ãã£ã¦ãçãããruby/debugã«è¦ªããã§ã¹ã ã¼ãºã«ç§»è¡ããå©ãã«ãªããã¨ãé¡ã£ã¦ãã¾ãã 以ä¸ãdebugã¯ruby/debugãæãã¾ãã å 責äºé èè ã¯debugã¨æ¯ã¹ã¦byebugã®çµé¨ããã¾ãããã¾ãããä¸æ£ç¢ºãªæ å ±ãå¤ãæ å ±ãããã¾ããããã²ãç¥ãããã ããã æ¬è¨äºã®ç®çã¯é«åº¦ãªã¬ãã«ã§æ¯è¼ãè¡ããã¨ã§ããdebugã®ç¹å®ã®å©ç¨æ¹æ³ã«ã¤ãã¦ã¯å ¬å¼ããã¥ã¡ã³ããåç §ãã¦ãã ããã æ¬è¨äºã¯ãã¹ã¦ã®æ©è½ãç¶²ç¾ ãã¦ããããã§ã¯ããã¾ããããã»ã¨ãã©ã®æ©è½ãã«ãã¼ãã¦ããã¯ãã§ãã ð debugã使ãã¡ãªãã åå¥ã®æ©è½ã解説ããåã«ãdebugã使ãã¡ãªããã«ã¤ãã¦ç°¡åã«è§¦ãã¦ããããã¨æãã¾ãã 1. åºåãã«ã©ã¼åããã¦ãã 2. ã¡ã½ããããããã¯ã®å¼æ°ãããã¯ãã¬ã¼ã¹
morimorihogeã§ãã涼ãããªã£ã¦ããããçãã¦ãããæãã«ãªã£ã¦ä½ããã§ãã ä»åã¯ruby/debugã«æ°ããå°å ¥ãããChrome Devtoolsé£æºãªã¢ã¼ããããã°æ©è½ãåããã¦ã¿ãã®ã§ããã¡ããç´¹ä»ãã¦ã¿ããã¨æãã¾ãã ãã¨ã®èµ·ãã æ°ããRubyæ¨æºãããã¬ã¨ãã¦éçºãé²ãã§ããruby/debugã§ãããå æ¥ãããªTweetãããã¾ããã debug.gem and Chrome browser integration. Thanks Ono-san! pic.twitter.com/3aUdH2zbEo â _ko1 (@_ko1) October 14, 2021 ãªã«ããããããªãï¼ï¼ã¨æããä»åã®è¨äºãæ¸ãã«è³ãã¾ããã åãã¨ãã¦ã¯ããããã¬ã®ã³ã³ã½ã¼ã«ã§ open chrome ã³ãã³ããå®è¡ããã¨URLã表示ããããã®URLã«Chromeã§ã¢ã¯ã»ã¹ã
ãã£ããã¨æ¸ããã®ã§ãä½ãã®åèã«ã©ãã Rails ã®åé¡ãã©ããããã°ã調ã¹ã ããªãã®Rails ã¢ããªããä¾ãã°ãã©ã¦ã¶ããã®ãªã¯ã¨ã¹ãã«å¯¾ãã¦ä½ãå¿çããå ´åããªã¯ã¨ã¹ãæ å ±ã¯Rails ã®ã¢ããªã±ã¼ã·ã§ã³ããã°ã©ã ã«å°éããåã«HTTP ãµã¼ãã®ããã°ã©ã ãéãã¾ãã ã§ãã®ã§ãHTTP ãµã¼ããRails ã«ãªã¯ã¨ã¹ãæ å ±ã渡ããªãã£ãå ´åããããã¯ãªã¯ã¨ã¹ããHTTP ãµã¼ãã«ããå°éããªãã£ãå ´åã¯ãå½ç¶Rails ããã°ã©ã ã¯åãã¾ããã ã¨ãããã¨ã§ã¾ãã¯ããªã¯ã¨ã¹ããRails ã«å°éãã¦ãããããã°ãã調ã¹ã¾ãããã ãã° ããã©ã«ãã§ã¯ãdevelopment ç°å¢ã® Rails ã®ãã°ã¯ log/development.log ã«åºã¾ãã ãã°è¦ãã¨ãã®åºæ¬çãªãã¨ã§ãããtail ã³ãã³ãã® f ãªãã·ã§ã³ã§ã追å è¡ãéææµãã¦ããããã«ãã¦ã¿ã¾ããã ãã
åãã« ä»ã¾ã§binding.pryã§ãããã¯ãã¦ããã®ã§ãããä¸è¨ã®æé ãè¸ãã®ã§ãããã¯ã«æéããããã å¦çãæ¢ãããæã«binding.pryãæã¡è¾¼ã å¦çãæ¢ããã 確èªå¾binding.pryãæ¶ãã 次ã®å¦çãè¦ããæã¯ãããç¹°ãè¿ãã VScodeã§ãããã¯ãã㨠æ¢ãããå¦çã®æã«ãã¬ã¤ã¯ãã¤ã³ããè²¼ãï¼è¤æ°è²¼ãäºãåºæ¥ããï¼ ãããã¯ã®éå§ãã¿ã³ãæ¼ãã 3.å¦çãæ¢ããã ã¨ãªããbinding.pryãæ¸ããªãäºãè¤æ°ç®æãã¬ã¤ã¯ãã¤ã³ããè²¼ãäºãåºæ¥ãã®ã§ãå¹çåã測ããã ã¤ã³ã¹ãã¼ã« ä¸è¨ãè¨è¿°ãã¦ã¤ã³ã¹ãã¼ã« - ruby-debug-ide - debase
ruby/debug ã¨é£æºãã¦ãããã°ãè¡ãã VSCode extension ãåºã¦ãã®ã§è©¦ãã marketplace.visualstudio.com github.com åæ $code -v 1.57.0 b4c1bd0a9b03c749ea011b06c6d2676c8091a70c x64 $ruby -v ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19] æºå debug ã¯ãã¬ãªãªã¼ã¹çãã¤ã³ã¹ãã¼ã«ãã¦ã㨠README ã«ããã®ã§å¾ãã gem install debug --pre ãããã«ä»¥ä¸ã®ãããªã³ã¼ããæ¸ãã¦ãã¬ã¼ã¯ãã¤ã³ããè²¼ã£ã¦ã¿ã class A attr_accessor :x end def main a = A.new a.x = 2 puts a.x end
ç°å¢ï¼rails 4.2.0 Rails ã§ãªã¯ã¨ã¹ãã® HTTP ãããã¯request.headersããåå¾ã§ããã ãã¹ã¦ãã°ã«åºåãããªã # ãã¹ã¦ãã°ã«åºåãã request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" } åå¥ã«åå¾ãããªã # ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ããåå¾ãã request.headers[:HTTP_USER_AGENT] request.envããã§ãåå¾ã§ããã # ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ããåå¾ãã request.env['HTTP_USER_AGENT'] ä»åãããããã¨ã¯ã¯ã©ã¤ã¢ã³ãå´ãã HTTP ãããã« API ã®ãã¼ã¸ã§ã³ãåãè¾¼ãã§ãªã¯ã¨ã¹ããã¦ããã®ã§ããã¹ã¦ã®ãªã¯ã¨ã¹ãã® API ãã¼ã¸ã§ã³ãåãåºãã¦ãã°ã«åºåãããã ãªã¯ã¨ã¹ãã®ãã©ã¡ã¼ã¿ã curl ã§åç¾ããã¨ä»¥ä¸
æ²é¡ã®é¡æãæºããããã«ã調ã¹ã¦ãã¾ããããå¦ã³ãããã¾ããã®ã§ããçµè«ãã¨ã ãã®**ãéç¨ããã®å¦ãã 4ã¤ã®TIPSã**ããå±ããããã¨æãã¾ãã çµè« explain 使ãããªã®ã§ãããèå³ã失ã£ãæ¹ã¯ãã以ä¸ãèªã¿é ãå¿ è¦ã¯ãªããã¨æãã¾ããã SQLãã¹ãããªã¿ããã¨ãããããããªé¡æ rais c 使ãã¾ããActive Record 使ãã¾ããçºè¡ãããSQLãè¦ããã§ãã irb(main):001:0> User.first User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 => #<User id: 1, name: "name1", created_at: "2016-10-08 11:20:08", updated_at: "2016-10-08 11
ä¹ ãã¶ãã«ã©ãã¼ãããã³ã°(ã©ãã¼ããã¯ã»ãããã®ã³ã°)ã¨ããåèªãç®ã«çã¾ã£ãã®ã§ãæ´çãã¦ã¿ã¾ãã ã©ãã¼ãããã³ã°(ã©ãã¼ããã¯ã»ãããã®ã³ã°ãããã£ãã¢ã»ãã¢ã»ããã°ã©ãã³ã°)ã¨ã¯ åé¡è§£æ±ºã«è©°ã¾ã£ãã¨ãã人ã«åé¡ã説æããã¨èª¬æéä¸ã§è§£æ±ºãããã¨ãããããã«ã人ã§ã¯ãªãã©ãã¼ããã¯(ã¢ãã«ã®ããã¡ã)ãããã£ãã¢ã«è©±ãããããã¨ã§åé¡è§£æ±ºã試ã¿ãææ³ã®ãã¨ã§ãã Rubber duck debugging - Wikipedia Teddy Bear Pair Programming by Adrian Bolboaca ãã¼ã®ã¼ã«è©±ã ãã©ãã¼ãããã³ã°ãã¨äººã«æãããã¨ã®æ義 - ãã¤ã¸ã®æ¥å ± ãã¢ããã°ã©ãã³ã°ï¼ããã£ãã¢å¹æï¼ - çºå£°ç·´ç¿ ãã¢ããã°ã©ãã³ã°ãç¡çãªããµã¤ã¬ã³ããã¢ããã°ã©ãã³ã°ãæ¤è¨ããã - Qiita 人ã«èª¬æããã¨ç¸æã®æéã奪ã£ã¦ãã¾ãã¾ããã
Laravel 5 ã§ãããã°åºåããï¼ã¤ã®ããæ¹ã«ã¤ãã¦ã¾ã¨ããã ãã°ãã¡ã¤ã«ã«æ¸ãã ã ï¼éãã®æ¸ãæ¹ãããã ãã«ãã¼é¢æ° logger(), info() <?php Route::get('/', function() { $message = ['a' => 1, 'b' => 2, 'c' => 3]; logger($message); info($message); // logger()->notice($message, $context); // logger()->warning($message, $context); // logger()->error($message, $context); // logger()->critical($message, $context); // logger()->alert($message, $context);
PHPã§ãããã° PHPã§ã®ãããã°ã£ã¦ã¿ãªããä½ãã¦ã¾ãï¼ã£ã¦èãã¨ãååãããã¯var_dump();ãechoã£ã¦è¿ã£ã¦ãããã§ãããã¸ããã¨ãæããã§ããã©åãæ°å¹´åããã§ãããæ å¼±ã§ãããæè¿ãRailsã§Webã¢ããªä½ã£ã¦ããã¨ãbinding.pryãææ¾ããªãæãã«ãªã£ã¦ãã¦ã¾ãã¦ããªãã§Railsï¼Rubyï¼ã§æ¸ããã§ããï¼ã¨èãããããbinding.pryãããããã ã¨ååãããæ¬æ°ã§æã£ã¦ãã¦ããããªbinding.pryè³ã®ã¾ã¾PHPã®éçºã«ã¹ã¤ããããã¨ãã¡ãã£ã¨ãããã¨ã§ã¦ã¬ã¼ã¨ãªãããã§ããJavaãObjective-Cã§ã³ã¼ãæ¸ãã¦ãã人ããè¦ããããããªããã°ã©ãã³ã°ã®ããæ¹ããã®ãï¼ã¨é©ãããããã§ãã var_dump();ãæ¸ãã¦ã¯ãã©ã¦ã¶æ´æ°ãã¦å¤æ°ã®ä¸èº«ã確èªããããã¡ã½ããã®æåã確ãããããã«å度å®è¡ãããâ¦ãããªè¦è¡ããã¯åæ¥ãããï¼ã¨
以ä¸ã®å 容ã¯ãGoogleã®éçºè åããã¼ã¸ã«ãã èªã¿ãããå½¢å¼ã¸ã® JavaScript ã®å¤æ ã»ã¼ãã®ã¾ã¾ã§ãã (å¼ç¨) JavaScript ãèªã¿ãããå½¢å¼ã«å¤æããã«ã¯ãChrome DevTools 㧠[Pretty-Print] ã¢ã¤ã³ã³ãã¯ãªãã¯ãã¾ãã å®éã«ãã£ã¦ã¿ã¾ãã ãã¨ãã°Google Earthã® app_ja.js ã®ã½ã¼ã¹ã³ã¼ãã¯å§ç¸®ããã¦ããã®ã§æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãããããã ã¨èªããæ°ããã¾ãããã ãããªã¨ãã«ã¯ã Pretty Print {} ã®ã¢ã¤ã³ã³ãã¯ãªãã¯ãã¾ãã ããã¨ã app_ja.js:formatted ã¨ããã¿ãã®ä¸ã«ãèªã¿ãããæ´å½¢ãããã¹ã¯ãªããã表示ããã¾ãã ã¡ãªã¿ã«ããããã°æã®ãã¬ã¤ã¯ãã¤ã³ãã¯formattedå´ã«è¨å®ããã°è¯ãã®ã§ãæ¢å®ã®APIã使ããããªéçºä½æ¥ã楽ã«ãªãã¾ããã
Railsæ¬ã®åçµãdocker-composeã§è¡ãªã£ãã¨ãã®Tipsã TL;DR docker-composeã§ä½ã£ãRubyOnRailsã³ã³ããã§binding.pryã«ãããããã°ãè¡ããããã«ããã åæ docker-composeã§RailsãSpringç¨ã®ã³ã³ãããªã©ãè¤æ°ã³ã³ãããèµ·åããå½¢ã®Railsç°å¢ãæ§ç¯ãããåºæ¬æ§æã¯ä»¥ä¸ã®è¨äºã«ç¿ã£ã¦ããã é«éã«éçºã§ãã Docker + Railséçºç°å¢ã®ãã³ãã¬ã¼ããä½ã£ã äºåæºå Railsããããã°å®è¡ããããã«å¿ è¦ãªè¨å®ãã¡ã¤ã«ã®æºåãããã ã³ã³ããã®æ¨æºå ¥åºåã«ã¢ã¿ããããããã«ãDockerã®è¨å®ããã¦ããã docker-compose.yml ãã¬ã¼ã¯ãã¤ã³ããè²¼ãããã®binding.pryãããããã®Gemã追å ããã Gemfileã¯pry-railsã®ä»ã«pry-byebugã追å ãã¦
ãç¥ãã
ã©ã³ãã³ã°
ã©ã³ãã³ã°
ãªãªã¼ã¹ãé害æ å ±ãªã©ã®ãµã¼ãã¹ã®ãç¥ãã
ææ°ã®äººæ°ã¨ã³ããªã¼ã®é ä¿¡
å¦çãå®è¡ä¸ã§ã
j次ã®ããã¯ãã¼ã¯
kåã®ããã¯ãã¼ã¯
lãã¨ã§èªã
eã³ã¡ã³ãä¸è¦§ãéã
oãã¼ã¸ãéã
{{#tags}}- {{label}}
{{/tags}}