CORDEA blog

Android applications engineer

自宅サーバーのFlaskにドメイン設定してみる

はじめに

今後同じようなことをしたときに忘れていそうなのでメモ。
今回は自分なりにやりやすい方法を選んだ結果、かなり環境を限定されるやり方となってしまいました。
やり方はいろいろあるので、このようなやり方もある、という程度で留め置いていただければ幸いです。
機会があれば追記して再送します。

諸環境


 

やってること

  • お名前.com

   ドメイン取得

   ドメイン管理

   ポート変換

   iptablesでポートの開放


手順

Flaskに関しては5000番ポートで使用します。

Hosted Zoneはあらかじめ作成しておきます。
Hosted Zoneの作成の仕方についてはawsdocumentaion*3に詳しく説明があります。

ここまでで以下の2点は終わっていることを前提としています。

  • domainの取得
  • Hosted Zoneの作成


 

name serverの変更


Hosted Zoneの作成を終えたら、Hosted Zoneの一覧にあるこれから使用するdomainをクリックしてHosted Zone DetailsのDelegation Setを確認します。
f:id:CORDEA:20140818173440p:plain


先ほど確認したDelegation Setのname server情報をお名前.comに反映させます。
場所は以下の通り
ドメインNavi -> ドメイン設定 -> ネームサーバーの設定 -> ネームサーバーの変更 -> 他のネームサーバーを利用


変更する際には使用したいドメイン名にチェックを入れてください。*4
http://cordea.jp/material/blog/domain.png

 

CTUの設定

次はCTUの設定ですが、これはフレッツ・光プレミアムの方限定となります。
他のサービスでどのように設定するかは私には分かりかねますが、別にCTUで設定しなくてもiptablesでport変換するという手もあると思います。

画像を見ていただくとわかるかと思いますが、WAN側IP(global ip)の80番ポートへのアクセスをサーバーに割り当てているLAN側IPの5000番ポートに変換しています。


http://cordea.jp/material/blog/ctu_config.png


 

Record Setの作成

ここまで終わったらHosted ZoneのRecord Setを作成します。
設定は画像のとおり

Type A
Alias No
Value WAN側IP

http://cordea.jp/material/blog/AWS.png


 
以上です。

 

*1:別にAWSを使う必要はないんですが、契約しているドメインを全てRoute 53で管理してるので私はRoute 53を使用します。

*2:フレッツ・光プレミアム」で設置される終端装置

*3:Creating a Hosted Zone - Amazon Route 53

*4:画像の丁度上にチェックボックスがあります

【Debian】Rのpackage "rgl"インストール時に出たエラーと対策

CentOS / Fedoraこちら

Debianでやってたら過去に見たようなエラーが出たのですが解決したのでまとめ。

手順

出たエラーはこちら

error: X11 not found but required, configure aborted. 

error: missing required header GL/gl.h

以下をインストールしたら無事に”rgl”を入れることが出来た

sudo apt-get install -y libx11-dev freeglut3-dev

CentOS 7 にyumで python-pip をインストールする

CentOSに7が出たということを知り、早速新しく買ったサーバーに入れてみたはいいもののyumからpipが入らない
でもeasy-installは使いたくない

というわけでyumからpipをinstallします。


Version

CentOS Linux release 7.0.1406 (Core)


手順

wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm

sudo rpm -ivh epel-release-7-0.2.noarch.rpm

sudo yum install -y python-pip


おわり

MySQLのMEMORYストレージエンジンを試してみる

はじめに

見ていて面白そうだったので試験的にMEMORYストレージエンジンを使用してみました。

MEMORYストレージエンジンはメモリ上にテーブルを作成するものです。
これにより、かなり処理が高速化されます。

MySQLのインストールは終わっているものとして書いて有ります。

 

手順

 
先にheap size等の設定を行います。
これはインメモリにする上で必須の設定です。

sudo vim /etc/my.cnf

 

my.cnfに次の記述を追加します。

max_heap_table_size=2G
tmp_table_size=2G

 

できたらrestartします。

sudo service mysqld restart

 

それが終わったらMySQLにログインして設定を行います。

set global tmp_table_size = 2147483648;
set global max_heap_table_size = 2147483648;

 

ここまでできたらtableを作成してみます。

create table in_memory (id varchar(16), chr varchar(8), index(id)) engine=memory;


 
ここらへんは適当に。

load data infile "/tmp/test.csv" into table in_memory fields terminated by ',';

 

簡単な速度計測

 
tableの情報はこんな感じです。

Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length
my_isam MyISAM 10 Dynamic 39706716 23 915841192 281474976710655 536508416
in_memory MEMORY 10 Fixed 39706716 27 1281039008 1207959534 640502960


 
で、計測結果ですが

Name Speed(sec)
my_isam 0.04
in_memory 0.00


 
正直なところ使うデータセットが悪かったので違いがわかりにくいですが、2-4倍程度の速度向上が見込めるかと思います。


 

最後に

サーバー再起動/クラッシュするとtableのデータが全て消えるので、実用できるかというと微妙なところですが、なかなかおもしろいと思います。

 

jVectorMapでmarkerを置く座標を決めるためのやつ

world_mill_enの座標を知りたかったけど公開してるサイトが見つからなかった。
いちいちローカルで作りなおすのも何なのでJSFiddleでShareしておきます。

公式のReverse projectionとほぼ同じなのでオリジナリティはありませんが...




http://jsfiddle.net/CORDEA/By7ju/

Pythonのライブラリ、PodSixNetの使い方

はじめに

 
使い方といっても、他のドキュメントがしっかり書いてあったりするので、1からすべて説明するというものではありません。

作者の方のサイトで説明を読んだけれど、実際にどう使ってわからない、といった方に向けて備忘録的に書いておきます。
あと、個々の関数やクラスの説明に関しては作者の方のサイトを見ていただければ幸いです。

 
この記事で最終的に出来上がるのはHello/Byeを交互に受発信するものです。

コードを全て見たい場合は下のGistをご参照ください。

サーバー/クライアント共通


PodSixNetでは次のようなディクショナリ形式のデータをやり取りします。
 

{"action": "myaction", "string": "apple", "boolean": "True", "integer": 1}


送信側は次のようにして送信します。

 

self.Send({"action": "myaction", "string": "apple", "boolean": "True", "integer": 1})

受信側は次のようにして受信します。

 

def Network_myaction(self, data):
    string  = data["string"]
    boolean = data["boolean"]
    integer = data["integer"]
    print(string)

この時、printされるのは"apple"になります。


 

サーバーサイド

class NewChannel(Channel):
    def __init__(self, *args, **kwargs):
        Channel.__init__(self, *args, **kwargs)
 
    def Network_getHello(self, data):
        print("network: hello")
        message = data["message"]
        self._server.allSendBye(message)
 
    def Network_getBye(self, data):
        print("network: bye")
        message = data["message"]
        self._server.allSendHello(message)


 
ここではクライアントサイドから送信されてきたメッセージを受け取っています。
allSendBye, allSendHelloについてはあとで出てきます。


 

class NewServer(Server):
    channelClass = NewChannel

    def __init__(self, *args, **kwargs):
        Server.__init__(self, *args, **kwargs)
        self.clients = {}
        self.clientNumber = 0
        print("Server launched")

    def Connected(self, channel, addr):
        print("New connection: " + str(channel))
        self.clients[self.clientNumber] = channel
        self.clientNumber += 1

 
ここでの__init__はサーバーを立ち上げた時に呼ばれます。
また、Connectedはクライアントとの接続が行われた際、クライアント毎に呼ばれます。
もし接続させるクライアント数を限定したければ、Connectedで処理すると楽です。


 
私の場合、クライアントの識別はディクショナリで行なっています。
ディクショナリのKeyはクライアントの番号、ValueはChannelです。

 

    def allSendHello(self, message):
        print("client message: " + message)
        clientList = self.clients.values()
        for i in clientList:
            i.Send({"action": "getHello", "message": "Hello Client!"})

    def allSendBye(self, message):
        print("client message: " + message)
        clientList = self.clients.values()
        for i in clientList:
            i.Send({"action": "getBye", "message": "Bye Client!"})

    def launch(self):
        while True:
            self.Pump()
            sleep(0.0001)


 
NewServerクラスの続きです。
allSendHello, allSendByeはその名の通り、接続しているクライアントすべてに対して送信しています。
ディクショナリに入っているValueをすべてリストに格納し、for文で全て取り出して送信しています。
この場合、iにはChannelが入っています。
Channelを指定することで送信する相手を決定することが可能です。



 

クライアントサイド


基本は変わりませんのでさくっと行きます。

 

class NetworkListener(ConnectionListener):
    def __init__(self, host, port):
        self.Connect((host, port))
        print("Client started")

    def Network_connected(self, data):
        print("Connected to the server")
        self.sendHello()

    def Network_disconnected(self, data):
        print("Disconnected from the server")

 
Network_connectedはサーバーに接続した時に呼ばれます。
Network_disconnectedサーバーから切断された時に呼ばれます。

 

    def sendHello(self):
        sleep(1.0)
        self.Send({"action": "getHello", "message": "Hello Server!"})

    def sendBye(self):
        self.Send({"action": "getBye", "message": "Bye Server!"})
        sleep(1.0)

 
ここではサーバーに対してメッセージを送信しています。



 

最後に


PodSixNetはターン制のゲームには非常に有効なライブラリです。
ぜひ使ってみてください。


 

Pythonのturtleモジュールで自分の思い通りにグラフを書く

はじめに

RにしろPythonにしろ、書いているとうまい具合に行かないことがある。
一番思い通りに行く方法はやっぱり自分の手で1から書いてしまうことだと思います。
というわけでturtleモジュールで棒グラフを書いてみました。

turtleモジュールを使ったことのある人ならわかるかと思いますが、遊びならともかく普通に使うならExcelとかRとか使った方が良いです。

結果

結果としてどんな感じのものができるか始めに出しておきます。
f:id:CORDEA:20140608191511p:plain

コード


動作させると亀がゆっくりグラフを書いてくれます。
その間コーヒーでもどうぞ。



Draw bar chart using the turtle module.


まとめ


メリット

  • 見てて和む
  • 色やフォント位置など、かなり細かく指定できる
  • もうちょっとちゃんと作ればRよりも理解しやすい(たぶん)


デメリット

  • 遅い(亀の速度を変えれば多少は速くなる)
  • 自分で書くコード量が多いため1つのグラフを書くのに時間がかかる
  • 文字が回転させられない(新しいものではできるかもしれません)