ページ内のリンクが何回クリックされたかをカウントする

外部リンク集なんかを掲載しているページでどのリンクが何回クリックされたかを確認する方法。

Google Analyticsのイベントトラッキングで同じようなことができるはずだけど、
どうもうまく計測できなかったので自作してみた。

クリック数をカウントしたいリンクに特定のCSSクラス(.click-countみたいな)とラベル名をつけておき、リンクがクリックされた時にAjaxでサーバにその情報を送ってデータベースに保存する。
jQueryを使用。サーバ側はCakePHPを使用。


sample.html

<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript" src="/js/click_counter.js"></script>
</head>
<body>
...
<a href="http://piro-suke.hatenablog.com/" class="click-count" data-linkname="ブログ">Pyro Memo</a>
<a href="https://twitter.com/pirosuke" class="click-count" data-linkname="Twitter">Twitter</a>
...
</body>
</html>

click_counter.js

$(document).ready(function () {
    (function($) {
        var ClickTrackService = {
            track: function (name, url, options) {
                var callerUrl = location.href;
                $.ajax({
                    "type": "POST",
                    "dataType": "json",
                    "url": "/click_tracks/track/",
                    "data": {
                        "name": name,
                        "url": url,
                        "caller_url": callerUrl
                    },
                    "success": options.success || function (data) {},
                    "error": options.error || function (xml, status, e) {}
                });
            }
        };

        $("a.click-count").live("click", function (e) {
            var linkName = $(this).attr("data-linkname");
            var url = $(this).attr("href");
            if (linkName != null && linkName != "") {
                ClickTrackService.track(linkName, url);
            }
        });
    })(jQuery);
});

保存用のテーブル(MySQL)

CREATE TABLE IF NOT EXISTS click_tracks(
    id integer not null auto_increment,
    name varchar(100),
    url text,
    caller_url varchar(255),
    ip varchar(20),
    created datetime,
    PRIMARY KEY (id)
) ENGINE=InnoDB;

click_tracks_controller.php

<?php
class ClickTracksController extends AppController {
    public $name = "ClickTracks";
    public $uses = array(
        'ClickTrack',
    );

    public function track() {
        $url = null;
        $name = null;
        $caller_url = null;
        if (array_key_exists("form", $this->params)) {
            if (array_key_exists("url", $this->params["form"])) {
                $url = $this->params["form"]["url"];
            }
            if (array_key_exists("name", $this->params["form"])) {
                $name = $this->params["form"]["name"];
            }
            if (array_key_exists("caller_url", $this->params["form"])) {
                $caller_url = $this->params["form"]["caller_url"];
            }
        }

        $ip = $_SERVER["REMOTE_ADDR"];

        $this->ClickTrack->create();
        $track = array(
            "url" => $url,
            "name" => $name,
            "caller_url" => $caller_url,
            "ip" => $ip
        );
        $this->ClickTrack->save($track);

        //JSONレスポンス処理
    }
}

Riv.vimプラグインでバックスペースの挙動を調整

Riv.vimの標準の挙動だと、行頭でバックスペースを押すとdeleteと同じ挙動になる。
どうやら、RivSuperBackSpaceコマンドがそういう動きにさせているようだ。
行頭でも通常のバックスペースとして動くようにならないか調査した。


以下のファイルの412行目付近でRivSuperBackSpaceのキー設定をから空に
変更したら挙動を変更できるみたい。

riv.vim/autoload/riv/cmd.vim

変更前

\'type': 'ins', 'mode': 'i', 'maps': ['mq'], 'keys':['<BS>'],

変更後

\'type': 'ins', 'mode': 'i', 'maps': ['mq'], 'keys':[],

CentOS環境でrst2pdfを使って日本語PDFを出力する

riv.vimのpdf出力機能がどうしてもうまく動かせないので、
pythonのrst2pdfで直接出力することにした。

easy_installでrst2pdfをインストールし、以下の設定ファイルで日本語に対応する。
ほぼ参考サイトのまま。

~/rst2pdf/config

[general]

# カンマ区切りのカスタムスタイルシートのリスト。
stylesheets="~/.rst2pdf/ja.json"

# 圧縮されたPDFを生成
# 使用する true/false (全て小文字) もしくは 1/0
compressed=false

# コロン区切りのフォントサーチパスのリスト
font_path="/usr/share/fonts"

# 言語のハイフネーションサポート
language="ja_JP"

# デフォルトのページヘッダとページフッタ
header=""
footer=""

# リテラルブロックが大きすぎる場合の処理
# shrink/truncate/overflow
fit_mode="shrink"

# 改ページ処理のヘッディング最大レベルを指定します。
# 0は改ページ処理のレベルを設定しないことを意味します。
break_level=0


~/rst2pdf/ja.json

{
    "embeddedFonts" :
        [["vlgothic/VL-Gothic-Regular.ttf","vlgothic/VL-PGothic-Regular.ttf","ipa-mincho/ipam.ttf","vlgothic/VL-Gothic-Regular.ttf"]],
    "fontsAlias" : {
        "stdFont": "VL-PGothic-Regular",
        "stdBold": "VL-PGothic-Regular",
        "stdItalic": "VL-PGothic-Regular",
        "stdMono": "VL-Gothic-Regular"
    },
    "styles" : [
        ["base" , {
        "wordWrap": "CJK"
    }],
    ["literal" , {
        "wordWrap": "None"
    }]
    ]
}
参考サイト

rst2pdf拡張を使ったPDFファイル作成
http://sphinx-users.jp/cookbook/pdf/rst2pdf.html

rst2pdfの日本語周り設定
http://d.hatena.ne.jp/aroma_black/20100630/1277867889

rst2pdfをWindowsで使ってみた
http://d.hatena.ne.jp/nullpobug/20090424/1240510391

rst2pdf で reStructuredText から PDF を生成する
http://sakito.jp/python/rst2pdf.html

Riv.vimプラグインで全角文字を含むリンクも自動リンクされるようにする

VimでreStructuredTextを使えるように、riv.vimを導入した。
https://github.com/Rykka/riv.vim

:RivTitle0

みたいなコマンドでタイトルフォーマットを適用したりできて便利。


ファイルのパスやURLを書くと自動リンクされるので、
ファイル同士の関連付けに使っているのだけど、標準だと全角文字を
含むファイルパスはリンクされない。

日本語ファイル名間でリンクしたかったので、
ソースを変更して対応できないか調べてみた。

ソースを見たところ、riv/ptn.vimの369行目あたりにリンク用の
正規表現が定義されているので、ここを変更したら全角対応できそう。

let file_name = '[[:alnum:]~./][[:alnum:]~:./\\_-]*[[:alnum:]/\\]'

これを

let file_name = '[[:alnum:]~./]\S*[[:alnum:]/\\]'

こう変更したらいけるみたい。

WindowsでIPアドレス情報を定期出力

自宅からVPN経由で会社PCにアクセスする際、会社PCのIPアドレス
いつの間にか変わっていて困ったときがあったので、IPアドレスが変わっても
把握できる仕組みを考えてみた。環境はWindows7


Dropboxを使っているのでipconfigをDropboxフォルダに出力するバッチファイルを
作成して、それをWindowsのタスクスケジューラに登録しておくことにした。

バッチプログラムは以下の1行。

ipconfig > <出力先パス>

iplog.batみたいな名前をつけて適当な場所に保存する。


次にタスクスケジューラでこのバッチプログラムを呼び出すように設定する。
タスクスケジューラの設定は以下のページを参考にした。

http://www.atmarkit.co.jp/ait/articles/1305/31/news049.html


今のところうまく動いてる。

バッチプログラムとタスクスケジューラの組み合わせで色々自動化を試してみたい。

指定したフォルダ内のファイルのファイル名から特定のパターンの文字列を一括削除する

フォルダを指定してその中のファイルのファイル名の一部を削除するちょっとしたスクリプト。子フォルダの再帰処理はしない。
001_(hoge).txt、002_(fuga).txtなどのファイルを001_hoge.txt、002_fuga.txtに一括変換したい時なんかに使えるよう、正規表現でパターンを指定できるようにした。

使い方

python exclude_file_name.py フォルダパス 置換パターン
python exclude_file_name.py target_folder [¥(¥)]


exclude_file_name.py

!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import os.path
import re

root = sys.argv[1]
ex_pattern = sys.argv[2]
    
def main():
    files = os.listdir(root)
        
    for file_name in files:
        new_file_name = re.sub(ex_pattern, "", file_name)
        src = os.path.join(root, file_name)
        dest = os.path.join(root, new_file_name)
        print src + " => " + dest
        os.rename(src, dest)

if __name__ == "__main__":
    main()

Pocketからエクスポートしたブックマークをデータベースに取込むスクリプト

自分のブックマークを色々分析できるように、PocketのOptionsページから
エクスポートしたブックマークのリストをデータベースに取込む。

PythonでMySQLdbとBeautifulSoup4を使用。

テーブル

CREATE TABLE bookmarks (
    id integer NOT NULL AUTO_INCREMENT,
    title varchar(255),
    url text,
    created datetime,
    PRIMARY KEY (id)
);

スクリプト(pocket_export2db.py)

!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys 
import MySQLdb
from datetime import *
from bs4 import BeautifulSoup

DB_INFO = { 
    "host": "DBホスト名",
    "db": "DB名",
    "user": "DBユーザー名",
    "passwd": "DBパスワード",
    "charset": "DB文字コード"
}

def main():
    argvs = sys.argv
    if len(argvs) != 2:
        print "Usage: python %s export_file_path" % argvs[0]
        quit()

    file_path = argvs[1]
    soup = BeautifulSoup(open(file_path), from_encoding="utf-8")

    connect = MySQLdb.connect(**DB_INFO)
    connect.cursorclass = MySQLdb.cursors.DictCursor
    cursor = connect.cursor()

    for link in soup.find_all("a"):
        href = link.get("href")
        time_added = link.get("time_added")
        tags = link.get("tags")
        title = link.get_text()
        print title

        created = datetime.fromtimestamp(int(time_added))

        res = cursor.execute("INSERT INTO bookmarks(title, url, created) VALUES(%s, %s, %s)", (title, href, created))

    connect.commit()
    cursor.close()
    connect.close()

if __name__ == '__main__':
    main()

使い方

python pocket_export2db.py エクスポートしたファイルのパス