Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Write Code Every Day

Write Code Every Day

ながらRuby会議01 (https://regional.rubykaigi.org/nagara01)

Avatar for Koichi ITO

Koichi ITO

August 05, 2025
Tweet

More Decks by Koichi ITO

Other Decks in Programming

Transcript

  1. w ϦϞʔτϦϙδτϦ͔ΒHJUDMPOFͨ͠ ϩʔΧϧϦϙδτϦΛ؅ཧ͢Δπʔϧ w HJUDMPOFʹ୅ΘΓHIRHFUͰϦϙδτϦऔಘ w dHJUDPO fi HʹHIRͷSPPUσΟϨΫτϦΛ ࢦఆՄೳ

    HIR IUUQTHJUIVCDPNYNPUFNFOHIR [ghq] root = ~/src HIRHFUʹΑΔσϑΥϧτͷ഑ஔઌ͸HIR ͕ͩɺιʔείʔυͱ͍͏ந৅Խͨ͠σΟ ϨΫτϦ໊ͱͯ͠ѻ͏ͨΊTSDʹ͍ͯ͠Δ
  2. HIR IUUQTHJUIVCDPNYNPUFNFOHIR $ tree `ghq root` /Users/koic/src ├── github.com │

    ├── modelcontextprotocol │ │ ├── modelcontextprotocol │ │ └── ruby-sdk │ └── rubocop │ ├── rubocop │ └── rubocop-rails ├── gitlab.com │ └── tmtms │ └── lsp_router w HIRSPPU͔Βͷ ϗετ໊PSH໊ ϦϙδτϦ໊ͷ σΟϨΫτϦߏ଄ w TSD௚ԼʹϦϙδτϦ HJUDMPOFͯ͠Δਓ΁ HIR@USBOTGFSΛHFN ͱͯ͠ϦϦʔεࡁΈ
  3. w ແݶʹ૿͑ΔϩʔΧϧϦϙδτϦͱ͍͏՝୊ w QFDP΍G[GͳͲϑΟϧλϦϯάπʔϧͰղܾ ϑΟϧλϦϯάπʔϧͰϦϙδτϦҠಈ $ ghq list | wc

    -l 2428 $ cr # This is an original command. QUERY> rubocop/rubo IgnoreCase [16 (1/1)] /Users/koic/src/github.com/rubocop/rubocop /Users/koic/src/github.com/rubocop/rubocop-ast /Users/koic/src/github.com/rubocop/rubocop-capybara
  4. ࢀߟ HIR QFDP # cr is a custom command for

    "change repository". function cr() { if [ $# -eq 1 ]; then repo=$(ghq list -p | sort | peco --query $1) else repo=$(ghq list -p | sort | peco) fi if [ -n "$repo" ]; then cd $repo fi } IUUQTHJUIVCDPNLPJDEPU fi MFTCMPCNBTUFSEPUTIHIRTI ༨ஊͰ͕͢ɺ&NBDTύοέʔδͩͱJWZHIR͕ศར
  5. $ git remote add upstream https://github.com/koic/rubocop $ git push upstream

    head ϩʔΧϧϦϙδτϦ ϦϞʔτϦϙδτϦ FH (JU)VC dTSDHJUIVCDPNSVCPDPQSVCPDPQ PSJHJO SVCPDPQSVCPDPQ VQTUFBN LPJDSVCPDPQ PSJHJOʹ४ͨ͡ύε PSJHJOͱVQTUSFBN 044 13લͷHJUQVTI͸ɺHJUQVTIVQTUSFBNIFBEͷܾΊଧͪͰΑ͍ GPSLͨ͠ϦϙδτϦΛVQTUSFBNͱͯ͠ॳظઃఆճͷΈࢦఆ 13 VQTUSFBN DMPOFQVMM 'PSL PSJHJO OFFETDPNNJUCJU
  6. $ git remote add upstream https://github.com/your/origin $ git push upstream

    head ϩʔΧϧϦϙδτϦ ϦϞʔτϦϙδτϦ FH (JU)VC dTSDHJUIVCDPNZPVSPSJHJO PSJHJOcVQTSFBN ZPVSPSJHJO PSJHJOʹ४ͨ͡ύε PSJHJOͱVQTUSFBN ͓࢓ࣄ VQTUSFBN͸࣮࣭PSJHJOͷΤΠϦΞε 'PSL͸ෆཁ VQTUSFBN DMPOFQVMM ͓࢓ࣄͰ΋HJUQVTIVQTUSFBNIFBEͱ͍͏044ͱಉ͙͡͠͞ʹͳΔ 13 PSJHJO
  7. w wip_࢝·Γͷ໊લͷϒϥϯν͕ύονା w QFDPͰϒϥϯν໊ʹΑΔϑΟϧλϦϯά ύονାͱ8*1ϒϥϯνͰ࿈ಈ alias cb='git checkout `git branch

    | peco | \ sed -e "s/\* //g" | awk "{print \$1}"`' $ cb # cb is a custom command for "change branch". QUERY> wip_ wip_fix_a_false_positive_for_layout_xxx_cop wip_fix_a_false_negative_for_style_xxx_cop
  8. w ະ׬੒ެ։ͰͷΠγϡʔͷόοΫϦϯΫ๷ࢭ w wip_࢝·ΓϒϥϯνͷQVTI๷ࢭͷHJUIPPLT HJUIPPLTͰະ׬੒ͷQVTI๷ࢭ # .git/hooks/pre-push if [ \

    "$(git rev-parse --abbrev-ref HEAD | grep '^wip_')"\ ]; then echo "[ABORT] You cannot push this branch." 1>&2 exit 1 fi git push࣌ʹ࣮ߦ͞ΕΔHJUIPPLTͱͯ͠഑ஔ XJQϒϥϯνͩͱࣦഊ͢ΔͷͰɺৗʹgit push upstream headͰྑ͍
  9. w HJUDPO fi HHMPCBMJOJUUFNQMBUFEJSύε ΛςϯϓϨʔτͷύεΛࢦఆ࣮ͯ͠ߦ͢Δ w HJUDPO fi HʹUFNQMBUFEJSͷઃఆ͕Ͱ͖Δ HJU@UFNQMBUFIPPLTΛ༻ҙ

    [init] templatedir = ~/src/github.com/koic/dotfiles/dot.git_template $ git config --global init.templatedir \ ~/github.com/koic/dotfiles/dot.git_template
  10. w (FN fi MFͰHFNϝιουͷQBUIΦϓγϣϯΛ ࢖ͬͯϩʔΧϧΛ࢖͏Α͏ʹ͍ͯ͠Δ w ։ൃσόοάͰγʔϜϨεʹίʔυฤू͢Δ Πγϡʔͷ࠶ݱ؀ڥ 3VCP$PQ༻ #

    frozen_string_literal: true source 'https://rubygems.org' gem 'prism', path: '/Users/koic/src/github.com/ruby/prism' gem 'rubocop', path: '/Users/koic/src/github.com/rubocop/rubocop' gem 'rubocop-ast', path: '/Users/koic/src/github.com/rubocop/rubocop-ast'
  11. w Πγϡʔͷಈ࡞ݕূ༻ʹϩʔΧϧϦϙδτϦ Λ༻ҙ͍ͯ͠Δ w Πγϡʔ൪߸ͰσΟϨΫτϦΛ۷ͬͯɺ ΠγϡʔͷίʔυΛషΓ෇͚ͯ֬ೝ͍ͯ͠Δ Πγϡʔͷ࠶ݱ؀ڥ 3VCP$PQ༻ $ mkdir

    42 && cd $_ $ emacs example.rb # Paste issue code and edit. $ bundle exec rubocop HJU؅ཧ͓ͯ͘͠ͱɺΦʔτίϨΫτͷόά࠶ݱ·ͰHJUDIFDLPVUͷ܁Γฦָ͕͠
  12. w ΃Μ͞Μ΍NBNF͞Μͷ ΞϨ HJUIVCDPNUSJD  w ։࠵͝ͱʹެ։͞ΕΔ 53*$,ͷίʔυͰޡݕ஌ ͕ͳ͔ͬͨ͜ͱ͕ͳ͍ w

    ࠷ڪͷ3VCP$PQΩϥʔ 53*$,ͷ࠷ڪίʔυͰݕࠪ eval((s=%~c=(0..35 ).map{s[2*_1+1]}*'';class$Inte ger;def$quXinclude(Math ;spXo(a)=self* a.pow(87X=h=32.chr;g=PI/480;ls=(sp*31X,89)%89; def$abX+'eval((s=%'+(n=? .next)+s*88.chr+[nXs()=[a =self%X+'.split(',sp*25+'?'+88.chr+');(0..36).mapX89,89- a].miX{s[2*_1].split}',sp*31+".join.tr('$',$/)))"]*$/)Xn;end ;reqX.split$/;trap(:INT){puts;exit};q=->t,i{a,y=((t+i*99)Xuire 'matrX%960). ivmod(80);[(a*(7+i)+i*23)%79+(y+a)/(5+i%4)%2,39Xix';1 5.tiX-y/2]};p=->t,u{a=->b,c{(0..5).sum{(u%2-1)*E**(t*(b+c*_1)*gXmes{ |i,*X.i+ i*u+=5+sin(u*u))}};x,z=a[5,3]. 5,3].rect;x+=y.Xv|z= *?!Xi a[19,4];z+=w;r=(4+(x.abs+z.i).ab };t=(0..959).fX..? W,?Xind{|t|(0..29).all?{x,y=q[t,_1];(x 2||h=ls[y][x]X[,* ?]..X[/[^!-}]/]}};h=($**h+h).chr;eval( []} ->(x,yX?};a =(0X,a,b){x=x*36+39.5;y=19.5-y*18;b*=1 |i|((yX..1 34)X-b).ceil..y+b).map{|j|((x-i)/a+(y j)/ .times{X.ma p{zXx,z=p[t,_1];l=u```=0;while``````(l<1)``; u+```=0 ;d=x-y;X.in dex(Xl+=(d.abs+(z-w``)``.i).ab``s*1.``1 ;x``,z=y``,w;o[v``=``x.r d.imag/Xc[i+ 15*Xd.abs*l*sin(2*``l-t``*g*80``-_1) l*(``1-l)/``6,a``=l*( -l)**2*0.X_1] )};X7,a*2]&&o[v,z,``0.0``3,l**`` ``times``{|i``|(8+i).times{|Xw=* MatXj|o[sin(i)/2+````` ```sin( `/2.0`````````)*j/200,j*0.0Xrix [*(X5-1,0.02,0.1]``}} ``. q[t,``_1];m``[y][x]= };i=-X0.. 44).X1;$><<(['%%','[H .map{|j|(0..79).map{|k|x=(Xmap{ |i,X -39.5)/35.8;y=( i+=1;m[j][k]?h:c[i]):ls[j]X*b| v<<X[k];}*''}*$/<<0) 1)%9 te"`")#qv.jSaL{=;q(Q}4fXa.z ip(Xjs(:#tK`Jm))FKO /A9(2'%iorvf7 eEa0uV xv+Q@qUU](L@&Py .1v'X0.. ).suXydSEH{-GI|-5(,z G5evpq,[b50 D[ t {on,I?VStS`?G@LoqFCXm{|j ,k|Xj1.QnxKz!mH%o# )b2Seut,]! 48 lBieJGi 5jeNPD#b}H3X-(p =(iXaVz#8*+US,hgF 5#6]y-` 4hy HN hF75WjD!0IxJ$sX+k) .powX+UP"cNUE9- G< tHvV;Ib <-s U T ? vlE xylg=x#X(i+k ,88)XV9u$9lKb9 @C do7+-w >l { v9 { P l ga%]AK<e&'X+1)* (j||(X4ifK/6S+ k} @@*a} 6rS xn"Q[M 8 `|g>$#BrjXb<<p; 0))}XtbDp'Kc t2 Dat9C s C rL+ g,j]Tf B< eMI+zzkWX;b}] .lup.XtVP<ak IM E/+)B jwv uB (Twqed D* dyf_dT7Xsolve (v);13Xn:8 #_ RiSTO, [Fk m O]O#"+ a_ cT_.X5.time s{c[i+X e5 T`FBEC q*f 2 o@{a<eUG aW PX15*_1] =z[a[_1]X z_@`nll 7F1 2 [=^uS0z^ 6X||w.shif t]}};eval(Xfg K#R N bp-E_Xc)~.split( ?X);(0..36).map{s[2*_1].split} .join.tr('$',$/))) IUUQTHJUIVCDPNUSJDUSJDLCMPCNBTUFSUPNQOHFOUSZSC
  13. w େࡕ3VCZձٞͷొஃͷͨΊʹࣗ࡞ͨ͠ HJUIVCDPNLPJDNJOJGZSCΛ࢖ͬͯɺNJOJGZ ͨ͠3VCZͷίʔυΛΦʔτίϨΫτ͢Δ .JOJGZͨ͠ίʔυΛݕࠪ͢Δ $ gem i minifyrb $

    cat lib/mcp/version.rb module MCP VERSION = "0.2.0" end $ minifyrb lib/mcp/version.rb module MCP;VERSION="0.2.0";end .JOJGZͨ͠ίʔυ͕ੜ੒͞ΕΔ IUUQTTQFBLFSEFDLDPNLPJDNJOJGZSVCZDPEF
  14. w ίʔυΛݟ͚ͨͩͰΘ͔Δύον͸؆୯ w ಈ͔͞ͳ͍ͱΘ͔Βͳ͍ύον͸IVCίϚϯ υ΍HIίϚϯυ͕13ͷίʔυऔಘʹศར HIίϚϯυར༻ͷํ͕ΠϚυΩ IVC΍HIίϚϯυͰϩʔΧϧಈ࡞ݕূ $ # Tip:

    suggests using `eval "$(hub alias -s)"`. $ hub checkout https://github.com/org/repo/pull/42 $ gh pr co https://github.com/org/repo/pull/42
  15. ͝౰஍λΠϜελϯϓूΊ $ cd path/to/rubocop $ git log --author=koic --pretty=format:'%aE %ai'|\

    awk '{print $4}' | sort | uniq -c 20 +0200 # νΣίɺΠλϦΞɺόνΧϯ (αϚʔλΠϜ) 18 +0300 # τϧί 15 +0800 # ୆࿷ɺதࠃ 3418 +0900 # ೔ຊ 10 -0500 # ϛωΞϙϦεɺγΧΰ (αϚʔλΠϜ) 1 -0700 # αϯϑϥϯγεί (αϚʔλΠϜ) 5 -0800 # ϩαϯθϧε $ git log commit 07501d54dac7dd21f9d42e8d6dd502166daf3565 Author: Koichi ITO <koic.ito_at_gmail.com> Date: Fri Nov 15 09:31:09 2024 +0300 Fix false positives for `Lint/InterpolationCheck` This PR fixes false positives for `Lint/ InterpolationCheck` when using invalid syntax in interpolation. ```console $ cat example.rb