京都市内中心部の通りには、東西の通りと南北の通りがあり、それぞれにわらべ歌があります。
今回は南北の通り名のわらべ歌です。東から順に歌っていきます。
(なお、わらべ歌にない通り名でも住所表記に使うことがあります)
1.歌詞
○南北の通り名のわらべ歌(通称:寺御幸 てらごこ)
てら ごこ ふや とみ やなぎ さかい
たか あい ひがし くるまやちょう
からす りょうがえ むろ ころも
しんまち かまんざ にし おがわ
あぶら さめがいで ほりかわのみず
よしや いの くろ おおみやへ
まつ ひぐらしに ちえこういん
じょうふく せんぼん はてはにしじん
2.実際の通り名
寺町通り (てらまちどおり)
御幸町通り(ごこまちどおり)
麩屋町通り(ふやちょうどおり)
富小路通り(とみのこうじどおり)
柳馬場通り(やなぎのばんばどおり)
堺町通り (さかいまちどおり)
高倉通り (たかくらどおり)
間之町通り(あいのまちどおり)
東洞院通り(ひがしのとういんどおり)
車屋町通り(くるまやちょうどおり)
烏丸通り (からすまどおり)
両替町通り(りょうがえちょうどおり)
室町通り (むろまちどおり)
衣棚通り (ころものたなどおり)
新町通り (しんまちどおり)
釜座通り (かまんざどおり)
西洞院通り(にしのとういんどおり)
小川通り (おがわどおり)
油小路通り(あぶらのこうじどおり)
醒ケ井通り(さめがいどおり)
堀川通り (ほりかわどおり)
葭屋町通り(よしやまちどおり)
猪熊通り (いのくまどおり)
黒門通り (くろもんどおり)
大宮通り (おおみやどおり)
松屋町通り(まつやちょうどおり)
日暮通り (ひぐらしどおり)
智恵光院通り(ちえこういんどおり)
浄福寺通り(じょうふくじどおり)
千本通り (せんぼんどおり)
※西陣(にしじん)は地域名です。通り名ではありません。
3.音声
・京美人三人娘が唄う京都の通り名の唄(京都修学旅行ワンダーランド)
地元の旅館関係者団体である、近畿日本ツーリスト協定旅館ホテル連盟教育旅行部会京都地区会のサイトです。
「南北の通り名の唄」の「聞く」をクリックします。
・京都数え歌(YouTube:bonten79488さんの投稿)
上記と同じ音源のようです。
・寺御幸のわらべ歌(京都銀行のサイト)
「唄を聴く」をクリックします。クリックしても聞こえない場合はRealPlayer形式の音声ファイルを再生できるソフトが必要です。
5.通りの位置の地図
以下が秀逸です。
・京都通り名マップ(株式会社ジオセンスのサイト)
一覧で通り名を選ぶとGoogleMAPに表示されます。
6.参考
全体の説明は以下が詳しいです。
・京都市内の通り(wikipedia)
2011年7月9日土曜日
2011年7月2日土曜日
python:ログ出力(2)
ログ出力について、簡単なクラス化をしてみました。
python標準のロギング機能はバージョン2.3以降使用可能です。
#
# -*- coding:sjis -*-
#
import os,sys,logging
#ログ出力クラス
class LogW():
"""
Properties:
path: ログファイル名
Logger: ロガー(ログ割振り機構)
Attention:
最低メッセージレベル以上のメッセージをログや画面に出力する。
"""
def __init__(self, sLog="", bDel=True, bLogLV=10, bGamenLV=20):
"""コンストラクタ
Args:
sLog: ログファイルフルパス。未指定時はソース".py"→".log"
bDel: 初期既存時削除か(bool)
bLogLV: ログファイル出力対象の最低メッセージレベル
bGamenLV: 画面表示対象の最低メッセージレベル
Attention:
レベ:0=NOTSET,10=DEBUG,20=INFO,30=WARNING,40=ERROR,50=CRITICAL
"""
#ログファイル名
if sLog: self.path = sLog
else: self.path = sys.argv[0][:-3]+".log" #".py"→".log"
if bDel and os.path.isfile(self.path): os.remove(self.path)
#レベル名称の変更
for level, name in zip([10,20,30,40],["_","I","W","E"]):
logging.addLevelName(level, name)
#ロガー(ログ割振り機構)
self.Logger = logging.getLogger("")
#ログファイルのハンドラー
self.logfilehdlr = logging.FileHandler(self.path)
self.Logger.addHandler(self.logfilehdlr)
#画面のハンドラー
self.consolehdlr = logging.StreamHandler()
self.Logger.addHandler(self.consolehdlr)
#ルートロガーは全メッセージが通るようにしておく
logging.root.setLevel(logging.NOTSET)
#出力レベルの設定
self.setlevel(bLogLV, bGamenLV)
#デストラクタ
def __del__(self):
self = None
def setformat(self, T=True, V=False):
"""メッセージ書式の設定
Args:
T: 日時出力(bool)
V: レベル名称出力(bool)
"""
s = ""
if T: s = "%(asctime)s "
if V: s+= "%(levelname)s "
s+= "%(message)s"
formatter = logging.Formatter(s, "%Y/%m/%d %H:%M:%S")
self.logfilehdlr.setFormatter(formatter)
self.consolehdlr.setFormatter(formatter)
def setlevel(self, iLogV=10, iGamenV=20):
"""出力レベルの設定
Args:
iLogV: ログファイル出力対象の最低メッセージレベル
iGamenV: 画面表示対象の最低メッセージレベル
Attention:
レベ:0=NOTSET,10=DEBUG,20=INFO,30=WARNING,40=ERROR,50=CRITICAL
"""
self.logfilehdlr.setLevel(iLogV)
self.consolehdlr.setLevel(iGamenV)
def I(self, msg="", T=True, V=False, G=True, L=True):
"""情報レベルメッセージの出力
Args:
msg: メッセージ
T: 日時出力(bool)
V: レベル名称出力(bool)
G: 画面出力(bool)
L: ログ出力(bool)
"""
if not G: self.setlevel(iGamenV=100) #画面出力可否
if not L: self.setlevel(iLogV=100)
self.setformat(T, V)
self.Logger.info(msg)
self.setlevel() #画面出力可否、ログ出力可否をクリア
if __name__=="__main__":
log = LogW()
log.I("a:日時出力、ログ抑止、画面出力",L=False)
log.I("b:日時出力、ログ出力、画面抑止",G=False)
log.I("c:日時抑止、ログ出力、画面出力",T=False)
log.I("d:日時出力、ログ出力、画面出力")
log.setformat(V=True) #レベル名称出力可
log.Logger.info("情報レベル")
log.Logger.warning("警告レベル")
log = None
----------
結果
○画面(標準出力)
ケースa、c、dを出力。
2011/07/02 07:45:27 a:日時出力、ログ抑止、画面出力
c:日時抑止、ログ出力、画面出力
2011/07/02 07:45:27 d:日時出力、ログ出力、画面出力
2011/07/02 07:45:27 I 情報レベル
2011/07/02 07:45:27 W 警告レベル
○ログファイル
ケースb、c、dを出力。2011/07/02 07:45:27 b:日時出力、ログ出力、画面抑止
c:日時抑止、ログ出力、画面出力
2011/07/02 07:45:27 d:日時出力、ログ出力、画面出力
2011/07/02 07:45:27 I 情報レベル
2011/07/02 07:45:27 W 警告レベル
なお、関係する記事は以下です。
python:ログ出力
python標準のロギング機能はバージョン2.3以降使用可能です。
#
# -*- coding:sjis -*-
#
import os,sys,logging
#ログ出力クラス
class LogW():
"""
Properties:
path: ログファイル名
Logger: ロガー(ログ割振り機構)
Attention:
最低メッセージレベル以上のメッセージをログや画面に出力する。
"""
def __init__(self, sLog="", bDel=True, bLogLV=10, bGamenLV=20):
"""コンストラクタ
Args:
sLog: ログファイルフルパス。未指定時はソース".py"→".log"
bDel: 初期既存時削除か(bool)
bLogLV: ログファイル出力対象の最低メッセージレベル
bGamenLV: 画面表示対象の最低メッセージレベル
Attention:
レベ:0=NOTSET,10=DEBUG,20=INFO,30=WARNING,40=ERROR,50=CRITICAL
"""
#ログファイル名
if sLog: self.path = sLog
else: self.path = sys.argv[0][:-3]+".log" #".py"→".log"
if bDel and os.path.isfile(self.path): os.remove(self.path)
#レベル名称の変更
for level, name in zip([10,20,30,40],["_","I","W","E"]):
logging.addLevelName(level, name)
#ロガー(ログ割振り機構)
self.Logger = logging.getLogger("")
#ログファイルのハンドラー
self.logfilehdlr = logging.FileHandler(self.path)
self.Logger.addHandler(self.logfilehdlr)
#画面のハンドラー
self.consolehdlr = logging.StreamHandler()
self.Logger.addHandler(self.consolehdlr)
#ルートロガーは全メッセージが通るようにしておく
logging.root.setLevel(logging.NOTSET)
#出力レベルの設定
self.setlevel(bLogLV, bGamenLV)
#デストラクタ
def __del__(self):
self = None
def setformat(self, T=True, V=False):
"""メッセージ書式の設定
Args:
T: 日時出力(bool)
V: レベル名称出力(bool)
"""
s = ""
if T: s = "%(asctime)s "
if V: s+= "%(levelname)s "
s+= "%(message)s"
formatter = logging.Formatter(s, "%Y/%m/%d %H:%M:%S")
self.logfilehdlr.setFormatter(formatter)
self.consolehdlr.setFormatter(formatter)
def setlevel(self, iLogV=10, iGamenV=20):
"""出力レベルの設定
Args:
iLogV: ログファイル出力対象の最低メッセージレベル
iGamenV: 画面表示対象の最低メッセージレベル
Attention:
レベ:0=NOTSET,10=DEBUG,20=INFO,30=WARNING,40=ERROR,50=CRITICAL
"""
self.logfilehdlr.setLevel(iLogV)
self.consolehdlr.setLevel(iGamenV)
def I(self, msg="", T=True, V=False, G=True, L=True):
"""情報レベルメッセージの出力
Args:
msg: メッセージ
T: 日時出力(bool)
V: レベル名称出力(bool)
G: 画面出力(bool)
L: ログ出力(bool)
"""
if not G: self.setlevel(iGamenV=100) #画面出力可否
if not L: self.setlevel(iLogV=100)
self.setformat(T, V)
self.Logger.info(msg)
self.setlevel() #画面出力可否、ログ出力可否をクリア
if __name__=="__main__":
log = LogW()
log.I("a:日時出力、ログ抑止、画面出力",L=False)
log.I("b:日時出力、ログ出力、画面抑止",G=False)
log.I("c:日時抑止、ログ出力、画面出力",T=False)
log.I("d:日時出力、ログ出力、画面出力")
log.setformat(V=True) #レベル名称出力可
log.Logger.info("情報レベル")
log.Logger.warning("警告レベル")
log = None
----------
結果
○画面(標準出力)
ケースa、c、dを出力。
2011/07/02 07:45:27 a:日時出力、ログ抑止、画面出力
c:日時抑止、ログ出力、画面出力
2011/07/02 07:45:27 d:日時出力、ログ出力、画面出力
2011/07/02 07:45:27 I 情報レベル
2011/07/02 07:45:27 W 警告レベル
○ログファイル
ケースb、c、dを出力。2011/07/02 07:45:27 b:日時出力、ログ出力、画面抑止
c:日時抑止、ログ出力、画面出力
2011/07/02 07:45:27 d:日時出力、ログ出力、画面出力
2011/07/02 07:45:27 I 情報レベル
2011/07/02 07:45:27 W 警告レベル
なお、関係する記事は以下です。
python:ログ出力
2011年6月19日日曜日
京都市の通り名住所(2) 東西の通り
今回は京都の通り名です。
市内中心部の主だった通り名は、「わらべ歌」になっていますので、このわらべ歌について書きます。(なお、わらべ歌にない通り名でも住所表記に使います)
京都の通りは、東西の通りと南北の通りがあり、それぞれにわらべ歌があります。
今回は東西の通り名のわらべ歌です。曲名は歌詞の出だしに基づいて、丸竹夷(まるたけえびす)と通称されています。多少異なる歌詞も伝わっています。
北から順に歌っていきます。
1.歌詞
まる たけ えびす に おし おいけ
あね さん ろっかく たこ にしき
し あや ぶっ たか まつ まん ごじょう
せきだちゃらちゃら うおのたな
ろくじょう ひっちょう通り過ぎ
はっちょう越えれば とうじみち
くじょうおおじで とどめさす
2.実際の通り名
丸太町通り(まるたまちどおり)
竹屋町通り(たけやまちどおり)
夷川通り (えびすがわどおり)
二条通り (にじょうどおり)
押小路通り(おしこうじどおり)
御池通り (おいけどおり)
姉小路通り(あねやこうじどおり)
三条通り (さんじょうどおり)
六角通り (ろっかくどおり)
蛸薬師通り(たこやくしどおり)
錦小路通り(にしきこうじどおり)
四条通り (しじょうどおり)
綾小路通り(あやのこうじどおり)
仏光寺通り(ぶっこうじどおり)
高辻通り (たかつじどおり)
松原通り (まつばらどおり)
万寿寺通り(まんじゅじどおり)
五条通り (ごじょうどおり)
雪駄屋町通り(せきだやまちどおり) 現.楊梅通り(ようばいどおり)
魚の棚通り(うおのたなどおり)
六条通り (ろくじょうどおり)
七条通り (しちじょうどおり) 歌詞では「ひっちょう」
八条通り (はちじょうどおり) 歌詞では「はっちょう」
東寺道 (とおじみち)
九条通り (くじょうどおり) 歌詞では「九条大路」
3.音声
・京美人三人娘が唄う京都の通り名の唄(京都修学旅行ワンダーランド)
地元の旅館関係者団体である、近畿日本ツーリスト協定旅館ホテル連盟教育旅行部会京都地区会のサイトです。 「東西の通り名の唄」の「聞く」をクリックします。
4.別の歌詞
別の歌詞として、六条通り以降が以下のようになっているものも伝わっています。
ろくじょう さんてつ とおりすぎ
ひっちょう こえれば はっ くじょう
じゅうじょう とうじで とどめさす
この歌詞は最初の掲載した歌詞よりも広く伝わっているようですが、以下の2点の実態と合いません。
・塩小路通り(歌詞では「さんてつ」三哲通り)と七条通り(歌詞では「ひっちょう」)の順番が実際と逆です。
・東寺(世界遺産の寺院)は九条通りの北側です。
音声
・丸竹夷-京の通り名(YouTube:TerencaStumpさんの投稿)
5.通りの位置の地図
以下が秀逸です。
・京都通り名マップ(株式会社ジオセンスのサイト)
一覧で通り名を選ぶとGoogleMAPで太線表示されます。
6.参考
京都市内の通り名の全体説明は以下が詳しいです。
・京都市内の通り(wikipedia)
南北の通り名はまた今度です。
市内中心部の主だった通り名は、「わらべ歌」になっていますので、このわらべ歌について書きます。(なお、わらべ歌にない通り名でも住所表記に使います)
京都の通りは、東西の通りと南北の通りがあり、それぞれにわらべ歌があります。
今回は東西の通り名のわらべ歌です。曲名は歌詞の出だしに基づいて、丸竹夷(まるたけえびす)と通称されています。多少異なる歌詞も伝わっています。
北から順に歌っていきます。
1.歌詞
まる たけ えびす に おし おいけ
あね さん ろっかく たこ にしき
し あや ぶっ たか まつ まん ごじょう
せきだちゃらちゃら うおのたな
ろくじょう ひっちょう通り過ぎ
はっちょう越えれば とうじみち
くじょうおおじで とどめさす
2.実際の通り名
丸太町通り(まるたまちどおり)
竹屋町通り(たけやまちどおり)
夷川通り (えびすがわどおり)
二条通り (にじょうどおり)
押小路通り(おしこうじどおり)
御池通り (おいけどおり)
姉小路通り(あねやこうじどおり)
三条通り (さんじょうどおり)
六角通り (ろっかくどおり)
蛸薬師通り(たこやくしどおり)
錦小路通り(にしきこうじどおり)
四条通り (しじょうどおり)
綾小路通り(あやのこうじどおり)
仏光寺通り(ぶっこうじどおり)
高辻通り (たかつじどおり)
松原通り (まつばらどおり)
万寿寺通り(まんじゅじどおり)
五条通り (ごじょうどおり)
雪駄屋町通り(せきだやまちどおり) 現.楊梅通り(ようばいどおり)
魚の棚通り(うおのたなどおり)
六条通り (ろくじょうどおり)
七条通り (しちじょうどおり) 歌詞では「ひっちょう」
八条通り (はちじょうどおり) 歌詞では「はっちょう」
東寺道 (とおじみち)
九条通り (くじょうどおり) 歌詞では「九条大路」
3.音声
・京美人三人娘が唄う京都の通り名の唄(京都修学旅行ワンダーランド)
地元の旅館関係者団体である、近畿日本ツーリスト協定旅館ホテル連盟教育旅行部会京都地区会のサイトです。 「東西の通り名の唄」の「聞く」をクリックします。
4.別の歌詞
別の歌詞として、六条通り以降が以下のようになっているものも伝わっています。
ろくじょう さんてつ とおりすぎ
ひっちょう こえれば はっ くじょう
じゅうじょう とうじで とどめさす
この歌詞は最初の掲載した歌詞よりも広く伝わっているようですが、以下の2点の実態と合いません。
・塩小路通り(歌詞では「さんてつ」三哲通り)と七条通り(歌詞では「ひっちょう」)の順番が実際と逆です。
・東寺(世界遺産の寺院)は九条通りの北側です。
音声
・丸竹夷-京の通り名(YouTube:TerencaStumpさんの投稿)
5.通りの位置の地図
以下が秀逸です。
・京都通り名マップ(株式会社ジオセンスのサイト)
一覧で通り名を選ぶとGoogleMAPで太線表示されます。
6.参考
京都市内の通り名の全体説明は以下が詳しいです。
・京都市内の通り(wikipedia)
南北の通り名はまた今度です。
2011年5月29日日曜日
京都市の通り名住所(1)
京都市内では通り名をつけて特定する住所表記が使われてきました。
この理由として以下の2つを考えています。
・京都市中心部は通りが東西と南北にまっすぐに通っていることから、どのあたりかわかりやすくするため。
・同名の大字が複数あるケースが多くあり、それを特定するため。
通り名住所という表記方法が先で、これがあるから同名大字が複数存在しても困らないのかもしれません。
例えば、日本郵便の京都市中京区(なかぎょうく)のページでは、中京区内に「油屋町」として別々に2つの郵便番号(604-8063、604-8103)が割り当てられていて、それぞれが同名ながら別の大字として存在することを示しています。
では通り名住所の表記方法はどうなっているかと言うと、通り名2つで交差点を特定し、この交差点から大字まで道案内する要領でたどっていく、ということになっています。
例)京都市役所
京都市 中京区 寺町通御池上る 上本能寺前町 488番地
構造はこのようになります。
住所構造:案内文言+大字+番地
(上記のうち、)案内文言:通り名1+通り名2+方向
京都市役所の住所例ではこのようになります。
通り名:寺町通り、御池(通り)
方向 :上る
最初の2つの通り名で「交差点」を示します。
例では寺町通りと御池通りの交差点で、これが道案内の基点になります。
なお、住所地にある建物が面する通りを、基本的に1つ目の通り名にします。
また、2つ目の通り名は、末尾の「通り」という文字を省略する習慣です。
次に方向です。
東:東入る、東入(ヒガシイル)
西:西入る、西入(ニシイル)
南:下る(サガル)
北:上る(アガル)
このうち、「上る」「下る」の読み方は注意が必要です。
文部科学省が指定した表記と読みの組み合わせは、
上がる-アガル、上る-ノボル
下がる-サガル、下る-クダル
ですが、京都市内ではこのルールは通用せず、フリガナの「が」を省略します。
こうしていよいよ大字名になりますので、住所例の場合、「寺町通りと御池通りの交差点」から「北」に進んだところにある「上本能寺前町」ということになります。
なお、「北に進んだところ」とはその周辺のことであり、最終地点が通りの右側か左側かはわかりません。
京都市内は「両側町(りょうがわちょう)」と言って、同じ通りの両側の地域が一つの「町」を形成してきた歴史がありますので、この表記が適していたと思われます。
京都市役所の場合は、案内文言の示す領域のうち、東側にありました。
大きな地図で見る
京都市役所は「寺町通り」「御池通り」の他に、「河原町通り」「押小路通り」にも面しているので、別の通り名住所の表記も可能です。
このあたりのことがよくまとまっているサイトを紹介しておきます。
ジオどす 京の通り名
この理由として以下の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」を返します。
そして、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」を返します。
2011年3月6日日曜日
python:ログ出力
pythonの基本機能にエラーログ記録機能がある。(v2.3以降)
・出力したいメッセージの「重要度」を指定可能。初期値は以下のとおり。
レベル50:CRITICAL(危機)
レベル40:ERROR(エラー)
レベル30:WARNING(警告)
レベル20:INFO(情報)
レベル10:DEBUG(デバッグ)
レベル 0:NOTSET(未指定)
・ログの交代機能あり。
特定時間や特定容量に達したときに別ファイルに切り替えることができる。
・多彩な出力先に出力可能。
ファイル、標準出力(コンソール画面)、TCP/IPソケット、UPDソケット、電子メールアドレス、システムログ、Windowsのイベントログ、メモリー、HTTPサーバ。
・ログの冗長性を制御可能。
出力する「最低重要度レベル」を出力先別に指定可能。
参考:
Python2.4ライブラリリファレンス
6.29 logging -- Python 用ロギング機能
試しに、
ログファイルに情報レベル以上
コンソールに警告レベル以上
のメッセージを出してみた。
#
# -*- coding:sjis -*-
#
import sys, logging
def main():
#メッセージ形式:日時 レベル メッセージ
ff = "%(asctime)s %(levelname)s %(message)s"
#日時形式:yyyy/mm/dd hh:mm:dd
df = "%Y/%m/%d %H:%M:%S"
## ログファイルの設定
#出力対象:情報レベル以上。
#ログファイル名:当pyファイルと同名.log
#ファイルモード:新規書込。追加の場合は"a"
logging.basicConfig(
level=logging.INFO, format=ff, datefmt=df,
filename=sys.argv[0][:-3]+".log", filemode="w")
## 標準出力の設定
#出力対象:警告レベル以上。
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
formatter = logging.Formatter(fmt=ff, datefmt=df)
console.setFormatter(formatter)
logging.getLogger("").addHandler(console)
#レベル名称の変更
logging.addLevelName(20, "I") #初期値は"INFO"
logging.addLevelName(30, "W") #初期値は"WARNING"
logging.addLevelName(40, "E") #初期値は"ERROR"
#テスト
logging.debug("デバッグメッセージです") #出力されない
logging.info("情報メッセージです") #ログファイルに出力
logging.warning("警告メッセージです") #ログ、コンソール両方に出力
logging.error("エラーメッセージです") #ログ、コンソール両方に出力
if __name__=="__main__": main()
"""結果
コンソール画面:
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです
ログファイル:
2011/03/06 01:24:22 I 情報メッセージです
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです
"""
・出力したいメッセージの「重要度」を指定可能。初期値は以下のとおり。
レベル50:CRITICAL(危機)
レベル40:ERROR(エラー)
レベル30:WARNING(警告)
レベル20:INFO(情報)
レベル10:DEBUG(デバッグ)
レベル 0:NOTSET(未指定)
・ログの交代機能あり。
特定時間や特定容量に達したときに別ファイルに切り替えることができる。
・多彩な出力先に出力可能。
ファイル、標準出力(コンソール画面)、TCP/IPソケット、UPDソケット、電子メールアドレス、システムログ、Windowsのイベントログ、メモリー、HTTPサーバ。
・ログの冗長性を制御可能。
出力する「最低重要度レベル」を出力先別に指定可能。
参考:
Python2.4ライブラリリファレンス
6.29 logging -- Python 用ロギング機能
試しに、
ログファイルに情報レベル以上
コンソールに警告レベル以上
のメッセージを出してみた。
#
# -*- coding:sjis -*-
#
import sys, logging
def main():
#メッセージ形式:日時 レベル メッセージ
ff = "%(asctime)s %(levelname)s %(message)s"
#日時形式:yyyy/mm/dd hh:mm:dd
df = "%Y/%m/%d %H:%M:%S"
## ログファイルの設定
#出力対象:情報レベル以上。
#ログファイル名:当pyファイルと同名.log
#ファイルモード:新規書込。追加の場合は"a"
logging.basicConfig(
level=logging.INFO, format=ff, datefmt=df,
filename=sys.argv[0][:-3]+".log", filemode="w")
## 標準出力の設定
#出力対象:警告レベル以上。
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
formatter = logging.Formatter(fmt=ff, datefmt=df)
console.setFormatter(formatter)
logging.getLogger("").addHandler(console)
#レベル名称の変更
logging.addLevelName(20, "I") #初期値は"INFO"
logging.addLevelName(30, "W") #初期値は"WARNING"
logging.addLevelName(40, "E") #初期値は"ERROR"
#テスト
logging.debug("デバッグメッセージです") #出力されない
logging.info("情報メッセージです") #ログファイルに出力
logging.warning("警告メッセージです") #ログ、コンソール両方に出力
logging.error("エラーメッセージです") #ログ、コンソール両方に出力
if __name__=="__main__": main()
"""結果
コンソール画面:
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです
ログファイル:
2011/03/06 01:24:22 I 情報メッセージです
2011/03/06 01:24:22 W 警告メッセージです
2011/03/06 01:24:22 E エラーメッセージです
"""
2011年2月12日土曜日
番地号の表記(1) 地番
番地号は、住所のうち町字の次のレベルで住所を特定する要素です。
1.地番
明治の地租改正以来の土地に対して付けた番号、「地番」で表記する場合です。
元々課税用の区画ごと(筆、ふでという単位で数える)の番号だったため、住所として扱うには基本的に不便な点があります。(以下、いずれも例外はあります)
・土地という面について付番され、地点を示していない。
・建物と無関係に付けられたため、複数の地番にまたがる建物や1つの地番に複数の建物があることがある。
・位置関係と無関係につけられたため、連続した番号があちこちに散らばり、地番だけでは位置特定が難しい。
などです。
・1234番地
よく見られる地番表示です。
・123番地の2
1つの土地区画を複数の所有者に分けたり(分筆、ぶんぴつ)、複数に分かれている番地を1つに合わせたり(合筆、ごうひつ、がっぴつ)する場合、番地の下にさらに「枝番」を付けます。
枝番のレベルには制約が無く、分筆合筆の影響でどんどん深くなることがあります。複雑になった場合、改めて未使用の新しい数字を割り当てることもあります。
・甲123番地、123番地甲
地番は課税用に並び順がわかればいいので、十干(甲乙・・・)、十二支(子丑寅・・・)、カナ(いろは・・・)が付いていることがあります。このあたりの事情は、町字レベルでの順序に割り当てられた地名と同様です。
・無番地
公共財産の土地は課税対象外のため地番が付けられていないことがあります。この場合、「無番地」「番外地」と表記されます。なかには実際は付番しているのに無番地という住所で長年使用してきたため住所変更の影響が大きすぎて無番地のままにしていることもあるようです。
例)四街道市役所
千葉県四街道市 鹿渡 無番地
・123番地先
道路など地番が割り当てられない場所を特定する場合に、付近の地番を1つ挙げてその先という意味で「先」の文字を付け住所とすることがあります。道路工事や水道工事の工事看板でよく見られる表記です。
また、埋立で土地が新しくできた場合、地番が付番されるまでの仮の表記として使用することがあります。付近に地番を付番した土地が無い場合、町字名+地先になることがあります。
例)東京湾アクアライン 海ほたるPA
千葉県木更津市 中島地先 海ほたる
1.地番
明治の地租改正以来の土地に対して付けた番号、「地番」で表記する場合です。
元々課税用の区画ごと(筆、ふでという単位で数える)の番号だったため、住所として扱うには基本的に不便な点があります。(以下、いずれも例外はあります)
・土地という面について付番され、地点を示していない。
・建物と無関係に付けられたため、複数の地番にまたがる建物や1つの地番に複数の建物があることがある。
・位置関係と無関係につけられたため、連続した番号があちこちに散らばり、地番だけでは位置特定が難しい。
などです。
・1234番地
よく見られる地番表示です。
・123番地の2
1つの土地区画を複数の所有者に分けたり(分筆、ぶんぴつ)、複数に分かれている番地を1つに合わせたり(合筆、ごうひつ、がっぴつ)する場合、番地の下にさらに「枝番」を付けます。
枝番のレベルには制約が無く、分筆合筆の影響でどんどん深くなることがあります。複雑になった場合、改めて未使用の新しい数字を割り当てることもあります。
・甲123番地、123番地甲
地番は課税用に並び順がわかればいいので、十干(甲乙・・・)、十二支(子丑寅・・・)、カナ(いろは・・・)が付いていることがあります。このあたりの事情は、町字レベルでの順序に割り当てられた地名と同様です。
・無番地
公共財産の土地は課税対象外のため地番が付けられていないことがあります。この場合、「無番地」「番外地」と表記されます。なかには実際は付番しているのに無番地という住所で長年使用してきたため住所変更の影響が大きすぎて無番地のままにしていることもあるようです。
例)四街道市役所
千葉県四街道市 鹿渡 無番地
・123番地先
道路など地番が割り当てられない場所を特定する場合に、付近の地番を1つ挙げてその先という意味で「先」の文字を付け住所とすることがあります。道路工事や水道工事の工事看板でよく見られる表記です。
また、埋立で土地が新しくできた場合、地番が付番されるまでの仮の表記として使用することがあります。付近に地番を付番した土地が無い場合、町字名+地先になることがあります。
例)東京湾アクアライン 海ほたるPA
千葉県木更津市 中島地先 海ほたる
登録:
投稿 (Atom)