2017年07月

    Pythonでシーザー暗号実装

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    この間時間制限ありのPython問題集でシーザー暗号のプログラムを組むことがあったのですが、時間制限があるとだめだね。

    緊張して全然頭まわらない。

    プログラムの仕様としては
    • 文字列(変数名Message str型)
    • ずらす個数(変数名Key int型)
    • 暗号化した文字列(Result str型)
    • 暗号化する文字はa-zA-Zのみで,や:などの文字はそのまま表示する

    とりあえず、「文字をずらす!」ということをするので、ordで文字コードを取得して、a-zA-Zの間にあればKey分ずらすというものを書いたのだが、とても分かりづらいものになってしまった。

    後から考えてみると、
    小文字アルファベット、大文字アルファベットの文字列を用意しておき、その中から検索して、見つかればずらすとしたほうがスマートだったなと思ったので書いてみた。

    問題集では暗号化のみを扱っていたが、ついでなので複合もできるように拡張しておいた。

    import re
    
    def cryption_caesar(Message, Key, IsEncrypt):
        assert isinstance(Message, str), "Error"
        assert isinstance(Key, int), "Error"
        assert Key > -1, "Error"
        assert isinstance(IsEncrypt, bool), "Error"
        
        alf_s = "abcdefghijklmnopqrstuvwxyz"
        alf_l = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        
        result = ""
        
        if Key > 26:
            Key = Key % 26
        
        for e in Message:
            if re.search(r"[a-z]", e):
                if IsEncrypt:
                    if alf_s.find(e) + Key > 25:
                        result += alf_s[alf_s.find(e) + Key - 26]
                    else:
                        result += alf_s[alf_s.find(e) + Key]
                else:
                    if alf_s.find(e) - Key < 0:
                        result += alf_s[alf_s.find(e) - Key + 26]
                    else:
                        result += alf_s[alf_s.find(e) - Key]
            elif re.search(r"[A-Z]", e):
                if IsEncrypt:
                    if alf_l.find(e) + Key > 25:
                        result += alf_l[alf_l.find(e) + Key - 26]
                    else:
                        result += alf_l[alf_l.find(e) + Key]
                else:
                    if alf_l.find(e) - Key < 0:
                        result += alf_l[alf_l.find(e) - Key + 26]
                    else:
                        result += alf_l[alf_l.find(e) - Key]
            else:
                result += e
        
        return result
    

    cryption_caesarの3つ目の変数がTrueなら暗号化、Falseなら復号する。

    入力文字列 rin_jugatlaを暗号化すると
    sjo_kvhbumbとなる、これを復号すると
    rin_jugatlaに戻ると。

    あぁ、なぜ最初にこの方法を思いつかなかったんだろう・・・。
    assertのエラー文が雑とか、条件分岐も雑とかいろいろあるけど、まぁ動けばいいかな。
    スポンサーサイト

    SourcePawn / Sourcemod プラグイン作成環境構築

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    https://developer.valvesoftware.com/wiki/SteamCMD#Windows※このページの内容は以下2ページとほぼ同様です。非常に参考になるサイトですので、この記事内でわからないことがあればぜひ参照してください。
    SourcemodとはSource Engineで動くゲームの動作を拡張・修正・改造するためのMOD(以下plugin)作成環境です。
    Sourcemodで具体的にどのようなことができるのかですが、例えば
    1. マップのプレイ回数のカウント
    2. プレイヤーのキル・デスやスコアでランキング
    3. 味方の位置が壁透けて見えるようになる
    などなどいろいろなことができます。

    ゲームプレイ中に、「これがあれば・・・」のような悩みを解決するのに役立つかもしれません。
    そんなこんなで、開発環境を構築していきましょう。

    ここでは開発環境(エディタ)の都合上、Windowsのみを扱います。
    また、ゲームを実行しながらゲームサーバを実行するため若干コンピュータのスペックを必要とするかもしれません。(動かない環境で試したことがないのでどの程度が最低必要スペックかは書けません。)
    当方の環境は記事最下部に示します。


    開発環境構築目次

    1. ゲームクライアント実行環境構築(Team Fortress2など) 
    2. ゲームサーバ実行環境構築
    3. 開発環境構築
    4. 開発の流れ


    ゲームクライアント実行環境構築

    Source Engineで動いているゲームであれば大体動くと思いますが、今回はTeam Fortress2(以下TF2)を使用する。

    SteamのゲームストアからTF2をインストールする

    インストール先はデフォルトを使用しているものとして進める。


    ゲームサーバ実行環境構築

    SteamCMDのダウンロード

    上記サイトから「steamcmd.zip」をダウンロードする。

    SteamCMDの配置

    先ほどダウンロードしたzipファイルを解凍し、「steamcmd.exe」を「C:\srcds」に配置する。

    Create_server.batの配置

    create_server.batをダウンロードし、「C:\srcds」に配置する。
    ファイルの内容は以下の通りです。(TF2 Wikiより引用)
    なお、「set appid=232250」ここの数値を変えることにより、他のゲームサーバを構築可能である。
    appidはゲームのストアページの末尾の数値例えばARK「http://store.steampowered.com/app/346110/ARK_Survival_Evolved//」なら346110である。
    :バッチファイルを実行したディレクトリ
    set runcmd=%~dp0
    :SteamCMDのログインユーザー
    set username=anonymous
    :SteamCMDのログインユーザーのパスワード
    set password=
    :アップデートするサーバーのゲームID
    :(Team Fortress 2 = 232250)
    set appid=232250
    :ディレクトリ移動
    cd %runcmd%
    :SteamCMDを実行
    start /wait steamcmd +login %username% %password% +force_install_dir %runcmd%server\ +app_update %appid% validate

    SteamCMDとCreate_server.batを用いたゲームサーバ構築

    先ほど配置した「create_server.bat」を実行する。
    サーバを構築するための基礎ファイル群をダウンロードする。
    改善環境によるが、5分程度で完了すると思う。

    srcds_01.jpg 

    このようなウィンドが表示され、最新行に「>Steam」と表示された後に「quit」または×ボタンでウィンドを閉じる。
    この状態での「C:\srcds」の様子は

    srcds_02.jpg 

    このようになっている。状態が異なる場合は手順を確認してほしい。

    さらに、もう一度「create_server.bat」を実行する。
    TF2サーバを構築するためのファイル群をダウンロードする。
    記事作成時点で7GB弱ある。

    srcds_03.jpg 

    このような画面でダウンロード状況が表示される。
    最新行に「>Steam」と表示された後に「quit」または×ボタンでウィンドを閉じる。

    なお、ゲームサーバにアップデートがあった場合は、「create_server.bat」を実行するとアップデートを適用することができる。
    また、ファイルが破損した、サーバを再構築したい場合は、「steamcmd.exe」と「create_server.bat」以外を削除し、上記作業を行えばよい。

    ゲームサーバの開始

    start_server.batをダウンロードし、「C:\srcds\server」に配置する。
    実行するとゲームサーバを開始する。

    srcds_04.jpg 

    このようなウィンドが表示されれば成功である。
    なお、batファイルに使用できるオプションは多数あり下記を参考に用途に合わせて追記するとよい。

    ゲームサーバの設定

    server_setting.cfgをダウンロードし、「C:\srcds\server\tf\cfg」に配置する。
    plugin作成用の最低限の設定のみを記述した。
    • sv_lan 0 
    0だとサーバをウェブに公開する設定だが、ポート開放していなければ外部からは接続できない。
    今回はローカルでの運用を前提としているが、changelevel(マップ変更)コマンドを使用した際に、sv_lan 1にしているとサーバがクラッシュした経験があるため0を推奨する。
    • sm plugins load_unlock
    Pluginを読み込みやすくするための設定、本運用するサーバではこのコマンドを使用したのちにはsm plugins load_lockを使用するとよいだろう。

    なお、設定ファイルに使用できるオプションは多数あり下記を参考に用途に合わせて追記するとよい。

    Metamod導入

    pluginを動かすためのファイル群
    Metamod:Source - Newsこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。
    解凍しフォルダ「addons」を「C:\srcds\server\tf」に配置する。

    Sourcemodの導入

    pluginを動かすためのファイル群
    SourceMod: Half-Life 2 Scriptingこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。
    解凍しフォルダ「addons」と「cfg」を「C:\srcds\server\tf」に配置する。


    開発環境構築

    エディタの導入

    メモ帳などでも開発可能だが、関数名などをハイライトや入力を補完する機能を持つエディタが公開されているため、こちらを利用したほうが開発効率が良い。
    おすすめ順に列挙した。

    宣言関数一覧表示あり
    デバッガーあり
    Releases · Timocop/BasicPawn · GitHubダウンロードはこちらから

    ハイライトあり
    入力補完あり
    宣言関数一覧表示あり(行までジャンプあり)
    開発止まってる
    Pawn Studio download | SourceForge.netダウンロードはこちらから

    SPEditの導入

    上記リンクより最新のSPEditをダウンロードし「C:\spedit1.2.0.2」に配置したとして進める。

    Sourcemodの導入(オプション)

    SourceMod: Half-Life 2 Scriptingこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。(サーバに導入したものと同じものでよいため、次指定フォルダをサーバフォルダ群からコピーしてもよい)

    「C:\spedit1.2.0.2\sourcepawn\configs」フォルダに、任意の名前のフォルダを作成する(ダウンロードしたSourcemodと同じバージョン名にしておくとわかりやすい。)
    例えば、ダウンロードしたファイルが「sourcemod-1.8.0-git6014-windows.zip」であれば、「1.8.0-git6014」とするとよい。

    sourcemod-1.8.0-git6014-windows.zipをダウンロード、解凍し
    addons => sourcemod => scripting => 「spcomp.exe」ファイルを先ほど作成した「1.8.0-git6014」フォルダに配置する。
    addons => sourcemod => scripting => 「include」フォルダを先ほど作成した「1.8.0-git6014」フォルダに配置する。

    導入したSourcemodを使用する設定(オプション)

    SPEditのメニュー Configuration => Edit Configuration => New
    • Name - 適当な名前(先ほど作成したフォルダ名「1.8.0-git6014」などとするとよい)。
    • Scription Directories - 先ほど作成した「1.8.0-git6014」フォルダを指定する。
    • Copy Directory - プログラムをコンパイルしてできたファイルをコピーする先 - 「C:\srcds\server\tf\addons\sourcemod\plugins」フォルダを指定する。
    • Server Executable - 「C:\srcds\server\start_server.bat」を指定する。

    上記赤文字はデフォルトの設定を変更しておくと作業効率が上がる。


    開発の流れ

    1. ゲームサーバ立ち上げ(ショートカットF9)
    2. ソースコード作成
    3. コンパイル(ショートカットF6)
    4. バグ取り、1に戻る
    5. コンパイルが通ればゲームサーバにpluginをアップロード(ショートカットF7)
    6. ゲームサーバに「sm plugins refresh」を入力しエンターで実行(プラグインファイルの再読み込み)


    コンパイルとファイルコピーがワンタッチで行えるので非常に効率よく動作確認が行える。
    コンパイルが正常に通っても、ゲーム内で動作確認中にバグが見つかる、意図したとおりに動作しないことは非常によくあるこのなので、必ずゲームサーバで動作を確認する必要がある。
    また、WindowsのゲームサーバとLinuxのゲームサーバでは若干挙動が異なり、Windowsゲームサーバで正しく動作している場合でも、Linuxで完全に同じ動作をするとは限らないことを知っておくとよいだろう。

    ーーーーーーーーーー

    当方PCスペック
    OS:Windows7 Home
    CPU:Intel Core i7 4790K
    RAM:16GB
    Storage:2TB程度
    Graphic:Radeon 7750HD