2011年12月27日火曜日

python:単純バグ発見ツール pychecker(1)

pycheckerは、pythonソースコードを解析して単純なバグを見つけるツールです。
構文チェック、タイプミス、値セット前に変数を参照した、などを手軽に見つけることができます。
ロジックチェックのツールではないので、このチェックを通ったからと言って、プログラムが正常動作することが保障されるわけではありませんが、バグ発見にはかなり強力なツールです。


PythonはGoogleで使われている主要なスクリプト言語の1つで、Googleでもpycheckerを勧めています。
スタイルガイドの第1項は、PyCheckerをかけましょう、というところから始まります。

Google Python スタイルガイドの和訳(Kousei Kitahara氏のサイト)

Google Python Style Guide(google公式サイト:英語)


1.ダウンロード
PyCheckeプロジェクト日本語トップページ

にて、「ダウンロード」をクリックします。
私が使用しているバージョンは「0.8.19」です。


2.インストール
ダウンロードしたファイルを展開して、次のコマンドを実行します。


python setup.py install
うまくいかないときは「python install」などでネット検索してください。
pythonの公開ツールではインストールで上記のコマンドを使用することが多いので、きっと対処方法が見つかると思います。
インストールが成功すると、pycheckrはpythonをインストールしたフォルダ内に配置されます。

例)C:\Python26\Lib\site-packages\pychecker
ここにcheker.pyなどが配置されます。

3.使用準備
checker.pyの第1引数にチェックしたいpythonファイルのパスを渡して実行すれば、チェックできます。

私はchcker.pyを実行するバッチファイルを作成し、そのショートカットのアイコンをデスクトップに置いて、このアイコンにチェックしたいpythonファイルをドラッグ&ドロップして実行しています。
ここではこの方法をご紹介します。


テキストファイルに以下の例のように書いて「pythecker.bat」として保存し、そのショートカットのアイコンをデスクトップに置きます。

@echo off
python.exe C:\Python26\Lib\site-packages\pychecker\checker.py %1
pause


マシンによって「checker.py」のあるフォルダが異なりますので、2行目には本当にあるパスを書きます。
「%1」はコマンドプロンプトでの第1引数のことで、ショートカットのアイコンにドラッグ&ドロップしたファイルのフルパスがセットされます。

さてこれで準備ができました。

次回はいよいよpycheckerを使ってみます。
 

2011年11月23日水曜日

番地号の表記(7) 文字街区:アルファベット

建物名称を除く日本の正式住所は漢字、ひらがな、カタカナ、数字、「-」(ハイフン)ですべて表記できると思っていませんか。
実はこれらの文字だけでは表記できない正式住所が存在します。


住所のうち「番」に相当する部分(街区符号)が、「アルファベット」という驚きの場所があります。
マンション名にアルファベットを使用していることは普通にありますが、そのような建物名称ではなく、公式住所でアルファベットを使用する住所があります。


大阪府大阪市中央区 上町 A番7号 大槻能楽堂GoogleMap

大阪市中央区は1989年2月13日に旧東区と旧南区が合併して誕生した区です。
この上町(うえまち)という町字には「1丁目」と「丁目割りをしていない地域」があります。
1丁目が旧東区で、丁目割りしていない地域が旧南区らしいです。
旧東区には「1丁目1番」があり、旧南区には「1番1号」があり、いずれも省略表記が「1-1」になるため紛らわしいので、丁目なし地域を「2丁目」にする案もあったようですが拒否したという話(伝説?)があります。


ちなみに、旧南区の「1番1号」は「A番1号」になったわけですが、昔のままの番地表記がネットにありました。

セブンイレブン 大阪上町店(セブンイレブンの店舗検索
大阪府大阪市中央区上町1番1号
機会があれば、書物で由来について裏づけをとってみたいと思っています。

2011年10月23日日曜日

番地号の表記(7) 文字街区:漢字+数字

住所のうち「番」に相当する部分(街区符号)が、
「漢字+数字」という表記が大阪市の6つの区にあります。
例を1つずつ挙げます。


・大阪市中央区
大阪高津郵便局(日本郵政の公式サイト)
大阪市中央区道頓堀1-東3-26(
GoogleMap

・大阪市鶴見区
鶴見区在宅サービスセンター(大阪市の公式サイト
大阪市鶴見区諸口5-浜6-12(GoogleMap

・大阪市西区
京セラドーム大阪(公式サイト
大阪市西区千代崎3丁目 中2番 1号(GoogleMap

・大阪市平野区
ニチイケアセンターかわなべ(ニチイの公式サイト
大阪市平野区長吉川辺二丁目 北2番 3号(GoogleMap


・大阪市北区
浪華昆布(公式サイト
大阪市北区天神橋2丁目北2-20(GoogleMap


・大阪市淀川区
阪急バス 加島出張所(阪急バスの営業所リスト
大阪市淀川区加島3丁目 中4番 10号(GoogleMap


文字街区はまだまだ続きます。  

2011年10月9日日曜日

番地号の表記(6) 文字街区-漢字のみ

集合住宅の棟にアルファベットを使用している場合は除くと、番地は数字で表記されるのが普通ですが、今回は「数字ではない番地」について見てみます。
住居表示法では「番」の部分を「街区符号」と呼んでいて、あくまでも「符号」なので、数字でなくても法的には問題無いようです。多少の違和感はありますが。


1.漢字のみ
(1)

大阪市中央区久太郎町4丁目渡辺

れっきとした正式な住居表示住所です。「街区符号」は「渡辺」です。
ここには坐摩神社(いかすりじんじゃ)と大阪府神社庁があります。

坐摩神社(公式サイト)は「久太郎町四丁目渡辺3号」です。
大阪神社庁(公式サイト)は「久太郎町四丁目渡辺6号」です。
やはり住居表示板でも「番地」部分が「渡辺」になっています。

神社の南西角に設置されている住居表示板(ストリートビュー
ぼやけていて見づらいのですが、
右の住居表示板:「北久宝寺町四丁目 4」
左の住居表示板:「久太郎町四丁目 渡辺」
とあります。
もともと渡辺町という大字だったのですが地名変更になるときに反対運動が起き、街区符号に渡辺を残すことで決着したそうです。

参考)
渡辺(wikipedia
坐摩神社(wikipedia


(2)
埼玉県鴻巣市本町1丁目 本一町
埼玉県鴻巣市本町1丁目 宮本町

場所はここです。(Googleマップ

鴻巣市 広報誌「かがやき」平成20年4月号
(6ページ) ※pdfファイル
本町1丁目3番の街区の一部を旧町名の「本一町」「宮本町」に変更
住居表示板の写真が掲載されていますが、ほとんど読み取れません。残念。
上記広報誌によると全国で2ヶ所のようです。

2011年8月21日日曜日

番地号の表記(5) 集合住宅の住居表示例

前回に引き続き、集合住宅の住居表示についてです。
今回は集合住宅の住居表示の例をいくつか見ていきます。

通常の一戸建ての場合の「番」に相当する「街区符号」を中心に見ていきます。

例1)高島平2丁目28番3-xxx号室
建物壁面表示:2-28-3

高島平団地は東京都板橋区が誇る大規模団地です。
建物壁面の表示は3レベルで「丁目-番地-番地内棟番号」を示しています。
建物壁面の表示がハイフンで区切られた丁目以降の住所そのままで、最もわかりやすいパターンです。
法律上の町字は大字と丁目をひとかたまりにした「高島平二丁目」ですが、
「2丁目」は実態として「高島平」の2番目の区域なので、実態に即した表記と言えます。
そのうち立て替えられてしまうかもしれないのでストリートビューのURLとその画像も貼っておきます。


例2)竹山2丁目4番2405号棟xxx号室
  建物壁面の表示:2405
竹山団地は神奈川県横浜市緑区竹山1~4丁目に広がる大規模団地です。
建物壁面の表示は4桁の値で「丁目+番地+番地内棟番号」を示しています。
住居表示住所を示す場合、丁目や街区の番号を2度書くような煩わしさがありそうです。
ストリートビューのURLとその画像も貼っておきます。

例3)桐ヶ丘1丁目1番E34号館xxx号室
  建物壁面の表示:E34
都営桐ヶ丘アパートは東京都北区桐ヶ丘1~2丁目、赤羽台3丁目に広がる大規模団地です。
建物壁面の表示は3桁で「地区+地区内棟番号」を示しています。
WはWESTで西、EがEASTで東、NがNORTHで北ということです。
ストリートビューのURLとその画像も貼っておきます。

例4)津雲台2丁目2番C-32棟xxx号室
  建物壁面の表示:C-32
千里津雲台団地は大阪府吹田市津雲台2丁目にある団地で、吹田市と豊中市にまたがる千里ニュータウンに含まれる団地の1つです。
建物壁面の表示は3桁で「アルファベット1桁+地区内連番」を示しています。
千里ニュータウン内の12団地をざっと見たところ、このアルファベット1桁は、
A大阪府住宅供給公社、B大阪府、C都市機構
と団地の所有者を示しているようです。
複数業者が開発した場合の地域的なまとまりの1パターンです。
ざっと見た限りの判断なので、詳細をご存知の方はお知らせください。
ストリートビューのURLとその画像も貼っておきます。

例5)幸町2丁目14街区11号棟xxx号室
  建物壁面の表示:14-11
幸町団地は千葉県千葉市美浜区幸町2丁目にある団地です。
法律上の「街区」は道路等で囲まれた領域ですが、この地域の街区には街区を貫通する小道がいくつかあり、住居表示法上の街区をいくつかまとめて1つの街区にしているように見えます。これは実施基準で特例にある、道路幅4m以上の道路で区切られた領域を1つの街区としていいという条項を適用したものと思われます
あえて「番」を使わずに「街区」という文字を使っているあたり、なんらかの事情があるように思います。
建物壁面の表示は2レベルで「地区+地区内連番」を示しています。
団地すべてが2丁目に収まっているためか、建物壁面にあえて「2」は表示していないようです。
ストリートビューのURLとその画像も貼っておきます。

このように住居表示法およびその実施基準を踏まえてそれぞれ工夫した住所表示となっています。
結果として全国的には表記が統一されていますが、その示す内容には多少の地域差があります。


2011年8月20日土曜日

番地号の表記(4) 集合住宅の住居表示

今回は集合住宅です。
1つの建物に複数の住居がある場合の番地号について書きます。
旧自治省告示「街区方式による住居表示の実施基準」(pdf)(三重県鈴鹿市の公式サイト)

には3つの表記例が挙げられています。
なお、用語は「番地号の表記(3) 基礎番号とフロンテージ」を参照してください。

(1)集合住宅が1つの基礎番号内にある場合
 街区符号(番地):「基礎番号」(建物入り口の街区外周線上の位置)
 住居番号(号):「各戸の番号」
 例えば、1棟だけのマンションなどです。


例)中央4丁目1番 △△マンション405号室
 →中央4丁目1番405号

・街区符号(番地):1
 住居番号(号):405

(2)集合住宅群が1つの街区内にある場合
  住居番号(号):「棟番号-各戸の番号」
 街区符号(番地):「基礎番号」(建物入り口の街区外周線上の位置)
 例えば、街区内に複数の棟がある団地などです。

例)中央4丁目1番 □□マンション3号棟405号室
 →中央4丁目1番3-405号

・街区符号(番地):1
 住居番号(号):3-405

(3)集合住宅群が複数の街区にまたがっている場合
 街区符号(番地):「棟番号」
 住居番号(号):「各戸の番号」
 例えば、複数の街区にわたる団地などです。


例)中央4丁目 ○○団地3号棟405号室
 →中央4丁目3番405号

・街区符号(番地):3
 住居番号(号):405

特に上記の(1)と(3)は表記が同じになるので、街区符号(番地)が「街区の基礎番号」か「団地の棟番号」なのか、住所からは判断ができません。
集合住宅はこの「実施基準」を踏まえてそれぞれ工夫した住所表示となっています。
結果として全国的に表記は統一されていますが、その示す内容には多少の地域差があります。


 

2011年8月15日月曜日

番地号の表記(3) 基礎番号とフロンテージ

「中央1丁目2番3号」という住所の場合、
「2番」:法律では「街区符号」。一般的には「番地」
「3号」:法律では「住居番号」。一般的には「号」
といいます。


今回はこの「3号」にあたる一般的に「号」と呼ばれている部分のお話です。
「号」は住居の入り口の位置が「街区の外周線」のどの位置にあるかで決まります。
つまり、従来の地番のような面の領域ではなく、地点を示す点の位置でもありません。

街区の外周を一定間隔で区切って「基礎番号」という番号をつける際の、一定間隔を「フロンテージ」といいます。
「フロンテージ」は市区町村で定めます。だいたい10m~15mくらいです。
基礎番号は住所のうち「号」に当たる部分の元になる値です。
割り当て方は、市区町村の中心に近い角から右回りに番号をつけていきます。


このあたりの図解は以下のサイトがわかりやすいです。
計画・財政・施策/住居表示(三重県鈴鹿市の公式サイト>行政ガイド)

基本的なことは以上です。今度はちょっと変わった例を見ていきます。

(1)基礎番号の境目に入り口がある
建物の入り口が丁度、基礎番号の境目にある場合、小さい方の番号を採用します。


(2)1つの基礎番号に複数の建物がある
例えば、
・間口の狭い建物が並んでいる。
・街区内に袋小路があり、その袋小路沿いに複数の建物がある。


このような場合、基礎番号だけでは別の建物なのに同じ住所になってしまいます。
そこでこのような場合、住居番号は「基礎番号-枝番」になります。


例)中央4丁目1番2号 を入り口とする鈴木さんと佐藤さんの家
  中央4丁目1番2-1号 鈴木さん宅
  中央4丁目1番2-2号 佐藤さん宅 など。


(3)1つの建物が複数の基礎番号を持つ
例えば、
・大きな建物で、主たる入り口がいくつもあり、それらが別々の基礎番号の位置にある。


ビルには非常口があるので入り口が複数ということはごく普通です。
どれが「主たる入り口」かということは、市区町村長が決めてしまいます。
ところが街区外周に沿ってお店の入り口が並んでいるような場合、各戸の主たる入り口は別々です。
このように「主たる入り口」が別々の基礎番号の位置に複数ある場合、たとえ同じ建物のお店であっても「号」が異なります。


例)中央4丁目1番 の大きな建物の街区外周に沿ってお店が並んでいる場合
中央4丁目1番1号 八百屋さん
中央4丁目1番2号 靴屋さん など。


住居表示の魔界はまだまだ続きます。

2011年8月14日日曜日

番地号の表記(2) 住居表示の基本

従来の「地番」はもともと地租納税のための番号であり、道案内に不向きで不便なことがありました。
・番号があちこちに飛んで位置的に連続しないため、どのあたりかわからない。
・配達で誤配や遅配が多い。
・消防などの現地到着が遅れたり、訪問者がたどり着けなかったりする。
・分筆や合筆があった場所は枝番がついて住所が長くなることがある。


そこで、位置がわかるような住所にしようということで、
1962年に「住居表示法」が施行されました。
住居表示に関する法律(総務省:電子政府の総合窓口e-gov)


自治省告示。実務上の注意点です。
街区方式による住居表示の実施基準(pdf)(三重県鈴鹿市の公式サイト)

 
住居表示には「街区方式」と「道路方式」の2つの付番方法がありますが、ほとんどすべての地域で街区方式が採用されています。道路方式は例外的に山形県東根市の一部で採用されただけです。(他に採用した地域があればお知らせください)

「街区方式」の基本は以下のとおりです。
・町字内部に恒久施設で区切られた領域「街区」を設定する。

 ここでの恒久施設とは、道路などの長期間変化しない線状の地物のことです。
・街区ごとに「街区符号」(一般的には番地)をつける。

・街区の外周を一定間隔「フロンテージ」ごと区切って「基礎番号」をつける。
・住居入り口位置の基礎番号に基づき「住居番号」(一般的には号)をつける。


例)中央4丁目1番2号
 「1番」:法律では「街区符号」。一般的には「番地」
 「2号」:法律では「住居番号」。一般的には「号」


このあたりの図解は以下のサイトがわかりやすいです。
計画・財政・施策/住居表示(三重県鈴鹿市の公式サイト>行政ガイド)

なお、従来の地番は無くなったわけではなく、土地を面的に管理する際には引き続き使われます。
つまり、住居表示地域では、従来の地番住所と住居表示住所の2つの住所があることになり、住居表示の住所を「用いるように努めなければならない」(住居表示義務)とされています。

2011年7月9日土曜日

京都市の通り名住所(3) 南北の通り

京都市内中心部の通りには、東西の通りと南北の通りがあり、それぞれにわらべ歌があります。
今回は南北の通り名のわらべ歌です。東から順に歌っていきます。
(なお、わらべ歌にない通り名でも住所表記に使うことがあります)


1.歌詞
○南北の通り名のわらべ歌(通称:寺御幸 てらごこ)
てら ごこ ふや とみ やなぎ さかい
たか あい ひがし くるまやちょう
からす りょうがえ むろ ころも
しんまち かまんざ にし おがわ
あぶら さめがいで ほりかわのみず
よしや いの くろ おおみやへ
まつ ひぐらしに ちえこういん
じょうふく せんぼん はてはにしじん


2.実際の通り名
寺町通り (てらまちどおり)
御幸町通り(ごこまちどおり)
麩屋町通り(ふやちょうどおり)
富小路通り(とみのこうじどおり)
柳馬場通り(やなぎのばんばどおり)
堺町通り (さかいまちどおり)
高倉通り (たかくらどおり)
間之町通り(あいのまちどおり)
東洞院通り(ひがしのとういんどおり)
車屋町通り(くるまやちょうどおり)
烏丸通り (からすまどおり)
両替町通り(りょうがえちょうどおり)
室町通り (むろまちどおり)
衣棚通り (ころものたなどおり)
新町通り (しんまちどおり)
釜座通り (かまんざどおり)
西洞院通り(にしのとういんどおり)
小川通り (おがわどおり)
油小路通り(あぶらのこうじどおり)
醒ケ井通り(さめがいどおり)
堀川通り (ほりかわどおり)
葭屋町通り(よしやまちどおり)
猪熊通り (いのくまどおり)
黒門通り (くろもんどおり)
大宮通り (おおみやどおり)
松屋町通り(まつやちょうどおり)
日暮通り (ひぐらしどおり)
智恵光院通り(ちえこういんどおり)
浄福寺通り(じょうふくじどおり)
千本通り (せんぼんどおり)
※西陣(にしじん)は地域名です。通り名ではありません。


3.音声
京美人三人娘が唄う京都の通り名の唄(京都修学旅行ワンダーランド)
地元の旅館関係者団体である、近畿日本ツーリスト協定旅館ホテル連盟教育旅行部会京都地区会のサイトです。
「南北の通り名の唄」の「聞く」をクリックします。


京都数え歌(YouTube:bonten79488さんの投稿)
上記と同じ音源のようです。

寺御幸のわらべ歌(京都銀行のサイト)
「唄を聴く」をクリックします。クリックしても聞こえない場合はRealPlayer形式の音声ファイルを再生できるソフトが必要です。

5.通りの位置の地図
 以下が秀逸です。
京都通り名マップ(株式会社ジオセンスのサイト)
一覧で通り名を選ぶとGoogleMAPに表示されます。

6.参考
 全体の説明は以下が詳しいです。
京都市内の通り(wikipedia)

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:ログ出力

2011年6月19日日曜日

京都市の通り名住所(2) 東西の通り

今回は京都の通り名です。
市内中心部の主だった通り名は、「わらべ歌」になっていますので、このわらべ歌について書きます。(なお、わらべ歌にない通り名でも住所表記に使います)

京都の通りは、東西の通りと南北の通りがあり、それぞれにわらべ歌があります。
今回は東西の通り名のわらべ歌です。曲名は歌詞の出だしに基づいて、丸竹夷(まるたけえびす)と通称されています。多少異なる歌詞も伝わっています。
北から順に歌っていきます。

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つ目の通り名は、末尾の「通り」という文字を省略する習慣です。

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


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

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

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



大きな地図で見る
 

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

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

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」を返します。

 

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 エラーメッセージです
"""

2011年2月12日土曜日

番地号の表記(1) 地番

番地号は、住所のうち町字の次のレベルで住所を特定する要素です。

1.地番
 明治の地租改正以来の土地に対して付けた番号、「地番」で表記する場合です。
 元々課税用の区画ごと(筆、ふでという単位で数える)の番号だったため、住所として扱うには基本的に不便な点があります。(以下、いずれも例外はあります)
・土地という面について付番され、地点を示していない。
・建物と無関係に付けられたため、複数の地番にまたがる建物や1つの地番に複数の建物があることがある。
・位置関係と無関係につけられたため、連続した番号があちこちに散らばり、地番だけでは位置特定が難しい。
などです。

・1234番地
 よく見られる地番表示です。

・123番地の2
 1つの土地区画を複数の所有者に分けたり(分筆、ぶんぴつ)、複数に分かれている番地を1つに合わせたり(合筆、ごうひつ、がっぴつ)する場合、番地の下にさらに「枝番」を付けます。
 枝番のレベルには制約が無く、分筆合筆の影響でどんどん深くなることがあります。複雑になった場合、改めて未使用の新しい数字を割り当てることもあります。

・甲123番地、123番地甲
 地番は課税用に並び順がわかればいいので、十干(甲乙・・・)、十二支(子丑寅・・・)、カナ(いろは・・・)が付いていることがあります。このあたりの事情は、町字レベルでの順序に割り当てられた地名と同様です。

・無番地
 公共財産の土地は課税対象外のため地番が付けられていないことがあります。この場合、「無番地」「番外地」と表記されます。なかには実際は付番しているのに無番地という住所で長年使用してきたため住所変更の影響が大きすぎて無番地のままにしていることもあるようです。

例)四街道市役所
千葉県四街道市 鹿渡 無番地

・123番地先
 道路など地番が割り当てられない場所を特定する場合に、付近の地番を1つ挙げてその先という意味で「先」の文字を付け住所とすることがあります。道路工事や水道工事の工事看板でよく見られる表記です。
 また、埋立で土地が新しくできた場合、地番が付番されるまでの仮の表記として使用することがあります。付近に地番を付番した土地が無い場合、町字名+地先になることがあります。

例)東京湾アクアライン 海ほたるPA
千葉県木更津市 中島地先 海ほたる

2011年1月29日土曜日

python:クラスを作ってみた

クラスの練習として、ファイルについてのクラスをつくってみました。

#
# -*- coding:sjis -*-
#
import os,sys,win32com.client
oFSO=win32com.client.Dispatch("Scripting.FileSystemObject")

class File:
 def __init__(self, path):
  self.set_path(path) #フルパス
  self.set_fdr() #フォルダ名
  self.set_name() #ファイル名
  self.set_root() #フルパスの拡張子よりも前部分
  self.set_ext() #拡張子(.を含む)
  self.set_drv() #ドライブ名(:を含む)
  self.set_isfile() #存在するか
  self.set_path83() #フルパス8.3形式名。存在時のみ。
  self.set_name83() #ファイル8.3形式名。存在時のみ。
  self.set_size() #ファイル容量(バイト)
 def set_path(self, s): self.path = s
 def set_fdr(self): self.fdr = os.path.dirname(self.path)
 def set_name(self): self.name = os.path.basename(self.path)
 def set_root(self): self.root = os.path.splitext(self.path)[0]
 def set_ext(self): self.ext = os.path.splitext(self.path)[1]
 def set_drv(self): self.drv = os.path.splitdrive(self.path)[0]
 def set_isfile(self): self.isfile = os.path.isfile(self.path)
 def set_path83(self):
  self.path83=""
  if self.isfile:

    self.path83 = oFSO.GetFile(self.path).ShortPath
 def set_name83(self):

 self.name83 = os.path.basename(self.path83)
 def set_size(self):
  self.size=0
  if self.isfile:

    self.size = os.path.getsize(self.path)
 
if __name__=="__main__":
 sIn=""
 if len(sys.argv)>1: sIn = sys.argv[1]
 p = File(sIn)
 print "path = "+p.path
 print "fdr = "+p.fdr
 print "name = "+p.name
 print "root = "+p.root
 print "ext = "+p.ext
 print "drv = "+p.drv
 print "isfile = "+str(p.isfile) #bool型
 print "path83 = "+p.path83
 print "name83 = "+p.name83
 print "size = "+str(p.size) #int型

-----
例1:存在するファイルを指定した場合
path = C:\Documents and Settings\a23456789.html
fdr = C:\Documents and Settings
name = a23456789.html
root = C:\Documents and Settings\a23456789
ext = .html
drv = C:
isfile = True
path83 = C:\DOCUME~1\A23456~1.HTM
name83 = A23456~1.HTM
size = 112


例2:存在しないファイルを指定した場合
path = C:\Documents and Settings\b23456789.html
fdr = C:\Documents and Settings
name = b23456789.html
root = C:\Documents and Settings\b23456789
ext = .html
drv = C:
isfile = False
path83 =
name83 =
size = 0

2011年1月22日土曜日

python:辞書オブジェクト

d={} #辞書dのクリア
d={key:val, ...}  #キーと値をコロンでつなぐ。要素区切りはカンマ。
len(d)  #辞書の件数
d=dict(L) #リスト→辞書(リストはキーと値の2要素リストであること)
  例)d=dict([[1,"a"], [2,"b"]]) → {1:"a", 2:"b"}
d[key]=val  #値設定
a=d[key]    #値取得(キーが無いときはエラー)
a=d.get(key, "無い時の値")  #値取得(キーが無いときは指定値返却)
if a in d:  #キーの有無判定
for (key, val) in d.items(): #キーと値の組み合わせのループ
for key in sorted(d.keys()): #キーのループ(並び替えて)
for val in d.values():  #値のループ
kvSum=dict([[k,v] for k, v in zip(KeysL, ValsL)])

 →{k1:v1, ...} #キーリストと値リストの組み合わせ辞書作成
d[key]=d.get(key,0)+cnt #キー別に値を累積
b=d.copy() #辞書のコピー 

2011年1月16日日曜日

町字の表記 順番に割り当てられた地名

・丁目(ちょうめ)
例)名護市役所
沖縄県名護市 港 一丁目 1番1号
これは全国に多数存在する表記方法。

・丁(ちょう) ※丁目に相当
例)堺市北区役所
堺市北区 新金岡町 5丁 1-4
「5丁目」ではなく「5丁」で正しい。市内に多数あり。

・町目(ちょうめ)
例)京都大宮丸太町郵便局
京都府京都市上京区 丸太町通大宮東入 一町目 857
一町目、二町目、・・・などあり。

・条(じょう)
例)北海道札幌市手稲区役所
札幌市手稲区 前田1条 11丁目 1-10

例)北海道旭川市役所
北海道旭川市 6条通 9丁目

・番町(ばんちょう)
例)名張百合が丘郵便局
三重県名張市 百合が丘東1番町 15
他にもつつじが丘、桔梗が丘、梅が丘などで1番町、2番町、・・・などあり。

・地割(ちわり)
例)八幡平(はちまんたい)市役所
岩手県八幡平市 大更 第35地割 62番地

・いろは
例)七尾市役所
石川県七尾市 袖ヶ江町 イ部 25

例)羽咋郵便局
石川県羽咋市 川原町 メ 136-4
「メ」は、いろはにほへと・・・あさきゆめみし・・の「め」。

例)八街(やちまた)市役所
千葉県八街市 八街ほ 35-29

例)匝瑳(そうさ)市役所
千葉県匝瑳市 八日市場ハ 793番地2

・十干 (甲乙丙丁戊己庚辛壬癸)
読みは、こう、おつ、へい、てい、ぼ、き、こう、しん、じん、き。
または、陰陽五行思想(wikipedia)に基づいて、
きのえ、きのと、ひのえ、ひのと、つちのえ、つちのと、かのえ、かのと、みずのえ、みずのと。

例)魚沼中条郵便局
新潟県十日町市 中条 甲 872-6
なかじょう こう。
郵便番号簿によると、中条庚は「なかじょう かのえ」。

例)香川県土庄町役場
香川県小豆郡土庄町 甲 559-2

・十二支 (子丑寅卯辰巳午未申酉戌亥)
例)十日町高田郵便局
 新潟県十日町市 子 377-7
十日町市には十二支すべてが揃っている。

十干十二支は地番の一部として扱う地域もある。

2011年1月10日月曜日

町字の表記 接尾語

町字名の末尾に付く共通する文字を思いつくまま書いてみます。

・町(まち、ちょう)
例)富山県富山市役所
富山市 新桜町 7-38
これは全国に多数存在する表記方法。

・丁(ちょう)
例)和歌山中央郵便局
和歌山県和歌山市 一番丁 4
数字地名だけでなく、鷺ノ森堂前丁 など市内に多数あり。

・通(とおり)
例)尼崎郵便局
兵庫県尼崎市 昭和通 2丁目 11-1

・免(めん)
例)松浦市役所
長崎県松浦市 志佐町里免 365
他にも今福町坂野免、鷹島町中通免など多数。

・触(ふれ)
例)壱岐市役所
長崎県壱岐市 郷ノ浦町本村触 562
他にも芦辺町箱崎中山触、石田町池田西触、勝本町大久保触など多数。

・郷(ごう)
例)西海市役所
長崎県西海市 大瀬戸町瀬戸樫浦郷 2222
他にも西海町天久保郷、崎戸町蠣浦郷など多数。

2011年1月4日火曜日

町字の表記(3)

2.町字が2段階 の続き)

2-3.旧市区町村+旧大字
例)三瀬郵便局
佐賀県佐賀市 三瀬村 三瀬 2634-1


3.町字が3段階
3-1.区+大字+丁目
岩手県奥州市役所
岩手県奥州市 水沢区 大手町 1丁目 1
「水沢区」は合併特例法に基づく地域自治区の名称。
「水沢区大手町」が大字名。

3-2.旧市区町村+大字+丁目
徳島県鳴門市役所
徳島県鳴門市 撫養町 南浜 字東浜 170
「撫養町」は市区町村合併前の旧町名(元は市区町村レベルの名称)。
「南浜」は市区町村合併前の旧大字名。
現在は、「撫養町南浜」が大字名。

(番外).通り名1+通り名2+方向+大字
京都市中京区役所
京都市中京区 西堀川通 御池 下る 西三坊堀川町 521
「西堀川通り」と「御池通り」の交差点から南へ行ったところにある「西三坊堀川町」である。京都市内は別項を立てたい。


ここまででわかるとおり、町字名の区切りレベルは地域ごとにさまざまである。
鳴門市役所の例では、町字の第1レベルが合併前は「南浜」で合併後は「撫養町」という旧市区町村レベルとなるが、暗黙で同一レベル扱いしがちである。
地域ごとの統計情報を比較する際には注意が必要である。
同一地域でも合併前後の経年変化がわからなくなることがある。

2011年1月3日月曜日

python:定数、エスケープシーケンス

pythonの規定の定数、エスケープシーケンス。

以下、「\」は半角¥マーク。

\\ 「\」文字そのもの
\' シングルクオーテーション
\" ダブルクオーテーション
\a ベル
\b バックスペース
\f 改ページ
\r キャリッジリターン
\n 改行
\t 水平タブ
\v 垂直タブ
\N{name} Unicode データベース中で名前 name を持つ文字
\uxxxx 16ビットの16進数値xxxxを持つUnicode文字
\Uxxxxxxxx 32ビットの16進数値xxxxxxxxを持つUnicode文字
\ooo 8進数oooを持つASCII文字
\xhh 16進数hhを持つASCII文字
\0 NULL
\+(改行) 文字列を途中で改行する


パス名の要素の区切り文字
os.sep    #windowsでは 半角¥

ファイル名と拡張子を分ける文字
os.extsep    #windowsでは半角ピリオド

行末文字
os.linesep    #windowsでは「\r\n」。キャリッジリターンとラインフィード

円周率
import math  # mathモジュール
math.pi    #3.1415926535897931

注意点は、mathモジュールをimportしてから使うこと。以下同様。

自然対数の底
math.e    #2.7182818284590451

整数の最大値  マシン環境によって異なる。
sys.maxint    #私の環境では2147483647

整数の最小値  マシン環境によって異なる。
-sys.maxint - 1    #私の環境では-2147483648

2011年1月2日日曜日

python:リストの内包表記

[x for x in L]
 forからリストLまでがひと区切り。forでLから取り出されたxが、forの前に渡される。


例)0~3までの各3倍の値のリスト
[0, 3, 6, 9] = [x*3 for x in range(4)]

[x for x in L if x < 10]
 for部で取り出された要素のうち、その後ろif部で評価され真だったものだけが、forの前に渡される。


[x for L2 in L1 for x in L2]
 1つ目のforでL1から取り出されたL2が、2つ目のforに渡され、 そこから取り出されたxが、1つ目のforの前に渡される。


[[x[1], x[0]] for x in L]
 要素2つのListの前後を入れ替える