1日3タックルを目指して頑張ります。 ロリ巨乳が大好きです。 > 今日の3タックルTopへ

Top /  Python

ログから時刻を抜き出してdatetime型に変換するPythonスクリプトのお話

 2012/07/22 (Sun) -  カテゴリ:  若干エンジニアらしい話 »  Python

久々にちょっとだけ Python のお話

Apacheやらアプリやらが吐き出したログを集計して処理時間を計算したりする時に、ログの一行を datetime 型に変換する Python スクリプトのメモ (2.7で動作確認)

なんかちょっと気に入らないところはあるけどツールとしては十分だからコレでよしとする。なんとなく処理するログの想定としては、半角スペースで連結された日付文字列と時刻文字列(ミリ秒単位)が行の先頭にあって、日付文字列の区切りが / か - で、時刻文字列の区切りが : か . くらいかな。

>>> import re
>>> from datetime import datetime
>>>
>>> def log2datetime(line, regexp_delimiters=re.compile(r'[/\- :\.]')):
...     try:
...         args = regexp_delimiters.split(line)[:7]
...         args[6] += '000' # ms → us に必要
...         return datetime(*(map(int, args)))
...     except:
...         return
...
>>> start = log2datetime('2012/07/22 23:00:25:154 xxxxxxxxxxx')
>>> end = log2datetime('2012-07-22 23:00:28.168 yyyyyyyyyyy')
>>> dt = end - start
>>> print dt.total_seconds()
3.014

こんな感じで、datetime 型に変換すると簡単に差分が取れるので便利

5秒に一回ボタンを押すだけの簡単なお仕事

 2012/06/22 (Fri) -  カテゴリ:  若干エンジニアらしい話 »  Python

なんの因果か、また性能試験などというものに首を突っ込むことになった。んで Windows アプリの、とあるボタンを数秒間隔で一定時間クリックし続けるという、なんとも切ない作業をする必要が出てきたんだけど、さすがにこんなのを手作業でやるほどアホくさいことは無いので、なんとか自動化してみる。まぁ一昔前だったら VB 何とか的なのを使って、ウィンドウハンドルを取って、メッセージを送ってとか色々やったんだろうけど、ここ数年で Python を使えるようになった俺様は一味違うぜぇ!

というワケで、色々探した結果、 pywinauto なんていう素晴らしいモジュールを発見したったったー。

いつものごとくPythonインタープリタとdir()関数を駆使しながら、適当にコーディングしてたら、小一時間ほどで望みのツールが完成したわ。

あとは、実際の性能試験実施環境に Python をインストールするわけにもいかないので、 py2exe でサクッと実行ファイル化してできあがりー。と思ったら、実行ファイル化で大ハマリしたけど、一回使いきりのツールだから「A quick-and-dirty solution」的な対処で無理やり直して無事完成

この辺に良い感じのサンプルがあったりするから、色々試してみると良いと思うよ。

サンプル的なメモはまた後日書く。

py2exe でお手軽にツールを作ってみよう!

 2011/12/22 (Thu) -  カテゴリ:  若干エンジニアらしい話 »  Python

ちょこっとしたツールを作るには Python が激しく便利なんだけど、 Python が入ってない端末だと実行できないのが玉にキズ というわけで Windows の実行ファイルが作れる py2exe なんつーものを試してみた。

まずは py2exe をインストールしないことには始まらないので py2exe のインストーラを入手する。(http://sourceforge.net/projects/py2exe/ からダウンロードできる。)

Files → py2exe → 0.6.9 とたどっていって、自分の Windows にインストールされている Python のバージョンに合った実行ファイルをダウンロードする。(2011/12/22 時点で 0.6.9 が最新) ちなみに、自分の Windows にインストールされている Python のバージョンは、Python(command line) を起動すれば最初に表示される。

インストーラをダウンロードしたら当然のようにインストールする。ダウンロードしたファイルを実行するだけで、特に難しい手順はない。

ここまでで準備完了! あとは exe ファイル化したい Python スクリプトを用意する。とりあえずサンプルとして、引数に指定したディレクトリ配下のファイルを全て標準出力に出力する ls_R.py を次のように作ってみる。

import os
import sys

argvs = sys.argv[1:]
if not argvs:
    exit(1)
for argv in argvs:
    for r, ds, fs in os.walk(argv):
        if not fs:
            continue
        for f in fs:
            print os.path.join(r, f)

スクリプトを作ったら、次のような setup.py を用意する。(実際にはファイル名は何でも良いはず。)

from distutils.core import setup
import py2exe

setup(console=['ls_R.py'])

日本語のファイル名を使いたいときは、おまじないとして一行目に #coding: ms932 と書いておく。(この場合 setup.py は shift-jis で保存すること)

パイソニアのおまいらには言うまでもないことだと思うけど、おまじないを書かないとおなじみのこのエラーが出る。

C:\xxx>python setup.py py2exe
  File "setup.py", line 4
SyntaxError: Non-ASCII character '\x89' in file setup.py on line 4, but no encod
ing declared; see http://www.python.org/peps/pep-0263.html for details

setup.py ができたら、先ほど作った ls_R.py と同じディレクトリに置き、コマンドプロンプトで次のコマンドを実行する。このとき setup.py の置かれたディレクトリをカレントディレクトリとすること。

c:\xxx> python setup.py py2exe
20111222_1.png

ここまで実行すると setup.py と同じディレクトリに build と dist のディレクトリができる。 20111222_2.png

この dist 内に、 ls_R.exe ができている。(dist 内には、 ls_R.exe を動かすのに必要な dll などが含まれているので、実行ファイルを他のマシンに動かすときは dist ごと移動すること)

20111222_3.png

ls_R.exe を実行するときは、コマンドプロンプトから「c:\xxx>ls_R.exe c:\hoge」のような感じで実行する。

長くなったけど py2exe の使い方終わり。ちなみに我が家の Vist + Python2.7 と会社の Windows7(32bit) + Python2.7 では問題なく動いたよん。ところで、この dist はそのまま再配布してもよいのだろうか…。

twill の notfind に注意

 2011/01/22 (Sat) -  カテゴリ:  若干エンジニアらしい話 »  Python

良かれと思ってテストを自動化したのに、ちょっとしたことから試験漏れが発生する恐れがあるので自戒の念を込めて残しておく。

twill には twill.commands.find(), twill.commands.notfind() という、twill.commands.go() で移動した画面に「ある文字列」が存在するかをチェックする機能があるんだが、その引数に unicode 文字列を渡しちゃいかん! というお話

たいそう分かりづらいサンプルだが↓の通り。ちなみに http://3tackle.blog55.fc2.com/ のソースは EUC-JP で書かれていて「最新記事10件」という文字列を含んでいる。

>>> from twill.commands import *
>>> go('http://3tackle.blog55.fc2.com/')
==> at http://3tackle.blog55.fc2.com/
'http://3tackle.blog55.fc2.com/'
>>> find(u'最新記事10件'.encode('euc-jp'))   # これは正しく評価されている
>>> find(u'最新記事10件')   # これは常にエラーとなる
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/twill-0.9-py2.5.egg/twill/commands.py", line 239, in find
    raise TwillAssertionError("no match to '%s'" % (what,))
twill.errors.TwillAssertionError>>>
>>> notfind(u'最新記事10件')   # これは常にエラーとならない
>>>
>>> notfind(u'最新記事10件'.encode('euc-jp'))   # これは正しく評価されている
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/twill-0.9-py2.5.egg/twill/commands.py", line 259, in notfind
    raise TwillAssertionError("match to '%s'" % (what,))
twill.errors.TwillAssertionError: match to '?ǿ?????10??'
>>>
>>>

ここで「http://3tackle.blog55.fc2.com/」に「最新記事10件」という文字列を含まない。というテストを実行したい場合、notfind(u'最新記事10件') と書いてしまうと常に正常に通過するテストとなってしまい正しくテストが行えない。

find() に unicode を渡した場合は、常にエラーとなるテストになるため、大した問題とはならないが、notfind() に unicode を渡した場合は、あたかも正常にテストが通過しているようにみえるため注意が必要である。

html を mobi に変換する

 2010/11/27 (Sat) -  カテゴリ:  若干エンジニアらしい話 »  Python

思い立ったが吉日ってことで携帯小説をPCにダウンロードして、mobi 形式(kindle で読める形式)に変換してみた。念のため E★エブリスタの会員規約を調べてみたけど、特にローカルに保存しちゃダメよ的な記述がなかったので「私的利用だから許してください。」っていう言い訳でローカルに保存させて頂いた。(まぁ厳密にはブラウザでwebページを開いた時点でローカルに保存されちゃってるわけだが)

という理由により Python でサクッと書いたダウンロードツールのソースを全部公開するのも憚られるので最低限動く部分だけ…。にしてもやっぱ Python って便利だよね。

>>> import urllib2
>>> import re
>>> regexp = re.compile(r'<img src="http://estar.jp/i/dot.gif" height="3" width="1" alt=""><br>')
>>> f = urllib2.urlopen('http://estar.jp/.pc/_novel_page?page=2&w=10741090')
>>> print regexp.split(f.read())[1] # とりあえずこの部分をファイルに吐き出せばおk
>>> f.close()

後は URL の page の部分を変えながらごにょごにょすればサクッと全ページのダウンロードが完了する。適当な wait を入れたり、相手のサーバが返してくるステータスコードをチェックして適切にさばいてあげたりしないと「岡崎市立中央図書館の大量アクセス事件w」みたいなことになるかもしれないから気をつけてね。

んで、首尾よくローカルに保存できたら、スタイルとかをちょっぴり整えて html ファイルを作り KindleGen を使って html → mobi の変換をする。KindleGen は Amazon が公式に配ってるツールだから信頼性は抜群だ。ちなみに、変換のしかたは簡単で Windows 版の場合は zip を ダウンロードして適当なディレクトリに解凍したら、変換したい html ファイルを kindlegen.exe に Drag & Drop すれば html ファイルと同じパスに mobi ファイルができあがる。このやり方で mobi ファイルができなかったらどっかでエラーが出ているはずなので、コマンドプロンプトで (引数にhtmlファイルを指定して) kindlegen.exe を実行するとどんなエラーが出ているかがわかる。

これで電波の届かない地下鉄とかでも快適に読むことができるな。そしてなにより携帯よりも kindle のほうが読みやすくて素敵

20101127.png

人のコードを読むといろんな意味で勉強になるな

 2010/07/28 (Wed) -  カテゴリ:  若干エンジニアらしい話 »  Python

新人の書いたコード (Python 2.5) を実行してて、おや? っと思うところがあったから調べてみた

こんな感じ

>>> 1 / 5
0
>>> -1 / 5
-1
>>> 1 / -5
-1
>>> -1 / -5
0
>>> -(1 / 5)
0

なんとなく起こっていることは想像できるけど念のため真面目に調べたら Python チュートリアルの「3. 形式ばらない Python の紹介」に # 整数の除算は floor (実数の解を越えない最大の整数) を返す: って書いてあった。これですっきりしたなぁ。

Python ならきっと何とか

 2010/07/10 (Sat) -  カテゴリ:  若干エンジニアらしい話 »  Python

Python で リストの要素同士を足し算する

色々あって入社研修時に C 言語で書いたプログラムを Python で書き直し中なんだが、 Python ってリストの要素同士の足し算できたっけ? ちょこっと調べてみたりしたけど、良く分からんのでとりあえずこんな感じのコードで凌いでる。

>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> [i + j for i, j in zip(a, b)]
[6, 8, 10, 12]

Python ならもうちょっと直感的な操作でできそうな気がするのになぁ。ちなみに未だに 2.5 を使ってる。

                               .= パ
                 ..l..:.::::::::::::::::::::::::::::イ     ニ= イ    =
                    .|..:::::::::::::::::::::::::::::: |     ニ= ソ そ -=
                  |:r¬‐--─勹:::::|     ニ= ン れ =ニ
                 |:} __ 、._ `}f'〉n_   =- な. で -=
  、、 l | /, ,         ,ヘ}´`'`` `´` |ノ:::|.|  ヽ ニ .ら. も ニ
 .ヽ     ´´,      ,ゝ|、   、,    l|ヽ:ヽヽ  } ´r :   ヽ`
.ヽ し き パ ニ.    /|{/ :ヽ -=- ./| |.|:::::| |  |  ´/小ヽ`
=  て っ イ  =ニ /:.:.::ヽ、  \二/ :| |.|:::::| |  /
ニ  く. と ソ  -= ヽ、:.:::::::ヽ、._、  _,ノ/.:::::| | /|
=  れ.何 ン  -=   ヽ、:::::::::\、__/::.z先.:| |' :|
ニ  る と .な =ニ   | |:::::::::::::::::::::::::::::::::::.|'夂.:Y′ト、
/,  : か ら ヽ、    | |::::::::::::::::::::::::::::::::::::_土_::|  '゙, .\
 /     ヽ、

そういえば昔ポインタってのがあったなー

 2010/05/24 (Mon) -  カテゴリ:  若干エンジニアらしい話 »  Python

Python で2次元リストの行列を入れ替える

ノーヒントのナンクロを解くためにちょっとコーディングしてみようと思ったんだけど、色々書いたりしてるうちに、なかなか面白い方法を知ったのでメモ

zip に * 付で list を渡すと行列が入れ替わる。

>>> ary = [[1, 2], [3, 4]]
>>> zip(*ary)
[(1, 3), (2, 4)]

なんでそうなるかは↓を見たらなんとなく理解できるはず。

>>> def test(arg1, arg2):
...     print arg1
...     print arg2
...
>>> ary = [[1, 2], [3, 4]]
>>> test(*ary)
[1, 2]
[3, 4]
>>> def test1(arg1, arg2, arg3):
...     print arg1
...     print arg2
...     print arg3
...
>>> ary2 = [[1,2,3], [4,5,6], [7,8,9]]
>>> test1(*ary2)
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

ラヂオ体操

これでダイエットできるかな。

連休中に仕事してる俺カコイイ

 2010/05/02 (Sun) -  カテゴリ:  若干エンジニアらしい話 »  Python

何の因果か分からんが、連休中だってのに Python の静的コード解析について調べてる件 連休明けからはもうちょっと段取りを良くして欲しいと切に願う。

はじめに

静的コード解析ツールの候補としては pylint, pyflakes, pychecker があるようだが、今回の目的は import されずに使われている関数だのクラスだのを調べたいってだけなので、これには pyflakes が適してるみたい。

つーことで pyflakes を動かしてみた。ちなみに環境は Ubuntu 8.04.4 LTS + pyflakes-0.4.0 な。

使い方

http://sourceforge.jp/projects/freshmeat_pyflakes/releases/ からファイルを一式ダウンロードして解凍する。解凍後のディレクトリ構成は↓

$ ls -R pyflakes-0.4.0
pyflakes-0.4.0:
PKG-INFO  bin  pyflakes  setup.py

pyflakes-0.4.0/bin:
pyflakes

pyflakes-0.4.0/pyflakes:
__init__.py  checker.py  messages.py  scripts  test

pyflakes-0.4.0/pyflakes/scripts:
__init__.py  pyflakes.py

pyflakes-0.4.0/pyflakes/test:
__init__.py  harness.py  test_imports.py  test_other.py  test_script.py  test_undefined_names.py

ざっとソースを眺めた感じだと、とりあえず PYTHONPATH に pyflakes-0.4.0 を設定すれば動作するっぽいので、インストールはしないで使うことにした。

動かすには(ツールを解凍したディレクトリがカレントディレクトリの状態で)以下のコマンドを実行すれば良い。

$ PYTHONPATH=${PYTHONPATH}:pyflakes-0.4.0 python pyflakes-0.4.0/bin/pyflakes 検査したいソースコードのあるルートディレクトリ

実行結果

コマンドを実行するとこんな結果が出る。意味は見たまんま。インポートしてるけど使っていないモジュールやら * でインポートしてるモジュールやら案外細かいところまでエラーが出てくる。

/hoge/fuga.py:1: 'from xxxx.yyyy import *' used; unable to detect undefined names
/hoge/fuga.py:25: undefined name 'XXXXXX'
/hoge/fuga.py:33: 'yyyy_zzzz' imported but unused
などなど

まとめ

表示されるエラーにどんなエラーがあるかは pyflakes-0.4.0/pyflakes/messages.py を見れば良さげ。今回の目的である import されずに使われている関数だのクラスだのは「undefined name 'xxxx'」をチェックしとけば良いんじゃないかなぁ。

            _. -=ニ::_Z ̄ニ=-  .._
        / (:_: ;r'": :/:: ̄:7''ヽ:,r': ̄`ヽ、
        /: : : : : :ヽ、:_(_: : : (:: : : :\,r=‐':"⌒ヽ._
      / : : : : : ; ': : : : : : ̄::ヽ、__/: : : : : l: : :/ミノ
     ' : : : : : / : : : : : : :__:ヽ_: /:: :l: :l: : : : l : ゙‐'ヽ
     l: : : : : :;' : : : : : : (((//゙ハ、 : l: :l : : : l: : : l : ',
.    l: : : : : :l: : : : : : : : : : : :`Vノ : l: :l: : : ,' : : ;': l:ll
    l: : : : : :l: : : : : : : : : : : l: :/:l :l: :l: :l:: :/ /::/: :;リ|   「残業はしない」
    l: : : : : :l : : : : : : : : : : l: :l::ノ: }: :} l / /::/レj:/::|    「納期は守る」
.     l: : : : : l: : : : : : : : : : :l: :|/_;イ_;イ_;リ、// .ノ/:|
     '; : : : : l: : : : : : : : : ::l: :|ニニ ‐--ミ`' } ,ィチj゙ :|   「両方」やらなくっちゃあならないってのが
    /´ヽ: : : :l; : : : : : : : : :l: :|z't'ツ"_>`` '" {^~ |: :|   「下請け」のつらいところだな
  / ¶′\: :ll : : : : : : : : l: :| `~¨´ (::"′   ',ノl: :j
,r‐{   , \ll : : : : : : : :l: :| :.           ∨ノ:|
  ! ¶′',  r、\: : : : :::::l: :| :.      .._ /´): :l
 ¶′   \ ヾ>、\: : : ll: :|  :.       __-了:/::;'
エエエュ┬r 、\ `ヾ>、\:ll: :|   :   ‐.._'´¨´ノ:/::/
―‐ - 、 ̄`<〉、 ヽ、._`^‐-\ト 、 :      ̄「V/
 ¶′   \ `<〉、 \` ー==┬''^ヽ、 ...__ ノ
   ¶′  \ `〈>、 ヽ`:r'"||  ,タ ¶ }
¶′    ¶′ヽ  `〈>、ヽ i || ,タ  /

恥を忍んで公開(史上最大のコーディングスキル判定)

 2010/04/19 (Mon) -  カテゴリ:  若干エンジニアらしい話 »  Python

やるやる詐欺もアレなんで、とりあえず作るだけ作った。考える時間なんかを含めて5時間ってところか。途中で飽きてきて適当になった部分もあるけど、たぶん正しく動いてるはず。ちなみに七対子とか、純カラとかぜんぜん考慮してないよ。あと再帰は嫌いなんで使わなかった。

以下、コード (言語は Python2.5.4)

#coding: utf-8

import sys
import re
import copy

def main():
    hands = raw_input(u'> ')
    _validate(hands)
    tiles = [0] * 9
    for tile in hands:
        tiles[int(tile) - 1] += 1
        # 5 枚以上あったら終了
        if tiles[int(tile) - 1] > 4:
            sys.exit('Error')
    pong, chow, pair = _pickup_melds(tiles)
    _analyze(pong, chow, pair, tiles)

def _validate(hands):
    """
    とりあえず 13 文字で [1-9] であることだけチェック
    """
    if not re.compile(r'^[1-9]{13}$').search(hands):
        sys.exit('Error')

def _pickup_melds(tiles):
    """
    13 牌が取り得る全ての面子を抽出する。
    """
    # 刻子
    pongs = []
    for i, count in enumerate(tiles):
        if count >= 3:
            pongs.append(('pong', i))

    # 順子 同じ面子が複数取れる場合も重複して抽出する。
    chows = []
    for i in xrange(7):
        for j in (1, 2, 3, 4):
            if tiles[i] < j or tiles[i + 1] < j or tiles[i + 2] < j:
                break
            chows.append(('chow', i))

    # 対子
    pairs = []
    for i, count in enumerate(tiles):
        if count >= 2:
            pairs.append(('pair', i))

    return pongs, chows, pairs

def _analyze(pongs, chows, pairs, tiles):
    """
    聴牌しているかどうかを調べて、聴牌時は出力する。
    """
    fix_melds = []
    # 単騎待ち (4面子確定)
    for cmb in _get_cmb(pongs + chows, 4):
        if cmb in fix_melds:
            continue
        fix_melds.append(cmb)
        is_ready, ready =  _is_ready_hands(_inspect(cmb, tiles))
        if is_ready:
            _print_melds(cmb, ready)

    # 単騎以外 (3面子 + 雀頭)
    for pair in pairs:
        for cmb in _get_cmb(pongs + chows, 3):
            if cmb + [pair] in fix_melds:
                continue
            fix_melds.append(cmb + [pair])
            is_ready, ready = _is_ready_hands(_inspect(cmb + [pair], tiles))
            if is_ready:
                _print_melds(cmb + [pair], ready)

def _inspect(melds, tiles):
    """
    tiles から全ての melds を取り出して、 tiles に矛盾(枚数が負になる)
    がなければ残りの _tiles を返す。
    """
    _tiles = copy.copy(tiles)
    for meld in melds:
        if meld[0] == 'pong':
            _tiles[meld[1]] -= 3
            if _is_invalid(_tiles):
                break
        elif meld[0] == 'pair':
            _tiles[meld[1]] -= 2
            if _is_invalid(_tiles):
                break
        elif meld[0] == 'chow':
            _tiles[meld[1]] -= 1
            _tiles[meld[1] + 1] -= 1
            _tiles[meld[1] + 2] -= 1
            if _is_invalid(_tiles):
                break
    else:
        return _tiles

def _is_ready_hands(tiles):
    """
    聴牌チェック
    ここでの聴牌チェックは、_inspect の結果、残った牌が単騎待ち
    であるか、または塔子を構成しているかのチェックである
    """
    if not tiles:
        return False, None

    # tiles の枚数チェック 1 or 2 でなければならない
    tiles_count = sum(tiles)
    if tiles_count not in (1, 2):
        return False, None

    # 1 枚なら単騎待ち
    if tiles_count == 1:
        return True, '%d' % \
            ([i for i, c in enumerate(tiles) if c == 1][0] + 1)

    # 1 枚以外 (== 2枚) なら待ちの形を調査して適切に返却する。
    for idx, count in enumerate(tiles):
        tile = idx + 1
        if count == 2:
            return True, '%d%d' % (tile, tile)
        elif count == 1:
            if tiles[idx + 1] == 1:
                return True, '%d%d' % (tile, tile + 1)
            elif tiles[idx + 2] == 1:
                return True, '%d%d' % (tile, tile + 2)
            else:
                break
    return False, None

def _get_cmb(melds, n):
    """
    melds から n 個をとる組み合わせを返す。n = 3 or 4 しか使えない。
    """
    if n not in (3, 4):
        sys.exit('Error')

    length = len(melds)
    for i in range(length):
        for j in range(i + 1, length):
            for k in range(j + 1, length):
                if n == 3:
                    yield [melds[i], melds[j], melds[k]]
                else:
                    for l in range(k + 1, length):
                        yield [melds[i], melds[j], melds[k], melds[l]]

def _is_invalid(tiles):
    """
    tiles の要素がひとつでも負の値になっていた場合は False を返す。
    """
    return bool(len([count for count in tiles if count < 0]))

def _print_melds(melds, ready):
    """
    melds と ready を形式を整えて画面に出力する。
    """
    format_melds = []
    for meld in melds:
        if meld[0] == 'pong':
            tile = meld[1] + 1
            format_melds.append('(%d%d%d)' % tuple([tile] * 3))
        if meld[0] == 'chow':
            tile = meld[1] + 1
            format_melds.append('(%d%d%d)' % (tile, tile + 1, tile + 2))
        if meld[0] == 'pair':
            tile = meld[1] + 1
            format_melds.append('(%d%d)' % tuple([tile] * 2))
    print '%s [%s]' % (' '.join(format_melds), ready)

if __name__ == '__main__':
    main()

実行結果はこんな感じ

$python ma.py
> 1112345678999
(111) (999) (234) (567) [8]
(111) (999) (234) (678) [5]
(111) (999) (345) (678) [2]
(999) (123) (456) (11) [78]
(999) (123) (678) (11) [45]
(999) (345) (678) (11) [12]
(123) (456) (789) (11) [99]
(111) (234) (567) (99) [89]
(111) (234) (789) (99) [56]
(111) (456) (789) (99) [23]
(123) (456) (789) (99) [11]
$python ma.py
> 1111222233334
(111) (222) (333) (123) [4]
(111) (222) (333) (234) [1]
(123) (123) (123) (123) [4]
(123) (123) (123) (234) [1]
(222) (333) (234) (11) [11]
(123) (123) (234) (11) [23]
(111) (333) (123) (22) [24]
(111) (333) (234) (22) [12]
(111) (123) (234) (22) [33]
(111) (222) (123) (33) [34]
(111) (222) (234) (33) [13]
(111) (123) (234) (33) [22]
$python ma.py
> 1112223334445
(111) (222) (333) (444) [5]
(111) (234) (234) (234) [5]
(111) (234) (234) (345) [2]
(444) (123) (123) (123) [5]
(123) (234) (234) (11) [45]
(123) (234) (345) (11) [24]
(234) (234) (345) (11) [12]
(111) (234) (345) (22) [34]
(111) (222) (444) (33) [35]
(111) (222) (345) (33) [44]
(111) (222) (333) (44) [45]
(111) (222) (345) (44) [33]
(123) (123) (123) (44) [45]
(123) (123) (345) (44) [12]

まぁこのくらいがオイラの限界かな。

 | トップへ |  次ページへ »
最新記事
カテゴリ
最新コメント
最新トラックバック
月別アーカイブ
カウンタ
_

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
これはやべぇ

インターネッツの設定をしてあげたついでに、接続確認と称してこのブログを開いたら、気になるあの娘が検索したアイテムがwww

万が一アダルトグッズが表示されたりしたらと思うと股間が熱くなるな。

とか妄想してたけど、インターネッツの設定をしてあげた直後に検索の履歴が残ってるわけないか
(´・ω・`)
にしても使い方によってはこの機能は凶悪だな。

プロフィール

タックル

Author:タックル
三度のメシより大ライスが好きなエンジニアです。
焼肉屋に行ったら最初の一杯は大ライスで乾杯! 全然関係ないけど食堂のカレーなら4杯は軽いよ。

ちなみにロリ巨乳は大ライスより好き!

プライベートでタックルされてくれるロリ巨乳のお友達を24時間365日募集中です。

エントリーの内容はタックルの日々の生活について多少脚色しながら面白おかしく書いている限りなくノンフィクションに近いフィクションです。

嘘を嘘と見抜けない人は(ry

Webサービス
フィードメーター - 今日の3タックル あわせて読みたいブログパーツ
タックル会
個人的なリンク