みろりHP


緑色さんの多目的ブログ
みろりえいちぴー(旧)
引っ越し先 みろりHP: https://www.mrrhp.com
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:プログラミング |
Brett Slatkin『Effective Python』その3 クラスと継承



前回に続いて、クラスの章で楽しめたところをノートしていく。



記録管理に辞書じゃなくてヘルパークラスを使う
もちろん簡単なやつなら辞書でいい。クラスを使うタイミングとしては「辞書が入れ子になっちゃった」、「タプルが3以上の要素数をもっちゃった」など。
これは自作ゲーム『一石二鳥』のとき何を参考にするでもなく自然にできてたからよさげ。

フック
list.sort(key=lambda...)

みたいに関数を渡して振る舞いをカスタマイズする仕組みをフックというそうだ。
そもそもsortに関数を渡せることを知らんかった……。

__call__を定義するとオブジェクトが関数みたいに呼び出せる
すげー! じゃあstrクラスを改造すれば
'ただの文字列'()

なんてことができるってことかよw
と思ってすこしいじってみたんだが、どうやら文字列などの組み込み型は改造ができんようになってるようで……。このイタズラは完遂できなかった。

クラスメソッドをコンストラクタとして使う
@classmethod
def foo(cls):
    return cls()
こういう……ことだとは思うんだけどこれだけじゃ意味不明だよな。

子クラスで親クラスの__init__を呼ぶとき
super().__init__()

とする。親クラスのメソッドは子クラスでも息づくんだから、こんなの必要ないじゃんと思ったが。そっか、子クラスにinitを書いてしまったら親クラスのinitは実行されなくなっちゃうのか。

private属性の使い方
self.__foo

こういう命名の変数はprivate属性になってクラス内でしかアクセスできなくなる。子クラスからもダメ。ただし
_Klass__foo

っていう呼び出し方でコールすることが可能。
private変数は、コントロール外のサブクラスによる名前衝突を避けるために使いましょう。



クラスは理解したからこの章はまあオッケーだった。が、次章がどうもするりと入ってこねえ……。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:ゲーム |
ダークソウル2 忘れられた罪人まで




<忘れられた罪人>では謎のムービーが入ったり、重要そうな篝火に火が灯ったりと……ちょっと話が動いたという感覚があった。俺は何が起こっとるのかまったく把握してないけどな。<忘れられた罪人>については、最初部屋に飛び込んだときには過去最強のボスじゃねえかと冷や汗をかいたものだ。けどコイツが強いのは部屋が暗いからであって、部屋に灯りを灯せば最初のボスたちと特に変わらず……3回目で抜けられた。
死にまくったのはむしろそこに至るまでの<虚ろの衛兵>とか<鐘守のガーゴイル>みたいな、複数で襲い掛かってくる連中。視界に連中全員を収めるように位置取るのが多分コツ。火力的に倒しきれないかとも思えたが、隠れ港でようやくソウルの矢以外の魔術が開放されたので何とか抜けられたぜ。




ステータスはこんな感じに伸ばしてる。
  • 記憶力と理力はいいとして信仰は『帰路』の奇跡のため上げた。プレイが相当気楽になったぜ。ボス戦からも離脱できるってのが大発見だった。
  • 装備はいまだに防御力スカスカのスゲー軽いやつ。それでもボスの攻撃は1発まで耐えてる。魔術師に優しい攻撃力設定で俺は嬉しい。
  • 前回「がんばってキャラメイクしたぶん、気をつけて死なないようにしようって気になる」とか抜かしておきながら亡者状態なんだけど、それは……いや、猛烈な頻度で死ぬので生者キープなんてムリ!


| 緑色 | ゲーム | comments(0) |
| カテゴリ:プログラミング |
Brett Slatkin『Effective Python』その2 関数



前回に続いて、関数のパートで楽しめたとこをノートしていく。



関数返り値にNoneを設定するのはヤメて、例外を飛ばせ。
try:
    return a/b
except ZeroDivisionError as e:
    raise ValueError('えらぁだよ') from e
てかこうやってエラーの種類を変えられるの知らなかったわ。

Pythonはクロージャをサポートしてる。
クロージャってのは、定義されたスコープの変数を参照する関数のこと。ああ、関数の中から外の変数を使えるもんね。アレのことか。

タプルの比較規則。
(0, b) (1, a)
の場合、まず[0]の0と1、そのつぎに[1]のbとaの比較になる。

nonlocal宣言でローカル変数の参照渡しみたいなことができる。
def foo():
    a = 'fooのa'

    def bar():
        nonlocal a
        a += 'なぁんつって'

    bar()
    print(a)  # fooのaなぁんつって

foo()
こういうことか。aがグローバル変数だった場合 nonlocal じゃなくて global になるところが注意。

リストを作成して返す関数は、もしかしたらジェネレータ関数にできるんじゃない?
やり方は
lis.append(x)
していたところを
yield x
にするだけ。
これはかなりいいのでは? プログラミング問題とかでよくでかいリストを返す関数を作ってたけど、あれは全部エコなジェネレータにできるってことか。

可変長位置引数で見た目をすっきりさせよう。
def foo(message, *args):

こういうやつね!
foo('メッセージ', 1, 2, 3, 4)

って呼び出せば、1以降がリストになって args に代入される。……ん? いや別に、最初からリストで渡せばよくね?
ちなみにすでにリストになってるなら
foo('メッセージ', *list)

って渡せる。いや、最初からリストでよくね???
可変長位置引数を使うとき注意しないといけないことがあって、たとえば上の foo を
foo(message, message2, *args)

に定義変更しても呼出でエラーは起こらない。これは発見困難バグを生むのでやばい。さらに、これにジェネレータを渡すと勝手にタプルにするからメモリ爆発することがある。いやメンドくせーよ! 最初からリストで渡せばいいだろ!

キーワード引数、デフォルト引数は良い。
def foo(message, option1=1, option2=2):
見るからに使い勝手いい。

デフォルト引数には罠がある。
def foo(message, when=datetime.now()):
こうするとwhenのデフォルト値は定義時の時間で固定されちゃう。fooを呼び出すたびにその時間を取得してほしいなら、デフォルト引数Noneを使う。
def foo(message, when=None):
    when = datetime.now() if when is None else when

こんな罠もあるよ♪
def foo(x, dic={}):
    dic[x] = 1
    return dic

print(foo('a'))  # {a:1}
print(foo('b'))  # {a:1, b:1}  クソワロタww
定義時にひとつのディクショナリが定義されちゃってて、以降デフォルト引数にはそのディクショナリオブジェクトが使われ続けるので、こーゆーことになる。これも上と同じで None を使う。

キーワード専用引数。
これはすげぃ。
def foo(a, b, *, option1=False, option2=False):
こうすると、option1以降の引数はキーワードでしか指定できなくなる。完全にオプション専用の引数ができるってことじゃん。
Python2ではこの構文がないのだけど、同じ動作を作ることはできる。
def foo(a, b, **kwargs):
    option1 = kwargs.pop('option1', False)
    option2 = kwargs.pop('option2', False)
    if kwargs:
        raise TypeError('Unexpected **kwargs')




今回のフェイバリットは最後のキーワード専用引数かな。すげえ便利そう。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:みろりHP |
アニバーサリ絵



親愛なるルームメイトの誕生日のため、絵を一枚こしらえた。



「おおっ、絵だ! ん? なんだあたしの似顔絵じゃねーのかよ!」って言ってた。
「でも……ありがと(プイッ)」って脳内で付け加えておいた。


| 緑色 | みろりHP | comments(0) |
| カテゴリ:ゲーム |
ダークソウル2 古い竜狩りまで



ダークソウル2をはじめた。

ある程度進めたところで(できればクリア)感想を書くつもりだったんだけれども、内容を紹介してくれという話があったんでちょろっと書くぜ。



プレイ感
  • とても楽しめてる。今回は「久しぶりにコントローラ使うゲームしたい」「アクションRPGしたい」ってモチベーションで選んだのだけど当たりだった。
  • まずムービーとかイベントが少ないのがいい。モニタを眺めてる時間のほとんどが、駆け回ったり戦ったりしてる時間。グッド。記憶に新しいのは昨年か一昨年やったテイルズシリーズ。あれはイベントばかりでかったるかった……。親愛なるルームメイトと一緒にプレイするのが楽しくもあったけれど、それはそれとして。
  • ワールドが綺麗。まあ俺はあんまりゲームやんないから最近の映像クオリティのことは知らないが、この綺麗なワールドを走り回るの結構楽しめるぜ。
  • シナリオについてはわからん。てかシナリオがわからん。前作をやっていたらわかるのか? でもこれ多分だけどシナリオを楽しむゲームじゃないよな? だからわからなくても問題ないだろう。
  • 俺の買ったのは中古で、説明書がついてなかった。別に説明書なんてイマドキ……って思うじゃん? すこぶる必要だった。画面表示の意味がわからん。仕方ないのでそういうところだけはネットで調べたり、あるいはいろいろいじって解き明かしてる。

難易度について
  • 紫苑のやつが言ってて思い出したんだけど、そういやこれって難易度が高いゲームっていう噂だったっけ。確かにたくさん死んでいる。けど常時オートセーブの仕様で取ったアイテムがリセットされるとかないから、あんまりストレスは感じていないと思う。
  • 唯一気をつけないのがソウルの扱いだよな。敵を倒してソウルをかき集め、それを拠点で装備やレベルアップに費やすシステムなんだが、死ぬとその場所に全ソウルが置きっぱなしになっちまう。それを回収しにいく道中で死んじゃうと、前回のソウルは消えてしまう。ので、あんまりソウルは貯めないほうがよいな。
  • ソウルのロストはマジで大損害だ。これもまたやってて気付いたんだが、各所各所の敵たちは湧き数に限りがあるみたいなんだよな。ようは、ボスを倒すために延々レベル上げするのが不可能。いつかはプレイヤースキルを上げなきゃいけないときがくる。俺は気づかず何度かロストしてるので、戦々恐々だ。
  • 死んじゃうと外見が亡者になっちゃうっていう仕様も、最初びっくりしたけど気に入った。最初がんばってキャラメイクしたぶん、気をつけて死なないようにしようって気になるもんね。

ボス戦とか
  • 上述のソウルのことがあるんで、まずはソウルを空っぽまで使い切ってからボス部屋に突っ込む。死にまくりながら、ボスの攻撃をかわすパターンをおぼえる。まだレベルが足りないと思ったら、ソウル稼ぎに奔走する……みたいな流れかな。
  • 俺は魔法使いで始めたんだけれど、これっておそらく難易度高めだよな? とくに魔法の使用回数が限られてるのがつらい。<竜騎兵>と<古い竜狩り>まではソウルの矢30回でなんとか倒せたが、この先はレベル上げないと原理的に抜けられなさそう。
  • で、上記2ボスについてはおおよそ同じ攻略法で抜けた。
    • 1. ボスのまわりをぐるぐるまわって距離を一定に保つ。
    • 2. 攻撃してきたところでローリング回避。
    • 3. 一発だけ矢を撃つ。(以上繰り返す)
  • 装備はまだ初期装備だ。縛りプレイでもなんでもなくて、ボス戦略を考えてるうちに気付いたんだけど、装備重量が上がるとローリングの性能が激下がりする。この戦法を続けるなら、初期装備で装備重量30%以下にとどめておかないとむしろまずい。(重量ステを上げるのは後回し)




というわけでファーストインプレッションはわりと良いぞ。


| 緑色 | ゲーム | comments(0) |
| カテゴリ:プログラミング |
Python 迷路を解くプログラム



例によってプログラミング問題です。問題を見た瞬間おっもしろそー! と思った。
# これを……   ->  こうする!

# ########      #+########
# ## ### #      #+## ### #
#    ##  #      #++++##  #
####    ##      ####+   ##
# ## #####  ->  # ##+#####
#    #   #      #++++#+++#
# #### # #      #+####+#+#
#      # #      #++++++#+#
## ## ## #      ## ## ##+#
######## #      ########+#



みどりんの考えたのがこういうロジック。







メインロジック。いちばん上の solve_maze がトップレベル。
import os, itertools, copy, enum

def solve_maze(maze):
    """迷路を解きます。"""

    # 最初の奴隷を用意します。
    first_walker = Walker()

    # 通路座標を奴隷の歩行可能座標として登録します。
    first_walker.walkable_points = maze.pathways

    # こいつをスタート地点に立たせます。
    first_walker.start_point = maze.start_point
    first_walker.step_to(maze.start_point)

    # 分かれ道のたびに、奴隷を増殖させて袋小路まで進ませます。
    # そのたびにwalkersリストに追加されるので、最終的に全通りのルートがwalkersに登録されることになります。
    walkers = [first_walker]
    for walker in walkers:

        # 奴隷ひとりにつき再帰関数ひとめぐり。
        walker_life(walker, walkers)

    # 勝者を決めます。
    winner = compete_walkers(walkers, maze)
    return winner


def walker_life(walker, walkers):
    """奴隷の歩みを処理する再帰関数です。"""

    # 今いるマスの東西南北に道があるか調べます(一度踏んだマスは通れない)。
    next_points = walker.look_around_next_points()

    # 進める場所がない場合、そいつは終了です。
    if not next_points:
        return

    # 道がひとつだけある場合、次のマスへ移動させます。
    if len(next_points) == 1:
        walker.step_to(next_points[0])

    # 道が2以上ある場合、奴隷を分裂させます。
    else:
        process_for_multiple_possibilities(walker, next_points, walkers)

    walker_life(walker, walkers)


def process_for_multiple_possibilities(walker, next_points, walkers):
    """道が2以上ある場合の処理です。forが長くなるのヤだから分離しました。"""

    # 進む前の奴隷をコピーしておきます。
    walker_copies = [walker.create_myself() for i in range(len(next_points) - 1)]

    # 現奴隷は次のマスへ移動します。
    walker.step_to(next_points[0])
    next_points.pop(0)

    # コピーした奴隷たちを、それぞれ別の分かれ道へ進ませます。
    # そして次の while のためwalkersリストに溜めておきます。
    for walker_copy, next_point in zip(walker_copies, next_points):
        walker_copy.step_to(next_point)
        walkers.append(walker_copy)


def compete_walkers(walkers, maze):
    """最優秀ゴール者を決めます。関数が長くなるのヤだから分離しました。"""

    # 奴隷の中から、ゴールした連中を取り出します。
    goal_walkers = list(filter(lambda walker: walker.stand_point == maze.goal_point, walkers))

    # インデックスとwalker.step_numのディクショナリ。{0:30, 1:25, 2:10}みたいになる。
    dic = {i: goal_walker.step_num for i, goal_walker in enumerate(goal_walkers)}

    # step_numでの昇順ソート。[(2,10), (1,25), (0,30)]みたいになる。
    ranking = sorted(dic.items(), key=lambda value: value[1])

    # ゴール者の中で、最短距離をいった者が最優秀ゴール者です。
    return goal_walkers[ranking[0][0]]

迷路のマスを定義する。ぶっちゃけ今回のプログラムではあんまり必要ないクラスだけど enum っていうのを使ってみたくてさあ。
class MazeSigns(enum.Enum):
    """ 迷路のマスをenumで定義してみます。
        具体値の取り出し方は MazeSigns.WALL.value こう。"""

    WALL = '#'
    PATHWAY = ' '
    FOOTPRINT = '+'
    STAND_POINT = '*'

迷路データを簡単に扱えるようにするクラス。ちょっと色気づいて、最近オライリーで覚えた private 属性を使ってみた。
class Maze:
    """ 迷路データを簡単に扱うためのクラス! 
        ほら、文字列のままだと座標指定でマスを取得するとかできないじゃん?
        そういうのができるようになります。10x10だけに対応してるよ!"""


    def __init__(self, original_maze):
        self.original_maze = original_maze

        # MazeSignsのディクショナリ。
        self.sign_dic = {sign.value:sign for sign in MazeSigns}
        # マップ文字列を二次元配列にしたものです。
        self.map_list = self.__convert_map_to_list()
        # 通路部分の座標のリストです。
        self.pathways = self.__make_pathways()
        # この迷路のスタート地点とゴール地点です。
        _ = self.__get_entrances()
        self.start_point = _[0]
        self.goal_point  = _[1]


    def __convert_map_to_list(self):
        """(private)マップ文字列を二次元配列にして、中身を全部MazeSigns型に変換します。"""

        lines = list(filter(lambda line: line != '', self.original_maze.split(os.linesep)))
        lines.reverse()

        # マネしちゃダメな堂々の二重内包表記。クソ読みづらい(笑)
        return [[self.sign_dic[cell] for cell in list(line)] for line in lines]


    def __make_pathways(self):
        """(private)歩行可能座標のリストを作ります。"""

        # 通路の部分の座標を求めます。
        pathways = []
        for x, y in itertools.product(range(10), range(10)):
            if self.map_list[y][x] == MazeSigns.PATHWAY:
                pathways.append((x, y))
        return pathways


    def __get_entrances(self):
        """(private)迷路のスタート地点とゴール地点を求めます。"""

        entrances = []
        for coordinate in self.pathways:
            if coordinate[0] in [0, 9] or coordinate[1] in [0, 9]:
                entrances.append(coordinate)
        return entrances

迷路を歩かせる奴隷を作成するクラス。
class Walker:
    """迷路を歩く奴隷を意味するクラス! 自分が歩いた座標を記録していくよ!"""

    # インスタンスひとつひとつに振るIDです。
    walker_id = 0


    def __init__(self):

        # ID。
        self.walker_id = Walker.walker_id
        # 初期座標。
        self.start_point = None
        # 現在地。
        self.stand_point = None
        # 歩行可能座標。
        self.walkable_points = []
        # 歩行履歴。
        self.walk_history = []
        # 歩行数。
        self.step_num = 0


    def __str__(self):
        """str(walker)したとき現在のコイツの状態を返します。"""

        return os.linesep.join([
            f'',
            f'初期座標:{self.start_point}',
            f'現在地:{self.stand_point}',
            f'残歩行可能座標:{self.walkable_points}',
            f'歩行履歴:{self.walk_history}',
            f'歩行数:{self.step_num}',
        ])


    def step_to(self, next_point):
        """引数の座標へ歩みます。"""

        self.stand_point = next_point
        self.walk_history.append(next_point)
        self.walkable_points.remove(next_point)
        self.step_num += 1


    def look_around_next_points(self):
        """今のマスの東西南北に歩行可能マスがあるか調べます。"""

        # 東西南北の座標です。
        next_points = [
            (self.stand_point[0], self.stand_point[1]+1),
            (self.stand_point[0], self.stand_point[1]-1),
            (self.stand_point[0]+1, self.stand_point[1]),
            (self.stand_point[0]-1, self.stand_point[1]),
        ]

        # 進める座標は、歩行履歴になくて歩行可能座標にあるもの。
        next_points = filter(lambda point: point not in self.walk_history, next_points)
        next_points = filter(lambda point: point in self.walkable_points, next_points)
        return list(next_points)


    def create_myself(self):
        """自分自身のコピーを作ります。"""

        walker = copy.deepcopy(self)
        walker.walker_id += 1
        return walker


    def draw_steps_on_map(self, maze):
        """自分が歩いた軌跡をマップに書きます。"""

        map_list = maze.map_list
        for coordinate in self.walk_history:
            map_list[coordinate[1]][coordinate[0]] = (
                MazeSigns.STAND_POINT if coordinate == self.stand_point else MazeSigns.FOOTPRINT)

        # 文字列にします。マネしちゃダメな堂々の 3重 内包表記。クッソ読みづらい。
        map_list.reverse()
        return os.linesep.join([''.join(m) for m in [[maze_sign.value for maze_sign in line] for line in map_list]])

実行はこんな感じ。
#####################################################################
# ここまでプログラム。ここから実施。
#####################################################################

questions = [
'''
##########
##########
##########
###       
###   ####
###   ####
###   ####
###   ####
      ####
##########
''',
'''
##########
###      #
### ## # #
### ## # #
#   ##    
# # #### #
# #      #
# ########
#     ####
##### ####
''',
]

for i, question in enumerate(questions):
    maze = Maze(question)
    winner = solve_maze(maze)
    print()
    print(f'-*-*-*-* question{i} *-*-*-*-')
    print(winner)
    print(winner.draw_steps_on_map(maze))

結果はこう!
-*-*-*-* question0 *-*-*-*-
<Walker オブジェクト ID:2>
初期座標:(0, 1)
現在地:(9, 6)
残歩行可能座標:[(3, 2), (3, 3), (3, 4), (3, 5), (3, 6),
              (4, 2), (4, 3), (4, 4), (4, 5), (4, 6)]
歩行履歴:[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1),
         (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 6),
         (7, 6), (8, 6), (9, 6)]
歩行数:15
##########
##########
##########
###  ++++*
###  +####
###  +####
###  +####
###  +####
++++++####
##########

-*-*-*-* question1 *-*-*-*-
<Walker オブジェクト ID:2>
初期座標:(5, 0)
現在地:(9, 5)
残歩行可能座標:[(3, 6), (3, 7), (3, 8), (4, 8), (5, 8),
              (6, 5), (6, 6), (6, 7), (6, 8), (7, 5),
              (7, 8), (8, 6), (8, 7), (8, 8)]
歩行履歴:[(5, 0), (5, 1), (4, 1), (3, 1), (2, 1),
         (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
         (2, 5), (3, 5), (3, 4), (3, 3), (4, 3),
         (5, 3), (6, 3), (7, 3), (8, 3), (8, 4),
         (8, 5), (9, 5)]
歩行数:22
##########
###      #
### ## # #
### ## # #
#+++##  +*
#+#+####+#
#+#++++++#
#+########
#+++++####
#####+####



迷路を解くだけでなく、最短距離を求められてる。完璧! クラスを効果的に使えてるし、内包表記や高階関数を使いすぎなまでに使ってるし、再帰関数も使えてる。満足!


| 緑色 | プログラミング | comments(0) |
    123
45678910
11121314151617
18192021222324
25262728   
<< February 2018 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…