blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

艦これのAPIを直接叩いて操作しようと思ったけどやめた話

やりたかったこと

寝ている時や仕事中などゲームをプレイできないとき、Jenkins提督に遠征の指揮を執ってほしかった。
Jenkinsがコマンドを実行することにより、帰投した艦隊の受け入れ、補給、遠征への出撃を定期的に行ってくれるイメージ。

これを実現するために、こんな感じのプログラムを書いてみた
https://gist.github.com/oh-sky/6404680
※プログラムの動作確認には自分で用意したモックサーバを使用しており、実際にゲームの操作は行っておりません。

プログラムの動作イメージとしてはこんな感じ

$ #各艦隊のステータス確認
$ ./knkr.rb getDeckPort
第1艦隊
出撃可
第2艦隊
帰投中
第3艦隊
出撃可

$ #遠征から帰投した艦隊の受け入れ
$ ./knkr.rb getMissionResult 2
第2艦隊の遠征結果
成功

$ #遠征に送る
$ ./knkr.rb startMission 2 5
第2艦隊の遠征終了予定時刻
2013-08-31 20:10:30

たぶん、トークンとアプリサーバのアドレスを入れたら動くと思います。 が、やっていませんし、やらないでください。

絶対にやらないでください。

やめた理由

DMMオンラインゲーム利用規約には下記のような記述があります。

第6条(禁止事項)
1.会員は、本サービスを利用するにあたり、故意・過失を問わず以下の各号に定める行為を行ってはならないものとします。
■不適切行為
(8)不正な方法(特殊なプログラムを介しての)でのアクセスを試みる行為

大切なアカウントが轟沈する可能性のあることはできません。

結論

ゲームはルールを守って、楽しくプレイしましょう。

鳥海は俺の嫁

Mac OS XでNFSサーバを立てる方法

/etc/exports を作成する

書式:/PATH/TO/SHARING/DIR -mapall=${uid}:${gid} ${ipaddr}

例えば、IPアドレス192.168.123.45のホストに、UID501,GID20のユーザとして、/var/nfs/exports のマウントを許可するなら

/var/nfs/exports -mapall=501:20 192.168.123.45

と書きます。

/etc/exportsが作成されると、自動的にnfsdが起動します

nfsdを起動したあとに/etc/exportsを編集した場合は

$ sudo nfsd update

で、新しい設定が反映されます。

複数のホストに接続を許可する場合は、IPアドレスをスペースで区切って複数書けば良いようです。 192.168.123.0/24 のような指定はできません

UID,GIDを調べるには

$ dscl . -list /Users uid
$ dscl . -list /Groups gid

RDS MySQLインスタンスにてトリガを設定する

RDSのMySQLインスタンスにてトリガを作成するには

MySQLでは、binlogを出力する設定になっている場合、SUPER権限を持つユーザでないとトリガやファンクションを作成できない。

RDSのMySQLインスタンスは、リードレプリカの有無に関係なくbinlogを出力する設定になっており、 且つ利用者側ユーザにSUPER権限は無いため、トリガを作成しようとすると下記のようなエラーが出る。

You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

解決手段

グローバル変数log_bin_trust_function_creatorsの値を1にすれば良い。 RDSの場合はパラメータグループを操作する。

f:id:oh-sky:20130825202630p:plain

この変更は再起動すること無く反映される。

参考:http://dev.mysql.com/doc/refman/5.1/ja/stored-procedure-logging.html

ApacheでHTTPSのReverseProxy設定

例えばhttps://proxy.example.com/へのアクセスをhttps://hostname.example.com/へ転送したいときのVirtualHost設定は下記のようになります。

[prompt]$ sudo vi /etc/apache2/sites-available/proxy.example.com
===========================================================================
<VirtualHost *:443>
        ServerName proxy.example.com
        SSLEngine on
        SSLProxyEngine on
        SSLCertificateFile /path/to/certificate.crt
        SSLCertificateKeyFile /path/to/private.key
        ProxyPass / https://hostname.example.com/
        ProxyPassReverse / https://hostname.example.com/
</VirtualHost>

当たり前ですが、証明書はproxy.example.comのものである必要があります。

設定ファイルを書いたら、必要なモジュールのリンクを貼り、Apacheを再起動します。

[prompt]$ sudo a2enmod proxy
[prompt]$ sudo a2enmod proxy_http
[prompt]$ sudo a2enmod ssl
[prompt]$ sudo a2ensite proxy.example.com
[prompt]$ sudo /etc/init.d/apache2 restart

Debianでの設定例です。Ubuntuなら似たような方法で設定できると思います。他のディストリビューションでは、設定ファイルのパスやモジュールのロード方法が異なる場合があります。

おまけ Proxyでアクセス制御を行いたい場合

通常、OrderAllowDenyといったディテクティブは<Directory>ディレクティブ内に書くものだけれど、 ディレクトリの存在しないプロキシではどうしたら良いのかというと・・・ <Proxy>ディレクティブに設定します。

例えば

<VirtualHost *:80>
    ServerName hoge.example.com
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 172.16.0.0/16
    </Proxy>
</VirtualHost>

みたいな感じで。

AuthNameAuthTypeといったディレクティブも<Proxy>内に書きます。

PostfixでメイルのSubjectを書き換える方法

Postfixheader_checksという機能を使います。 header_checksを使うと、ヘッダに任意のパターンを含むメイルをREJECTしたり、REDIRECTしたり、ヘッダを書き換えたりすることができます。

例えば、本番サーバと開発用サーバがあり、開発用サーバからのメイルを判別しやすくするために [test]というprefixを件名につけたいと行った場合、下記のように設定します。

/etc/postfix/header_checks を下記のような内容で作成
/^Subject: =\?UTF-8\?B\?(.*)/ REPLACE Subject: =?UTF-8?B?W3Rlc3Rd$1

上記はBASE64UTF-8で書かれたSubjectの先頭に"[test]"を付加する場合。 文字セットやTransfer-Encodingが異なる場合はそれに合わせて変更します。

/etc/postfix/main.cf に、下記のような行を追加
header_checks = regexp:/etc/postfix/header_checks
postfixを再起動
[prompt]$ sudo /etc/init.d/postfix restart

PHPのSoapClientで、名前空間の接頭辞をns1から任意のものに変えたい場合

<?php
/**
 * SoapClientを継承するクラスにて、__doRequest()メソッドをオーバーライドする
 */
class MySoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $request = preg_replace('/xmlns:ns1/', 'xmlns:myns', $request);
        $request = preg_replace('/<ns1:/', '<myns:', $request);
        $request = preg_replace('/<\/ns1:/', '</myns:', $request);
        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }
}

$soapObj = new MySoapClient(
    null,
    array(
        'soap_version' => SOAP_1_1,
        'location' => 'http://example.com/',
        'uri' => 'http://example.com/',
        'use' => SOAP_LITERAL,
    ));

$soapObj->MethodName( new SoapParam('value', 'param') );

上記のように、SoapClientクラスを継承し、オーバーライドした__doRequest()メソッドにて ns1 を任意の文字列に置換すれば、下記のようなリクエストをサーバに送ることができる。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myns="http://example.com">
  <SOAP-ENV:Body>
    <myns:MethodName>
      <param>value</param>
    </myns:MethodName>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Debianで必要なコマンドがどのパッケージに入っているか調べる方法

ググれば大抵の場合解決するんですが、どうしても自己解決しなければならない場合に

1 まず apt-file をインストールし、データを更新する。

[prompt]$ sudo aptitude update
[prompt]$ sudo aptitude install apt-file
[prompt]$ sudo apt-file update

2 そして、例えばnslookupがどのパッケージに入っているか調べる場合は

[prompt]$ apt-file search nslookup