たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

雑記

えらいこっちゃ

今年はそんなことばかり言ってる

帰宅困難者になった

先日の大雨でお家に帰ることができなくなった。具体的に書くのはアレだけど、木曜日の授業が終わった後、研究を少ししていたら家に帰るルートがすべて死滅していた。
仕方がないので近くにあった祖母の家に避難し、なんやかんやで家に帰れたのが日曜日。この数日間でたくさんのことがありすぎてしんどかった。あと、研究室は宿泊施設でないということがよくわかった。

好きなもの

人に好きなものを具体的に説明するのがいやだ。というと変に思うかもしれない。バ○ージはマ○ーダさんに好きな食べ物を聞いた時、その理由に「好きのもののほうが知りたいから」と言っていた。すげー解るしできればそうしたい。しかし世の中には色んな人がいるから、ぼくの好きなものを嫌いな人が必ずいて、もしそれが好きなことについて話している相手だったらと考えると、もう終わる。
まあそれは後付けの言い訳で、本当は好きな話をするとだいたいそれをネタにいじられてしまうからなのだけど。
すこし昔、同じようなことを友達が言っていて、「こいつは嫌な思いをしているから、好きなものを言ってもいいかな」と思い話したが、やはり好きなものを悪く言われてしまった。軽いいじりのつもりだったのだろうけど、自分が嫌だったから気をつけようとまでは瞬間に思いつかなかったのかもしれない。というわけで、そいつとは疎遠になったし、好きだったそのコンテンツからも離れてしまった。また話ができるようになったらどう考えているのか聞きたい。
ところで、こんな不便な考えで普段どうしているかっていうのは秘密。

ラノベ

最近思いつきでラノベを買った。今の所面白いと思っていて、続きを買おうと思っているけれど、前述の理由でここに作品名を書くのはやめておきたい。
ラノベなんて長いこと買っていなかったけど、たまに読むのもありかなと思う。いろんな文学があっていいと思う。まぁそんなに本は読まないから偉そうなことは言えないけど。
ただ、本を読むのがなかなかに遅いので続編を買うのが結構後になりそうだ。一冊を長く楽しめると言い換えると少しお得に感じる。嬉しい。

Excel

初めてではないけどTHE・神Excelに出会った。企画書みたいなのを何故かそこに書くらしい。
課題なので渋々やったが、改行するのも面倒だしカーソル操作が思ったとおりに行かなくてすごくしんどかった。それもそのはずExcelは文章作成ソフトじゃないのだ。使い方を誤ると余計に苦労する。さらに少し驚いたのが、周りの人たちはあんまり文句を言ってなかったこと。受け入れる力がハンパなさすぎる。見習っていきたい。

終わり

明日も早起きしないとね

ICPC2018国内予選に参加した

参加しました

参加しました

A,Cの2完でした。

イカれたメンバー紹介

  • ぼく(@xztaityozx_001)
    • いつもはC#で参加しているヤツ。AtCoderレートがそろそろ茶色に落ちる
    • 激しい憎悪によって目覚めた伝説のバトルメイド1
  • wheson(@wheson)
    • 実質水色の緑。笑顔が素敵。
    • vimのDockerfileを試して、dotfilesを更新したのに反映されない!って怒ってたけどpushしてなかっただけの悪いやつ
  • eliza0x(@eliza0x)
    • いつもはHaskellで参加してるヤツ。感情がすぐに無になる
    • 激しい憎悪によって目覚めた伝説のバトルメイド2

ICPC2018国内予選0問題「参加」

すっごいあめだったので、ぜんじつ、おうちに、かえれませんでした
ちかくにそぼのいえがあるので、ひなんしました。

あさおきたら、あめがやんでいませんでした。ぬれながらがっこうにいきました。
がっこうについたら、むわっとしていました。さいあくでした

そうこうしていたら、めんばーがしゅうごうしたので、ACしました

準備

正直服とか靴とかびしょびしょでコンディションは最悪。それでもなんとか参加できそうであったので、PCのセットアップ、ホワイトボードや飲み物の用意をしました。この日、僕は家に帰れないことが確定していたため、手持ちの服を温存するために、メイド服を着ました。これは去年の11月にゼミ内の圧力により手に入れた暗黒の力です。面倒なことにこれを着ている間は「メイド長」という別の人格が宿る設定なので、色々手間です。この記事ではこの設定が守られない箇所があります。よろしくおねがいいたします。

これについてもう少しあって、正直ぼくはメイドさんという属性は好きだし、手持ちのメイド服もフリフリしててかわいいんですが、できれば誰も見ていないところでひっそり自分だけで楽しみたいと思っています。

因みにもう一着あるのですが、それはeliza0xが着ていました。

なのでここから先は二人のメイドと男が競プロしてる情景を思い浮かべながら読んでください

開始〜A問題AC

開始と同時に前回の教訓を活かしてALLを3部印刷しました。ステープラーで3部をまとめましたが、途中でステープラーがぶっ壊れて泣きました。

Aを読んでいたwhesonとeliza0xが「やるだけ」と言っていたので、また自明に実装の早いwhesonが実装しました。

ACまで10分ぐらいだったのでいい感じだと思いました。

B,Cを読む

Bをeliza0xとwhesonで考察しました。日本語が難しかったので、読解に時間がかかりましたが「実装激重だけどやるだけ」という感じだったのでeliza0xが実装することに。この間 ぼくはあとの問題のためにテンプレを作り、Cを先に読んでいました。

Bの実装が始まったのでCについてwhesonに説明しました。すると「しゃくとりするだけでは?」みたいな提案を受けたので、「109^ だけど大丈夫か?」と聞きました。なんやかんや話してみましたが、まぁ大丈夫でしょwとなったので愚直なしゃくとりを書く方針になりました。

Bがバグる。Cを通す

Bが激重だったのでバグってしまいました。「バグったら印刷して交代」という作戦を取ることにしていたので、Cをやることに。実装がちゃんと降りてきていたみたいなのでwhesonに任せました。

この辺から暑くてメイド服は半脱ぎ状態でした。

しゃくとり自体はすぐかけたみたいなのでテストケースを回すと、計算が終わらないので最適化オプションをつけると、ビビるぐらい計算がはやくなってみんなでビビりました。サンプルはあっていたので提出しAC

無限

ここからBの実装に無限にやられてしまいました。こんがらがってしまった時点で別の誰かが実装を最初からするほうが良かったのかもしれません。

eliza0xからのヘルプに答えつつ、残りの問題で解けそうなのが無いかwhesonと探しましたがぼくは最大流の波動を感じませんでしたし、DPのwhesonもどうやっておとせるかわからないということでした。

G問題が構文解析だったので構文解析のeliza0xに問題概要を説明すると「めっちゃムズいやつやん」と悲鳴をあげていました。

このあとPCのグラフィックドライバがぶっ飛んだり、雨が強くなったり、暑すぎてメイド服をやめたりといろいろありましたが、結局Bを通すことができませんでした。

まとめ

模擬では良い結果を出せただけに、今回の2完は少し悔しいものとなりました。ぼくとwhesonは今年が最後のICPCでしたが、eliza0xはまだ参加できるので、来年の活躍を楽しみにしつつ消えることとします。

第36回シェル芸勉強会@限界キャンパスサテライトを開催した

この限界のはてに、まだ救いがあると思っている

お前が生まれたこの世界は、お前を救ってくれるとまだ信じている

なんかこんな感じのことをメタルギアで聞いた気がする。

震源+大雨=限界

弊キャンパスは直近の地震震源の真上ぐらいにあったところです。ここにこの間の大雨を合わせるとまさに限界!という感じです

大阪サテライトがこの雨の影響で中止となってしまったため、家に変えることも出来ないぼくはこの限界キャンパスで勝手にサテライトを開催することにしました。

あーたのしい

午前の部

鳥海さんによる文字コードの講義が始まりました。難読化クラスタとしては何かネタが転がっているかもしれないとワクワクしていました。

まずはlocaleiconvのような文字コードなどに関わってきそうなコマンドについてでした。
ずっと「ja_JP.utf8ってなんやねん冗長やなオイ」って思ってたんですが、どういう意味なのか解ることが出来てよかったです。

そのあと基数変換の話題ではbash$((2#bbbb))というパターンで変換できると知り驚きました。これすごい便利

いよいよ文字コードっぽいところに来た時、続きは次回ですとなっりました。えっ次回も参加するしか無い

昼休憩

昼休憩の間に限界サテライトからLTの配信が出来ないかどうか試していました。手伝ってくれた方々ありがとうございました。

限界サテライト側の機材不足で、音声がクリアに拾えないという問題があったため、結局配信は無しということになりました。悔しい・・・

昼飯を食ったあとは完全に体力の限界という感じでした。でも家に帰る手段も無いのでこのまま午後も見ることにしました。あとこれは秘密ですが、気づいたらメイド服を着ていました。

午後の部

とっても楽しい問題の始まりです。今回は時間内に解けた問題が全然ありませんでした。チクショー

因みに問題と解答はここです

問1

welcome.txtというファイルに仕込まれたバイナリを解析して、AAを見つける問題。いきなりヘビー過ぎて泣いた。とりあえずxxdしてみると不思議な模様があったので目を細めて見てみると0x00が紛れていたので、sedしてみました

するとめちゃめちゃなAAが出てきたので、適当にターミナルの横幅を動かしてみると70ぐらいだと解りました

cat welcome.txt | sed 's/\x00/@/g' | fold -70

因みに幅が70だったのは、toiletコマンドの出力の幅が70だったからだそうです。なるほどな〜〜〜〜

問2

フォーマットがめちゃくちゃなファイル名を揃える問題。こういうのはよくありそうだし、できると最高かもしれないですね

これはゴリゴリやればいいなとおもったので、ゴリゴリ。

ls -1|nkf -Z|sed 's/[0-9]/& /g;s/[aA-Z]/ & /g'|sed -r 's/^([0-9]).*([aA-Z])[^組]/\1年\U\2組/g'|sed 's/組組/組/g'|paste <(ls -1) - | xargs -n2 echo "mv" | bash

まずsedで年次と組を分離し、その後またsedしました。ちょっと冗長ですねこれ

因みに、ぼくは全角英数と半角英数が混ざっていると死にます。

問3

2018年の日付のうち2,3,5,7が4つ含まれる日付を列挙する問題。 例えば2018/07/23と言った感じ。
4つあるかどうかgreptrで削ったあとawklengthを見ればいいなと思っていたんですが、日付の列挙がうまく出来なかった・・・

時間内には解けなかったんですが、dateutils.dseqというコマンドがあるよということだったのでそれを使って解いてみました。

dateutils.dseq 2018-01-01 2018-12-31|sed -E 's/[^2357]//g'| paste - <(dateutils.dseq 2018-01-01 2018-12-31)|awk 'length($1)==4{print $2}'

pasteを使えるようになってから、よく使うようになりました。とっても便利ですよねこのコマンド

問4

tanzakuファイルをcatすると・・・

$ cat tanzaku
┏ ーー-┷-ーー┓
┃       ┃
┃       ┃
┃       ┃
┃       ┃
┃       ┃
┃       ┃
┃       ┃
┗ーーーーーー┛

このように表示されるのでこの中に俳句を入れる問題。ゴリゴリでいけそう

字余りするところは全角スペースで埋めてtetayoko。そのあとはsedの後方参照をつかってそれーという感じ。見た目ほど難しくなかった

問5

cowsayコマンドの出力を右向きにする。ただし文章はひっくり返しちゃダメ。
見た瞬間うっとなるのは響け!ユーフォニアム問題に似たものを感じる。

これは最初にrevしたあとsedで行を選択して末尾にスペースを埋め込んでいく戦法を考えました。でもあんまりよくないし何よりもめんどくさいので脳を休めてた。

問6

seq 20のうち素数である番号を○で囲む問題。

1
②
③
468
9
101214
15
161820

こういう感じですね。午前でやったことを活かして行こうと思い。まず②のxxdを見る。ASCIIコードを見つけて、それを基準に差分を足していけばいいのでは?と思ったのでゴリゴリしてみる

seq 20|factor|awk 'NF==2{print $2}'|xargs -I@ echo "echo \$((0xe291a1+@-2))"|bash|bc <(echo "obase=16") |tr '[A-F]' '[a-f]'|sed 's/$/0a/g'|xxd -p -r|paste <(seq 20|factor|awk 'NF==2{print $2}') -|awk '{print "s/^"$1"$/"$2"/g"}'|sed -f- <(seq 20)

前回のシェル芸勉強会で覚えた-f-も使えたので良かった。ちょっと冗長なので、他のシェル芸人さんみたいにスマートなやり方も鍛えていきたい

問7

textというファイルには見えない文字が含まれているらしい。どこにどんなのがあるか調査する問題。

調査するというのが難しかったので、とりあえずどんなのがありそうなのかbatで見る。すると・・・

丸見えになったのでコレで良いのではとなってしまった。この辺でもう脳が死んでたのでこんな解答しか出来なかった・・・

問8

最後はルビをふる問題。シェル芸人からの挑戦状を読んでいたので、sedで送り仮名を削りつつ、ルビのペアを作るのは出来てたけど上につける時のスペースの入れ方がわからなくてダメだった。

column -tでいいよということだったので覚えていきたい。

LTしたかったやつ

都合でいつものパワポテーマで作れなかったんですが。また難読化でLTする予定でした。今回は日夜手で難読化しているシェル芸人さんたちのために難読化コンバータを作りました。Go製です。ぜひ使ってみてください

因みにぼくは使ったことないです

まとめ

シェル芸勉強会はやはりサテライトでみんなで集まってやるのがたのしいですね。一人でサテライト開いても寂しいだけでした。問題が激しかったので寂しがっている暇はありませんでしたが。次回も参加したいなーとおもっています

今回もとても楽しかったです!ありがとうございました!!!

ICPC2018国内模擬に参加しました

参加した

参加しました

ABCEの4完でした。

イカれたメンバー紹介

  • ぼく(@xztaityozx_001)
    • いつもはC#で参加しているヤツ。ICPCには無いので実力が2割しか出せない
    • バグ産みマスター
  • wheson(@wheson)
    • 実質水色の緑。紅茶が好きらしい
    • vimのDockerfile試しておいてって頼んだのにスルーした悪いヤツ
  • eliza0x(@eliza0x)
    • いつもはHaskellで参加してるヤツ。C++に翻弄されるのが好き
    • 構文解析は任せろって言ってた

敬称略します

準備

僕の研究室を会場にすることになったので、PCのセットアップをした。僕以外の二人がUS配列を使う人たちだったので、Fcitxの設定を色々した。
エディターはvimで良いだろうとなったので、設定ファイルをかき集めてシンボリックリンクを貼り直すようなスクリプトでも作っておくか〜と思ったけど、Dockerでいいじゃんとなったのでそっちを用意した。

どのターミナルが誰のvimかわからんみたいになったので、ノード名を変えるとかしたほうが良さそう

直前にプリンターが死んだけど気合で直した。えらい

開始〜A問題ACまで

とりあえず全部印刷して、A,B,Cをざっくり見た。whesonが「Aはやるだけですね」と言ったので自明に実装が早いwhesonにまかせてB,Cをeliza0xと読むことにした。

Cを読んでいたらBNFが見えたので、eliza0xに投げた。ワクワクして「やるだけですね」と言ってた。
Bを読んでいたeliza0xが条件を式にしてくれていたので、ほぼ読んでないけど書けそうになった。

そうこうしているうちにwhesonがAを通した。ここまででだいたい15分だった。

D,Eの考察とCの実装

eliza0xが先にC行けそうなのでやりたいとすごいやる気だったので譲った。その間Dをwhesonと眺めることにした。

各桁にはコレだけ目的の数があるよね〜〜って式を立ててたんですが、ホワイトボードで列挙して数え上げたときと誤差がでて死亡。任意の2つの数字の組み合わせで、小さい順に並べると二進数っぽい増え方するよね〜って言ったりしていたけど、ダメそうだったのでEを先に見ることに。このときeliza0xは半分ぐらいCが出来ていたっぽい

これは失敗だが、3部問題を印刷しなかったので、全員が一度に問題を見れなかった。なので先にwhesonにEを読んでもらった。

whesonが「グラフですね」というのでイヤだなーと思っていたが、条件を聞くと二部グラフの波動を感じたので言った。whesonも少し考えた後、目を大きく見開いてそうですねといっていたので、ほぼ考察終了。このときの彼の顔がまさにピンときたみたいな顔だったので忘れられない。

「ホンマに二部グラフなんか」と思ったので条件を再度精査して、ホワイトボードに書き起こす。そしたら二部グラフ丸出しだったので、そうっぽいということになった。

ライブラリの所有者で実装が完全に頭で出来ていたwhesonがEを書くと言っていたので、僕はBを脳内コーディングして、Cを待つことに。

B,C,Eをバグらせる

この辺は目まぐるしく入れ替わったので、よく覚えていない。

たしか、パーサーはうまく動いているけどどこかが変らしく、eliza0xがCをつまらせていたので一旦、実装の軽いBをやることに。脳内コーディングとeliza0xとのペアプロでそれなりの速度でコードがかけたがやはりどこかがおかしく、プリントアウトしてwhesonと交代した。

ライブラリの写経をしている間に、eliza0xとCの問題文をもう一度よく読み、ほしい答えを読み取る。すると、実装が降ってきたみたいなので交代。この時whesonもどこかをバグらせていたみたいなのでプリントアウトして交代。ここでだいたい2時間経過ぐらい。

怒涛のAC

完全に降りてきていたみたいなのでさっとCをeliza0xが通す。Bも関数の1つがintを返さないと行けないのにboolを返してたという大ポカを修正してちょこっといじれば通ったので、whesonに交代。

Eのバグは写経ミスらしかったので、コーナーケースとかの処理をして、サンプルが通ったのがだいたい終了5分前ぐらい。この間ずっと田中ヒメの過呼吸みたいなやつの真似をしていたんだけど、whesonは気づいてくれなかったし、eliza0xは落ち着いてと言っていたので、やるタイミングを完全に間違えた。

Eを無事ACし、やったぜー!となっていた時は終了2分前だった。

終了後

終了後、弊学から参加していた人々が集まった。みんな口々に感想を言ったり、ここでバグらせたなどを言ったりしていた。あとでランキング?みたいなのを見るとselectedになっていたので素直に嬉しかった。

次は予選本番ですね!!!!!!!!同じ調子でできれば予選突破も夢じゃなさそうなので頑張っていきたい。

今回はコーディング環境周りや、手順、役割配分などで課題も見え、単に座るだけをせずに済んだのでとても良い模擬だった。ちなみに同日のARCは参加TLEしたので、問題すら見ていない・・・・・・(参加したかった)

雑記

夏になるな

汗かくだろ

英語むずすぎ

そういう文化圏の人と30分ほど話した。当然向こうはペラペラだけどこっちはそうも行かない。情けないけど
でも優しくわかってくれようとするし、わかってもらおうと喋ってくれるし、割とこっちも聞き取れたのがなんか嬉しかった。でも落ち着いて食えんので昼飯と同時に開催しなくてもいいと思う。

人間の名前

自己紹介されても人間の名前が覚えられない。覚えてもらいたいとは思っているので同じように覚えようとする必要はあるんだろうけど。記号として覚えようとしているのか、名が体を表していないとぱっと覚えられない。
例えば「太郎」という名前の人は「太郎」って感じの見た目じゃないと覚えられない。でも「太郎」って感じの見た目が一体どんなものかって言うと何も思いつかない。

それでもよく絡む人の名を覚えられるのは、自分の中で「太郎」はこういう見た目だと学習するからなんだとおもう。なので違う見た目で「太郎」だとまた覚えられない。無能

会話速度

人間の会話速度ははやすぎる気がする。物事を受け取ってから理解して言葉を発して相手に伝わるまでの時間の猶予が短すぎる。相手が聞いたことに対して文脈的に正しいことを言わなければならない。さらに言葉狩りが激しい今、十分に発言に気をつけなければいけないし、相手が嫌だと感じることはもちろん言いたくない。別に今の自分が日常会話の中で困ってるということはない。単に夜、布団で今日のことを思い出すと、ああ言えばよかったなとかを無限に考えてしまうだけ。明日はもっと良い日になるよね

終わり

思ったより書くことがある。

雑記

日常系に憧れる

いいよね

雑記なので

ざっくりとしたことを書く。別に書きたいわけじゃないけど

鼻毛を切る

鼻毛を切ると、当然ながら鼻の中のフィルターがなくなる。当然外界の埃なんやらがダイレクトに喉に来る。僕の場合こうなると喉が痒くなってとてもつらい。なので鼻毛は切るべきでない。と思う。

しかし鼻から鼻毛が出ていると可笑しい。世間的には。僕も他人が鼻毛を出していたら可笑しいと思う。だから切る。

辛い思いをするのにあえて鼻毛を切らなければならない。そういうこと

ヤモリ

家にいるときにいつも作業をしている机がある。ここの横にはすりガラスがあり、そこをヤモリが餌場にしている。光が漏れるから獲物が集まってくるんだろう。ヤモリがゆっくりガラスの上をゆく姿をこっちもゆったりと見るのが楽しい。

ヤモリが一歩足を出すたびにその指がガラスに張り付いて広がる。獲物を見つけたときゆっくり近づいたあと、それまでとはまるで違う俊敏な速度で獲物を捕まえる。見ていて飽きないが、当然それを見ている間進捗は出ない。

プリキュア

今回のプリキュアはとても面白い。感想力と語彙力が0なので具体的な考察とかは他の人に任せるけど、とにかく面白い。今の所

僕が毎週生命を維持できているのは日曜日にプリキュアを見て回復し、また来週プリキュアをみたいと思うからである。

記憶

怒りは6秒押さえ込むと消えるみたいなのをどっかで見て、実践したこともある。確かに消えるけど怒りそうだったときの記憶までは消えない。人間の記憶、自由に読み書きできたら良いと思うんだけどなんなの?この設計は

終わり

なんだこの内容は

超・記号オンリー難読化シェル芸の材料について

時代と共にUsageも変わる・・・!

そんなお話

シェル芸botくんにmtコマンドが入った

LANG=Cにもしていただいたみたいなので超・記号オンリー難読化ができる

www.slideshare.net

とっても嬉しい。ありがとうございます。

試してみる

喜び勇んで試しにmtコマンドのUsageを見ようと思ったのでやってみたんですが

思ってた出力と違います。ちなみに期待していたのは以下

$ LANG=C mt --usage
Usage: mt [-?V] [-f DEVICE] [--file=DEVICE] [--rsh-command=COMMAND] [--help]
            [--usage] [--version] operation [count]

なんだこれーと思ったのでとりあえずmtコマンドのバージョンを見てみると

$ mt --version
mt (GNU cpio) 2.12
...

え〜〜〜全然違うなるほど〜。どうやらaptでインストールできるmtは少し古いみたいですね

$ apt search mt-st 
ソート中... 完了
全文検索... 完了  
mt-st/bionic 1.3-1 amd64
  Linux SCSI tape driver aware magnetic tape control (aka mt)

やっぱりバージョンによってmtのUsageが違うんですねー。時代を感じる

GNU CPIOのサイトで公開されているChangeLogを眺めてみると、何回かmtのUsageを変更したゼみたいなことが書いてあります(英語わからん)

GNU CPIO

具体的にどのリリースからUsageが違うのか、配布されてるソースをビルドしてみたりしたんですがわからなかったです(もうちょっと調査するかも)

マナ の色が違う

しかしこのマナではスライドそのままでは 世界樹 を作ることができません。こうした色の違いを 属性 ということにしました

属性 が違うなら混ぜるか変換すればいいので 命の泉マナ から作れる別のコマンドを探し、世界樹 へつなげます

今回選んだのは tset コマンドです。適当に/usr/bin/bin以下から探して目についたのと、響きがなんか可愛かったので選びました。

tset

tsetは変なオプションをつけるとUsageを出力して終了します

$ tset -@
tset: invalid option -- '@'
Usage: tset [options] [terminal]

Options:
  -c          set control characters
  -e ch       erase character
  -I          no initialization strings
  -i ch       interrupt character
  -k ch       kill character
  -m mapping  map identifier to type
  -Q          do not output control key settings
  -q          display term only, do no changes
  -r          display term on stderr
  -s          output TERM set command
  -V          print curses-version
  -w          set window-size

If neither -c/-w are given, both are assumed.

割とたくさん文字が出ますね。mt始動をやめてtset始動に切り替えても行けるかもしれません

ともかく、tsetmtマナ世界樹 が作れそうです

やったね

一応難読化の解説も書いておきます

# mtのUsage
___=$(mt 2>&1)
# tset
____=$(${___:8:1}${___:1:1}${___:4:1}${___:8:1} -@ 2>&1)

# ls --help
echo ${____:10:1}${____:1:1} -${___:28:2}${____:2:1}${____:10:1}${____:15:1}

なんの解説なの?これ

LANG=C問題

この難読化では文字を変数に格納して展開することを繰り返して難読化します。なのでマナや世界樹を作るmt,ls --helpと言ったコマンドの出力は重要です。

今回のバージョンの違いというのもありますが、特に影響するのは言語設定です。翻訳の程度では全く難読化が成り立たなくなることもあります。

じゃあLANG=Cを必須にして難読化の先頭につければいいじゃん?という御仁もいらっしゃることかと思いますが、頑張ってアルファベットを消したのに復活させるのは悔しいのでダメです

なのでこれらの出力の中でもLANGの値に依存しない部分を切り取ったりすることが肝要です。これは実は発案のkanataさんが 命の泉 を作るときにもやっています。僕はコレをやっていなかったので実は超・記号オンリー難読化はできてないと言えます。

現に日本語設定だとmtのUsageは日本語訳され、以下のように出力されます

$ mt
使用法: mt [OPTION...] 操作 []
Try 'mt --help' or 'mt --usage' for more information.

かなり違うのが解ると思います。使える文字種も減っています。

解決していく

しかし、よく見てみれば 世界樹 を得るだけであれば Try...の行さえあれば大丈夫であることがわかります。

なのでkanataさんのやったようにいらない部分を削っていきます。

$ __=$(mt 2>&1)
$ echo $__
使用法: mt [OPTION...] 操作 []
Try 'mt --help' or 'mt --usage' for more information.
$ echo ${__##*]} 

Try 'mt --help' or 'mt --usage' for more information.

いい感じですね。空行が気になりますが、必要な部分だけ記号のみで取り出せそうです。

同様にls --helpの出力も必要な部分だけ取り出すようにしていきます。

$ LANG=C /bin/ls --help|grep -o .|sort -u|grep "[A-Za-z]"|xargs
A B C D E F G H I K L M N O P Q R S T U W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
$ /bin/ls --help|grep -o .|sort -u|grep "[A-Za-z]"|xargs
A B C D E F G H I K L M N O P Q R S T U W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z

ん?あれ?一緒なの?日本語にしても得られる文字種は一緒に見えます。これならLANG=Cしなくても良さそうです。少なくとも日本語環境では

しかしホンマかいなと思って発表時に得られなかった文字を探してみました。そしたらjだけが新たに現れていました。しかも両方

なんかおかしいな〜とおもって確認したら

$ type ls
ls is an alias for exa

あ〜〜〜exaに変えてたんだった

github.com

実際jが増えたからと言ってどうせJ,Vが足りないのでブレース展開をするので何でも良いんじゃないかと考える方もいるかと思いますが、世界樹内での文字の位置が変わるため、割と死活問題です・・・

まとめ

今回はmtが作るマナについて少し調査しました。その結果

  • 古いmtと最近のmtじゃUsageが違う(この違いを属性の違いとした)
  • aptで探すと出てくるのは古いほう。
  • 古いUsageだとそのままじゃ世界樹にならない
  • tsetのマナから足りない部品を集める。ただしmtは既に使わなくてもいいレベルで文字が豊富

さらにLANG=Cが必須かもしれない問題についても少し取り組みました

  • やはり環境に依存しない部分だけで難読化するのがよさそう
  • mtの場合は必要な部分だけ切り取ってやればOK
  • つまりLANG=Cはなくても良い
  • ただしツールは合わせること(/bin/ls を指定するとか)

難読化シェル芸。とっても楽しいですね。色んな所で話題になっているようで、これで興味を持ってもらえていたら難読化シェル芸クラスタとしてはとっても嬉しいです。ありがとうございます。

これからもヤベー難読化が見つかることを楽しみにしています。