2011年5月29日日曜日

京都市の通り名住所(1)

京都市内では通り名をつけて特定する住所表記が使われてきました。
この理由として以下の2つを考えています。


・京都市中心部は通りが東西と南北にまっすぐに通っていることから、どのあたりかわかりやすくするため。
・同名の大字が複数あるケースが多くあり、それを特定するため。

通り名住所という表記方法が先で、これがあるから同名大字が複数存在しても困らないのかもしれません。

例えば、日本郵便の京都市中京区(なかぎょうく)のページでは、中京区内に「油屋町」として別々に2つの郵便番号(604-8063、604-8103)が割り当てられていて、それぞれが同名ながら別の大字として存在することを示しています。

では通り名住所の表記方法はどうなっているかと言うと、通り名2つで交差点を特定し、この交差点から大字まで道案内する要領でたどっていく、ということになっています。

例)京都市役所
京都市 中京区 寺町通御池上る 上本能寺前町 488番地


構造はこのようになります。
住所構造:案内文言+大字+番地
(上記のうち、)案内文言:通り名1+通り名2+方向


京都市役所の住所例ではこのようになります。
通り名:寺町通り、御池(通り)
方向 :上る


最初の2つの通り名で「交差点」を示します。
例では寺町通りと御池通りの交差点で、これが道案内の基点になります。

なお、住所地にある建物が面する通りを、基本的に1つ目の通り名にします。
また、2つ目の通り名は、末尾の「通り」という文字を省略する習慣です。

次に方向です。
東:東入る、東入(ヒガシイル)
西:西入る、西入(ニシイル)
南:下る(サガル)
北:上る(アガル)


このうち、「上る」「下る」の読み方は注意が必要です。
文部科学省が指定した表記と読みの組み合わせは、
上がる-アガル、上る-ノボル
下がる-サガル、下る-クダル
ですが、京都市内ではこのルールは通用せず、フリガナの「が」を省略します。

こうしていよいよ大字名になりますので、住所例の場合、「寺町通りと御池通りの交差点」から「北」に進んだところにある「上本能寺前町」ということになります。
なお、「北に進んだところ」とはその周辺のことであり、最終地点が通りの右側か左側かはわかりません。
京都市内は「両側町(りょうがわちょう)」と言って、同じ通りの両側の地域が一つの「町」を形成してきた歴史がありますので、この表記が適していたと思われます。

京都市役所の場合は、案内文言の示す領域のうち、東側にありました。



大きな地図で見る
 

京都市役所は「寺町通り」「御池通り」の他に、「河原町通り」「押小路通り」にも面しているので、別の通り名住所の表記も可能です。

このあたりのことがよくまとまっているサイトを紹介しておきます。
ジオどす 京の通り名

2011年5月6日金曜日

python:100マスゲーム

1から100までの数字を1つずつ縦横10×10のマス目にランダムに書いたものを用意します。
そして、1から小さい順に消していき全部消すのにかかる時間を競います。
いわゆる、頭の体操の定番です。


私は最初8分もかかりましたがだんだんタイムを縮め6分でできました。
小中学生だと5分もかからないようです。
似たようなゲームとしては「Count Touch」「数字順探し」などがネット上にあり、マス目でなかったり、制限時間があったり、数字が100個もなかったり、値にマイナス値があったり、といったバリエーションがあります。
「小さい数字を順に探す」などでネット検索するといくつもひっかかります。

さて、このゲームの用紙を作るところをpythonで作ってみました。
ロジックは以下のとおりです。
1から100の連番とこれに対応した乱数の組を発生させます。
この組を乱数の昇順にソートすることでシャッフルします。
シャッフルした組の連番を10個ずつ10行のcsvファイルに出力します。


ここまでをpythonで作成し、この出力csvファイルを表計算ソフトで開いて枠線やフォントサイズを整えて印刷します。
「シャッフルした1から100までの連番の10個ずつ10行のcsvファイル」作成プログラムは以下のとおりです。


# -*- coding: shift_jis -*-
#
# 100masu.py
#
import os,sys,random

def Make100masu(n):
 """ 100マス表作成
 1~100までの数字をすべて1つずつ使用し、
 10行10列にランダムに配置したcsvファイルを作成する。
 args:
  n: 出力ファイル名に付ける番号
 """
 #出力先フォルダ:このスクリプトと同じフォルダ
 sOtFdr = os.path.dirname(sys.argv[0])
 #出力ファイル名:「100masuXX.csv」
 sOt = os.path.join(sOtFdr, "100masu"+str(n).zfill(2)+".csv")
 #出力ファイル既存時は削除しておく
 if os.path.isfile(sOt): os.remove(sOt)

 #[乱数値、連番(1~100)]を要素とするリストを作成
 L0 = [[random.random(),i+1] for i in xrange(100)]

 #乱数値>連番の優先順位で並び替え
 L1 = sorted(L0)

 #出力ファイルを書込み用に開く
 f = open(sOt, "w")
 #100の配列要素を10行10列に出力
 for i in xrange(10): #行番号
  for j in xrange(10): #列番号
   #要素のうち連番を取り出し文字型に変えて出力する。
   f.write(str(L1[i*10+j][1]))
   #要素9個までは半角カンマ、10個目は行末文字を出力する。
   f.write({True:",", False:"\n"}[j<9])
 f.close()
 return None

if __name__=="__main__":
 #とりあえず10個作成します。
 for i in xrange(10):
  Make100masu(i+1)



・random.random()
 乱数の発生。細かい指定もできるが、当プログラムではソートキーにするだけなので特に指定なしで実行する。
・for i in xrange(100):
 0~99までの100個の数字を順に発生させる。
 range関数は発生させる値をメモリーに展開するが、xrange関数はメモリー展開しないのでメモリーを節約できる。当プログラムの100程度ならばどちらでも大差ない。
・{True:",", False:"\n"}[j<9]

 {}内は辞書型(連想配列)で、直後の[]内の式の値をキーにして対応する値を返します。j<9ならばTrueとなり「、」が返り、j≧9ならばFalseとなり「\n」を返します。