September 14, 2015

webビーコンを作った

google analyticsでアクセスログを取ってるのだけれど、セッション毎のデータを利用するのは有料だったので、自分で作ってみた。 な感じのプログラムに対して、 <script type="text/javascript">document.write("<img src='http://beacon.gepuro.net/?site=blog.gepuro.net");document.write("&referrer="+encodeURIComponent(document.referrer)+"'>");</script> な感じにタグを埋め込んで使う。 このサイトでデータを集めて、何かに使うつもり。

September 5, 2015

実行速度のボトルネックをplopで見つける

2016/10/6の追記 python3 setup.py install でインストールするだけで良く、下にあるソースコードの変更は不必要になった。 以降は2016/9/5に書いた記事 Plop: Low-overhead profiling for Pythonにあるようにdropboxの中の人が開発したplopというツールがある。 これを使えば、プログラムの累積実行時間をメソッド単位で計測でき、コールグラフも作成出来る。pythonが遅いと感じた時に、簡単にボトルネックになっている箇所を発見出来るので便利! しかしながら、https://github.com/bdarnell/plopにあるコードはpython2系でしか動かないので、3系でも動くように修正した。 面倒だったので、計測用のコードしか修正してないです。可視化は2系のまま。 使い方 計測 python3 -m plop.collector myscript.py 可視化 python -m plop.viewer --datadir=/tmp コード collector.py from __future__ import with_statement import collections import signal import sys import _thread as thread from plop import platform import time class Collector(object): MODES = { 'prof': (platform.ITIMER_PROF, signal.SIGPROF), 'virtual': (platform.ITIMER_VIRTUAL, signal.SIGVTALRM), 'real': (platform.ITIMER_REAL, signal.SIGALRM), } def __init__(self, interval=0.01, mode='virtual'): self. Read more

October 16, 2013

コードのハイライティングを出来るようにした

Pygmentsを pip install Pygments でインストールして、 markdown.markdown(html, ['fenced_code', 'codehilite']) とすれば良い。 あとは、 https://github.com/richleland/pygments-css からお気に入りのハイライティングを選んできて、適切な箇所に置く。 以下がサンプル print "Hello World" print "Hello World" #!/usr/bin/python # -*- coding:utf-8 -*- print "Hello World" 参考: http://pythonhosted.org/Markdown/extensions/code_hilite.html https://github.com/richleland/pygments-css 追記 markdownは2.1.1、Pygmentsは1.6で動作確認をしている。バージョンが異なると挙動が変わる模様。

October 14, 2013

似てない記事の推薦エンジンのバグを直した

先日より、各記事の下部に似てない記事を表示させていたが、記事によって表示されないものがあった。原因が分かったので、修正を行いました。 cos類似度を計算する時に、各記事の組み合わせを作成する箇所でバグがありました。 本来は、 itertools.permutations とするところを、 itertools.combinations としていました。 現段階では、A,Bの類似度とB,Aの類似度を二度計算しているので、記事の数が増えてくると修正を加える必要が出てきそうです。 参考: 10.1. itertools — 効率的なループ実行のためのイテレータ生成関数

August 29, 2013

ネストされたリストを平坦にする

Python で flatten - ネストしたリストをフラットにするを参考にして、タプルが含まれていても、実行出来るようにした。 def flatten(L): if isinstance(L, (list, tuple)): if L == [] or L == (): return [] else: return flatten(L[0]) + flatten(L[1:]) else: return [L] isinstanceの箇所を変更しただけです。

August 29, 2013

PythonからPostgreSQLにアクセスする

psycopg2を使うと便利なようです。 以下は、最低限必要になりそうなサンプル。 import psycopg2 con = psycopg2.connect( database = "database" , user = "username" , password = "password" , host = "host" , port = 5432 ) cur = con.cursor() cur.execute("select * from tablename") cur.fetchall()

March 1, 2013

Flaskでhttpsを使う

認証を使うようなサービスは、SSLを用いてセキュアな通信をしたい。 Flask自身が持ってるwebサーバでは、SSLが使えないので、 apacheやwsgiの力を借りる必要がある。 まず、オレオレ証明書を作る。 $ openssl genrsa -aes128 1024 server.key $ openssl req -new -key server.key server.csr $ openssl x509 -in server.csr -days 365 -req -signkey server.key server.crt とこんな感じで作れる。 作成したものは、それぞれ server.key :秘密鍵 server.csr :公開鍵 server.crt :デジタル証明書 である。 apacheの設定は、SSLの方は、 LoadModule ssl_module modules/mod_ssl.so \#Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000) SSLSessionCacheTimeout 300 SSLMutex default SSLRandomSeed startup file:/dev/urandom 256 SSLRandomSeed connect builtin SSLCryptoDevice builtin <VirtualHost *:443 ServerName example. Read more

February 28, 2013

scikit-learnのインストールをした

Debian系のOSを使っている人は、 $ sudo apt-get install python-sklearn でインストール出来る。 最近、scikit-learnが流行って来ているようなので、少しずつ使っていきたいな。 まずは、インストールの確認ということで、 $ ipython Python 2.7.3 (default, Sep 26 2012, 21:51:14) Type "copyright", "credits" or "license" for more information. IPython 0.13.1.rc2 -- An enhanced Interactive Python. ? - Introduction and overview of IPython's features. %quickref - Quick reference. help - Python's own help system. object? - Details about 'object', use 'object??' for extra details. In [1]: import sklearn In [2]: sklearn. Read more

February 26, 2013

Djangoを始める

画像ベースのサイトを作ってみたいかもしれない に向けて、Django&PostgreSQLでサイトを構築して行きたいと思う。 まずは、Djangoの利用の準備を始める。 データベースには、PostgreSQLの利用を想定する。 LinuxMintでのインストール方法 $ sudo apt-get install python-django PostgreSQLのインストール $ sudo apt-get install postgresql $ sudo apt-get install postgresql-client PostgreSQLのPython用のモジュール $ sudo apt-get install python-psycopg2 プロジェクトを開始する $ django-admin startproject gepupic でプロジェクトを開始できる。 すると、gepupicというフォルダが作成され、 gepupic/ manage.py gepupic/ \_\_init\_\_.py settings.py urls.py qsgi.py という構成でファイルが作成される。 開発用サーバーを起動する時は、 $ python manage.py runserver Validating models... 0 errors found Django version 1.4.1, using settings 'gepupic. Read more

February 16, 2013

設定ファイルを書く時はConfigParser

何かプログラムを書いているときに、設定ファイルをどうするか悩むときがある。プログラムの初めの方に定数として宣言しておいて、そこを編集させるか、別のファイルに書かせるかの二通りが考えられそう。 設定項目が短い場合は、JSONで記述するのも便利そうだが、長くなってくると見難くなりそうと感じる。 今回紹介するライブラリは、ConfigParserです。Pythonで利用出来ます。 import ConfigParser CONFIG_FILE = 'settings.ini' conf = ConfigParser.SafeConfigParser() conf.read(CONFIG_FILE) USERNAME = conf.get('credential', 'username') PASSWORD = conf.get('credential', 'password') host = conf.get('options','host') port = conf.get('options','port') Pythonコードは、上のように書くだけで良いです。 設定ファイル``settings.ini”は、 [credential] username=ユーザー名 password=パスワード [options] host=127.0.0.1 port=5000 とこんな感じです。 割と簡単に書けるので、今後も使っていきたいですね。

February 12, 2013

cPickleでPythonオブジェクトを保存する

Pythonでは、cPickle(またはpickle)、shelveというように変数を永続化することが出来るモジュールがあります。 用途としては、データベースを使用するほどの規模ではないが、データを保存しておきたい時に便利です。 shelveを使えば、辞書型を保存しておくことができます。 今回、紹介するcPickleは、Pythonオブジェクトをシリアライズして保存することができます。例えば、辞書型、配列型、文字列といった様々なデータを保存しておくことが出来ます。 cPickleとPickleの大きな違いは、実行速度です。cPickleの方が最大で1000倍早いそう。(自身では未確認) このgepulogでは、cPickleを利用しています。使っている場所は、サイドバーにあるカテゴリと最近の更新の部分です。こちらのデータは、変化が少なく、同じデータを何度も表示するので、データベースへ毎回アクセスするよりも早くなるはず。(サイトのレスポンスを表示してくれるサイトでは早くなっているように見える) 編集者用の画面をもう少し直したいなあ。

January 21, 2013

Python-Markdownが便利!

gepulogで、記事を書く際に利用しているライブラリの一つであるPython-Markdownの紹介です。 Markdownというのは、文書を書くときに記述するマークアップ言語で、プレーンテキストをhtmlに変換してくれる優れものです。Pythonでの利用方法は、簡単で、 \#!/usr/bin/python \# -*- coding:utf-8 -*- import markdown text = u"プレーンテキスト" print markdown.markdown(text) で、利用できます。すると出力は、 ``プレーンテキスト `` のように出力されます。 書き方は、http://daringfireball.net/やhttp://ja.wikipedia.org/wiki/Markdownを参考にすると良さそうです。自分自身、まだ使い始めて間も無いので、調べながらでないと書けないけれども、慣れると便利になりそうですね。

© gepuro 2013