conta's diary

思ったこと、やったことを書いてます。 twitter: @conta_

Flash Professionalで配置したオブジェクトをActionScript側(Flash Builderとか)で利用する (CS6, AS3)

メモメモφ(..)
1. Flash Professionalで作った.flaファイルにオブジェクトを配置する
 例)Buttonを配置する
2. 配置したオブジェクトをマウスで選択、右側のパレット?の"Properties"の"Instance Name"の部分にインスタンス名をつける。
 例) testButton
3. Actionscript側のMainクラス的なところで、こんな感じに書く

public class Main extends Sprite
{
  public function Main()
  {
    var testButton:Button = Button(this.getChildByName("testButton"));
    function onClick(event:Event) {

      trace('hello!');
    }
    testButton.addEventListener(MouseEvent.CLICK, onClick);
    }
  }

getChildByName()がミソ。かな。ここで指定したインスタンス名を引数に入れてオブジェクトを取得できる
4. 配置したボタンをクリックしてみる。イベントが発生して、コンソールに文字が表示されていたら成功!

FlashはIEでも動くから嬉しいよ(´・ω・`)
IE爆発しろっ(・∀・)

さくらVPSにVPN(PPTP)を構築 (Ubuntu 12.04)

漢は黙ってVPNにつないどけっ!って夢で誰かがささやいていたのでVPNの構築をやってみた。
VPNにしておけば開発するときも捗るし、VPN経由でサーバーからネットサーフィンすれば、パブリックなネットワークにつないでも盗聴されるリスクが減るしね。
今回はさくらVPSにUbuntu12.04をインストールしてPPTPを使ったVPNを構築!

いざっ(`・ω・´)!

1. pptpdのインストール

sudo apt-get install pptpd

2. confファイルの編集

ファイルは全部インストールした時に生成されるので、
下記ファイルたちをこんな感じで編集。

/etc/pptpd.conf

今回は 192.168.200.xxx らへんでipを設定。

localip 192.168.200.11  
remoteip 192.168.200.128-238

○ /etc/ppp/pptpd-options

ms-dns 8.8.8.8
ms-dns 8.8.4.4

GoogleさんのパブリックDNSを使う。

○ /etc/ppp/chap-secrets

# client, server, secret, IP addresses
username pptpd "password" *

"client, server, secret, IP addresses" の順番で入力
server の名前は "/etc/ppp/options.pptpd" のnameといっしょにすること。
デフォルトでpptpdになってるのでそのまま使う。
IPはとりあえずどっからでも受け付けるようにしときます。

3. NATの設定

○ /etc/rc.local

# adding to the bottom right before exit 0
sudo iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j MASQUERADE

これをしないとこのサーバーから外に出ることができないとGoogle先生が言っていました。

4. IPv4のフォワーディングの有効化

/etc/sysctl.conf

net.ipv4.ip_forward=1

5. 設定のリロード

sudo sysctl -p

あとはつなぐだけ

PCからなり、iPhoneからなり繋ぎまくってください。

これであなたも快適VPN生活☆


本当はCentOSにL2TPでやろうと思ったのですが、謎のエラー祭りが開催されてしまって、めっちゃ時間をかけた挙句、力不足で構築できずムシャクシャして夜中の3時からOSごと入れ替えてやったっていうのはここだけの話(´・ω・`)
CentOSと比べると非常に簡単だった(ような気がする

Skymarkの入力フォームを半自動化する

あれ毎回入れるのめんどくさい!
なんで会員登録してログイン->予約ができないのー!

それで少しでも楽しようと考えた結果が、”Javascriptでフォームを入力するスニペットをつくったらいんじゃない?”ということでした。

*もし使うときはくれぐれも自己責任でお願いします!
何が起きても一切責任は取りませんよ(´・ω・`)

script

HTMLを解析した結果こうなった。

document.getElementsByName('aLastName0')[0].value = "YOUR";
document.getElementsByName('aFirstName0')[0].value = "NAME";
document.getElementsByName('aAge0')[0].value = 18;
document.getElementById('aSex_M0').checked = true;
document.getElementsByName('tel')[0].value = 012345678;
document.getElementsByName('mailAddressPC')[0].value = "test@example.com";
document.getElementsByName('mailAddressMB')[0].value = "test@example.co.jp";
document.getElementById('callerSame').checked = true;

やってみる

まず、この画面まで行く。
f:id:contaconta:20120714030443p:plain

そして、
さっきのスクリプトを貼り付けて実行!

結果
f:id:contaconta:20120714030421p:plain

いぇーい( ・∀・)

SQLAlchemyで動的にテーブルを作る2

うーん、いいのかなぁー。もっとリファレンス読まないと。。。

Create

engine = sqlalchemy.create_engine(engine_str, echo=True)

def create_test_table(table_name):
    test_info = TestInfo.__table__
    test_info.name = table_name
    test_info.create(engine)

tablename = 'test001'
create_test_table(tablename)

Insert

TestInfo.__table__.name = 'test001'
info = TestInfo(info_name, description)
db_session.add(info)
db_session.commit()

Query

TestInfo.__table__.name = 'test001'

for row in db_session.query(TestInfo).all():
    print row

SQLAlchemyで動的にテーブルを作る

Base.create_all(engine)とすると定義されてるテーブルが全部作られちゃう。
定義してあるけど後でテーブルを動的に作りたい!と思ってやってみた。
一応動いたけど正しいのかどうかは不明。。。

リファレンスに、

Base = declarative_base()
class TestInfo(Base):
    ...

みたいに作ったクラスの中には__table__という属性が作られるよーと、
書いてあった(http://docs.sqlalchemy.org/en/rel_0_7/orm/tutorial.html)

>>> User.__table__ 
Table('users', MetaData(None),
            Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
            Column('name', String(), table=<users>),
            Column('fullname', String(), table=<users>),
            Column('password', String(), table=<users>), schema=None)

これを使って、

"Creating and Dropping Database Tables" http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#metadata-describing

"Column, Table, MetaData API" http://docs.sqlalchemy.org/en/latest/core/schema.html?highlight=table#sqlalchemy.schema.Table

のところを見つつ、書いてみた。

models.py

モデルを定義する。

Base = declarative_base()
class TestInfo(Base):

    __tablename__ = 'test_info'
    info_name = Column(String(128), primary_key=True)
    description = Column(String(256))

    def __init__(self, info_name, description):
        self.info_name = info_name
        self.description = description

    def __repr__(self):
        return "<TestInfo('%s','%s')>" % (self.info_name, self.description)

db.py

この中でTableを持ってきて、名前を変更してcreateしてる。

def init_db():
    image_info = models.TestInfo.__table__
    image_info.name = 'test001'
    image_info.create(engine)

engine_str = 'mysql+mysqldb://%s:%s@%s:%d/%s?charset=utf8' \
    % (user, password, host, port, db_name)

engine = sqlalchemy.create_engine(engine_str, echo=True)

if __name__ == '__main__':
    init_db(engine)

実行

実行結果はこんな感じ。

$python db.py
mysql+mysqldb://root:root@localhost:3306/test?charset=utf8
2012-07-04 15:32:31,059 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2012-07-04 15:32:31,059 INFO sqlalchemy.engine.base.Engine ()
2012-07-04 15:32:31,061 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
2012-07-04 15:32:31,061 INFO sqlalchemy.engine.base.Engine ()
2012-07-04 15:32:31,061 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2012-07-04 15:32:31,061 INFO sqlalchemy.engine.base.Engine ()
2012-07-04 15:32:31,062 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
2012-07-04 15:32:31,062 INFO sqlalchemy.engine.base.Engine ()
2012-07-04 15:32:31,066 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2012-07-04 15:32:31,066 INFO sqlalchemy.engine.base.Engine ()
2012-07-04 15:32:31,068 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE test001 (
        ...
)

”CREATE TABLE test001”になった( ・∀・)

でもこれ使い方おかしいかもしれない。

opencvでWeb上のイメージを読み込み (Python)

φ(..)メモメモ。
こんな感じで書いたら動いた。

import cv2
import numpy
import urllib2

img_url = 'http://www.universe-s.com/img/news/2004/0520_01.jpg'
req = urllib2.Request(img_url)
data = urllib2.urlopen(req).read()
img_buf = numpy.fromstring(data, dtype='uint8')
img = cv2.imdecode(img_buf, 1)

cv2.namedWindow('test', cv2.CV_WINDOW_AUTOSIZE)
cv2.imshow('test', img)
cv2.waitKey(0)

macにSphinx & Blockdiag環境を整える

そろそろドキュメント書きながら開発できる人間になりたい(´・ω・`)
ということで、SphinxとBlockdiagを使える環境を作る。

Sphinxはドキュメント生成ツールで、reST記法?で書くとhtmlとかpdfとかに簡単に出力できる。
ソースコードのdocstringも読み込んでドキュメントを作ってくれる便利ツール。
BlockdiagはPython製のブロックダイアグラムを生成してくれるツール。

インストール

まずは必要な物をインストール

php install sphinx blockdiag sphinxcontrib-blockdiag

ドキュメントプロジェクト作成

sphinx-quickstart

と打って質問に答えていく。

conf.py

生成されたconf.pyにblockdiagを使うための設定を追加。
blockdiagで日本語を使いたかったら.ttfが必要らしい。IPAのサイトからフォントをDLして設定。

extensions = ['sphinx.ext.autodoc', 
                      'sphinx.ext.doctest',
                      'sphinx.ext.todo',
                      'sphinx.ext.viewcode',
                      'sphinxcontrib.blockdiag'] # これ追加

blockdiag_fontpath = '/path/to/ipag.ttf'

サンプル

index.rstにBlockdiagのサンプルを書いてみる。

   sphinx-quickstart on Wed Jun 20 17:32:10 2012.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to TestSystem's documentation!
========================================

Contents:

.. toctree::
   :maxdepth: 2

てすとー

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

.. blockdiag::
   :desctable:

   blockdiag {
      'あ' -> 'い' -> 'てすと' ;
   }

ビルド

➜  docs  make html
sphinx-build -b html -d build/doctrees   source build/html
Running Sphinx v1.1.3
loading pickled environment... done
building [html]: targets for 1 source files that are out of date
updating environment: 0 added, 1 changed, 0 removed
reading sources... [100%] index                                                                                                                                                
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index                                                                                                                                                 
Exception occurred:
  File "/Users/ogata/.pythonbrew/pythons/Python-2.6.7/lib/python2.6/site-packages/PIL/ImageFont.py", line 34, in __getattr__
    raise ImportError("The _imagingft C module is not installed")
ImportError: The _imagingft C module is not installed
The full traceback has been saved in /var/folders/mx/jx26pzv53tx7dgw_ftg_vyk00000gn/T/sphinx-err-FClZmw.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
Either send bugs to the mailing list at <http://groups.google.com/group/sphinx-dev/>,
or report them in the tracker at <http://bitbucket.org/birkenfeld/sphinx/issues/>. Thanks!
make: *** [html] Error 1

あれー?

と思ったら、ここ(http://blockdiag.com/ja/blockdiag/introduction.html)にこう書いてあった。
~MacOSX (homebrew) の環境でインストールされる PIL パッケージは freetype2 に対応していないためそのままでは blockdiag を利用することはできません。また、freetype2 用の Foluma (パッケージ)は提供されていないため、 以下の内容で /usr/local/Library/Formula/freetype2.rb ファイルを作成します。
ということで手順どおりにやってPILをインストールしなおし!

$brew install freetype2
...

$pip install PIL -I

...

--------------------------------------------------------------------
    PIL 1.1.7 SETUP SUMMARY
    --------------------------------------------------------------------
    version       1.1.7
    platform      darwin 2.6.7 (r267:88850, Jan 17 2012, 20:23:21)
                  [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
    --------------------------------------------------------------------
    --- TKINTER support available
    --- JPEG support available
    --- ZLIB (PNG/ZIP) support available
    --- FREETYPE2 support available        <== これでOk
    *** LITTLECMS support not available
    --------------------------------------------------------------------

よっしゃ!

再びmake

make html

f:id:contaconta:20120620183257p:plain

うごいたー!
ライブラリのドキュメントでよく見るスタイルになっとる

これで快適ドキュメント生活ができるかもしれない( ・∀・)