世界的日曜WEBプログラマー日記 -13ページ目

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)

Djangoで既にあるデータベースのテーブルからmodels.pyを吐き出す吐き出す方法



こんな簡単なことなのに日本語で調べたらえらい時間がかかった。
次をするとアウトプットされる。
python manage.py inspectdb

google検索で、「how to generate models.py from database django」で英語だと一発で出てきた。なんだかなー。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
Pythonで抽象基底クラス、Interface(Abstract class)を作る


どーも。弁当職人の等々力です。
お弁当、サンドイッチのマイ食では高度な技術を使っており… と最近言いたい方第いっております。実際は…秘密です。

さて、話を本題へ。
Pythonで抽象クラスを使うにはどうすればいいのか?という質問をうけました。
今、ABCライブラリという便利なモジュールがあります。Python3では標準のモジュールです。
なぜABCか。abc — Abstract Base Classesの略だそうですね。
名前の通り抽象化(インターフェイス用)の関数です。こっちをドンドン使って行きましょう。

実は今までabcモジュールがなかった時はraiseなどで頑張ってました。今回は古い形も(raise方式)載せておきます。ソースコードの上が古い方法、下がABCモジュールを使った新しい方法です。

なんかマニュアルをみるとごちゃごちゃとわけわからぬこと書いていますが、実はシンプルです。(下のソースコードは海外のソースをそのまま取ってきました。わかりやすかったので)

古いバージョン(python2.4)

# -*- coding:utf-8 -*- 
# old style
class BaseClass:
def do_something(self):
assert False, "Not implemented"

class DerivedClass(BaseClass):
def do_mystuff(self):
print "Do my stuff!"
def do_something(self):
print "Do something!"

if __name__ == "__main__":
c = DerivedClass()
c.do_something()
c.do_mystuff()

新しいバージョン(python2.6以降) 標準ライブラリABCモジュール利用

# New version 
from abc import ABCMeta, abstractmethod
class BaseClass:
__metaclass__ = ABCMeta
@abstractmethod
def do_something(self): pass

class DerivedClass(BaseClass):
def do_mystuff(self):
print "Do my stuff!"
def do_something(self):
print "Do something!"

if __name__ == "__main__":
c = DerivedClass()
c.do_something()
c.do_mystuff()


abcモジュールを使う場合、必ず定義させたい関数名の上に@abstractmethodをおきます。
お気軽です!

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
Firefoxのアップデート後、いきなりSeleniumが動かなくなった。Seleniumもアップデートする必要がある。
Seleniumをアップグレードする必要がある。(Pythonから扱う場合。)

$ pip install -U selenium

そしたら今度はpkg_resources.DistributionNotFound: pip==0.8.2のエラー。
PIPもアップグレードしよう。
$ sudo easy_install -U Distribute


以上。
宅配サイトのエラーチェックをSeleniumでしているんだけど、全部かたっぱしからエラー出て焦りましたw

ちなみにその時のエラーログは以下のような感じだった。
Traceback (most recent call last):
File "selenium_test.py", line 3, in
webdriver.Firefox()
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__
self.binary, timeout),
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 47, in __init__
self.binary.launch_browser(self.profile)
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 44, in launch_browser
self._wait_until_connectable()
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 81, in _wait_until_connectable
self._get_firefox_output())
selenium.common.exceptions.WebDriverException: Message: "The browser appears to have exited before we could connect. The output was: ERROR: ld.so: object 'x\
_ignore_nofocus.so' from LD_PRELOAD cannot be preloaded: ignored.\n*** LOG addons.xpi: startup\n*** LOG addons.xpi: checkForChanges\n*** LOG addons.xpi: No \
changes found\n*** LOG addons.manager: shutdown\n*** LOG addons.xpi: shutdown\n"


株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house