gepuro.net
gepulog

データ分析エンジニアによる備忘録的ブログ

サーバの引越

当ブログのサーバを引っ越しました。運用開始時期にはdockerが流行っておらずLXCを直接弄っていましたが、時代の流れに乗ってdockerに変えました。

また、さくらVPSを利用しているのですが大阪リージョンから石狩リージョンに変更したのでpingが遅くなっています。

今後ともよろしくお願いします。

記事ページに「前の記事」「次の記事」を追加した

他のブログを見ていると、「前の記事へ」「次の記事へ」と記事の最後にあるのを見て、いいなあと思ったので、追加しました。これで、サイトの滞在時間が伸びるかな?

bootstrapを3系にした

前々から気になっていたので、デザインを変えました。 bootstrapサイトのサンプルに載っているブログ用のテンプレートにしてみました。しばらくは、これでいこうと思う。

padding-leftで表示域を右にずらす

見出し部分のスタイルを今までは、

<h4 style="border-left:solid 3px blue;">ほげ</h4>

ほげ

のようにしていたが、

<h4 style="border-left:solid 3px blue; padding-left: 8px;">ほげ</h4>

ほげ

にした方が読みやすいとのアドバイスを頂いたので、早速変更した。

デザインは、難しいなあ。

Atom フィード形式に対応しました

Generating Feeds with Flaskを参考にして、当ブログをAtomフィード形式に対応させました。こちらです。

似てる記事も表示させた

一ヶ月ぐらい前から、似てない記事を表示させていたのだけど、サイトの滞在時間が伸びていないので、似てる記事も表示させる事にしました。

アクセスログを見てみると、似てない記事リストを見て別の記事へ飛んだユーザが居たので、無意味という訳ではなさそうです。

サイトのデザインも満足していないので、改良したい。

Flaskの日本語特のバグ?

@app.route("/hoge/<fuga>", defaults={"page":1})
@app.route("/hoge/<fuga>/", defaults={"page":1})
@app.route("/hoge/<fuga>/<int:page>")

などのようにルーティングを指定した時に、

OK

  • /hoge/日本語
  • /hoge/日本語/
  • /hoge/日本語/2

NG

  • /hoge/日本語/1

となっている。 ルーティングの部分で問題になっているような気がするのだが、もしかしたら他の部分かもしれない。調査が終了したら、報告したいな。

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

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"

参考:

追記

markdownは2.1.1、Pygmentsは1.6で動作確認をしている。バージョンが異なると挙動が変わる模様。

タイトルの表示方法を変更した

タイトル表示にカテゴリも表示するようにした。今までは、タイトルにカテゴリが表示されていなかったので、twitterなどの共有する時に不便だった。これで改善できたはず。

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

先日より、各記事の下部に似てない記事を表示させていたが、記事によって表示されないものがあった。原因が分かったので、修正を行いました。

cos類似度を計算する時に、各記事の組み合わせを作成する箇所でバグがありました。 本来は、

itertools.permutations
とするところを、
itertools.combinations
としていました。

現段階では、A,Bの類似度とB,Aの類似度を二度計算しているので、記事の数が増えてくると修正を加える必要が出てきそうです。

参考:

memcachedを導入した

http://flask.pocoo.org/docs/patterns/caching/を参考にして、memcachedをgepulogに導入しました。

from werkzeug.contrib.cache import MemcachedCache
cache = MemcachedCache(['127.0.0.1:11211'])

としておいて、

cache.get("key")
cache.set("key", "value", timeout=5*60)
cache.delete("key")
などのようにして使うことが出来る。

サーバのメモリはまだ余裕があるので、有効活用できるかな?

テンプレートを少し変更した

左下のadsenseが記事に被ることがあったので、テンプレートを少しだけ変更した。

これで、前よりは僅かながら見やすくなったはず。

なんだか左下が寂しくなりましたね。

このブログをもう少し使いやすくしたいな

修正を加えたいことを箇条書きでメモしておく

  • 記事の区切りを分かりやすく
  • 左下の広告が本文と重ならないようにする。(ブラウザのサイズによって重なってしまう事がある)
  • 下書き,非公開記事を作成出来るようにする。
  • memcachedを使って、高速化したい。
  • プログラムをシンタックスハイライト表示したい

gepulog systemのバグを直した

gepulog systemのバグを見つけた で分かっていたバグを直しました。

使っていくうちに、他のバグも出てきそう。

gepulog systemのバグを見つけた

カテゴリ表示が複数ページに渡る時に、2ページ目以降に移動しようとすると、カテゴリ表示が解除されてしまって、全表示の時と同じ状況になってしまうようです。

早いうちに直さないと。

Djangoを始める

画像ベースのサイトを作ってみたいかもしれない に向けて、DjangoPostgreSQLでサイトを構築して行きたいと思う。

まずは、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.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

というように起動する。 ここで、http://127.0.0.1:8000にアクセスすると、 デモ画面が表示される。

次に、settings.pyの編集を行う DATABASESの所を

'ENGINE': 'django.db.backends.postgresql_psycopg2'
として、あとは、NAME,USER,PASSWORD,HOST,PORTと設定を行う。 また、LANGUAGE_CODE='ja'とした。 ここで、PostgreSQLにてユーザとデータベースを作成しておく。
$ createuser -a -d -U postgres -P ユーザー名
でユーザを追加出来る。 また、
$ psql
> CREATE DATABASE gepupic;
などと、データベースを作成する。これらの操作を行う時に、su postgresしておく必要があるかもしれない。

データベースの作成が終わったら、

$ python manage.py syncdb
と実行すると、データベースの設定が行われる。

モデルの作成は、

$ python manage.py startapp apps
とする。すると、
apps/
    __init__.py
    models.py
    tests.py
    views.py
が作成される。

今日は、このあたりで。 徐々に開発していきます。

参考:はじめての Django アプリ作成、その 1

gepulog systemのソースコードを公開しました

githubにて、このブログシステムを公開しました。

https://github.com/gepuro/gepulog-system

ひとまず、作成したい機能が出来たので、開発を一休みするかもしれない。 新たに必要な機能が出てきたら、コードを書いていくかと。

設定ファイルを書く時は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

とこんな感じです。

割と簡単に書けるので、今後も使っていきたいですね。

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

Pythonでは、cPickle(またはpickle)、shelveというように変数を永続化することが出来るモジュールがあります。

用途としては、データベースを使用するほどの規模ではないが、データを保存しておきたい時に便利です。

shelveを使えば、辞書型を保存しておくことができます。 今回、紹介するcPickleは、Pythonオブジェクトをシリアライズして保存することができます。例えば、辞書型、配列型、文字列といった様々なデータを保存しておくことが出来ます。

cPickleとPickleの大きな違いは、実行速度です。cPickleの方が最大で1000倍早いそう。(自身では未確認)

このgepulogでは、cPickleを利用しています。使っている場所は、サイドバーにあるカテゴリと最近の更新の部分です。こちらのデータは、変化が少なく、同じデータを何度も表示するので、データベースへ毎回アクセスするよりも早くなるはず。(サイトのレスポンスを表示してくれるサイトでは早くなっているように見える)

編集者用の画面をもう少し直したいなあ。

google カスタム検索の導入

サイドメニューの下側にgoogle カスタム検索を追加しました。 本ブログ内での検索に対応しています。

気が向いたら、自分で実装するかもしれない。