How many files(0-15)

競馬の予想システムで一儲を企むおっさんのヨコシマな横顔

水彩色鉛筆

子供は絵を描くのが大好きなので、ちょいちょい面白い画材を見つけては与えてみているんだけれど、今回試してみたこれが凄い。



普通に色鉛筆として着色した上から水でなぞると水彩風になってしまう。

横で子供が楽しそうに使っているのを見て、僕も使いたくなった。

丁度、子供にコマさんを描いてほしいといわれたので、さっそく試してみることにした。


まずは下書き。
f:id:taka23kz:20150923154627j:plain


次に線を描いて。
f:id:taka23kz:20150923160823j:plain


着色。
f:id:taka23kz:20150923180129j:plain


黒目勝ちになってしまったけど、およそ10分程度でこれが描けちゃうって世の中便利になったなぁ。
後片付けも楽ちん。ただの色鉛筆と同じで水彩絵の具を使ったあとのように筆やパレット、バケツを洗ったりする必要がない。

これは買いだ。

いきなりステーキ ドンッ!

いきなり!  ステーキ

いきなり! ステーキ


職場の近くに「いきなりステーキ」ができた。僕はいきなりステーキを知らなったのだけれど、職場の方々と一緒に行ってみると、とんでもなく非常識、いやクレイジー(ほめ言葉)な店だった。

普通は、ステーキを食べようとなったら前菜あり、スープありでメインにステーキを食べる。

勿論、それなりに美味しいものを食べようとすると格好も気にする必要が出てくるかもしれない。

だが、いきなりステーキは非常識だ。


前菜? ⇒ 「そんなものは無い。」

格好? ⇒ 「立ち食いですけど、何か?」


もうね、潔すぎて痺れる。

注文も豪快。最低のオーダーが200gからとかそんな感じ。肉は僕が行ったところは4種類あって1gあたりの価格が6~10円となっていて、200gで最低1200円(税別)となる。

で、このグラム売りな感じなんだけど、お店のお姉さんがブロックの肉を注文を聞いて直接カット。一緒に行った2人のカットに関しては、オーダーした重量に正確にカット出来ていて、これもびっくり。

僕は軽い気持ちで500g注文して455gとかになったので、お姉さん的には失敗したと思ったのか、再度カットしますか?と聞かれた。

でもね。455gの肉塊ってすごいのよ。普通のお店じゃお目にかかれない圧倒的な質量。

完食できないんじゃないかと、ビビッて「それで良いです」とチキンになってしまった。

で、焼きあがったものをすぐに届けてくれるんだけど、やっぱり圧倒的。このドンッ!!って感じがたまらない。

f:id:taka23kz:20151002190519j:plain


僕は一番安い肉を食べたけど、それでも十分美味しかった。また行こう。


そうそうドンッ!といえば、ワンピースのスマホゲー(トレジャークルーズ)で、ロード時間に画面をTAPした回数に応じて宝石が貰えるミニゲーム的なやつがあって、最大500回、TAPすれば宝石もMAXで貰えるんだけど、システム屋として気になったので限界の9999回までTAPしまくった。まぁ、予想通りというか、別に何もなかったので完全に徒労に終わったんだけどね。

でも、これでカロリー消費できたかなぁ。

f:id:taka23kz:20151004145733p:plain

機械学習で競馬予想 其の013 ~リファクタリング2~

前回に引き続きリファクタリング。getParamの第1引数は、馬のデータが入ったファイルなんだけど、これを日本語(全角カナ)で読み込めるようにした。
これは単に、馬の名前は全角カナなので、ファイル名=馬の名前としておきたいというだけ。

calctime(getParam(u"weekend.tsv"), 1200, 504, 54.0, 1, 150918, 11)


以下のように「u"ファイル名"」とすれば、問題なさそうだ。しかし、これはファイル名を固定値で埋め込む場合に限るので、ファイルシステムから直接ファイル名を取得する場合においては、別の方法をとる必要がある。

calctime(getParam(u"ウィークエンド.tsv"), 1200, 504, 54.0, 1, 150918, 11)


例えばwindows環境(shift-jis)の場合なんかだと、globを使って、特定のディレクトリ配下のファイル名を取得し、unicode(fname, encoding='shift-jis')とすることで、unicodeでファイル名を取得することが可能だ。

import glob

for fname in glob.glob(horse_data_file_path + '/*'):
    calctime(getParam(unicode(fname, encoding='shift-jis')), 1200, 504, 54.0, 1, 150918, 11)


ただ、上記の実装では、レース毎、馬毎に異なる出走距離、馬体重等が固定値となっているのでそのあたりは別途検討の必要がある。

一旦、現状の前ソースを公開。まだまだだけど、これでも大分マシになったかな、、(多分)

# -*- coding: utf-8 -*-
import scipy as sp
import numpy as np
from scipy import linalg as LA
import os
import glob
import ConfigParser

# 環境設定ファイル読込処理
envFile = ConfigParser.SafeConfigParser()
envFile.read(r'\horse\conf\config.ini')

horse_data_file_path = envFile.get('horse_data', 'file_path')

# 天候・馬場
weatherDict = {}
weatherIndex = 0

# 開催地
locationDict = {}
locationIndex = 0

# 馬データの読み込み
def loadHorseData(filename):
    horsedata = sp.genfromtxt(os.path.join(horse_data_file_path, filename), delimiter="\t", 
        dtype=[ ('日付','S10'),         # 0:日付
                ('開催地','i3'),       # 1:開催地
                ('レース','i2'),         # 2:レース 
                ('レース名','U50'),       # 3:レース名  
                ('距離','i4'),          # 4:距離  
                ('天候','i3'),         # 5:天候  
                ('馬番','i2'),          # 6:馬番 
                ('人気','i3'),          # 7:人気 
                ('着順','U10'),         # 8:着順 
                ('タイム','f5'),        # 9:タイム 
                ('差/事故', 'i4'),     # 10:差/事故  
                ('上3F','i4'),         # 11:上3F 
                ('通過順','U10'),      # 12:通過順
                ('体重','i4'),         # 13:体重
                ('騎手','U20'),        # 14:騎手
                ('負担重量','i4'),     # 15:負担重量
                ('調教師','U20'),      # 16:調教師
                ('獲得賞金(円)','U10')  # 17:獲得賞金
                ],                  
        converters={ 
            0 : lambda s: convertDate(s.decode('utf8')), # 開催日
            1 : lambda s: createLocationDict(s.decode('utf8')),    # 開催地
            3 : lambda s: s.decode('utf8'),    # レース名
            5 : lambda s: createWeatherDict(s.decode('utf8')),    # 天候
            9 : lambda s: convertTime(s.decode('utf8')), # タイム
            14 : lambda s: s.decode('utf8'),    # 騎手
            16: lambda s: s.decode('utf8'),    # 調教師
        })

    return np.array(horsedata.tolist(), dtype = object)

# 1桁の場合は前ゼロを付与
def addZero(data):
    if len(data) == 2:
        return data
    else:
        return "0" + str(data)

def convertDate(date):
    aryYmd = date.split("/")
    year = addZero(aryYmd[0])
    month = addZero(aryYmd[1])
    day = addZero(aryYmd[2])
    return str(year) + str(month) + str(day)

def convertTime(time):
    if len(time.split(":")) == 2:
        return np.float32(time.split(":")[0])*60+np.float32(time.split(":")[1])
    else:
        return np.float32(time)
  
def createWeatherDict(weather):
    global weatherDict
    global weatherIndex
    
    if weatherDict.has_key(weather) == False:
        weatherIndex += 1
        weatherDict[weather] = weatherIndex
    return weatherDict[weather]
        
def createLocationDict(location):
    global locationDict
    global locationIndex
    
    if locationDict.has_key(location) == False:
        locationIndex += 1
        locationDict[location] = locationIndex
    return locationDict[location]
    
def paddingArray(ymd, loc, d, weather, n, y, w1, w2, padding):
    if padding.size != 0:
        y = y[padding]
        d = d[padding]
        w1 = w1[padding]
        w2 = w2[padding]
        n = n[padding]
        ymd = ymd[padding]
        weather = weather[padding]
        loc = loc[padding]
    return y, d, w1, w2, n, ymd, weather, loc
    
# データを整形する。
def dataShaping(horsedata):
    ymd = horsedata[:,0] # 開催日の配列を作成
    loc = horsedata[:,1]  # 開催地の配列を生成
    d = horsedata[:,4]    # 距離の配列を生成
    weather = horsedata[:,5] # 天候の配列を生成
    n = horsedata[:,6]     # 馬番の配列を生成
    y = horsedata[:,9]    # タイムの配列を作成
    w1 = horsedata[:,13]  # 体重の配列を生成
    w2 = horsedata[:,15]  # 負担重量の配列を生成

    # 記録が無いレースを除外
    z = np.array([idx for idx, i in enumerate(y) if i == i  ])
    y, d, w1, w2, n, ymd, weather, loc = paddingArray(ymd, loc, d, weather, n, y, w1, w2, z)

    # 古い開催データを除外(2013より古いデータは除去)
    z = np.array([idx for idx, i in enumerate(ymd) if np.float32(i) >= np.float32(130101)])
    y, d, w1, w2, n, ymd, weather, loc = paddingArray(ymd, loc, d, weather, n, y, w1, w2, z)

    # .Tは転置
    return np.array([d, w1, w2, n, weather, ymd, np.ones(len(n))]).T, y

def getParam(filename):
  # 以下、main処理
    horsedata = loadHorseData(filename)
    x, y = dataShaping(horsedata)
    return LA.lstsq(x, y)[0]       # 偏回帰係数

def calctime(params, distance, weight1, weight2, no, ymd, weather):
    t = np.int32(distance) * params[0] + np.int32(weight1) * params[1] + np.int32(weight2) * params[2] + np.int32(no) * params[3] + np.int32(weather) * params[4] + np.int32(ymd) * params[5] + params[6]
    print "|" + str(no) + "|" + str(t) + "|"

    return t

# 8R
print "8R 1200m"
calctime(getParam(u"ウィークエンド.tsv"), 1200, 504, 54.0, 1, 150918, 11)
以下、馬の数だけ続く

機械学習で競馬予想 其の012 ~リファクタリング~

僕は、pythonの素人で、行き当たりばったりなコーディングをしているため、ソースが冗長で汚くなってきたので、このタイミングでリファクタリングしようと思います。機械学習で競馬予想という本筋から逸れてしまいますが、(筆者の)今後のためにも仕方ありません。pythonに詳しい方であれば本エントリは無視した方が良いでしょう。基本的には冗長な部分の排除とよりpythonらしいと思われる記述にしていきます。

手始めに、プロパティ的なものをハードコーディングしていたのでプロパティファイルへ外だし。
pythonではConfigParserを使うと良いらしいので以下のように実装。

  • ConfigParser.SafeConfigParserでプロパティファイル読込用にインスタンスを生成
  • readでプロパティファイルの読み込み


プロパティファイルの内容を取得するには、getを使う。
これだけ。

import ConfigParser

# 環境設定ファイル読込処理
envFile = ConfigParser.SafeConfigParser()
envFile.read(r'config.ini')

horse_data_file_path = envFile.get('horse_data', 'file_path')


プロパティファイルにはカテゴリというのを設定できる。具体的な記述は以下のとおり。

[horse_data]
file_path=.\horse


次に、元々、genfromtxtで馬のデータを取得したものに対して、dataShapingという関数で、不要データを削除や、データの形式を整形部分をgenfromtxtの呼び出し部分に記述。
実装は以下のような感じ。convertersで単にファイルから取得した値を返却するだけだったのを元々dataShaping関数で実装していた整形モジュール呼び出しと連動させただけ。

# 馬データの読み込み
def loadHorseData(filename):
    horsedata = sp.genfromtxt(os.path.join(horse_data_file_path, filename), delimiter="\t", 
        dtype=[ ('日付','S10'),         # 0:日付
                ('開催地','i3'),       # 1:開催地
                ('レース','i2'),         # 2:レース 
                ('レース名','U50'),       # 3:レース名  
                ('距離','i4'),          # 4:距離  
                ('天候','i3'),         # 5:天候  
                ('馬番','i2'),          # 6:馬番 
                ('人気','i3'),          # 7:人気 
                ('着順','U10'),         # 8:着順 
                ('タイム','f5'),        # 9:タイム 
                ('差/事故', 'i4'),     # 10:差/事故  
                ('上3F','i4'),         # 11:上3F 
                ('通過順','U10'),      # 12:通過順
                ('体重','i4'),         # 13:体重
                ('騎手','U20'),        # 14:騎手
                ('負担重量','i4'),     # 15:負担重量
                ('調教師','U20'),      # 16:調教師
                ('獲得賞金(円)','U10')  # 17:獲得賞金
                ],                  
        converters={ 
            0 : lambda s: convertDate(s.decode('utf8')), # 開催日
            1 : lambda s: createLocationDict(s.decode('utf8')),    # 開催地
            3 : lambda s: s.decode('utf8'),    # レース名
            5 : lambda s: createWeatherDict(s.decode('utf8')),    # 天候
            9 : lambda s: convertTime(s.decode('utf8')), # タイム
            14 : lambda s: s.decode('utf8'),    # 騎手
            16: lambda s: s.decode('utf8'),    # 調教師
        })

    return np.array(horsedata.tolist(), dtype = object)


それぞれのデータ整形に使っている処理は以下のとおり。以前は、大井競馬場のデータだけを使っていたけど、今回はすべての開催地のデータを使うようについでに修正。

def addZero(data):
    if len(data) == 2:
        return data
    else:
        return "0" + str(data)

def convertDate(date):
    aryYmd = date.split("/")
    year = addZero(aryYmd[0])
    month = addZero(aryYmd[1])
    day = addZero(aryYmd[2])
    return str(year) + str(month) + str(day)

def convertTime(time):
    if len(time.split(":")) == 2:
        return np.float32(time.split(":")[0])*60+np.float32(time.split(":")[1])
    else:
        return np.float32(time)
  
def createWeatherDict(weather):
    global weatherDict
    global weatherIndex
    
    if weatherDict.has_key(weather) == False:
        weatherIndex += 1
        weatherDict[weather] = weatherIndex
    
    return weatherIndex

def createLocationDict(location):
    global locationDict
    global locationIndex
    
    if locationDict.has_key(location) == False:
        locationIndex += 1
        locationDict[location] = locationIndex
    return locationDict[location]


そうすると、結果が微妙に変わった。この辺の評価は後日にするとして次回もリファクタリングを進めます。

8R 1200m 実績
馬番 タイム(秒) タイム(秒) タイム(秒)
1 80.4909487166 74.2050783599 75.1
2 74.955080275 74.5661372198 76.6
3 73.6787991346 74.1367306308 74.1
4 76.1923007581 72.3405306744 75.0
5 77.984841449 81.7183619077 77.2
6 74.878874984 73.5652206548 76.2
7 76.8652917749 80.5876352042 78.0
8 76.739123412 73.8367610183 75.0
9 74.2465295977 75.2493784691 75.1
10 81.3600303209 81.3099440104 76.4
11 75.9533880198 76.1685987163 76.6
12 74.1004315609 73.9210259265 74.5
13 75.9515585476 76.2881028763 78.7
9R 1600m 実績
馬番 タイム(秒) タイム(秒) タイム(秒)
1 104.009553751 105.449829127 106.3
2 105.285454948 104.446635423 105.1
3 104.170221199 103.544665086 104.8
4 103.561907896 102.832908331 104.8
5 105.803250689 106.681494384 107.0
6 104.753017942 104.852490486 105.5
7 103.855474193 104.096728343 104.1
8 103.621835287 101.063900125 104.9
9 105.521398972 105.44998775 106.9
10 105.96640969 106.27426342 106.2
11 102.40205078 102.557512398 106.3
12 104.211524406 104.923401093 105.8
13 104.522090684 103.621225058 107.0
14 106.726775191 103.160208763 104.3
10R 1200m 実績
馬番 タイム(秒) タイム(秒) タイム(秒)
1 73.9448633203 74.053751696 74.7
2 74.4725932805 74.791709691 75.6
3 76.4310043125 74.9716748455 75.5
4 77.8331423393 91.0018906849 78.3
5 80.8977378491 79.8907980544 75.4
6 69.0830010014 68.6452500517 75.1
7 76.5005151764 75.2536390704 75.8
8 74.3322163529 74.4513043382 74.7
9 74.6606315693 53.7728385949 76.4
10 75.0673609574 74.9747204476 75.1
11 73.237177527 73.2287457443 76.5
12 82.8226314627 85.7890644837 75.7
13 73.5605822215 75.1488630555 74.5
11R 1600m 実績
馬番 タイム(秒) タイム(秒) タイム(秒)
1 101.298091317 101.639022812 102.3
2 101.843065646 104.904044778 103.2
3 103.375501518 102.832548994 102.6
4 106.789608436 104.198294174 101.0
5 101.40716234 100.890777032 105.3
6 101.866305864 101.794480623 103.2
7 100.723857238 103.042734984 102.3
8 102.829131723 102.415056316 103.9
9 102.544875956 101.758714813 106.6
12R 1800m 実績
馬番 タイム(秒) タイム(秒) タイム(秒)
1 114.444510794 117.24558277 117.1
2 118.470400983 119.808649496 118.5
3 117.646829198 115.77679082 116.3
4 115.078354065 114.421506359 117.1
5 116.195286215 91.7595650662 117.7
6 116.622796412 115.25449028 118.5
7 118.748983122 119.789764968 118.4
8 121.098679561 107.532586121 121.1
9 117.614868291 120.763363564 120.0
10 115.438044791 109.776689962 117.7
11 114.906238595 115.068710391 116.5
12 116.709747135 111.356021988 117.6
13 116.006504665 116.470179101 116.7

退職しました

本日付けで14年余り勤めた会社を退職。

「やっとこの日が来た」

辞めると決めてから4ヶ月間。長かった。

一応14年も勤めた会社を辞めようとするわけだから、退職の日まで色々と考えるのだけれど、ある時ふと随分前に辞めた人が言ってたことを思い出した。その人は

「あっという間に退職日が来てしまった」

と、とても不安そうな様子で呟いていた。その人は勢いで辞めちゃったのかな?という感じでもあったので、具体的な退職日が決まって1、2日くらいは、そんなに不安になるものなのかと戦々恐々としていたけど、僕の場合は、長い!待ちきれ無い!という毎日でやっと今日という日を迎えました。冒頭の「やっと〜」というのはそんな気持ちの現れかな。

この辺の感じかたは、退職というものへのスタンスというか、物の見方なのか、はたまた辞めた後に行く先があった(前述の人が辞めるタイミングでは行き先は無かった。今もどうしてるか不明)というタイミングの良さも手伝っていると思う。

タイミングの良さ(悪さ?)や物の見方と言えば、先日、千原ジュニアさん、福山雅治さんがご結婚されたそうで、大変めでたいのですが、この結婚発表のタイミングや各所でネットに書き込まれた内容が色々と面白い。

タイミング的には千原ジュニアさんが結婚の報告をした直後に福山雅治さんの結婚報告という流れが神掛かってる。

千原Jr.「ほんでぇ、結婚報告したんすよ」

千原Jr.「そしたらその一、二時間後ですわ、福山雅治結婚、ドォーン!相手はこれまたドォーン、吹石一恵!ってニュース記事がブァ~なってぇ、話題全部持ってかれましたわ」

もうね、こうなることが見えてる。ずっとネタに出来る。多分、僕は顔を見ただけで笑える自信がある。
芸人としては、ある意味最高の結婚祝いなわけです。ネタとしては最高だし、話題の上書きという意味では、悲しい。もうタイミングが良いのか悪いのか全然分からない。こうなると正に物の見方や当人の気持ち一つ。

また一連の結婚報道をうけて独身男性が集う某所で以下のような書き込みがあったのが印象的だった。

福山雅治でも、結婚まで46年掛かったんだから俺たちが結婚出来てなくても仕方ない。

という書き込みに対して

馬鹿か?
福山雅治だから46才でも結婚出来たんだよ。

これもどちらの言い分もわかるし、きっと後者が真実なのだろうが、僕は前者の方が好きだなぁ。超ポジティブ。


勤続14年とちょっと。これを14年無駄にしたと思うか、次のステップのために14年間掛けて力を蓄えたと考えるか自分次第だし、次のステップと言っても、職場自体は変わらず所属が変わるだけという普通に考えると変な転職なので業界の事情疎い人に話すと???となっちゃう。

自身にしても、明日からの生活が変わるわけでも無いので余り実感がない。

こんなシームレスでウルトラCのような退社&転職を可能にしてくれたのは、僕のわがままに我慢強く付き合って、色々と相談に乗ったり力になってくれた上司の皆様のお陰です。
もう、ただただ感謝しかありません。

明日からも普段どおり、ゆる〜く頑張ります。

jbpm備忘録6 プロセスロック

Processインスタンスのロックについて調べた。

結論から言うと、org.jbpm.db.GraphSession.lockProcessInstaceは、JBPMのデータJBPM_PROCESSINSTANCEテーブルをselect for updateする実装だ。

lockProcessInstanceの実装は以下のようになっており、肝はsession.loadの部分のLockMode.UPGRADEだ。

    public void lockProcessInstance(long processInstanceId) {
        try {
            session.load(ProcessInstance.class, new Long(processInstanceId), LockMode.UPGRADE);
        }
        catch (HibernateException e) {
            handle(e);
            throw new JbpmPersistenceException("could not lock process instance "
            + processInstanceId, e);
        }
    }

LockModeの内容を見てみると以下のようになっている。 注目すべきは、UPGRADEの注釈に、using select ... for updateとあることだ。 for updateをサポートしていないDBだって同然あるので、実際にJBPM_PROCESS_INSTANCEをロックする際に使用されるSQLはDBによって違いが出てくるはずだ。

Instances represent a lock mode for a row of a relational database table. 
It is not intended that users spend much time worrying about locking 
since Hibernate usually obtains exactly the right lock level automatically. 
Some "advanced" users may wish to explicitly specify lock levels.

    public final class LockMode implements Serializable {
        private final int level;
        private final String name;
        private static final Map INSTANCES = new HashMap();

        private LockMode(int level, String name) {
            this.level=level;
            this.name=name;
        }

An upgrade lock. Objects loaded in this lock mode are materialized 
using an SQL select ... for update.
 
        public static final LockMode UPGRADE = new LockMode(10, "UPGRADE");

        中略...

        static {
            INSTANCES.put( NONE.name, NONE );
            INSTANCES.put( READ.name, READ );
            INSTANCES.put( UPGRADE.name, UPGRADE );
            INSTANCES.put( UPGRADE_NOWAIT.name, UPGRADE_NOWAIT );
            INSTANCES.put( WRITE.name, WRITE );
            INSTANCES.put( FORCE.name, FORCE );
        }

実際にどのようなSQLを発行しているかは、jboss-log4j.xmlのcategroy org.hibernateをDEBUGレベルにしてみればわかる。 ちなみにoracleの場合は、for updateによるロックを行っていた。

lockProcessInstanceがこのような実装なので、Thread間で同一のProcessInstanceの内容を参照、更新する場合においては、lockProcessInstanceをid指定で行った後に、ProcessInstanceの実体を取得することが望ましい。

何故なら、ProcessInstanceをロックのパラメータに指定する方のlockProcessInstanceを使っていたため、稀にlockProcessInstanceを行う前に取得したProcessInstanceが別のThreadに書き換えられlock時StaleObjectStateExceptionが発生するという現象に私はどっぷりと嵌り、随分と悩まされたからだ。

ProcessInstanceの取得と同時に、ロックできないのって厳しいなぁ、、

もんげ~

子供がね、コマさん大好きなわけですよ。5,6歳の子供がいる人で、コマさんを知らない人は中々いないかなと思うのだけれど一応紹介すると、妖怪ウォッチに登場するプリチー属性?の狛犬妖怪、それがコマさん。 口癖は「もんげ~」と「ズラ」。まぁカワイイ。

で、コマさん IN UFOキャッチャー⇒子供発見⇒手遅れ

のコンボ炸裂で、仕方なく100円投入。

まぁ、100円で取れるほどUFOキャッチャーは甘くない。技術や知識、つまり狙いどころにドンピシャで合わせる技術や、人形の形状や重心を把握、店のアームの特性の理解といった知識面での武装は前提で、更には、両替のタイミングで、漁夫の利を得ようとするハイエナ(別のお客様)から商品を守ったり、ピンチになった時に店員さんに商品の位置をずらしたりして、助けてもらうためのコミュニケーションスキル。これらがすべて詰まった言うなれば、人生の縮図、それがUFOキャッチャー。そんなに簡単ではないのだ!


そういった思いを託して、子供に「いやぁ~難しいねぇ~」の一言で適当に誤魔化してみたが、諦めきれない様子。コミュニケーションスキル云々言っておいて子供一人説得できない。俺、無様すぎる。


仕方ないので、スキル「父親の意地」(別名、無駄遣い)やスキル「場外乱闘」(別名、店員さんに土下座でお願い)等を発動し、普通におもちゃ屋さんで買えば良かった気もする程度に散財して何とかゲット。


f:id:taka23kz:20150922113551j:plain



しゃべってるコマさんが見たい人はこちらがおすすめ。



ダイハツ公式 WAKE パロディCM 妖怪兄弟 ゴルフ篇 - YouTube



そしたら子供が大はしゃぎでコマさんを抱きしめる。

ここまでは良いんだけど、歩きながらコマさん語を連発。「XXズラ~」、「XXズラよ?」とか連発。
頭部を偽装してる方々を刺激しないかちょっと不安になるのでやめてほしいが、その理由を説明しようにも相手は5歳。上手く伝わらず、、、


こっちが「もんげ~」言いたいわ。