アスキーアート(突然の死、slコマンド、端末画面ぐちゃぐちゃ)をワンライナーでやってみた ※完全版
ΞεΩʔΞʔτ ϫϯϥΠφʔ@ୈ25ճγΣϧܳษڧձ େࡕαςϥΠτ (2016.10.29)MSR (@msr386)
View Slide
࣍➤ ࣗݾհ➤ ࠓ·Ͱͷল➤ ΞεΩʔΞʔτͳγΣϧܳ (όφʔܳ)➤ ಥવͷࢮ➤ slίϚϯυ➤ λʔϛφϧը໘Λ͙ͪΌ͙ͪΌʹ͢Δ➤ ·ͱΊ
ࣗݾհ➤ ϋϯυϧωʔϜ: MSR (@msr386)➤ C++ϓϩάϥϛϯάɺαʔόʔӡ༻͕ಘҙ➤ ٻ৬த➤ Chromium Contributor (1ճ͚ͩ)➤ Webϒϥβ࡞͍ͬͯ·͢ (http://app.tungsten-start.net/)
ࠓ·Ͱͷল
͜Ε·ͰͷࣗͷओͳLTൃදΛৼΓฦΔͱ
(1)Χφμͷങ͍ΓVPSͷհӡ༻ʹ͑ͳ͍͚ͲγΣϧܳ࿉ʹͽͬͨΓ?
(2) QRίʔυγΣϧܳ?QRةݥγΣϧܳ / QRίʔυγΣϧܳͷՄೳੑΛࡧ
΄ͱΜͲγΣϧܳͱؔͳ͍͡ΌΜ(ΨνͷγΣϧܳΖ͏ͥ)
࠷ۙͷόφʔܳͱ͍͏ྲྀߦʹΓ
ΞεΩʔΞʔτγΣϧܳΛΓ·͢
1. ಥવͷࢮ
?P? ɹɹc ɹɹ
ʘ ?P? ɹʘc ɹɹɹʼ
ʻ ?P?ʼ ɹࡾࡾ ʻʉʉʼ
Є ?P? ɹʻʼάΩο ʻʉʉʼ
ʊਓਓਓਓʊ ʼಥવͷࢮʻ ʉ:?:?:?:ʉ
ಥવͷࢮ➤ 2012ࠒɺͱ͋Δܝࣔ൘ʹॻ͖ࠐ·Εͨͷ͕ݩωλͱݴΘΕ͍ͯΔ➤ ࠷ޙͷғΈจࣈͷΞεΩʔΞʔτ͚͕ͩΑ͘ΘΕ͍ͯΔ➤ 2013ʹTwitterͰվߦίʔυ͕ରԠ͔ͯ͠Βڻҟతʹ֦ࢄ➤ ओͳಛ➤ ൚༻ੑͷߴ͞➤ ΞεΩʔΞʔτͷ୯७͞➤ ݟͨͷྗڧ͞➤ ʮಥવͷࢮδΣωϨʔλʔʯͱ͍͏໊લͰWebαʔϏεԽɺiOSAndroid͚ʹΞϓϦԽ͞Ε͍ͯΔ
ಥવͷࢮɹγΣϧεΫϦϓτ൛͕ଘࡏ➤ γΣϧεΫϦϓτ͋Δ (https://fumiyas.github.io/2013/12/25/echo-sd.sh-advent-calendar.html)$ echo -e "crontab -r\n突然の危険シェル芸" | echo-sd -s --center _人人人人人人人人人人人_ > crontab -r < > 突然の危険シェル芸 < ‾Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^‾ $ $ echo-sd -v 縦書き _人人_ > 縦 < > 書 < > き < ‾Y^Y^‾ $
ಥવͷࢮɹγΣϧεΫϦϓτ൛͕ଘࡏ➤ ॎॻ͖ɺɺετϨεൃੜաఔϞʔυɺπΠʔτػೳͳͲػೳ͕๛$ echo-sd --stress "crontab: no crontab forroot" あれ?中身消えてる "(historyの結果)334 sudo crontab -r" "eとr押し間違い!バックアップない!!" 危険シェル芸 crontab: no crontab for root ↘ あれ?中身消えてる ⾫ (historyの結果) 334 sudo crontab -r ↘ eとr押し間違い!バックアップない!! ⾫ _人人人人人人人人_ > 危険シェル芸 < ‾Y^Y^Y^Y^Y^Y^Y^Y^‾$ echo-sd --tanzaku ":(){ :|:& };:" ┏-┷-┓ ┃ ‥ ┃ ┃ ⏜ ┃ ┃ ⏝ ┃ ┃ ⏞ ┃ ┃ ┃ ┃ ‥ ┃ ┃ | ┃ ┃ ‥ ┃ ┃ & ┃ ┃ ┃ ┃ ⏟ ┃ ┃ ; ┃ ┃ ‥ ┃ ┗━━┛
ϫϯϥΠϯ࣮ɺ։࢝
࢝ΊΔલʹ୯७ԽͷͨΊʹɺҎԼͷΑ͏ͳखൈ͖Λ͠·͢➤ ෯ϑΥϯτʹಛԽ➤ 1ߦ͚ͩରԠ ෳߦͰߟྀ͖͢͜ͱ͕૿͑ΔͨΊ➤ શ֯จࣈ͚ͩରԠ ֯จࣈͱΓ͋͑ͣແࢹ͢Δ➤ LANG=ja_JP.UTF-8 લఏ LANGʹΑΓจࣈܭࢉ͕͓͔͘͠ͳΒͳ͍Α͏ʹ͢ΔͨΊ
੍࡞աఔ1. ಛΛଊ͑Δ_人人人人人人_ > 突然の死 < ‾Y^Y^Y^Y^Y^Y^‾ಥવͷࢮɺจࣈʹԠ্ͯ͡෦ɺԼ෦ͷจࣈ͕มԽ͢Δ →্෦ʮਓʯͱԼ෦ʮY^ʯΛશ֯1จࣈʹରͯ͠1ݸͣͭ૿ͤΑ͍
੍࡞աఔ2. จࣈΛௐΔʹ? awkͷlength()Λ༻͢Δ for (i=0; i※+2ࠨӈͷه߸ͱ༨ന3. printfͰܗ͢Δ printf("ʊ%sʊ\nʼɹ%sɹʻ\nʉ%sʉ\n", up, $0, dn)
ಥવͷϫϯϥΠφʔ୯७൛$ echo 突然の死 | awk \ '{for(i=0;i{up=up "人"; dn=dn "Y^"} printf( \ "_%s_\n> %s <\n‾%s‾\n", \ up, $0, dn)}'
ಥવͷϫϯϥΠφʔ୯७൛ɹ࣮ߦྫ$ echo 突然の死 | awk '{for(i=0;iprintf("_%s_\n> %s <\n‾%s‾\n", up, $0, dn)}' _人人人人人人_ > 突然の死 < ‾Y^Y^Y^Y^Y^Y^‾ $ $ echo Hankakuだとずれる | awk '{for(i=0;i"Y^"} printf("_%s_\n> %s <\n‾%s‾\n", up, $0, dn)}' _人人人人人人人人人人人人人人_ > Hankakuだとずれる < ‾Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^‾ $
ಥવͷϫϯϥΠφʔ୯७൛ͷಛͱಛ➤ awkҰൃܳ➤ πΠʔτՄೳ(112จࣈ)➤ ֯จࣈࠞ͟ΔͱͣΕΔͷखൈ͖͠ա͗͡Όͳ͍? ֯จࣈͰͣΕΔݪҼɺawkͷlength()ͷ༷➤ LANGڥมʹґଘ➤ ja_JP.UTF-8ͷ߹ɺશ֯֯1Λฦ͢➤ ͳΒɺશ֯2ɺ֯1ΛฦͤͣΕͳ͍ΑͶ?
ಥવͷϫϯϥΠφʔվྑ൛$ echo 突然の死 | awk \ '{for(i=1;i<=length();i++){ \ len+=(substr($0,i,1)~/[\x01-\x7E]/)?1:2} \ for(i=0;iup=up "人";dn=dn "Y^"} \ printf("_%s_\n> %s <\n‾%s‾\n", \ up,$0,dn)}'
ಥવͷϫϯϥΠφʔվྑ൛ɹ࣮ߦྫ$ echo 突然のワンライナーEx | awk '{for(i=1;i<=length();i++){len+=(substr($0,i,1)~/[\x01-\x7E]/)?1:2}for(i=0;i"Y^"}printf("_%s_\n> %s <\n‾%s‾\n",up,$0,dn)}'_人人人人人人人人人人人人_ > 突然のワンライナーEx < ‾Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^‾$$ echo Hankakuでもずれは最小限 | awk '{for(i=1;i<=length();i++){len+=(substr($0,i,1)~/[\x01-\x7E]/)?1:2}for(i=0;i"Y^"}printf("_%s_\n> %s <\n‾%s‾\n",up,$0,dn)}'_人人人人人人人人人人人人人人_ > Hankakuでもずれは最小限 < ‾Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^‾$
ಥવͷϫϯϥΠφʔվྑ൛ͷಛ➤ վળ➤ ͕֯ࠞͬͯͣ͟Εͳ͍➤ վѱ➤ πΠʔτෆՄ
վྑ൛ͷղઆ➤ awkΛܗ͢Δͱ͜ͷΑ͏ʹͳΔ{ for(i = 1; i <= length(); i++) { len += ( substr($0,i,1) ~/[\x01-\x7E]/ ) ? 1 : 2 } for(i = 0; i < len / 2 + 2; i++) { up = up "ਓ"; dn = dn "Y^" } printf("ʊ%sʊ\nʼɹ%sɹʻ\nʉ%sʉ\n", up, $0, dn) }
վྑ൛ͷղઆ(1.) for(i = 1; i <= length(); i++) { len += (substr($0,i,1)~/[\x01-\x7E]/) ? 1 : 2 }(2.) for(i = 0; i < len / 2 + 2; i++) { up = up "ਓ"; dn = dn "Y^" }(3.) printf("ʊ%sʊ\nʼɹ%sɹʻ\nʉ%sʉ\n",up, $0, dn)1. จࣈΛऔಘ 1จࣈͣͭऔΓग़͠ɺจࣈ͕UTF-8Ͱ1όΠτจࣈͰ͋Δ߹1ɺͦΕҎ֎2ͱ͢Δɻ UTF-8ͷ1όΠτจࣈɺ0x01ʙ0x7eؚ͕·Ε͍ͯΔ͔Ͳ͏͔Ͱఆ͢Δɻ2. ্෦ʮਓʯɺԼ෦ʮY^ʯΛจࣈʹԠͯ͡૿͢ ૿͢શ֯ج४Ͱ͋Δ͜ͱʹҙ3. printfͰܗ
͞ΒͳΔվྑͷಓ➤ ෳߦରԠ➤ ϧʔϓճΛݮΒ͢ͳͲͷ࠷దԽ➤ awkΛΘͳ͍ํ๏➤ etc.➤ ͬͱ͍͍ํ๏͋ΔͣͳͷͰɺՋͳͱ͖ʹνϟϨϯδ͠·͠ΐ͏
൪֎ฤ_人人人人人人人_ > 突然のSEGV < ‾Y^Y^Y^Y^Y^Y^Y^‾
൪֎ฤ➤ SEGVͰམͪͨɾɾɾ༷?$ awk --version GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0) $ echo ಥવͷSEGV | awk '{print $0~/[\x00-\x7F]/}' 1 $ echo ಥવͷSEGV | awk '{print $0~/[\x00-\x80]/}' awk: ίϚϯυϥΠϯ:1: க໋తΤϥʔ: ෦Τϥʔ: ηάϝϯςʔγϣϯҧ Aborted (core dumped) $
2. SLίϚϯυ
LSͷ͋Δ͋Δ➤ lsͱೖΕΑ͏ͱͯ͠ $ sl -l sl: command not found $➤ lʮ͔ͯ͠͠ʯ sʮΘͨͨͪ͠ʯ ҎԼུ➤ lsͱؒҧ͑ͯslͬͯೖΕͪΌͬͨʂͱ͍͏͋Δ͋Δ͔Βɺslͱ͍͏δϣʔΫίϚϯυ͕ੜͨ͠
SLίϚϯυͷ͍ྺ࢙➤ 1987ɺUNIXχϡʔεάϧʔϓfj.sourceʹॳొ(࡞ऀՎਖ਼͞Μ)➤ 1993ɺ๛ాਖ਼࢙͞Μ(ݱࡏɺ।ڭत)͕slίϚϯυΛϦϦʔε ͨͩͷδϣʔΫίϚϯυ͔ΒΩʔλΠϓڲਖ਼ίϚϯυʹਐԽ➤ 1990ޙʙ LinuxσΟετϦϏϡʔγϣϯʹࡌ͞ΕΔΑ͏ʹͳΔ➤ 2000ɺslͷվ൛͕ొ➤ དྷͰ30प!
SLίϚϯυͷಛ➤ Ctrl+C (SIGINT) Λԡͯ͠தஅ͠ͳ͍ ΩʔλΠϓڲਖ਼͕త͔ͩΒ➤ lsΑΓ࣮ߦ͕࣌ؒΔ͔ʹ͍ ΩʔλΠϓڲਖ਼͕త͔ͩΒ➤ Φϓγϣϯ͕lsʹࣅ͍ͯΔ Ωʔt δϣʔΫίϚϯυ͔ͩΒ
SLίϚϯυΛγΣϧܳͰ
݅➤ ݩωλͷΞεΩʔΞʔτΛϕʔεͱ͢Δ o o o ____ -- |OO| _||__| | | | /-O=O O=O--➤ ंྠճΒͳ͍➤ ৠؾݻఆ͔ͭग़ͬͺͳ͠➤ ӈ͔Βࠨಈ͕͘ɺؿंશମৗʹදࣔͤ͞Δ➤ Ctrl+C༗ޮ (ΩʔλΠϓڲਖ਼͕తͰͳ͍͔Β)
γΣϧܳखॱ̍AAΛ1ߦʹ$ echo -e " o \n o \n o ____\n -- |OO|\n_||__| |\n | |\n/-O=O O=O--" o o o ____ -- |OO| _||__| | | | /-O=O O=O-- $
γΣϧܳखॱ̎ӈ٧Ί͢ΔڥʹԠͯ͡ tput colsɺBSDܥͳΒ tput coɺBashͳΒecho $COLUMNS Ͱͷ෯͕औಘͰ͖Δ$ echo $COLUMNS120awkͷ-vΦϓγϣϯͰγΣϧมΛ͠ɺεΫϦϓτͷprintfͰӈ٧Ίͤ͞Δ$ echo -e " o \n o \n o ____\n -- |OO|\n_||__| |\n | |\n/-O=O O=O--" | awk -v col=$COLUMNS'{printf("%" col "s\n", $0)}'
γΣϧܳखॱ̏ӈ٧Ίͷ෯ΛݮΒ͍͖ͯ͠ɺfor ; do ; doneΛ༻͢Δ$ for ((i=$COLUMNS; i>=11; i--)); do clear; echo -e " o\n o \n o ____\n -- |OO|\n _||__| |\n ||\n/-O=O O=O--" | awk -v col=$i '{printf("%" col "s\n", $0)}';sleep 0.06; done
͞ΒͳΔվྑͷಓ➤ ͍͖ͳΓݱΕ͍͖ͯͳΓࢭ·ΔͷͰɺྻंࣄނͷΑ͏ʹݟ͑Δ ˞ݩωλΓڈΔ➤ ʹΑͬͯͪΒͭ͘͜ͱ͕͋Δ➤ Ctrl-CΛແޮʹ͢ΔʹͲ͏ͨ͠Β͍͍?➤ etc.➤ ͬͱ͍͍ํ๏͋ΔͣͳͷͰɺՋͳͱ͖ʹνϟϨϯδ͠·͠ΐ͏(2ճ)
SLίϚϯυ൪֎ฤ(1)lsʹࣅͨΦϓγϣϯଘࡏ͢Δ➤ $ sl -a HELP!➤ $ sl -F ඈΜͩʂ➤ $ sl -l ͪͬ͞ʂ➤ $ sl -c C51ͩʂ(Α͘Βͳ͍)➤ $ sl -aFlc શ෦ͤʂ
SLίϚϯυ൪֎ฤ(2)➤ slίϚϯυͷιʔείʔυgithubʹɻϓϧϦΫͰ͞ΒʹਐԽ➤ վ൛ͬͱ͍͢͝ ʮSL վܭըʯhttp://www.izumix.xyz/sl/ ʢύονద༻ࡁʣhttp://qiita.com/gm_kou/items/2840a6670dc2e733d00a ٬ं૿ͨ͠Γɺ౿ग़͖ͯͨΓɺSL͕ԟ෮ͨ͠Γɺ͕όϥόϥͩͬͨΓ͍Ζ͍Ζ δϣʔΫίϚϯυͷྖҬΛ͑ͨ࡞➤ GistʹژٸԽύον͕͋Δ https://gist.github.com/poochin/1423262 # SL͡Όͳ͍͡ΌΜʂͱ͍͏ͳಥࠐΈ͝ԕྀ͍ͩ͘͞
3.λʔϛφϧը໘Λ ͙ͪΌ͙ͪΌʹ
λʔϛφϧը໘Λ͙ͪΌ͙ͪΌʹ➤ ANSIΤεέʔϓγʔέϯεΛ͏͜ͱͰɺจࣈʹ৭Λ͚ͭͨΓɺഎܠ৭Λม͑ͨΓ͕Ͱ͖Δ➤ ͜ΕΛར༻ͯ͠ɺը໘Λ͙ͪΌ͙ͪΌʹ͢Δ͜ͱ͕Մೳ
എܠ৭Λม͑ΔANSIΤεέʔϓγʔέϯε➤ എܠ৭Λม͑ΔΤεέʔϓγʔέϯε(جຊ8৭) ESC[ʻ40ʙ47ʼm 40: ࠇ, 41: , 42: , 43: ԫ, 44: ੨, 45: Ϛθϯλ, 46: γΞϯ, 47: ന ※ʹΑΓ৭ඍົʹҟͳΔ➤ എܠ৭Λม͑ΔΤεέʔϓγʔέϯε(256৭) ESC[48;5;ʻ৭൪߸ʼm 48: ֦ுഎܠ৭; 5: 256৭ΠϯσοΫεΧϥʔ; ৭൪߸: 0ʙ255Λࢦఆ➤ ΤεέʔϓγʔέϯεͷϦηοτίʔυ (͜Ε͕ͳ͍ͱ৭͕Ϧηοτ͞Εͳ͍) ESC[0m
➤ echoίϚϯυͰ"\e"Λ͏ ※"\e"Λೝࣝ͠ͳ͍ڥ͋Δ➤ printfίϚϯυͰ"\033"Λ͏$ printf "\033[45m%s\033[0m\n" ϚθϯλANSIΤεέʔϓγʔέϯε͖ͰදࣔϚθϯλ$ echo -e “\e[46mγΞϯ\e[0m]γΞϯ
λʔϛφϧը໘͙ͪΌ͙ͪΌɹ˞$ clear; while :; do c=`expr $RANDOM % 256`; echo -en "\e[48;5;${c}m \e[0m"; done
λʔϛφϧը໘͙ͪΌ͙ͪΌɹվྑ൛➤ echo ➤ printf ※ൈ͚Δʹsleep 500Λফ͔͢Ctrl+CͰ$ clear; for color in `od -vAn -tu1 -N $(($COLUMNS*$LINES))< /dev/urandom` ; do echo -en "\e[48;5;${color}m \e[0m";done; sleep 500$ clear; for color in `od -vAn -tu1 -N $(($COLUMNS*$LINES))< /dev/urandom` ; do printf "\033[48;5;${color}m \033[0m";done; sleep 500
ղઆ1. 0ʙ255·ͰͷཚΛऔಘ odͱ/dev/urandomΛ༻͢Δ $ od -vAn -tu1 -N 1 < /dev/urandom 152. ͷը໘͍ͬͺ͍ʹͳΔΑ͏ʹɺܻ * ߦճ͚ͩཚΛऔಘ͢Δ $ od -vAn -tu1 -N $(($COLUMNS*$LINES)) < /dev/urandom 241 178 43 211 3 255 29 178 181 247 234 112 157 18 152 293. ΤεέʔϓγʔέϯεͰ৭Λม͑ͤ͞Δ $ echo -en “\e[48;5;${color}m \e[0m” $ printf “\033[48;5;${color}m \033[0m”4. 2.ͰٻΊͨ݁ՌΛforͰճͤ
·ͱΊ➤ ಥવͷࢮδΣωϨʔλʔͱslίϚϯυͳͲΛϫϯϥΠφʔͰ࣮ݱ➤ awkͷ൚༻ੑΕͳ͍➤ δϣʔΫίϚϯυΛγΣϧܳͰ࣮ݱͤ͞Δͷָ͍͠➤ ͬͱ͍͍ํ๏͋ΔͣͳͷͰɺՋͳͱ͖ʹνϟϨϯδ͢ΔͷΑ͍ͱࢥ͍·͢