conta's diary

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

AndroidでBitmap画像を保存

よく忘れるのでメモ書き。
ギャラリーに"/MyPhoto/"フォルダができてその中に保存されます。
最後のContentResolverの部分で保存したファイルパスを登録しておかないと、
デバイスを再起動するまでギャラリーが更新されない罠が準備されてます。

public void saveBitmap(Bitmap saveImage) throws IOException {

    final String SAVE_DIR = "/MyPhoto/";
    File file = new File(Environment.getExternalStorageDirectory().getPath() + SAVE_DIR);
    try{
        if(!file.exists()){
            file.mkdir();
        }
    }catch(SecurityException e){
        e.printStackTrace();
        throw e;
    }

    Date mDate = new Date();
    SimpleDateFormat fileNameDate = new SimpleDateFormat("yyyyMMdd_HHmmss");
    String fileName = fileNameDate.format(mDate) + ".jpg";
    String AttachName = file.getAbsolutePath() + "/" + fileName;

    try {
        FileOutputStream out = new FileOutputStream(AttachName);
        saveImage.compress(CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
    } catch(IOException e) {
        e.printStackTrace();
        throw e;
    }
    
        // save index
    ContentValues values = new ContentValues();
    ContentResolver contentResolver = getContentResolver();
    values.put(Images.Media.MIME_TYPE, "image/jpeg");
    values.put(Images.Media.TITLE, fileName); 
    values.put("_data", AttachName);
    contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}

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)