ランダム迷路をコーディング
モチベーション
昔よく遊んだゲームで「トルネコの大冒険」というのがありました。いわゆるローグ系の走りで毎回変わるダンジョンの配置に驚かされたものです。今回はそのダンジョンをランダムに作る・・・と思ったのですが、頭で考えた限りではちょっと設定がめんどくさそうかなぁと。そこで、トルネコのダンジョンのかなり下の階にでてくる、ランダム迷路をつくってみようかと思いました。いまの私の実力にちょうどいい。よし、それをPythonでやってみようぞ!
まずは結果から
こんなんを出力しました。にょきにょき伸びていく感じがなんとも気持ち悪くて俺好みですよ。
きちんと迷路になっています。定義としてはループをつくらない、マスを全部埋めていく、ということを念頭においてました。まあ、よくみると埋まっていないますもあるのですが、まあ、おおめに見てください。
全部のコード
import numpy as np import random import matplotlib.pyplot as plt import matplotlib.animation as animation import matplotlib.patches as patches %matplotlib inline from IPython.display import HTML class MakeMaize(): def __init__(self): self.size = [60,60] self.holes = [[[1,1,1,1] for i in range(self.size[1])] for j in range(self.size[0])] self.holes[0][0] = [0, 0, 1, 1] self.driller = [] self.died = [] self.dlog = [] #上下左右のマスに動けるかチェック。[下、左、上、右]でいけたら1 def check_available(self, plr): direction = [1,1,1,1] # 今来た道は戻れない direction[(plr["f"]-2)%4] = 0 # 壁にいるときは壁側に移動できない if plr["p"][0] == 0: direction[1] =0 if plr["p"][1] == 0: direction[0] =0 if plr["p"][0] == self.size[0] - 1: direction[3] = 0 if plr["p"][1] == self.size[1] - 1: direction[2] = 0 # それ以外で、すでに埋まっている場所を確認(holesに記録) x = plr["p"][0]; y = plr["p"][1]; for i, d in enumerate([[0,-1],[-1,0],[0,1],[1,0]]): dx = x + d[0]; dy = y + d[1]; if direction[i] ==1: #print "DX:DY:", dx, dy, self.holes[dx][dy] ix = 1 for j in self.holes[dx][dy]: ix *= j direction[i] = ix # 結果を返す return direction # 3から9までの値をランダムに返す。分岐、折れ曲がりのタイミングを設定 def ran_gene(self): return random.choice(range(3,10)) # ルーティン drillerが場所を定義 def step_forward(self, c): def direc(f, p, g): x, y = 0, 0 if f == 0: y = - 1 if f == 1: x = - 1 if f == 2: y = 1 if f == 3: x = 1 while len(self.dlog) != c+1: self.dlog.append([]) self.dlog[c].append([[p[0], p[0]+x], [p[1], p[1]+y]]) return [p[0]+x, p[1]+y] # Drillerの1ステップ for d, drl in enumerate(self.driller): # 現在の動ける場所を確認 av_dire = self.check_available(self.driller[d]) # 動ける場所がない場合は動ける場所にワープ if av_dire == [0, 0, 0, 0]: cands = [] # 過去ログ中からランダムに動ける場所に移動 pick = random.choice(self.dlog) random.shuffle(pick) for p in pick: cand = self.holes[p[0][0]][p[1][0]] if sum(cand) > 0: ordr = [0, 1, 2, 3] random.shuffle(ordr) for o in ordr: if cand[o] == 1: self.driller[d]["f"] = o self.driller[d]["p"] = [p[0][0], p[1][0]] break if self.driller[d]["p"] == [p[0][0], p[1][0]]: break # ターン、分岐のカウントを一つずつ減らす self.driller[d]["tc"] -= 1 self.driller[d]["sc"] -= 1 # 現在の進む向き f = self.driller[d]["f"] av_dire[(f-2)%4] = 0 # 現在の向きに進める場合、ターンするカウントが0出ない場合 # 現在の方向に一つ進む if av_dire[f] == 1 and self.driller[d]["tc"] != 0: self.driller[d]["p"] = direc(f, self.driller[d]["p"], d) av_dire[f] = 0 # 進める方向からランダムに一つ方向をえらぶ # 前に進めない場合の対処 way = [] for i, v in enumerate( av_dire): if v == 1: way.append(i) if len(way) > 0: af = random.choice(way) # ターンカウントが0のとき # 進める方向にターンする if self.driller[d]["tc"] <= 0: self.driller[d]["p"] = direc(af, self.driller[d]["p"], d) self.driller[d]["f"] = af # 分岐カウントが0のとき # 新しいdrillerを作成してリスト追加、進める方向に進ませる elif self.driller[d]["sc"] <= 0: #print "\tAF", af, av_dire, self.driller.append({ #"p": direc(f, self.driller[d]["p"]), "p": self.driller[d]["p"], "f": af, "sc": self.ran_gene(), "tc": self.ran_gene() }) av_dire[af] = 0 else: if d not in self.died: self.died.append(d) # 各カウントが0になったときにランダムに値を設定 if self.driller[d]["tc"] == 0: self.driller[d]["tc"] = self.ran_gene() if self.driller[d]["sc"] == 0: self.driller[d]["sc"] = self.ran_gene() self.holes[self.driller[d]["p"][0]][self.driller[d]["p"][1]] = list(av_dire) return 0 # ログの表示 def print_now(self, c): print c log = [] for i, drl in enumerate(self.driller): print " ", "PLY", i, "P:", drl["p"], "F:", drl["f"], "SC:", drl["sc"], "TC", drl["tc"] log.append(drl["p"]) self.logs.append(log) def start(self): # 初期のdrillerの配置 self.driller.append({"p": [0, 0], "f": 3, "tc": self.ran_gene(), "sc": self.ran_gene()}) #self.driller.append({"p": [self.size[0]-1, self.size[1]-1], "f": 1, "tc": self.ran_gene(), "sc": self.ran_gene()}) # 各drillerを動かす。 c = 0 while(True): #self.print_now(c) code = self.step_forward(c) if code < 0: break if len(self.died) == len(self.driller): break c += 1 if c == 500: break dlog = [] p_old = [] print len(mm.dlog)
これを使って可視化します。
mm = MakeMaize() mm.start() fig = plt.figure() ax = plt.gca(axisbg='black') ax.set_xlim(-1, mm.size[0]+1) ax.set_ylim(-1, mm.size[1]+1) fig.patch.set_facecolor('black') def init(): #line.set_data([0,0], [0,0]) #return line, return [] def animated(i): patches = [] for xy in mm.dlog[i]: x, y = xy patches.append(ax.add_patch( plt.Rectangle((x[0], y[0]), x[1]-x[0], y[1]-y[0], color="white", edgecolor="white", linewidth="2.5"))) return patches ani = animation.FuncAnimation(fig, animated, frames=len(mm.dlog), init_func=init, interval=100, blit=True) ani.save("makemaize.gif",writer='imagemagick') HTML(ani.to_html5_video())
嫁のいない土曜の昼は・・・
さぁ、土曜日だ。嫁も朝から外出中。こんな昼はそうだあれしかない。嫁がいない休みの昼にしか出ないことをするんだ。そう、それは・・・
そうめん祭りじゃ~
ふぅーーーーーー、いやっはっ!!!
そうだよ、そうめんをたくさん食うなんて暴挙は一人じゃなきゃできない暴挙、贅沢、(パチン、)すしざんまい!!!一束、二束、チっチっチっ、嫁がいない土曜の昼になんたる甘ったれたことを・・・。ふざけんなよ、三束に決まってるでしょーが!ふひゃーい、待ってろよ!
んっ、何、食生活の偏りが心配だと・・・?はっはっはっ、その点は抜かりはない。これをみよ!
とりごもくおむすびとポテトサラダ
もう一度いう、とりごもくおむすびに、ポテトサラダ。かつてこんな最強な組み合わせがあっただろうか、とりごもく、ポテトサラダ、もちろんメインはそうめんだっ!!!ナイスバランス!!SMAPでいえば中居くんのような絶っ妙なバランス感覚ぅ~。 向かうところ敵なし、鬼に金棒、さぁこれでみんなも恐れおののいたはずだっ!
さて、メインだよメイン。そうめんゆでちゃうよ。三束だよ、三束。はっはっはっ、
ここから先のお楽しみにはおめぇらにレポートするわけにはいかねぇ。なにがおきたかは内緒だ。これだけ伝えてやっただけでも感謝してほしい。それじゃぁまたPythonの世界で会おう!
ライフゲームをコーディング
モチベーション
あたらしい人工知能の教科書 プロダクト/サービス開発に必要な基礎知識
- 作者: 多田智史
- 出版社/メーカー: 翔泳社
- 発売日: 2017/01/10
- メディア: Kindle版
- この商品を含むブログを見る
この本読んでます。知っていることから知らないこと、新しい知識がいっぱいつまっていて読み応えは十分。 そのなかでライフゲームというゲーム?があることを初めて知りました。ルールは以下の通りです。
大きなグリッド内で一マスの生物が生きている、もしくは死んでいる状態で存在している。 隣り合う8つのマスの状態でそのマスの次の生存状態がきまる - 死んでいるマスの周りで3つの生きているマスがいると、次にそのますは生きている状態になる - 生きているマスの周りで生きているマスが1つ以下だと、次にそのマスは過疎で死ぬ - 生きているマスの周りで生きているますが4つ以上だと、次にそのますは過密で死ぬ
それ、Pythonでやってみましょう!
コーディング
import numpy as np import random import matplotlib.pyplot as plt import matplotlib.animation as animation import matplotlib.patches as patches %matplotlib inline from IPython.display import HTML class Seizon(): def __init__(self): self.h = 50 self.v = 50 self.space = [[0 for i in range(self.h)] for j in range(self.v)] self.cycles=15 self.start_val = 0 self.rectPtrn = [] def nextage(self, x, y): a_cell = 0 for i in [-1, 0, 1]: for j in [-1, 0, 1]: if x+i < 0 or x+i > self.h - 1 or \ y+j < 0 or y+j > self.v - 1 or (i==0 and j==0): pass elif self.space[x+i][y+j] == 1: a_cell += 1 if self.space[x][y]==0: if a_cell == 3: return 1 return 0 if self.space[x][y]==1: if a_cell == 2: return 1 return 0 def check_life(self): for i in range(self.v): for j in range(self.h): test = self.nextage(i,j) self.space[i][j] = test def random_set(self, d=2): c = 0 for i in range(self.v): for j in range(self.h): self.space[i][j] = random.randint(0,99) % 2 c += self.space[i][j] self.start_val = c def calc_alives(self): c = 0 for i in self.space: for j in i: c += j return c def pickRect(self): h = 0 v = 0 getRect = [] for i in self.space: v = 0 h += 1 for j in i: v += 1 if j == 1: getRect.append([v,h]) self.rectPtrn.append(getRect) def __main__(self): self.random_set() for t in range(self.cycles): val = self.calc_alives() print str(t) + " : trial ", print val * 1.0 /self.start_val, val self.pickRect() self.check_life() print len(self.rectPtrn) sz = Seizon() sz.__main__()
出力
0 : trial 1.0 1236 1 : trial 0.532362459547 658 2 : trial 0.366504854369 453 3 : trial 0.25 309 4 : trial 0.155339805825 192 5 : trial 0.0873786407767 108 6 : trial 0.0647249190939 80 7 : trial 0.0493527508091 61 8 : trial 0.0404530744337 50 9 : trial 0.0364077669903 45 10 : trial 0.037216828479 46 11 : trial 0.0380258899676 47 12 : trial 0.037216828479 46 13 : trial 0.0355987055016 44 14 : trial 0.0364077669903 45
ランダムで50%程度のマスカラ始めた場合、10回前後で大体3.5%で生き残り続けるようですね。この値は最初の配置で変わるようですが、3~4%ぐらいのようです。では実際どんな感じで生きているんでしょうか。アニメーションを使ってみてみましょう。
アニメーションをつかって可視化
fig = plt.figure() ax = plt.gca() ax.set_xlim(1,50) ax.set_ylim(1,50) #ax.set_aspect(1) def init(): return [] def animated(i): plt.cla() patches = [] print i, len(sz.rectPtrn[i]) for r in sz.rectPtrn[i]: #for r in [[1, 1], [2,2], [3,3]]: patches.append(ax.add_patch(plt.Rectangle((r[0],r[1]), 1, 1, fc="Blue"))) return patches ani = animation.FuncAnimation(fig, animated, frames=sz.cycles, init_func=init, interval=1000, blit=True) HTML(ani.to_html5_video())
こんなんが出ました。面白いですね。きまった型になってそのままキープしている様子がうかがえます。
天邪鬼的に修正天動説の動画GIFをコーディングしてみた
モチベーション
僕は生まれてこのかた、自分の感覚的に地動説が正しいと感じることがありません。この地球上にいる以上は天動説こそが真理に感じてしまいます。
ではなぜそれが正しくないということを知っているかというと、こちらのエントリにかかれているような科学の巨人達の肩の上にのって高等教育を受けさせてもらったことに他ならないのです。百聞は一見にしかずとは言いますが、目で見たことが正しいとも限らない、ということがあるのでなかなか難しいです。
一方で天動説を修正してみれば地球を中心とした正しい太陽系の図も作れるんですよね。ようはどこから観測するかの違いですもんね。地動説は神の視点でみたものですが、この修正天動説は地球上の観測者を固定して、より僕たちの実感に近いものになるはずです。
それ、Pythonでつくってみました
まずは地動説
ソースは後で掲載します。Jupyterコーディングしてアニメーションにしてみました。見やすさを考えて、太陽、水星、金星、地球、火星、月だけ。距離と速さは実際と同じ比率で設定していますが、月と地球の距離を実際比にするとあまりに地球に近くなるので実比よりだいぶ話しています。面倒なんで、月の公転速度も単純にして、太陽を回る地球の公転速度の1/12にしちゃいました。
まあ、見慣れていますよね。実にシンプル。念のため、真ん中が太陽で、内側から水、金、地、火の順に好転してます。地球の周りをまわっているのが月ですね。
続いて修正天動説
さて、地球を中心とするとどのようになるのでしょうか。。。
おお、なんかきしょくわるいっすね。真ん中が地球です。内側の円が月、外側が太陽になります。当然ほかの惑星は太陽の周りをまわっているんですね。
無理やりであることは承知の上ですが、こうした地球系のソーラーシステムというのも、閉じた宇宙空間では間違いではないと個人的に思うんですよね。もちろん、宇宙空間を説明するうえで、地動説がシンプルに働く、ということではあるのですが。
今回はJupyterの上で、Python2.7を使ってコーディングしました。まずは地動説のコード。超適当かつざっくり貼り付けます。
```python
import math
import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib.animation as animation
%matplotlib inline
%matplotlib nbagg
class Planet():
def __init__(self, ax, sp, dm):
self.ax = ax
self.sp = sp
self.dm = dm
def diameter(self):
return self.dm
def axis(self, time=0):
if self.ax == 0:
return (0.0, 0.0)
else:
return Ear.position(time)
def position(self, time=0):
spd = 0.0
if self.sp != 0: spd = 1.0/self.sp
rd = time * 2*math.pi/10 * spd
if self.ax == 0:
return math.cos(rd) * self.dm, math.sin(rd) * self.dm
else:
x, y = Ear.position(time)
return x + math.cos(rd)* self.dm, y + math.sin(rd)*self.dm
Sun = Planet(0, 0.0, 0.0)
Mer = Planet(0, 0.24, 0.39)
Ven = Planet(0, 0.62, 0.72)
Ear = Planet(0, 1.0, 1.0)
Mar = Planet(0, 1.89, 1.5)
Moon = Planet(1, 0.083, 0.1)
plnt = [Sun, Mer, Ven, Ear, Mar, Moon]
fig = plt.figure()
ax = plt.axes(xlim=(-1.6, 1.6), ylim=(-1.6, 1.6))
ims =
for p in plnt:
if p.ax==0:
circle = plt.Circle( p.axis(0), p.diameter(), fill=False)
ax.add_artist(circle)
for i in range(300):
x, y = ,
for p in plnt:
px, py = p.position(i*0.1)
x.append(px)
y.append(py)
im = plt.plot(x, y, "bo")
ims.append(im)
ani = animation.ArtistAnimation(fig, ims, interval=100)
plt.show()
```
そして修正天動説。
```python
import math
import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib.animation as animation
%matplotlib inline
%matplotlib nbagg
class Planet():
def __init__(self, ax, sp, dm):
self.ax = ax
self.sp = sp
self.dm = dm
def diameter(self):
return self.dm
def axis(self, time=0):
if self.ax == 0:
return (0.0, 0.0)
elif self.ax == 1:
return Sun.position(time)
else:
return Ear.position(time)
def position(self, time=0):
spd = 0.0
if self.sp != 0: spd = 1.0/self.sp
rd = time * 2*math.pi/10 * spd
if self.ax == 0:
return math.cos(rd) * self.dm, math.sin(rd) * self.dm
elif self.ax == 1:
x, y = Sun.position(time)
return x + math.cos(rd)* self.dm, y + math.sin(rd)*self.dm
else:
x, y = Ear.position(time)
return x + math.cos(rd)* self.dm, y + math.sin(rd)*self.dm
Sun = Planet(0, 1.0, 1.0)
Mer = Planet(1, 0.24, 0.39)
Ven = Planet(1, 0.62, 0.72)
Ear = Planet(0, 0.0, 0.0)
Mar = Planet(1, 1.89, 1.5)
Moon = Planet(0, 0.083, 0.1)
plnt = [Sun, Mer, Ven, Ear, Mar, Moon]
fig = plt.figure()
ax = plt.axes(xlim=(-2.0, 2.0), ylim=(-2.0, 2.0))
ims =
for p in plnt:
if p.ax==0:
circle = plt.Circle( p.axis(0), p.diameter(), fill=False)
ax.add_artist(circle)
for i in range(300):
x, y = ,
for p in plnt:
px, py = p.position(i*0.1)
x.append(px)
y.append(py)
im = plt.plot(x, y, "bo")
ims.append(im)
ani = animation.ArtistAnimation(fig, ims, interval=100)
plt.show()
```
その他メモ
動画GIFをつくるのに以下のサイトを参考にしました。
とても苦労したのは ffmpeg や ImageMagick のファイルパスを .matplotlibrc の設定ファイルに追加したのですが、クォーテーションでくくっているとダメなんですね。これを理解するのに6時間がかりでした。あー、無駄な時間を。。。
反復性肩関節脱臼 手術過程
GWを利用して反復性肩関節脱臼の手術をうけてきた。その経過を備忘録として記録します。入院は4日、2日目に手術となりました。反復性肩関節脱臼の前のエントリーは以下になります。
1日目
入院初日。午前中に病院に入る。入院手続きがすみ、病室へいく。スケジュールをなにも聞いておらず、看護師さんに確認すると明日の手術に合わせてシャワーのみで検査もないらしい。午後いっぱい、シャワー以外やることがなくなってしまった。体が悪いわけでもないので退屈でしょうがない。ミュートにしたテレビをみたり、本を読んだりしたのコンビニでコーヒーを飲んだりして時間をつぶす。6時の夕食も完食。明日の手術に向けて夜9時以降から絶食、飲み物も提供された経口補水液(ペットボトル3本で)のみ許されていて、明日の朝10時以降はそれも含めて絶飲。
次の日の手術は3番目ということが知らされる。だいたい昼前後だが、前の手術の状況によって前後するとのこと。主治医の先生も軽く顔出していただいて、軽い確認事項。
感じるのは同じ質問を別の人に何度もされること。これは手術で万一の失敗も防ぐための何重もののセーフティガードになっているのだろう。よく聞かれるのは、アレルギー、持病、常用薬、歯の状態(空気のチューブを入れるので、ぐらついている歯があったりすると折れてしまうらしい)など。
2日目
本日は手術の当日日。10時で一切の飲食禁止。午前中に点滴用の針を右腕にさす。早くて11時ということだったが、なかなかお呼びがかからない。すこし緊張していたがだんだんだれてきて、ぼんやり「やすらぎの郷」などをダラダラみる。1時半ごろようやく声がかかり、手術着に着替え。元気なので看護師さんのつれそいのもと歩いて手術室へ。緊張が高まる。担当者との挨拶ののち自分で手術台にのぼり横たわる。手術着がはぎとられた状態になる。(一応大きな布で覆われているが)。執刀医の先生が軽く声をかけてくれる。緊張をほぐそうとしてくれているのがわかる。手術前の確認の声をきいていると顔に麻酔のマスクがあてられる。しばらくするとうつろうつろして意識が遠のいてくる。
自分の名前を呼ぶ声で目を覚ます、返事をしたがのどに酸素のボンベが入っていたのでぐふっとなってしまうところで。また映像が途切れる。自分の乗っている台が運ばれている。左肩がが痛い。ああ、本当に手術が終わったんだと実感する。執刀医の先生が「うまくいきました。家族に説明しときました。」という旨の連絡をされるが、うつろ。エレベータから自分の病室へ。何人かの人力で体を持ち上げられ自分のベットへ。酸素マスクをつけられる。肩の痛みはあるが眠い。何度か目を覚ますがすぐ寝てしまったと思う。夜に酸素マスクはとられていたらしい。
夜中も何度か目を覚まし、肩の痛みを感じる。左肩は固定され、右腕には点滴、両足にエコノミー症候群対策のもみほぐす機械と弾性タイツがまかれた状態。何度かトイレに行くか尋ねられたと思うがたぶん断っている。手術前に行ってから一回も行っていない。
3日目
朝の5時30ごろ?夜勤の看護師さんにトイレを促される。ここでようやく意識がしっかりしてきた。左肩は痛いが自力で起き上がれたのは自信がついた。車いすに乗せられてトイレへ。いつの間にか着せられた昨日の手術着をまだきている。起き上がるとベットに血がついていた。あとから聞いたのだが、手術中に水を入れながらレンズを通すので残った水に血が混じって流れ出ているらしい。すべてが血ではないとのこと。その時はそんな話はきいていなかったが、あまり慌てはしなかった。トイレに行くのに車いすで移動。途中で倒れられたらこまるもんね。
ベットに戻って横になるも肩がかなり痛い。この手術をうけなければこの痛みはなかったよな、と少し弱気になる。朝ごはんが出たがおかずのみで、ご飯をたくさん残してしまった。あとから聞いたのだが、ご飯がきちんと食べられるまでは点滴がはずせないらしい。おとといの9時から断食して一日と半分ぐらいたっているが食欲はわかなかった。
しかし午前中のうちにだるさは回復していく。(肩は相変わらず痛い)トイレに行った際には看護師さんの付き添いのもと自力歩行でいく。お昼は完食して点滴も外してもらった。おそらく気持ちの問題だろうが肩の痛みも多少よくなっているように思えた。夜には左肩が吊るされていて動けない、こと以外はほぼいつもの調子に戻ったように思える。明日は退院、だがスケジュールがしらされておらず、本日は先生もいらっしゃらなかった。まあこっちの時間ならあるさ。
4日目
退院当日。肩の痛みは感じるものの、支障が出るほど大きくはない。看護師さんに予定を確認してもらったところ、先生はいらっしゃらず次の外来の時に詳しいお話をするとのこと。会計も休日なので次の外来でまとめてやってもらうとのこと。なのでもう身支度をして帰ってもよいといわれた。
身支度をゆっくりする。急な話で家族の助けも借りられなく、左肩の不自由さがあったが、元気だったので難はなかった。ひと段落したところでトイレにいって帰ったら先生が2人いらっしゃった。初対面かどうか自信が持てなかったが、手術室にいらっしゃった方だろうか。肩の消毒をしてもらい、自宅でのケアの方法について説明をうける。手術の説明や、抜糸、リハビリについてはやはりまた外来で後日とのことだった。
身支度が終わり看護師さんに確認後帰宅。人生初の入院と手術は幕を閉じた。
今回の入院では、病院のスタッフさんたちにはよくしていただいたのですが、特に看護師さんに非常に感謝をしています。並みな言葉だけど、献身的な看護で日本の医療の最前線をささえ、デリケートな患者との一番のインターフェイスになっていることを感じ、この方たちが日本の医療を支えていると身をもって実感しました。看護師の重労働な環境のニュースをよく聞きますが、ぜひ彼らの仕事が報われるものになってほしいですし、なにかそうした運動のサポートができればとも思っています。看護師さんマジ天使!
### 追記:一年後までの経過についてレポートしました
オルソケラトロジー 一週間経過
オルソのレポート忘れてました。実は月曜から装着して一週間近くたちました。安定した視力をだすためにということで、金曜までの5日間は弱めのソフトワンディをつけて、本日初めて裸眼の状態で生活しています。もちろん夜は毎日オルソを着用しています。
使用感として、通勤などで外で歩いたり電車に乗ったりするような通常の生活には問題ないです。そこには支障がありません。
一方で、デスクワークの仕事でディスプレイを見ているのが少しつらかった。普段大きめのディスプレイで作業面積を多くするために文字サイズを小さくして仕事をしているのですが、メガネの時からのギャップで文字がかすんでみえることが多かったです。メガネが安定して高い視力(両目で2.0)をキープしていたのですが、オルソとソフトでもそこまでいかないので、ちょっと前の環境がつらかった。設定を変更する必要がありそうです。あと、やはり時間や日によって度数がふらつくので、慣らすのが難しかった。
でもこのままオルソを続けていることで、一定値に安定をしてその環境にならすことができれば解決するのかなぁとも思っています。このまま継続していこうかと。継続によってどこまで度数がでるか、安定するかがポイントかな思っています。私の裸眼は中度の近視(0.1, D-3.25)なので、ある程度のところで限界がくると思うのですが、最低でも0.7、1.0まででたら御の字でしょう。
引き続きレポートしていきたいと思います。
オルソケラトロジー 体験期その1「検診とお試し版」
三十年以上、メガネ生活をしていたが、思うことがあり、ここにきてオルソケラトロジーという視力矯正方法をやってみることにした。
この強制方法は夜に特殊なコンタクトレンズをつけて就寝すると、コンタクトが角膜の形を変形させて、うまく焦点があうような癖がつき、翌朝目がよくなっているいうもの。癖をつけるだけなので日数がたつと元に戻ってしまうというもの。
ネットで病院の評判を確かめて電話の受け答えがよかったところに予約。初日は目の検診をして適用可能かの確認とお試し版のコンタクトをつけて使用具合を体験する。
受付で名前を述べて問診票に記入した後、しばらくすると目の検査のために呼ばれる。これらは健康診断で行われるような焦点や、眼圧などに加えさらに特殊な検査もあった。おそらく角膜の状況を確認したりなどがあった。さらにCの字を使った視力検査をおこなう。
自分の場合は裸眼で両目とも0.1をかろうじてキープ。度数でいえばD-3.0よりちょっと悪いくらいで、「中度の近視」に分類されるとのこと。乱視はほぼなかった。オルソケラトロジーは視力が悪すぎると効果があまり期待できないということで私の視力は適用範囲内にはなるようだ。角膜はきれいといわれた。
その後、お医者さんの検診、オルソケラトロジーの説明となった。Webで情報は読み漁っていたのでとくにサプライズはなく、すすめていくことができた。
その後いよいよお試し版のコンタクトの試着だ。担当の方に装着をしてもらう。これまでコンタクト歴がほぼないので、いきなりハードは異物感が大きく、まず目が開かことが難しい。視線を動かすたびに不快な感覚が呼び起こされる。装着後しばらくは目をつむる。しばらくして慣れてきて、携帯をみるために視線を下に落とすのはなんとかできたが、でも視線を動かすとつらい。この状態でもう一度お医者さんの検診をはさみながら一時間の待ち。
一時間後、再度お医者さんの検診。とりあえずコンタクトがずれたりとかの問題はないもよう。さらにコンタクトを外した状態の目の検査と視力検査がはいる。視力検査の結果、0.1=>0.2~0.3程度に上昇。本来なら就寝中の6-7時間でもっとしっかり癖をつけるのだが、1時間程度ならばこんなものだろう。たしかに装着前の裸眼より見えやすくなっているのは感じたのだが、劇的に、というわけではなかった。
とりあえず効果も確認ができ、適用に不安も少ないようなので、そのまま購入を依頼することにする。通常3-4日で自分のコンタクトが届くというので、その後定期的に検診をしながら使用をすすめていく。
裸眼生活がうまくいくとよいなー。