パスワードを忘れた? アカウント作成
7769885 story
プログラミング

遠隔操作ウイルスのクラス・メソッド名はどうなのよ 87

ストーリー by reo
ところでこのクラス設計を見てくれ 部門より
あるAnonymous Coward 曰く、

最近になって知ったのだが、最近話題の遠隔操作ウイルス「iesys.exe」のコマンド一覧やフォーム仕様、そしてクラス・メソッド名が公開されているそうだ(警視庁の「ウイルス情報」ページ)。

これを元に、「遠隔操作ウイルス開発者のプロファイリング」や「遠隔操作ウイルスから学ぶ命名法」なんて話題も出ている。

関数名を見ると、CamelCaseやlowerCamelCase、snake_caseが混在していて、一貫性の無さを感じるのだが、これをみて「スキルが高そう」「50代はありうる」といった感想が出ている模様。みなさまはこの関数名をみてどう思う?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 真面目に分析してみた (スコア:4, おもしろおかしい)

    by shuichi (572) on 2013年03月08日 22時38分 (#2339637) 日記

    A「まずクラス名・関数名の一覧を見て欲しい。」
    A「他の人も言っているように命名規則がバラバラなのが解るだろう。複数の人のコードが混ざっていると推測できる。」
    B「犯人は複数犯だと?」
    A「いや、この規模のプログラムで複数犯というのは考えづらい。インターネットなどからコピペしたコードだと考えるのが妥当だろう。」
    B「つまり、関数名だけ判断できないと?」
    A「そうは言っていない。もう一度よく見て欲しい。」
    A「命名規則はバラバラだが、小文字の動詞で始まり、区切りが大文字になっている関数が圧倒的に多いのがわかるだろう。」
    A「これはJavaなどでよく使われる命名規則だ。」
    B「つまり犯人はJavaのプログラマだと?」
    A「これだけでそう判断するのは早計だろう。」
    A「さっきも言ったが、これらの関数はインターネットからコピペしている可能性が高い。」
    A「つまり、コピペ元のソースがJavaだったという事ではないだろうか?」
    B「なるほど」
    A「ここで犯人が生粋のC#プログラマーだったらと仮定しよう。」
    A「サンプルコードを探すとき、検索文字列に「C# ~」とか「.netf ramework ~」を付けて検索する場合が多いと考えられる。」
    A「C#はメジャーだし、大抵のことは出来るので、わざわざ他の言語のサンプルを参考にする必要がないからね。」
    A「しかし犯人はJavaらしきサンプルを利用している。」
    B「つまり犯人はC#プログラマーではないと?」
    A「その可能性が高い。」
    A「もし犯人がC言語のプログラマだったなら、ウイルス作るのに巨大なランタイムが必要なC#はまず使わない。」
    A「スクリプト系言語のプログラマだったら、もっと短めの関数名を好むはずだ。」
    A「そう考えると、犯人はJavaプログラマだと考えるのが妥当かもしれない。」
    A「次はCommon.GetUnixTime()に注目してみよう。GetUnixTimeで検索すると結構な数のページが検索される。これもコピペだろう。」
    B「でしょうね。」
    A「これはUNIX時間を返す関数だと推測できる。」
    A「ここで犯人がUNIXを全く知らないと仮定しよう。どうやったらこれらのページにたどり着くだろうか?」
    A「実はUNIX時間という言葉を知らないとこれらのページにはなかなかたどり着けない。」
    B「クラス毎コピペしたら、この関数も付いてきたのでは?」
    A「クラス内のほかの関数と命名規則が違うので、その可能性は低いだろう。」
    A「つまり犯人はある程度UNIXに馴染みがあるのではないだろうか?」
    B「なるほど」
    A「では次はCommon_Crpt.addKaigyo()、removeKaigyo()に注目してみよう。」
    A「この二つだけ、明らかに他と異なるのがわかるだろうか?」
    B「・・・日本語ですね。」
    A「そうだ。英語、英語と来て、ここだけ日本語。これは恥ずかしい・・・。たとえコピペであっても私なら直すな。」
    B「直しますね。」
    A「次は_getElementById()に注目しよう。」
    B「ちょっと待ってください。addKaigyo()はどうなったんですか?」
    A「・・・いや、それだけだが・・・」
    B「・・・」
    A「では話を戻そう。_getElementById、_getElementsByTagNameはいわずと知れたDOMの関数だ。」
    A「この関数名がさっと出てくるぐらいだから、XMLかHTML、Javascriptなどを使ったことがあるのではないだろうか?」
    B「まあ今時その三つを使ったこと無いって言う人のほうが珍しいんじゃないですかぁ?」
    A「まあそうだな。なんか言葉に棘がないか?」
    A「まあそれはさておき、ここまでに出てきたキーワードを並べてみよう。」
    B「Java、UNIX、XML、HTML、Javascriptですね。」
    A「そうだ。これらのキーワードから導き出される犯人像は・・・」
    A「本職はJavaServlet/JSPを使ったWebプログラマで、C#をちょっとかじったことのある人物と言うことになる。」
    B「なるほど。・・・でもそれって全然絞り込めてませんよね。」
    A「ウイルス作るのにC言語よりC#を選んでることから、ここ10年ぐらいの間にWindowsのプログラミングを覚えた人。」
    B「それでも絞り込めていませんよ。」
    A「後はaddKaigyo()を放置するぐらいプログラミングに思い入れがない人だな。」

  • 一貫性がないということは

    複数人で作った

    という可能性を私は提示したい。

    Aという人が最初に作る、そしてBという人が別の部分をつくる。
    しかしこのときクラス名なんかはとくに一貫性なし。
    次にCという人間は別の部分をつくるが、一貫性をある程度保持するためにAとBの作ったクラス名を参考にして微妙な命名となる。

    こんな感じで作られた可能性は・・・・ないか・・・・

    • > 一貫性がないということは
      > 複数人で作った
      > という可能性

      その場合、考慮すべきは「一週間前の自分はもはや他人」ってことですかね。

      Aという時期にが最初に作る、そしてBという時期に別の部分をつくる。
      しかしこのときクラス名なんかはとくに一貫性なし。
      Cという時期に別の部分をつくるが、一貫性をある程度保持するためにAとBの作ったクラス名を参考にして微妙な命名となる。←イマココ

      なんてのはよくある話だと思います。

      #数日前、初期化処理中を示すフラグ名を「in_init」と「inInit」で混在させてたことが発覚したばかりなのでAC。

      親コメント
    • by Anonymous Coward

      いや、コピペでつくったんでしょ。
      実際、某サイトからコピペしてたみたいだし。

      #_S/_Eはどこかで見たことあるな…
      #なんだったかなぁ…

      • by Anonymous Coward

        _S → Second
        _E → Extended
        とか?

        既存コードに手を入れるときは絶対元のコードに触らないで、
        元のメソッドをコピって名前の末尾に2を加えたメソッドを追加(someMethod() → someMethod2())して、
        その中だけで解決する人がいたなぁ…DRY?何それ、ビール?みたいな感じで。

        • by Anonymous Coward

          んーそこだけおもしろそうなので頭ひねってみたけど私には答えはでませんでした。。。

          _uidToEndMark_S, uidToEndMark_E, uidToInterceptMark_S, uidToInterceptMark_E,

          このMark系列との処理の対称性があるっぽいように思えたので、2とかExとかEx2とかではなさそうな気がします。
          なんでしょね。。。Series/Paralleでもないし、、、Single/Enumerationとか?
          これどっかで引数とかのsignatureみれないんですかね?

          • by Anonymous Coward

            Start/End とかどうだろう。

            • by Anonymous Coward

              俺は#2339266なんだけど、過去に見たことある_S/_EもStart/Endだった気がする。

            • by Anonymous Coward
              つかSとEが対になってんのにStart/Endを思いつかないって、/.Jってもう技術者サイトじゃないだなって感じ。
              # // yyyy/MM/dd 退職済みの人の名前 S
              # // 今は使ってないゴミ
              # // yyyy/MM/dd 退職済みの人の名前 E
              # が多重に入れ子になってるソースはもう見たくないです…
      • by Anonymous Coward
        >いや、コピペでつくったんでしょ。

        今までの仕事で書いたコード・使ったコードがコピペ元ってこともあるよ

    • by Anonymous Coward

      関数名を見てみると
      ・privateメソッドはアンダーバーで始める
      ・暗号化など日曜プログラマには実装が難しい部分はC#サンプルからのコピペなので大文字から
      ・その他自分で書いたところははJavaの流儀
      という印象。
      Javaのスキルがある開発者が覚えたてのC#使ってみました、という感じがします。
      英単語の略し方からしても英語文献を自分で読んでバリバリやるタイプではなさそうですが、開発経験はかなりありそうな。

      • by Anonymous Coward

        オフトピ質問ですけど、

        ・privateメソッドはアンダーバーで始める

        個人的に昔から気になってたのですが、これはなに由来なのですかね?

        私は初めてみた業務用VisualC++のソースがすでにこれでした。
        当時「なんで?」と質問したら「しらん」と言われましたが。
        その後、FlexでもJavascriptでもPHPでもお会いします。。。

        # また別の話ですが"My"はperl由来でFA?(VBでもよくサンプルで出会ったけど。。。)

        • アンダーバーで始める名前って1980年代から存在していて, 当時はOSやターゲットに依存した互換性の無い物に使われていたことが多かったように思います. つまり, 使ってしまったら互換性/移植性に問題が出てくるため, 通常レベルのプログラマでは使ってはいけないというようなルールが設定されることがありました. それらの機能を使う場合には, 共通ライブラリ作成チームとかで互換性を維持できるような上モノをかぶせて提供することで, 問題の局所化を図っていたわけです.

          それが転じて, 外部から参照されないもの/単一のソース内で完結しているものの目印として頭のアンダーバーが使われるようになったんだと思います. 今のようにIDEが発達していない時代の工夫ですが, いちいち別の名前を考えるのが面倒とか, 関数/メソッドなどではどの関数/メソッドの下請けなのかが分かりやすいなんて理由で使われているのではないかと.

          親コメント
        • by Anonymous Coward

          _で始まるメソッドやマクロは、予告なく消滅したり仕様が変わったりする可能性があることを意味していました。
          非公式という意味です。実装依存の部分でもよく使われます。

          起源はわかりませんが、C言語のライブラリで既に導入されているので、かなり古いことは間違いありませんね。

          • C言語のライブラリがどーとかいうレベルで言うなら、

            • グローバル スコープを持ち、_ で始まる名前
            • _ で始まり、その次が大文字の名前
            • __ で始まる名前

            は、システムに予約されています [microsoft.com]
            (システムの内部的な名称で使われてるかもしれないから、バッティングしないようにユーザーは使うな、ということです。)

            ローカルなスコープなら _小文字 で始まる名前は使えますけど、トラブルを避けるためにも、_で始まる名前は使わないのが無難。

            #ライブラリのソースコードとか眺めて真似たりとかしてるとついつい_で始まる名前を使いたくなるんですよね。
            #私は今は、識別子の最後に_を付ける、というルールでやってます。

            親コメント
    • by Anonymous Coward

      犯人の身近なベテランの人が作っていたものをパクって作成したみたいな想像をした

  • by s02222 (20350) on 2013年03月08日 13時28分 (#2339274)
    「○○がしたい」でwebを検索して出てきたソースコードサンプルをコピペで集めるとこんな感じに一貫性の無い命名になる。

    掲示板への書き込みメソッド(っぽい名前の奴)とか、「こうやったら出来た」と雑なサンプルを載せてるblogなんかがヒットしそうなイメージ。 ちらっと検索してみたらこの話題しか出てこないみたいだけど。
    • by Anonymous Coward

      Win APIが絡むとwindowHandleとhWndが混在するようになる。

  • リンク先は「あるある〜」
    と吹き出してしまいましたw

    ガチガチの人はどうかわかりませんが、
    いくつかの言語を渡り歩いてりゃ、
    私的プログラムだったらこんなもんだと思いますけど。
    ソースコピペとかもねえ。こんなもんじゃね?

    そうか、今時の若い子はこんなスチャラカプログラミングはしないんだ。
    Hu-BASICとかN88-BASICとかから使ってると「三つ子の魂百まで」だなあ、というケースもありますな。
    個人的にはCamelCaseよりもアンダーバーが好きですね。
    というか、C言語を覚えた20数年前はそれが多かった気がする。
  • GJ (スコア:2, すばらしい洞察)

    by Anonymous Coward on 2013年03月09日 1時01分 (#2339694)

    この情報を公開すればIT技術者の関心を惹けると、犯人特定の情報を得られる可能性を閃いた警察は賢い。

  • by Anonymous Coward on 2013年03月08日 13時28分 (#2339273)

    おそらく警察は手詰まり、若しくはこれ以上犯人を探すつもりはない。
    つまり犯人はゆうちゃん

  • by Anonymous Coward on 2013年03月08日 13時54分 (#2339297)

    メソッド引数も公開すべきじゃないですかね。
    命名規約は結局のところ名前でしかなく、多少迷彩をかけてくる可能性もありそうですが、引数の型や順番は設計思想が現れそうに思うので。

    # kuippa氏の指摘は全体的に微妙。"asy"が"asynchronous"だと指摘されるまで気づかないって……。

  • by Anonymous Coward on 2013年03月08日 13時58分 (#2339303)

    色々くっつけた結果がこれではと。
    名前で検索すると同じのが出てきたりして。

  • by Anonymous Coward on 2013年03月08日 14時24分 (#2339332)

    これがあれば誰も悲しむことがなくなるのに。

    • by Anonymous Coward

      早速仕様のバグを見つけた。
      宇宙関連をスコープ外にしてた。
      やはり人間には無理なんだろうか。
      悲しみのない世界は実現不可能なんだろうか。

  • by Anonymous Coward on 2013年03月08日 14時32分 (#2339339)

    タレコミのリンク先を読んで思うのは、レビューアの能力や
    経験が(と若干性格も)暴露されているなっと。

typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...