$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
毎日叩ける シェル芸を覚えよう!
Search
greymd
August 26, 2016
Technology
4
4.4k
毎日叩ける シェル芸を覚えよう!
2016/08/27 第6回もう初心者向けでないなんて言わないよ絶対午前のシェル勉強会/第24回◯◯o◯裏番組シェル芸勉強会 での発表資料です。
greymd
August 26, 2016
Tweet
Share
More Decks by greymd
See All by greymd
Breaking Through Firewalls with Shell-gei
greymd
0
93
狂気!AWS CloudShell細胞分裂!
greymd
0
2.5k
シェル芸人に必要なのは「マスキングテープ」だったのでは
greymd
19
11k
入門Cureutils
greymd
3
2.6k
Other Decks in Technology
See All in Technology
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
590
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
400
Uncertainty in the LLM era - Science, more than scale
gaelvaroquaux
0
800
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
420
AI活用によるPRレビュー改善の歩み ― 社内全体に広がる学びと実践
lycorptech_jp
PRO
1
180
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
160
プロダクトマネジメントの分業が生む「デリバリーの渋滞」を解消するTPMの越境
recruitengineers
PRO
3
710
Noを伝える技術2025: 爆速合意形成のためのNICOフレームワーク速習 #pmconf2025
aki_iinuma
2
2k
Agentic AI Patterns and Anti-Patterns
glaforge
1
200
学習データって増やせばいいんですか?
ftakahashi
1
150
直接メモリアクセス
koba789
0
280
バグハンター視点によるサプライチェーンの脆弱性
scgajge12
3
970
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
57k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
710
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.8k
Embracing the Ebb and Flow
colly
88
4.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
Done Done
chrislema
186
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Transcript
ຖୟ͚Δ γΣϧܳΛ֮͑Α͏ʂ ʙேͷγΣϧܳษڧձʙ Yasuhiro Yamada (@grethlen) 2016-08-27 ୈ6ճ͏ॳ৺ऀ͚Ͱͳ͍ͳΜͯݴΘͳ͍Α ઈରޕલͷγΣϧษڧձ/ୈ24ճ̋̋őཪ൪γΣϧܳษڧձ ޕલͷ෦
$ whoami ͳ·͑: Yasuhiro Yamada ͓͠͝ͱ: ΞϓϦέʔγϣϯΤϯδχΞ ిࢠܾࡁ·ΘΓ͕ຊۀ ͠ΎΈ: Ξχϝؑ
γΣϧܳ Twitter: @grethlen Qiita: greymd ةݥ͡Όͳ͍Α
γΣϧܳྺ ܳྺ ຊ֨తʹ։͖࢝Ίͨͷ͕͓͓Αͦ6લ͘Β͍ γΣϧܳؔ࿈Ͱ։ൃ egzact — γΣϧͷऑΛิ͏ίϚϯυୡ Github: greymd/egzact cureutils
— ࣍ੈITਓࡐҭπʔϧ Github: greymd/cureutils هࣄ(Qiita) ʲͨͷ͍͠ͳʳ༷ʑͳίϚϯυୡΛԿߟ͑ͣʹͭͳ͍Ͱ༡Ϳ (1079 stock) ςετͷΛݮΒͦ͏ʂϓϦΩϡΞͰֶͿPICT (305 stock) ϓϦΩϡΞͰֶͿϫϯϥΠφʔWebεΫϨΠϐϯά (122 stock)
γΣϧܳͷֶͼํ ϘτϜΞοϓ →ࣝΛ͔ΒݻΊΔ →ྫ: ମܥతʹ·ͱ·ͬͨ ࢿྉΛಡΉ τοϓμϯ →Γ͍ͨ͜ͱΛઌʹܾΊΔ →࠷ݶඞཁͳ͔ࣝΒಘΔ →ྫ:
άάͬͨ݁ՌΛ ϦόʔεΤϯδχΞϦϯά ඪ४ೖग़ྗɺ੍ޚߏ ࠐΈίϚϯυɺ֎෦ίϚϯυɺ ύΠϓϥΠϯɺऴྃεςʔλεɺ ύϥϝʔλల։……etc ֦ுਖ਼نදݱɺ AWKͷGolfɺevalࠇຐज़ ίϚϯυͷෳ߹ɺ ศརͳΦϓγϣϯ……etc Γ͍ͨ ͜ͱ
ϘτϜΞοϓͳΞϓϩʔν ମܥతʹ·ͱ·ͬͨࢿྉΛಡΉ • γΣϧεΫϦϓτجຊϦϑΝϨϯε (ஶ: ࢁ ৎൣ) • Software DesignͰϐϯͱ͖ͨΒങ͏
(ྫ: 20166݄߸ bash ࠶ೖ) • γΣϧܳຊ • ͳͲ…(࠷ޙͷํͷεϥΠυʹ·ͱΊͯ·͢)
τοϓμϯͳΞϓϩʔν Γ͍ͨ͜ͱΛάάΔ →ग़͖ͯͨίϚϯυΛϦόʔεΤϯδχΞϦϯά ษڧձͰ՝Λղ͘ → ͔Βͳ͍՝γΣϧܳਓʹҰ୴ͬͯΒ͏ → ؾʹͳͬͨϑϨʔζΛ֮͑ͯؼͬͯͬͯΈΔ ຖΛ։͍֮ͯ͑ͨϑϨʔζΛୟ͘ͷΦεεϝ ΧϨϯμʔͷ֬ೝͱ͔ɺ
ੜ׆ʹඞཁͳ࡞ۀ͕GOODʢޙड़ʣ
ͲͬͪͷΞϓϩʔν͕͍͍ͷʁ ࠓͷ্ୡϨϕϧʹԠͯ͡όϥϯεΛऔΔͷ͕େ ϘτϜΞοϓ͚ͩͩͱख͕ಈ͔ͳ͍ɻ τοϓμϯ͚ͩͩͱ͕ࣝ๘ͷʹɻ
ϓνγΣϧܳษڧձΛ ͜Ε͔Β։͖·͢
ਐΊํ(1/3) ೖऀʢࠇ͍ը໘͕·ͩ͜Θ͍͓ͱͩͪʣ ը໘ʹग़ΔίϚϯυࣸܦ͋Δ͍άάͬͯԼ͍͞ɻ ͖ͨΒมଶΛ؍ͯ͠Լ͍͞ɻ͜Θ͘ͳ͍Ͱ͢ɻ ॳ৺ऀʢgrepͰϩάΛ֬ೝ͢Δͷ͕͍͍ͤͥͷ͓ͱͩͪʣ ͋ͨΒ͍͠ίϚϯυͱΦϓγϣϯΛ֮͑·͠ΐ͏ɻ ޙͰࢿྉΛݟฦͯ͠Έ·͠ΐ͏ɻ தڃऀʢxargsͰվߦΛআ͘ͷ͕श׳Խͯ͠Δ͓ͱͩͪʣ Βͳ͍Tips͕͋Δͱࢥ͏ͷͰɺੋඇ࣋ͪؼͬͯԼ͍͞ɻ มଶʢAWKͰGolf͢Δ͓ͱͩͪʣ
Ғͦ͏ͳ͜ͱݴͬͯͯ͢Έ·ͤΜɻมଶճظͯ͠·͢ɻ
ਐΊํ(2/3) ಈ࡞ڥ Ubuntu14.14ͷbashͰಈ࡞֬ೝࡁΈɻ ࢿྉࣗମطʹWebͰݟΕ·͢ɻ Ͱ͖Δ͚ͩ͑Λݟͳ͍ͰਐΊͯԼ͍͞ɻ ࣮ࢪதτοϓμϯͳֶͼΛɻ ࢿྉࣗମޙ͔ΒಡΈฦͯ͠ϘτϜΞοϓͳֶͼͷ ͨΊͷࡧҾͱͯ͠͝׆༻Լ͍͞ɻ
ਐΊํ(3/3) ͷઆ໌ $ ίϚϯυ -Φϓγϣϯͦͷଞ 'จࣈྻϦςϥϧ' ϑΝΠϧ # ίϝϯτ -
ઌ಄ͷ $ ϓϩϯϓτΛද͢ه߸Ͱೖྗෆཁɻ - จͷٯεϥογϡ \ վߦʢ͋ͬͯͳͯ͘OKʣ [࣋ͪؼΓϙΠϯτ] આ໌ͩΒͩΒ
Լ४උ (1/2) 1. Λ։͍ͯԼ͍͞ 2. ԼهͷίϚϯυΛ࣮ߦͯ͠ɺϑΝΠϧΛμϯϩʔ υ͍ͯͩ͘͠͞ɻ $ wget goo.gl/PGDjKb
-O holidays ※ wget͕ͳ͍ਓͪ͜Β $ curl -L goo.gl/PGDjKb > holidays
Լ४උ (2/2) 3. ls ΛଧͬͯϑΝΠϧ͕͋Δ͜ͱΛ֬ೝɻ $ ls holidays 4. ϑΝΠϧͷ༰Λ֬ೝ
$ head holidays 2015-01-01 ݩ 1 2015-01-02 ۚ ࡾ͕ 1 2015-01-03 ࡾ͕ 1 …
͜ͷϑΝΠϧʁ 2015ʙ2021·ͰͷຊͷҰཡ ϑΥʔϚοτʢ [ ] εϖʔεʣ YYYY-MM-DD[ ]༵[ ]Πϕϯτ໊[ ]ٳϑϥά
ٳϑϥάʢٳ=1, ฏ=0) 12/30ʙ01/03·Ͱٳѻ͍ ʢࣄೲΊɺେᷢɺࡾ͕ʣ ͓ຍ8/13ʙ8/16ʹઃఆ దٓݸਓͷঢ়گʹԠͯ͡ॻ͖͑ͯԼ͍͞ɻ
Q1 2016ͷ͚ͩΛඪ४ग़ྗʹදࣔͯ͠Լ͍͞ɻ ※தڃऀҎ্ͷํ”g”ͷͭ͘ίϚϯυېࢭ $ ? ? ? 2016-01-01 ۚ ݩ
1 2016-01-02 ࡾ͕ 1 2016-01-03 ࡾ͕ 1 2016-01-04 ݄ ฏ 0 …
ύλʔϯϚονΛ͠Α͏(1/2) ղྫ $ grep '2016' holidays 2016-01-01 ۚ ݩ 1
2016-01-02 ࡾ͕ 1 2016-01-03 ࡾ͕ 1 … [grepίϚϯυͷ͍ํͷجຊ] 1. grep <நग़͍ͨ͠ύλʔϯ> <ϑΝΠϧ໊> 2. cat <ϑΝΠϧ໊> | grep <நग़͍ͨ͠ύλʔϯ>
ύλʔϯϚονΛ͠Α͏(2/2) ผղ $ cat holidays | grep 2016 grepͷ͍ํ͕Θ͔Βͳ͍ਓʹ͜ΜͳΓํɻ $
cat holidays | sed -n '/2016/p' $ cat holidays | awk '/2016/' $ cat holidays | perl -ne '/2016/ and print' : grep͍ͷͰɺେͷ߹grepΛͬͨ΄͏͕͍͍ Ͱ͢ɻ
Q2 20162݄Կ͋Δ͔ ͑ͯΈ·͠ΐ͏ɻ $ ? ? ? 29
ߦΛΧϯτ͠Α͏(1/2) ղྫ $ cat holidays | grep '2016-02' | wc
-l 29
ߦΛΧϯτ͠Α͏(2/2) Լه wc -l (ߦΧϯτ)ͱ ΄΅ಉ͡ڍಈΛ͢Δɻ • awk 'END{print NR}'
• grep -c . • nl -nln | cut -f 1 | tail -n 1 • perl -pE '}{ say $.'
Q3 20169݄19Կͷʁ Πϕϯτ໊ͷΈΛදࣔͯ͠Έ·͠ΐ͏ɻ தڃऀҎ্ͷਓ”a”ͷͭ͘ίϚϯυېࢭ $ ? ? ? ܟͷ
ಛఆͷϑΟʔϧυΛநग़(1/2) ղྫ $ cat holidays | grep '2016-09-19' | \
awk '{print $3}' [ϑΟʔϧυ] จࣈྻΛεϖʔεͰ۠ͬͨͱ͖ͷจࣈͷ·ͱ·Γͷ ͜ͱɻ্هྫࠨ͔Β̏൪ͷϑΟʔϧυΛදࣔɻ 2015-01-01[εϖʔε][εϖʔε]ݩ[εϖʔε]1 $1 $2 $3 $4
ಛఆͷϑΟʔϧυΛநग़(2/2) Լهͷྫશͯɺ̏ϑΟʔϧυΛநग़͢Δྫ • awk '$0=$3' • cut -d ' '
-f 3 • perl -anle 'print $F[2]' # Perl0ΠϯσοΫε • perl -aple '$_=$F[2]' • self 3 # Open usp Tukubai ༻
Q4 ࠓͷใΛදࣔͯ͠Έ·͠ΐ͏ɻ ͨͩ͠ɺίϚϯυʹҰࣈΛΘͣʹɻ $ ? ? ? 2016-08-27 ٳ
1
ίϚϯυஔΛ͔͓ͭ͏(1/2) ղྫ $ cat holidays | grep $(date +%F) [ίϚϯυஔ]
$(ʙ) ͋Δ͍ όοΫΫΦʔτʢ`ʣΛͬͨ `ʙ` ͱ͍͏දݱʮίϚϯυஔʯɻ ʙ ʹॻ͍ͨίϚϯυͷ݁ՌΛจࣈྻʹ ͨ͠ͷͷΑ͏ʹ;Δ·͏ɻ
ίϚϯυஔΛ͔͓ͭ͏(2/2) ίϚϯυஔͷྫ $ date +%F 2016-08-27 $ echo $( date
+%F ) #(1) 2016-08-27 $ echo '2016-08-27' #(2) 2016-08-27 (1)ͱ(2)ͷίϚϯυ݁Ռతʹಉ͡ɻ
Q5 2016ʹɺ֤༵͕͍ͭ͋͘Δ͔දࣔͯ͠Έ·͠ΐ͏ɻ $ ? ? ? 53 52
52 ݄ 52 52 ਫ 52 Ր 53 ۚ
্͑͛(1/2) ղྫ $ cat holidays | grep '2016' | awk
'{print $2}' | \ sort | uniq -c [Α͘͏͑ํͷϑϨʔζ] • sort | uniq -c • sort | uniq -c | sort -n
্͑͛(2/2) sortͱuniqͷ͍ํ͕͔Βͳ͍ਓ͚ճ $ cat holidays | \ grep '2016' |
awk '{print $2}' | \ awk '{a[$1]++}END{for (k in a){print a[k],k}}' $ cat holidays | \ grep '2016' | awk '{print $2}' | \ perl -0777 -anlE 'grep{!$h{$_}++} @F; say "$h{$_} $_" for keys(%h)'
Q6 201608݄03 ͔Β 201609݄30 ·Ͱදࣔͯ͠Έ·͠ΐ͏ɻ $ ? ? ? 2016-08-03
ฏ 0 ʙ 2016-09-30 ۚ ฏ 0
͋Δύλʔϯ͔Β ͋Δύλʔϯ·Ͱநग़(1/2) ղྫ $ cat holidays | \ awk '/2016-08-03/,/2016-09-30/'
[ಛఆͷ2ύλʔϯؒͷग़ྗ] awk '/։࢝ύλʔϯ/,/ऴྃύλʔϯ/'
͋Δύλʔϯ͔Β ͋Δύλʔϯ·Ͱநग़(2/2) ผղ # sedΛ͏ $ cat holidays | \
sed -n '/2016-08-03/,/2016-09-30/p' # perlΛ͏ $ cat holidays | \ perl -nle 'print if /2016-08-03/../2016-09-30/' ڧҾʹ $ cat holidays | \ grep '2016-08-03' -A 50 | grep '2016-09-30' -B 50
Q7 2015ͱ2016Λൺֱͯ͠ɺ ยํʹ͔͠ଘࡏ͠ͳ͍ॕΛදࣔͯ͠Լ͍͞ɻ ̎ͭ͋Γ·͢ɻ $ ? ? ? # ࣮ࡍղ͍ͯ֬ೝͯ͠ΈͯͶ
ϓϩηεஔΛ͔͓ͭ͏(1/3) ղྫ $ diff \ <(grep 2015 holidays | awk
'{print $3}' | sort | uniq) <(grep 2016 holidays | awk '{print $3}' | sort | uniq) [ϓϩηεஔ] <(ʙ) ͱ͍͏දݱʮϓϩηεஔʯɻ <(ʙ) ͷՕॴɺ ʙ ʹॻ͍ͨίϚϯυͷ݁ՌΛهड़ͨ͠ ϑΝΠϧͷΑ͏ʹৼΔ͏ɻ
ϓϩηεஔΛ͔͓ͭ͏(2/3) ϓϩηεஔྫ $ echo A B C > abc.txt $
cat abc.txt | sed 's/A/B/' # (1) B B C $ cat <( echo A B C ) | sed 's/A/B/' # (2) B B C (1)ͱ(2)ͷίϚϯυ݁Ռతʹಉ͡ɻ
ϓϩηεஔΛ͔͓ͭ͏(3/3) ϓϩηεஔΛΘͳ͍ผղ $ cat holidays | grep -e '2015' -e
'2016' | \ awk '{print $3}' | sort | uniq -u
Q8 ※ ্ڃऀ͚ ༗څΛͬͯܭըతʹ࿈ٳΛ࡞ΔͨΊʹ 2015 ʙ 2021ͷؒͰ ٳ→ฏ→ٳ ͱͳ͍ͬͯΔ3ؒΛશͯநग़ͯ͠Έ·͠ΐ͏ɻ $
? ? ? 2015-11-01 2015-11-02 2015-11-03 2016-02-11 2016-02-12 2016-02-13 2016-05-01 2016-05-02 2016-05-03 … ݄͕Θ͔ΕΑ͍ͷͰɺ༵ٳϑϥάΛग़ྗͯ͠OKɻ ग़ྗํ๏͓·͔ͤ͠·͢ɻ
ҙ ෳߦʹ·͕ͨͬͯ ॏෳ͢Δ͕͋Δ͔ɻ {08-09, 08-10, 08-11} ͷτϦΦ {08-11, 08-12, 08-13}
ͷτϦΦ ༵ ༰ 2020-08-09 ٳ 2020-08-10 ݄ ฏ 2020-08-11 Ր ࢁͷ 2020-08-12 ਫ ฏ 2020-08-13 ͓ຍ
ҰߦͰϧʔϓΛճͦ͏ ղྫ $ cat holidays | tr '\n' '\t'| awk
-F'\t' \ '{for(i=3;i<=NF;i++){print $(i-2),$(i-1),$i}}' \ | grep ' 1.* 0.* 1$' গ͠Θ͔Γ͘͢ cat holidays | tr '\n' '\t'| awk -F'\t' \ # λϒจࣈΛ۠Γจࣈʹࢦఆ '{ for(i=3;i<=NF;i++){ # NF(Number of Field)…ϑΟʔϧυ print $(i-2),$(i-1),$i # ྫ: i͕3ͷ࣌$(i-1)$2ͱͯ͠ධՁ͞ΕΔ } }' \ | grep ' 1.* 0.* 1$' # 1(ٳ) " 0(ฏ) " 1(ٳ) (εϖʔεҙ)
ศརͳಓ۩Λ׆༻͠Α͏ egzactʢ࠷ऴεϥΠυࢀরʣͷ convίϚϯυ͕͋ΕγϯϓϧʹΊΔʂ ʢखલຯḩࣦྱʣ $ cat holidays | tr '\n'
'\t' | \ conv fs='\t' 3 | \ grep ' 1.* 0.* 1$' convίϚϯυ ϑΟʔϧυ۠ΓͷೖྗΛཐટঢ়ʹ܁Γฦ͢ɻ $ echo 'A B C D E' | conv 3 A B C B C D C D E
͜ͷϑΝΠϧΛͬͨศརٕ(1/3) ʮ2ϲ݄ͰͰ͖ΔΑͶʁʯͱݴΘΕͨ࣌ → ࣮ࡍͷӦۀʁ → େܕ࿈ٳΛڬΉͱҙ֎ʹগͳ͍ $ cat holidays |
\ awk '/2016-08-01/,/2016-09-30/' |\ grep '0$' | nl Ӧۀ͚ͩநग़ → ΤΫηϧʹషΓ͚ͯਐḿཧʢനʣ
͜ͷϑΝΠϧΛͬͨศརٕ(2/3) ࠓͷ༗څ͍ͭ͘Թଘ͠Α͏͔ͳ……ɻ ٳˠฏˠٳ $ cat holidays | grep '2016' |
\ tr '\n' '\t' | conv fs='\t' 3 | \ grep ' 1.* 0.* 1$' ٳˠฏˠฏˠٳ $ cat holidays | grep '2016' | \ tr '\n' '\t' | conv fs='\t' 4 | \ grep ' 1.* 0.* 0.* 1$'
͜ͷϑΝΠϧΛͬͨศརٕ(3/3) ࣍ͷૉͷ͍ͭͩΖ͏ʁؾʹͳΔͳ͋ $ cat holidays | grep '2016' | \
tr -d '-' | awk '$0=$1' | \ factor | awk '$0*=!$3' | \ sed -r 's/(..)(..)$/-\1-\2/' | \ grep -f - holidays
·ͱΊ ೖऀϘτϜΞοϓֶशॏࢹ͕٢ͩͱࢥ͍·͢ ׳Ε͖ͯͨΒΓ͍ͨ͜ͱΛ࡞ͬͯτοϓμϯ Γํ͕Θ͔Βͳ͍࣌…… → άάͬͯϦόʔεΤϯδχΞϦϯά → ͭΑ͍γΣϧܳਓʹฉ͘ ຖୟ͘ͱϚΠφʔͳૢ࡞ɾΦϓγϣϯ֮͑ͯ͘Δ ͳΜͱ͔श׳Խͤ͞ΔͱͭΑ͘ͳΕΔɻ
ࠓͷࢿྉͷؾʹͳͬͨ෦ΛҰ୴ؙ҉ه͢Δͷखɻ
ࢀߟจݙɾURL ੴҪ͞ΜͷʮγΣϧܳೖʯ http://slideck.io/github.com/hisaharu/shellgei/slides/shellgei23AM2.md#/ ࡈ౻͞ΜͷAWKҰߦඦݓ http://gauc.no-ip.org/awk-users-jp/material/100_one_liners_20131223.pdf γΣϧϓϩάϥϛϯά࣮༻ςΫχοΫ http://gihyo.jp/book/2015/978-4-7741-7344-3 γΣϧεΫϦϓτجຊϦϑΝϨϯε http://gihyo.jp/book/2011/978-4-7741-4643-0 Software
Design 20166݄߸ bash ࠶ೖ http://gihyo.jp/magazine/SD/archive/2016/201606 Perl One-Liners (※༸ॻ) http://shop.oreilly.com/product/9781593275204.do
ࢧԉπʔϧURL egzact — Έ߹Θͤྻڍ͕ܰʑͰ͖ΔΑ͏ʹͳΔ https://github.com/greymd/egzact Open usp Tukubai — DB͍ΒͣͰूܭ࡞ۀ͕ϥΫνϯʹͳΔ
https://github.com/usp-engineers-community/Open-usp-Tukubai nixar — ຯʹΓʹ͍͘࡞ۀָ͕ʹͳΔ͔ https://github.com/askucher/nixar MCMD — ԯ୯Ґͷσʔλʹෳࡶͳ౷ܭॲཧ͕Ͱ͖Δ http://www.nysol.jp/ Cureutils — ϓϦςΟͰΩϡΞͳศརίϚϯυ https://github.com/greymd/cureutils