pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

Yahoo!天気からピンポイントの天気データを取得してちょっと整える

パソコンから天気を読み上げようと思ってデータを取ってみた

python2.7とBeautifulSoupを使ってぱっととってくる。そして、下記のような出力をファイルに得る。東京都は北区。ファイル名は日付.txt

0時,曇り,気温8度,湿度82度,降水量0,風静穏0
3時,曇り,気温7度,湿度97度,降水量0,風北北西2
6時,晴れ,気温6度,湿度96度,降水量0,風北西1
9時,晴れ,気温10度,湿度87度,降水量0,風北北東1
12時,晴れ,気温16度,湿度57度,降水量0,風南東2
15時,晴れ,気温19度,湿度48度,降水量0,風南2
18時,曇り,気温15度,湿度63度,降水量0,風南2
21時,晴れ,気温11度,湿度74度,降水量0,風北西1

下記。とりあえずできた版

import os
import re
import datetime
from urllib import urlopen
from bs4 import BeautifulSoup

target_url = urlopen('http://weather.yahoo.co.jp/weather/jp/13/4410/13117.html')
soup = BeautifulSoup(target_url)

objdiv = soup.find('div', attrs={'id' :'yjw_pinpoint_today'})
trlist = objdiv.findAll("tr")

result = {}
p = re.compile(r'<.*?>')

tenkilist = ["jikan", "tenki", "kion", "shitsudo", "kosuiryo", "kaze"]
n = 0
for i in tenkilist:
   result[i] = p.sub("",str(trlist[n])).split("\n")
   while result[i].count("") > 0:
      result[i].remove("")
   n+=1

kaze2 = []
kaze2.append(str(result["kaze"][0]))
for i in range(1,len(result["kaze"]),2):
    kaze2.append(str(result["kaze"][i] + result["kaze"][i+1]))

d = datetime.datetime.today()
today = d.strftime("%Y%m%d")

f = open(today+".txt", "ab")
for i in range(1, len(result["jikan"])):
   f.write(str(result["jikan"][i])+",")
   f.write(str(result["tenki"][i])+",")
   f.write("気温" + str(result["kion"][i]) + "度"+",")
   f.write("湿度" + str(result["shitsudo"][i]) + "度"+",")
   f.write("降水量" + str(result["kosuiryo"][i])+",")
   f.write("風" + str(kaze2[i]))
   f.write("\n")
f.close()

参考

『orangain flavor』「Pythonでクローリング・スクレイピングに使えるライブラリいろいろ」
http://orangain.hatenablog.com/entry/scraping-in-python

『Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新) 』
http://kondou.com/BS4/

『18th Tech Note』「PythonでHTMLタグを除去する方法」
http://www.18th-technote.com/post/5987200384/python-django

『no workaround』「python リストから空の要素を削除 」
http://j4f-note.blogspot.jp/2012/04/python.html

ダイナミックルーティングのpassive interfaceあるいはredistribute connected

ダイナミックルーティングを動作させるときに、通常ユーザ側のネットワークは他のL3機器に対して経路を通知する必要があるが、一方ユーザ側にはそのルーティングプロトコルは流す必要はない。そこで、よくルーティングプロトコル動作インタフェース指定方法やredistribute or passiveという話になると思う。

調べた範囲で、下記が参考となった。

『♪メモのページ♪』『「redistribute connectedか、network ~か。」  OSPFネタ』
http://sky.ap.teacup.com/debslink/1182.html

『ネットワークエンジニアとして』「passive-interface」
http://www.infraexpert.com/study/rp7c.htm

『ネットワークの実験ノート』「【Cisco Tips】 Q. redistribute connectedは必要ですか?」
http://tiida.cocolog-nifty.com/netblog/2004/09/cisco_tips_q_re_1.html

『Darren's Blog』「OSPF – Type 1 LSA vs Type 5 LSA (passive vs redistribute)」
https://mellowd.co.uk/ccie/?p=2060

上記は基本的にはciscoかつOSPFの情報だが、考え方のベースとしてとても有用。
基本的には下記の印象

  • passiveは送信を止める。受信はするがネイバを張るプロトコルの場合はhelloをやりとりできなくなるためネイバは張らない
  • OSPFの場合は、redistributeを使うと外部経路となるため、設計時に考慮する必要。
  • 設定により外部経路扱いになるため、LSA(1 or 5)の違いによって、データベースと経路変化時の動作の違い

ふと、ではRIPの場合はと思ったが、セキュリティを考慮するとpassive-interfaceの考えは微妙かもしれない。メーカーや機器によって実装は違うので、当然都度確認はしなければならないと思うが、passiveのインタフェースは通常ルーティングのパケットを送らないが、受け取る。
RIPはネイバを張らないので、ブロードキャスト(v1)orマルチキャスト(v2)で経路情報を受け取るとルーティングテーブルに乗せてしまうのではないかな。意図しないインタフェースから受け取っても。

OpenSSLで1つのOS上で複数の認証局作って検証したいとき

証明書を使うシステムを検証してるときに少しずつ証明書の設定を変えながら行いたいときがある。1つのOS上でCAを増やしながらOpenSSLでなんとなくこうやるという記録。環境はCentos6.5, openssl-1.0.1e-30.el6_6.5.x86_64。

そしてこの情報もまた参考です。証明書関連のお取扱いは慎重に、ご注意をください。

今回は2つ。まず、認証局ディレクトリを2つ作って、openssl.cnfをそれぞれ配備する。

# mkdir /opt/ca01
# mkdir /opt/ca02
# cp /etc/pki/tls/openssl.cnf /opt/ca01/openssl.cnf
# cp /etc/pki/tls/openssl.cnf /opt/ca02/openssl.cnf

で、それぞれのファイルを編集する。今回下記のあたりのみ。"dir="部分にてディレクトリをそれぞれの場所に合わせ、共通の部分では、policy_matchをoptionalとして、CAと証明書要求で違うと怒られないようにする。最後に、clientAuthの拡張用途を指定している。

/opt/ca01/openssl.cnfの書き換え
(省略)…
[ CA_default ]
dir= /opt/ca01/# CHANGED Where everything is kept
…(省略)

/opt/ca02/openssl.cnfの書き換え
(省略)…
[ CA_default ]
dir= /opt/ca02/# CHANGED Where everything is kept
…(省略)

↓共通の書き換え
(省略)…
# For the CA policy
[ policy_match ]
countryName= optional #CHANGED
stateOrProvinceName= optional #CHANGED
organizationName= optional #CHANGED
…(省略)
↓末尾に追加
#####################added#######################
[ clientAuth ]
extendedKeyUsage = clientAuth
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid, issuer

で、openssl.cnfで指定しているディレクトリやファイルをそれぞれ/opt/ca01, ca02ディレクトリの下につらつら作る。両ディレクトリ以下共通の作業

# mkdir certs
# mkdir crl
# mkdir newcerts
# touch index.txt
# echo '01' >> serial
# echo '00' >> crlnumber

そして、CAの準備。利用したコマンドのみで途中の国とかの入力や出力は省略。

# openssl genrsa -aes256 -out /opt/ca01/private/cakey.pem 2048
# openssl req -new -key -x509 -key /opt/ca01/private/cakey.pem -out /opt/ca01/cacert.pem

# openssl genrsa -aes256 -out /opt/ca02/private/cakey.pem 2048
# openssl req -new -key -x509 -key /opt/ca02/private/cakey.pem -out /opt/ca02/cacert.pem

証明書要求を作っておく。newcerts以下に作成していることに特に意味はナシ。コマンドのみで国とかの入力や出力とかは省く。

# openssl genrsa -aes256 -out /opt/ca01/newcerts/01_user.pem 2048
# openssl genrsa -aes256 -out /opt/ca02/newcerts/02_user.pem 2048

そして証明書を発行。コマンドのみ記載
ca01では01_user.csrを、ca02では02_user.csrを作成している。

# openssl ca -config /opt/ca01/openssl.cnf -keyfile /opt/ca01/private/cakey.pem -extensions clientAuth -out /opt/ca01/newcerts/01_user.cer -infiles /opt/ca01/newcerts/01_user.csr
# openssl ca -config /opt/ca02/openssl.cnf -keyfile /opt/ca02/private/cakey.pem -extensions clientAuth -out /opt/ca02/newcerts/02_user.cer -infiles /opt/ca02/newcerts/02_user.csr

OpenSSLのcaオプションのオプションで、"-config"にて使うopenssl.cnfを、"-keyfile"にて発行に利用する秘密鍵を指定している。あとは、拡張用途"-extensions"でclientAuthを呼んでいる。

発行された証明書の中身を確認してみる。CA証明書のSubject Key Identifierと、発行された証明書のAuthority Key Identifierを比較して確認することで、どのCA/認証局から発行されたかがわかる。

それぞれのCA
# openssl x509 -in /opt/ca01/cacert.pem -text
…(省略)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                21:E5:6B:54:47:1A:CB:79:F2:BE:CD:A7:E2:6C:97:23:F8:7B:1C:21
            X509v3 Authority Key Identifier: 
                keyid:21:E5:6B:54:47:1A:CB:79:F2:BE:CD:A7:E2:6C:97:23:F8:7B:1C:21
…(省略)

# openssl x509 -in /opt/ca02/cacert.pem -text
…(省略)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                8E:27:FA:9B:A6:71:11:46:B5:44:FC:71:6C:83:D4:B1:EF:CF:55:BA
            X509v3 Authority Key Identifier: 
                keyid:8E:27:FA:9B:A6:71:11:46:B5:44:FC:71:6C:83:D4:B1:EF:CF:55:BA
…(省略)

それぞれ発行した証明書

# openssl x509 -in /opt/ca01/newcerts/01_user.cer -text
…(省略)
        X509v3 extensions:
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment
            X509v3 Subject Key Identifier: 
                1B:DF:71:BF:39:0E:B4:11:37:BA:71:A6:57:85:96:7F:CB:00:4C:A7
            X509v3 Authority Key Identifier: 
                keyid:21:E5:6B:54:47:1A:CB:79:F2:BE:CD:A7:E2:6C:97:23:F8:7B:1C:21
…(省略)

# openssl x509 -in /opt/ca02/newcerts/02_user.cer -text
…(省略)
        X509v3 extensions:
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment
            X509v3 Subject Key Identifier: 
                62:2E:E3:88:6F:96:05:26:E5:FB:47:BD:E1:F0:45:45:00:22:F8:8C
            X509v3 Authority Key Identifier: 
                keyid:8E:27:FA:9B:A6:71:11:46:B5:44:FC:71:6C:83:D4:B1:EF:CF:55:BA
…(省略)