Markdown Wiki (3) Memcache

  1. ユーザーサービス
  2. データストア
  3. Memcache

Memcache

今回勉強がてらにやってみたことの最後は Memcache。

デモサイトでは、常に右側のメニューにページ一覧が出ているので、そのリストを取得する時に cache を利用。以下、コードの抜粋。

from django.utils import simplejson
from google.appengine.ext import db
from google.appengine.api import memcache
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class PageList(webapp.RequestHandler):
    def get(self):
        permission = Permission()
        data       = []

        if permission.get():
            pagelist = memcache.get("pagelist")

            if pagelist is not None:
                data = pagelist
            else:
                query = WikiPage.all()
                query.order("title")

                for record in query:
                    data.append({"keyname":record.key().name(), "title": record.title })

                memcache.add("pagelist", data, 3600)

        self.response.headers[''Content-Type''] = ''text/plain''
        self.response.out.write(simplejson.dumps(data))

呼び出す側の JavaScript は、単に GET してるだけ。

var Connect = YAHOO.util.Connect;

var oCallback = {
    success: _create
};
Connect.asyncRequest("GET", "/wiki/list", oCallback);

デモページは Gmail のアカウントがあれば誰でも使えるが、データは 1 日に 1 回リセットされる。

Advertisements
Markdown Wiki (3) Memcache

Markdown Wiki (2) データストア

  1. ユーザーサービス
  2. データストア
  3. Memcache

データストア

Google App Engine の勉強のつづきで、データストアの使い方。GAE のドキュメントは、

などを参照した。

GQL という SQL のようなクエリ言語を使ってデータを扱えるけど、それとは別の Query インターフェースを使った。以下はデモサイトでページを表示、編集する部分のコード。

from django.utils import simplejson
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class Page(webapp.RequestHandler):
def __init__(self):
self.permission = Permission()
self.data = {}

def get(self, keyname):
if self.permission.get():
page = WikiPage.get_by_key_name(keyname)
self.data = {"keyname":keyname, "title": page.title, "content": page.content}

self.response.headers[''Content-Type''] = ''text/plain''
self.response.out.write(simplejson.dumps(self.data))

def post(self, keyname):
if self.permission.get():
page = WikiPage(key_name=keyname)
page.title = self.request.get("title")
page.content = self.request.get("content")
page.put()

self.data = {"keyname":keyname, "title": page.title, "content": page.content}

self.response.headers[''Content-Type''] = ''text/plain''
self.response.out.write(simplejson.dumps(self.data))

以下のような JavaScript から呼び出される (ページ更新時のリクエスト部分のみ。JavaScript ライブラリは YUI)。

var Connect = YAHOO.util.Connect,
Dom = YAHOO.util.Dom;

var _onClickUpdate = function(oEvent){
var sKeyName = Dom.get("keyname").value,
sTitle = Dom.get("title").value,
sPostData = "title=" + encodeURIComponent(sTitle)
+ "&content=" + encodeURIComponent( Dom.get("content").value ),
oCallback = {
success: _renderPage
};
Connect.asyncRequest("POST", _sRequestUrl + sKeyName, oCallback, sPostData);
Dom.get(sKeyName).innerHTML = sTitle;
};

その 3 へつづく。。

デモページは Gmail のアカウントがあれば誰でも使えるが、データは 1 日に 1 回リセットされる。

Markdown Wiki (2) データストア

Markdown Wiki (1) ユーザー認証

Google App Engine の勉強がてら、シンプルな wiki を作ってみた。といっても、主に GAE の

  1. ユーザーサービス
  2. データストア
  3. Memcache

の使い方を知るためのもので、ページのレンダリングは Showdown を使った。サーバ側のスクリプトは Python で、リクエストを受けた結果を JSON で返している。

GAE だけじゃなくて、Python の勉強もかねているので、変なところがあるかもしれない。。

ユーザーサービス

基本的な使い方は、GAE のドキュメント ユーザー サービスの使用にあるように、簡単だった。これだと Gmail のアカウントを持ってる人は誰でもアクセスできる事になるので、メールアドレスのリストを用意して、そこに登録されている人のアクセスを許可するようにした。該当部分を一部抜粋。

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class Permission:
    def __init__(self):
        self.accessible = ["example@gmail.com"]

    def get(self):
        user = users.get_current_user()

        if user:
            if len(self.accessible) < 1:
                return True

            for email in self.accessible:
                if user.email() == email:
                    return True

        return False

class Auth(webapp.RequestHandler):
    def get(self):
        url        = ''/wiki.html''
        permission = Permission()

        if permission.get():
            user = users.get_current_user()
            data = {"nickname": user.nickname(), "logoutUrl": users.create_logout_url(url)}

        else:
            data = {"loginUrl": users.create_login_url(url)}

        self.response.headers[''Content-Type''] = ''text/plain''
        self.response.out.write(simplejson.dumps(data))

JavaScript 側から以下のようにして呼び出している(JavaScript ライブラリは YUI を使用)。

YAHOO.namespace("mdwiki");

YAHOO.mdwiki.Auth = function(){
    var Connect = YAHOO.util.Connect,
        Dom     = YAHOO.util.Dom,
        Event   = YAHOO.util.Event,
        JSON    = YAHOO.lang.JSON;

    var _handleAuth = function(oResponse){
        var oAuthInfo = JSON.parse(oResponse.responseText);

        if (typeof oAuthInfo === "object") {
            var oProfile   = Dom.get("profile");

            if (oAuthInfo.nickname) {
                // the user has been authenticated
                oProfile.innerHTML = "<a href=''" + oAuthInfo.logoutUrl + "''>Logout</a>";
                YAHOO.mdwiki.Page.show();
                YAHOO.mdwiki.PageList.init();
            } else {
                // the user has not been authenticated
                oProfile.innerHTML = "<a href=''" + oAuthInfo.loginUrl + "''>Login</a>";
            }
        }
    };

    Event.onDOMReady(function(){
        var oCallback = {
            success: _handleAuth
        };
        Connect.asyncRequest("GET", "/wiki/auth", oCallback);
    });
}();

長くなりそうなので、その 2 へつづく。。

尚、デモページは Gmail のアカウントがあれば誰でも使えるが、データは 1 日に 1 回リセットされる。

Markdown Wiki (1) ユーザー認証

しかも「Web サイトの記憶領域設定パネル」の設定内容を変更しようにも、
設定が保存されない状況に陥ってしまってるのでどうしようもありません。
http://www.macromedia.com/support/documentation/jp/flashplayer/help/settings_manager07.html

調べてみたところ、以下の方法で解決しました♪

ホームフォルダ/ライブラリ/Preferencesの中にある、
「Macromedia」のフォルダをゴミ箱に捨てて空にして、
Safariを再起動するだけでOKという簡単なもの。

Flashの設定が保存されないときの解決法 – Kuma Station! – 楽天ブログ(Blog)

全く同じ問題でニコニコ動画とか Daily Motion とかが見れなくなってたので助かった。

(Summary in English)

When you get trouble of Flash player on Mac OSX (for example, you can not watch videos on Daily Motion, but you can watch YouTube video, in my case), you might want to remove ~/Library/Preferences/Macromedia and restart web browser. This will fix the problem that you can not save your configuration of Flash player.

Quote

GTD について思う事(まとまらず)

GTD のやり方とか良さについて書いてある Blog などを読んだり、実際に自分のタスク管理をする時に GTD の考え方をベースに行ってみたりして思ったことをまとめて書こうかと思ってたが、いつまでもまとめる気にならないのでまとめないままここに書き出しておく。

頭の中を空っぽに?

タスクとして書き出してしまう事で頭の中を空にし、タスク管理に頭を使うより、もっと、例えばクリエイティブな事に頭を使う、と言われてるのを見て、何か違和感があった。

GTD でも何でもタスクを頭の外に出すのは、忘れるられるから頭がスッキリするというよりは、目に見える形にすると曖昧さがなくなるので頭がスッキリするのではないかと思う。

この時、タスクの内容によって、買い物リストのような忘れてもいいものと、仕事のタスクのようなより頭に定着させたいものの2種類があると考える。そして重要なタスクは目に見える形にすることによって、より頭に残るのではないか。

だから、すべてを頭の中から追い出すのではなく、必要なものだけを記憶しやすくするための手段ではないかと思う。

大体、記憶量を減らしたからといって、その分、よりクリエイティブなことに頭を使うことができるかというと、それぞれ使っている神経がが違ってそうだし。何かを発想する時、ひらめく時は、多分過去の記憶したいくつかの事柄がヒントになったり組合わさったりして、新しいものが生まれることが多そうだから、本当にすべてを頭の中から追い出したら、何も思いつかなくなってしまいそうだ。

そう考えると、何でもかんでも Evernote に放り込むのはどうなんだろうとも思ってしまう。

タスクを書き出す方法

GTD を始める時、最初にすべてのタスクなんかを書き出す作業がある。これについては、ただひたすら時間をかけて書き出す、といった話を聞くだけで、特に手法についてのアイデアは見た事無い気がする。

で、自分の場合は、時間をかけるのが面倒なので、最初にすべて書き出そうとするのを諦めて、いわゆるユビキタスキャプチャーという、思いついた時にマメにメモる方法で対処していた。

だが、最近になって、ふと思いついた事がある。記憶の宮殿。

記憶の宮殿というのは、何かを覚える時に、頭の中に宮殿というか、家とかをイメージして、その中の部屋やものなどにむすびつけて覚えると後から思い出しやすい、という話だったと思う。

で、思い出しやすいのであれば、タスクを書き出す時に、実際に自分が行く場所を順番に思い出していけば、漏れを少なくできるんじゃないかと思った。

例えば、家、会社、学校、町、店。会社ならさらに、部署、フロア、部屋、チーム、人、机や PC などのもの、を順番に頭に浮かべ、それに関連するタスクなり何なりを、マインドマップなんかを使って書き出そうとすれば、漠然とすべてを書き出すよりも効率よく漏れなく、頭の中をスッキリさせられるのではないだろうか。

すべてをオーガナイズ

GTD やライフハック系のブログとかを見ると、仕事もプライベートもすべて GTD で管理して整理するみたいに見える。何となくそういう考えには馴染めなくて、自分の場合は、仕事だけを GTD の考え方をベースに整理、管理するようにしてる。

プライベートについては、勘や気分で行動するようにしてる。ただ、あー何かやらなきゃいけない事とかやりたい事がいっぱいあるなーって感じたときだけ、その辺にある紙にざっとマインドマップ何かで書き出すようにしてる。

で、書き出したやつは、あー何か暇ができたなーって時にチラッとみて、これでもやるかーって感じで適当に選んで行動する。別にすべてが処理できなくても、一日にひとつとかふたつとかやれたら、それで良しとしてる。

すべてを整理してきっちりやる、みたいな毎日は何か息が詰まりそうだし。

結論も何も無いが、今思ってるのはそんなところ。

GTD について思う事(まとまらず)