When it’s ready.

出来るまで出来ない

災害時に出来ること 停電グループの簡易検索

地震や津波の災害にあわれた方、心から哀悼の意を表します。

11日午後から節電したり、外出せずに低負荷な生活を心がけて居ましたが、ずっと何かできることはないのかとモンモンとしていました。義援金をポチポチしたり読書したり。そうしてる間にも発電所が次々と大変な状況になっていき、計画停電が発表されました。東電からPDFがDL出来るのを知って、Docsで各地域のグループをPDFからスプレッドシートへ起こす事が出来ると気づきました。一人でやるには時間がかかりそうだったので、Twitterで協力を募ると、非常に沢山の有志のみなさんが協力していただきあっという間に全てのセルが埋まりました。本当にありがとうございました。シートはまだ公開しています、編集も可能です。
参照HTML:見るだけで良ければ負荷低減のためなるべくこちらのURLを参照してください
https://spreadsheets.google.com/pub?hl=ja&hl=ja&key=0At5K5_buI_bsdGRleE1GQWZGcS16UENjekZPZWdaVUE&output=html

編集用URL:
https://spreadsheets3.google.com/ccc?hl=ja&key=tdexMFAfFq-zPCczFOegZUA&hl=ja#gid=0

しかし、最初に公開されたデータは、実際実施される区分けよりも大分大まかなデータであることが後々わかりました。Docsの情報ではざっくりと区域内か区域外かの参考にはなるけど、ピンポイントで特定住所が何グループに属しているのかはは分からないという事がわかりました。詳細なデータは、各県ごとに10ページ以上から構成される複数のPDFファイルに記載されています。

そこで、各町名からそこが何グループかを検索するサービスを作りました。作っている段階で他に作成されている方が居ることを知りましたがそのまま作成を続けました。他のサービスの方が完成度が高いので、直で使用するにはそちらを利用したほうがいいかも知れません。町名からグループIDだけ知りたいAPIが欲しい奇特な方がいれば、私の方のURLを利用していただけると素でグループIDを返すエンドポイントがあるので利用しやすいかと思います。

検索サービスのリンク

現在サービスは停止しています
私のサービスのトップページ
http://atu.si:8888/

検索APIのエンドポイント
http://atu.si:8888/api/get/調べたい町名

にアクセスすれば、グループIDを返すようにしています。
ソースもbitbucketに上げました。

https://bitbucket.org/a2c/teiden-search/wiki/Home
動かすのに必要なものは

  1. flask モジュール
  2. resis モジュール
  3. redis-server

になります。

データは、pdfからテキストに変換したものをredisに一度登録する必要があります。

#coding:utf-8
#!/usr/bin/env python
import os
import redis
from flask import Flask, request
import json
app = Flask(__name__)
app.debug = True

@app.route('/')
def redis_input():
  html = '''
  <!DOCTYPE HTML>
  <html lang="ja"><head><meta charset="UTF-8">
  <title>計画停電検索</title>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>  
  <script type="text/javascript">
  $(function(){
    $("#search").click(function(){
      var req_url = '/api/get/' + $("#town_name").val()
      $.ajax({
        type: "GET", 
        url: req_url, 
        success: function(json){
          if(json!='fail'){
            $("#result").html('グループ:' + json);
          }else{
            $("#result").html('グループ外');
          }
          }
        });
    });
  });
  </script>
  <style>
  body{
    font-size: 2em;
  }
  input{
    font-size: 1.4em;
  }

  </style>
  </head>
  <body>
  <div id='description'>地名(町名または大字)漢字で入れてください</div>
  町名:<input type='text' size=8 id='town_name'/>
  <button id='search'>Search</button>
  <div id='result'></div>
  </body></html>
  '''
  return html

# GET method ================================================
@app.route('/api/get/<key>')
def get_id(key):
  r = redis.Redis(host='localhost', port=6379, db=0)
  res = r.get(key)
  if res:
    return res
  else:
     return 'fail'


# Utility ============================================

def regist_redis(addr, grp):
  r = redis.Redis(host='localhost', port=6379, db=0)
  r.set(addr, grp)

def make_list(prefec):
  res = {}
  file = open('./txt/'+prefec+'.txt',  'r', )
  
  data1 = file.readlines()
  data2 = [[data1[x].strip(),
            [y.strip() for y in data1[x+1].split(' ')],
            [y.strip() for y in data1[x+2].split(' ')],
            data1[x+3].strip()] for x in range(0,len(data1)-4, 4)]

  for d in data2:
    for aza in d[2]:
      res[aza] = d[3]
  return res
 
@app.route('/api/update')
def data_update():
  file_list = ['chiba', 'gunma', 'ibaraki', 'kanagawa', 'numazu', 'saitama',  'tokyo', 'yamanashi', ]
  ng_list = ['tochigi',]
  for prefec in file_list:
    data = make_list(prefec)
    for addr, grp in data.items():
      print addr, grp
      regist_redis(addr, grp)
  return 'done'
 

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=8888)

全ファイルから町名をキーにして引っ張ってきていますが、各市や各県ごとで同じ町名があったら上書きされてしまうということに、このエントリー書きながら気づいたので、後ほど修正します。それに伴いレスポンスがリストになるかと思います。