Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
70
狂気!AWS CloudShell細胞分裂!
greymd
0
2.4k
シェル芸人に必要なのは「マスキングテープ」だったのでは
greymd
19
11k
入門Cureutils
greymd
3
2.5k
Other Decks in Technology
See All in Technology
AI人生苦節10年で会得したAIがやること_人間がやること.pdf
shibuiwilliam
1
220
【Λ(らむだ)】最近のアプデ情報 / RPALT20250729
lambda
0
130
LLMでAI-OCR、実際どうなの? / llm_ai_ocr_layerx_bet_ai_day_lt
sbrf248
0
300
MCPに潜むセキュリティリスクを考えてみる
milix_m
1
890
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
2.1k
私とAWSとの関わりの歩み~意志あるところに道は開けるかも?~
nagisa53
1
140
モバイルゲームの開発を支える基盤の歩み ~再現性のある開発ラインを量産する秘訣~
qualiarts
0
780
Jitera Company Deck / JP
jitera
0
280
隙間時間で爆速開発! Claude Code × Vibe Coding で作るマニュアル自動生成サービス
akitomonam
2
210
AI駆動開発 with MixLeap Study【大阪支部 #3】
lycorptech_jp
PRO
0
280
ML Pipelineの開発と運用を OpenTelemetryで繋ぐ @ OpenTelemetry Meetup 2025-07
getty708
0
320
Amazon CloudWatchのメトリクスインターバルについて / Metrics interval matters
ymotongpoo
3
290
Featured
See All Featured
Statistics for Hackers
jakevdp
799
220k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Facilitating Awesome Meetings
lara
54
6.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Why Our Code Smells
bkeepers
PRO
337
57k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Six Lessons from altMBA
skipperchong
28
3.9k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
390
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Speed Design
sergeychernyshev
32
1k
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