MySQLクライアントA4

MySQLクライアントのソースコードをA4形式の1ページに収めることは可能ですか? 8ポイント(原則的に読み取り可能)で、難読化後、できることがわかります! 難読化と10ピンのない通常のコードの場合、それは不可能です。 最大6ページ必要です。



すべてに取り組む過程で、私は偶然に、1000行を超えるサイズの小さな、しかし動くMySQLクライアントを手に入れました。 どれだけコンパクトにできるかがおもしろくなった。 日曜日の半分を費やし、コードを分離して最小化しました。 その結果、MySQLのCLIクライアントnanomysql完成しました 。その完全なソースは、380行と約10,500バイトをわずかに占め、同時にLinux、Windows、およびMacOSでコンパイルおよび動作します。 C ++で書かれ、STLの絶対最小値。



スクリーンショット、tsiferki、およびカット中のナノクライアントの製造に関する週末の狂気のその他の詳細。



はじめに、約束のメガスクリーンショット!



Z:\work\nanomysql>nanomysql.exe -u testme -p moo connected to mysql 5.5.25a-log nanomysql> use test --- ok, 0 row(s) nanomysql> select * from t id, gid, body --- 2, 1, three abcx four 3, 1, five six seven abcx 4, 1, eight in abcx-nine 5, 1, one two three in abcm 6, 1, binlog ftw 100, 1, one two abcx --- ok, 6 row(s) nanomysql> quit bye
      
      







更新:難読化されたソースの表ショット!!! 写真はクリック可能です。







クライアントは、7種類のネットワークパケットを処理(送信、受信、または解析)できます:ハンドシェイク、認証、クエリ、OK、エラー、フィールド、行。 サーバーに固執し、リクエストを送信し、結果を表示するために、一般に、それ以上は必要ありません。 そのため、1つのファイルに分離され、ソースのさまざまな場所からカットアンドペーストファンによって収集された初期バージョン(「収集するために領域を略奪する」を参照)はすぐに小さくなり、1250行ほどかかりました。 したがって、エンターテイメントの目標は500行に設定されました。



このバージョンでは、ハードコードされたログインとパスワードを使用してサーバーにアクセスし、ハードコードされたテスト要求を1つ作成できました。 愚かにも完全に不要なコードを捨てる(基本的に、すべての種類の完全に未使用のメソッドは全体として直接投げられる)



この時点で、クラスとメソッドの内部に登らなければなりませんでした。 ここで、スペース節約の原因は次の3つです。
  1. クラスをマージします(最初はMysqlDriver_tクラスの代わりに、3つのNetInputBuffer_c + NetOutputBuffer_c + MysqlDriver_t自体がありました)。
  2. クラス宣言へのメソッドのインポート(署名と空行のコピーを保存します)、
  3. 特定のケースのメソッド内の一般化されたコードの簡素化。


もちろん、常に個々の行のスポットストリップがあります。 これらの簡単な測定値は約500行に達しました。



同時に、500のマークまでの降下中に、コマンドラインオプションの解析を追加し、もう少し美しい結論を出しました。 コードを削除するために変更が他の変更と混合され、一般にコミット、機能の追加、行数の削減が行われました。 コードを消去しながらより多くの機能を実行することは常に非常に良いことです! この部分の過程でさえ、行の追跡では通常のコード標準に若干の違反が必要になることが明らかになりました。 「そして一般的には少し違った書き方をします。 重要な基準は、原則として読む必要がある場所の読みやすさを維持することでした。 (たとえば、SHA1の実装における魔法のような変換には、読む意味がなく、すぐにはありませんでした。)



そして、突然、別の興味深い質問が発生しました:一般的にクライアントを1ページで突き出すことは可能ですか? もちろん、QRコードではなく、読み取り可能なフォントを使用します。 一方で、もちろん、500行。 しかし、これらはコメントと空の行とともに、かなり短い行です。 さらに、テキストの合計は、すでに匹敵するために、わずか12キロバイトです。



言い換えれば、難読化を行い、コードのブロックを脇に置いてみましょう!!!



文字通りレンガ、貴重なキャラクターを保存します。 ここで結果を見ることができます、 nanosql1.pdf (免責事項:Googleでホストされている奇妙な最初のファイルかもしれません。HabrastorageはPDFを受け入れません)。



私は少し手作業でいじくり回しましたが、スクリプトが必要であることが明らかになりました。 スクリプト難読化ツールを書きました。 (その後、手作業でコードをもう少し編集する必要がありますが、3〜4か所でコードを修正するのは非常に簡単で、スクリプトは既に修正するには面倒です。)



コメントと空の行を削除すると〜10.5k〜〜7.3kになり、サイズが9で幅が狭いマージンの行の長さは1行あたり105文字、サイズは8、それぞれ118文字、ページに収まる約60行になります。 つまり、単純に空のスペースを削除するだけでは十分ではなく、コード内のあらゆる種類の長い識別子が多くのスペースを消費することは明らかです。 タイプm_iSock、m_pReadBufの変数の初期名を1文字または2文字のp、q、a0などに変更できるように、スクリプトにさらにいくつかの行を追加しました。 結果ははるかに良く、約5.5kです。



次に、C ++を使用すると、強化されたコードから「ブリック」を簡単に作成できます。 識別子を置き換えた後、境界線は多くの場合、単純に改行を取得して挿入できる場所になります。 そして、それが不可能な場合(たとえば、printfという単語の途中)、いつでも\を入れて行を折り返すことができます。



この場合、プリプロセッサディレクティブはシートの大部分に集中しており、#includeやその他の#ifdefの数を最小限にするためだけに、特別な処理を行うことはできません。 完全にプライベートなトリックを使用して、もう少し貴重な行を保存することができます。たとえば、名前付き定数#define MAX_PACKET 16777216の代わりに数字をコードに直接置き換えることで、さらにコンパクトにするために(1 << 24)の形式で保存できます。 その結果、変換されたコードはほぼIOCCCに送信でき、MySQLロゴのイルカのASCIIピクチャのブリックの代わりにフォーマットするだけです。



#define R return、#define V voidなどのトリックも試しました。 それらからの望ましい感覚は機能しませんでした。 行数を正確に示していないため、プログラムが短すぎます。 さて、6バイトの戻り値を1バイトのRに置き換えて、20回、100バイト節約するか、マイナス1行を節約します。 プラス1を追加#defineします。その結果、意味がありません。



コードの難読化されたバージョンと読み取り可能なバージョンの両方の難読化と最終的なカットは、あちこちで混同されました。 トリックは同じです。 興味深い部分から、おそらく、関数SHA1_Init()などをクラスに再実行し(行とトークンの両方を少し節約します)、次にsha.Init()。Update()。Final()の呼び出しを3行の列ではなく1行にチェーンします。



結果は377行のバージョンで、日曜日の夜でしたので、停止する必要がありました。 ;)おそらく、それをさらに強く絞って300行を達成するか、1ページに8番目ではなく9番目のサイズのブリックがありますが、これはあまりおもしろくないです。



合計



380行で完全に機能するMySQLクライアントを作成することができました。 彼が実際に役に立たないことは明らかであり、どこにでもはるかにインテリジェントなネイティブクライアントが存在します。 しかし、例として、「夕方と400行で書けるもの」は非常に示唆的だと思います。



難読化されたバージョンのクライアントは、最大5キロバイトまで駆動でき、1つのA4ページに収まります。 もちろん、これは純粋なエンターテイメントです。 しかし、その後、「MySQLクライアントをA4に適合させることはできますか?」という奇妙な質問については、納得できる答えはイエスです。



これらの377行の統計は次のとおりです。



残高がない人は、空の行とコメントを覚えておいてください。



このf話の教訓は何ですか? そして道徳はありません、ノーチラスは正しいです。 しかし、いくつかの組織的な結論を出すことができます。 たとえば、腐敗したコードがどこにでも常に存在するため、容赦なくゴミを捨てることをためらわないでください。 たとえば、そのIOCCCは誰でも利用できます。 ;)または、たとえば、一見複雑に見える複雑なコードの完全に動作するプロトタイプを、驚くほど速く、驚くほどコンパクトにすることができます。



私の意見では、最後が主なものです。 プロトタイプを作成してください、それは速くて楽しいです。



All Articles