ひいらぎの日記

デザインはまた時間のあるときにやります!

Google Places APIでプレイス検索(Python)

Google Places APIを使って現在地周辺の色々な建物を検索してみました。

f:id:ymho_99:20170824145708p:plainf:id:ymho_99:20170824145714p:plain

現在地の取得にはGoogle Maps Geolocation APIを用いてみました。これは、携帯基地局情報やWiFiなどから現在地を取得するapiです。

GPSを用いていないため、誤差が大きいです。現在地を取得するのはGPSを使用するhtml5のGeolocation APIがより正確ですが、今回はブラウザが不要ということでこちらを使ってやっていきました。

なお、どちらのapiも、使用するにはキーの取得を行う必要があります。

現在地の取得

Google Maps Geolocation APIを参考にしました。通信は、HTTPSのPOSTによって行います。リクエストとレスポンスは両方とも JSON 形式で、content-typeapplication/jsonです。上記サイトに、リクエストの記述について詳しく書かれています。サポートされているフィールドには、基地局情報やWiFiに関して色々ありますが、これらは省略できるので今回は省略しました。記述した方がより精度は上がります。 下はソースコード(参考)です。

Geolocation_key = #apiキー
url = "https://www.googleapis.com/geolocation/v1/geolocate?key="+ Geolocation_key
obj = {
}
json_data = json.dumps(obj).encode("utf-8")

req = urllib.request.Request(url=url,data=json_data,headers={'Content-type':'application/json'})
response = urllib.request.urlopen(req)
content = json.loads(response.read().decode('utf-8'))
lat = content['location']['lat']    #緯度
Lng = content['location']['lng']    #経度
radius = content['accuracy']        #正確さ(半径)

下にレスポンスの例を示します。

{
  "location": {
    "lat": 51.0,
    "lng": -0.1
  },
  "accuracy": 1200.4
}

latは緯度、lngは経度になっています。accuracyは正確さを表す半径です。取得した緯度経度を中心とし、この半径内の誤差が想定されているようです(GPSではないのでかなり広め)。

プレイス検索

Google Places APIを用いた周辺施設の検索のことを「プレイス検索」と呼んでいるようなので、この言葉を使っていきます。 Google Places API Web Serviceを参考にしました。日本語が充実していて嬉しいです。

こちらは、Geolocation APIと違ってリクエストはHTTP URLです。

https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters

outputjsonxmlの2つが選べるようですが、推奨されているのはjsonでここでもjsonを選択しました。parametersに記述する必須パラメータは、keyapiキー、予め取得したもの)、location(緯度経度、先ほど取得したもの)と、radius(検索半径、せっかくなので先ほど取得したaccuracyを使いました)です。また、radiusの代わりに、rank_by=distanceというものも使用できますが、新たにnametypeskeywordのうち、いずれかのパラメータを加える必要があります。

他にも色々面白そうなことができます、プレイス検索を参照してみてください。

ということで、とりあえずやってみたことを書いていきます。

レスポンス

Geolocation APIのときと同じ方法で、プレイス検索を実行してみます。先にレスポンスの例を示します。ロケーションは「大阪駅」で、types(後述)にuniversity(大学)を指定しました。

{
   "html_attributions" : [],
   "next_page_token" : "NEXT_PAGE_TOKEN",
   "results" : [
      {
         "geometry" : {
            "location" : {
               "lat" : 34.70225440000001,
               "lng" : 135.4904128
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70360338029151,
                  "lng" : 135.4917617802915
               },
               "southwest" : {
                  "lat" : 34.70090541970851,
                  "lng" : 135.4890638197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "2527f5962a7136d705c22fd7e61e080512838250",
         "name" : "創造社デザイン専門学校",
         "photos" : [
            {
               "height" : 2160,
               "html_attributions" : [
                  "\u003ca href=\"https://maps.google.com/maps/contrib/115757658207238128268/photos\"\u003e市川太郎\u003c/a\u003e"
               ],
               "photo_reference" : "CmRaAAAAciB1OiWZ_XCjCNc6jM9kAB3naFfFd45ydIBmFqgik1ExksGeQ-JvMx1czNQm3OCcUwqDcP3B1D1lzkxy6XopTVAguxltinFUfCKbR_phIojbmA0vHmROWLu-k6liDdMiEhDT15uJGVVuF7eDYIc2keCYGhSRdlDD4i_ZKhefSu1MzvxppFxqHA",
               "width" : 3840
            }
         ],
         "place_id" : "ChIJZVH5b4nmAGARvwMfI8k9P_U",
         "rating" : 4.3,
         "reference" : "CmRSAAAAM-uTgvYzgu1pvX7fZp9nHuJCfyXQqoqUdj84L_swpIliGTNAD8LXlU3yo1tmScAG8eBrtJf7cq4pHteOHWLroN_3RbeSd1ts5UTrSl5LjFnTIFxIX-rnTdd-aULvcgjREhByyw76hk1HJYioCXJnOukUGhRmh7gbK60rPoEsVII2OpPBEozsLg",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市福島区福島6丁目25−23"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.69963250000001,
               "lng" : 135.4990685
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70098148029151,
                  "lng" : 135.5004174802915
               },
               "southwest" : {
                  "lat" : 34.69828351970851,
                  "lng" : 135.4977195197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "e4e71687dddad686b032e116e97eb12985ca0b11",
         "name" : "京都女子大学 大阪オフィス",
         "place_id" : "ChIJY8WQHu3mAGAR2JwXMwaaf1k",
         "reference" : "CmRRAAAAjwJZKkChD4wp_HotIlfkgLNUD1jLR1LugLslfhLBexxJ0Tu-_-c-yANTN0-7NYJadWqrFDN44s3ie9kN8N9izWF6mNlnstJ_loChRTskOsCuHZxiMjelp5yR1dbUocDkEhC2V1d2cqOb0kkICbrb2je-GhRJOljDlkQdHtjtHOhBsa8IFPcqUA",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区梅田1丁目11−4"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.69781210000001,
               "lng" : 135.4939915
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.69916108029151,
                  "lng" : 135.4953404802915
               },
               "southwest" : {
                  "lat" : 34.69646311970851,
                  "lng" : 135.4926425197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
         "id" : "f3c80fb854f5deafa78dedba293c7c6af999319f",
         "name" : "株式会社日本アジア文化センター",
         "opening_hours" : {
            "open_now" : true,
            "weekday_text" : []
         },
         "place_id" : "ChIJ96pGO_PmAGARUU1zyXEffgA",
         "reference" : "ClRQAAAAI_7IA8RPJ393oYrU5hHicuyMMdSIeT5yzDSLBEOgSJKXyEV-0pjEsZ8jXLu4dxR65vEUjeDezZdROhncHSvkbYJItTaga2oRW7y62_VWYdISEFKs_3zcblBN9lNQNDUJCmQaFG9XIKYovK-pSn9YCg9habWx0WP1",
         "scope" : "GOOGLE",
         "types" : [ "travel_agency", "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪府大阪市北区 曽根崎新地2丁目3-13 若杉大阪駅前ビル5F"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.702334,
               "lng" : 135.500148
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7036829802915,
                  "lng" : 135.5014969802915
               },
               "southwest" : {
                  "lat" : 34.7009850197085,
                  "lng" : 135.4987990197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "9f7bb99183ae2ed021204dfbffc7c931a177ce8e",
         "name" : "立命館大学 大阪梅田キャンパス社会人大学院",
         "place_id" : "ChIJLz6fJJPmAGARnmgdtN4wRu0",
         "reference" : "CmRSAAAAf377LOt42Fpzsx8zv4N55l09KQSme6vi-Kjqx5JnqTs-1r9GWsesbQI1c4Goa8wDaxsWfcca8nAbwjg-rxQ-7L0AwgYhxkzdAaG_yRcsmpEUM2eh9xODNH9pDga7tbrSEhAd9LB1QOPAVuUxuL-Ha4yqGhQ1DgY0KR9tBWQMPyMc_lbXvaJANg",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市 北区小松原町2−4"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.7021464,
               "lng" : 135.5003165
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70349538029149,
                  "lng" : 135.5016654802915
               },
               "southwest" : {
                  "lat" : 34.70079741970849,
                  "lng" : 135.4989675197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "614442bc2419bd89f9606f828afb547ec30a7802",
         "name" : "立命館大学 梅田大阪キャンパス 就職活動支援",
         "place_id" : "ChIJLz6fJJPmAGARmJbneXw72SE",
         "rating" : 2.3,
         "reference" : "CmRRAAAAELzFIwfHbtihPlJcuCvToQFaNM2WWSI08O99kHKTZwqK_MWvj_rf3NCHDmXARhe6snzUN0CGrzOd2pA8-1-LFuLnaMPT3HsCarMZCpEGcF0J995zlyV-KzjZyZdhEESbEhCcuBF1epAMsr4HX35mB0NvGhSi1Ykx0nE5BlGiE6vgJS-d1tfYqw",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市 北区小松原町2−4"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.7028134,
               "lng" : 135.500372
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70416238029151,
                  "lng" : 135.5017209802915
               },
               "southwest" : {
                  "lat" : 34.70146441970851,
                  "lng" : 135.4990230197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "88001efd7cef2f1ca34fd48ac7b5777928c2d8fd",
         "name" : "芦屋大学 大阪キャンパス",
         "place_id" : "ChIJiURGFZPmAGARhr9gzmkDzUA",
         "reference" : "CmRRAAAA5Q3ohzdoH0LOCYYK7GFcPuB3YRfmBvRe23NGkodw2p3bhBMAml6M8ud5HHwdaX_xGkjVEQ2Tr1E4nBoYk3i7j1LWoIaHElqkC37x1dRIWqCFiSlnc9sTPM3S7EdVbqxREhBtWpP_ik2Upl5FJur5gXgLGhT1YQksA7y9R_RbnSJrdyhtuDljNA",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区小松原町3−3"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.698829,
               "lng" : 135.499248
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7001779802915,
                  "lng" : 135.5005969802915
               },
               "southwest" : {
                  "lat" : 34.6974800197085,
                  "lng" : 135.4978990197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "da844c29249e6ebbc75a85206afa8628f6c911c9",
         "name" : "大阪産業大学 梅田サテライトキャンパス",
         "place_id" : "ChIJu8FMVezmAGAR7ShAmT5VhyI",
         "reference" : "CmRRAAAAyJ61IuIegU10XRkfxYA0LRxyl2OL5TseLgnzYSOCkUJ9YHxsvll6eogH4L5ZtyzRAidtWSnN5P7jyCIvPRtfFw01TzyNqQmwWvktmMcX36UBkWh94rsMz1FuBWopF8lUEhBYSh_WhUOX5A3hgzjIezKjGhSKwOojvaYFFPpugrvN99sYRvLPXQ",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区梅田1−1−3"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.6988288,
               "lng" : 135.4992485
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7001777802915,
                  "lng" : 135.5005974802915
               },
               "southwest" : {
                  "lat" : 34.69747981970851,
                  "lng" : 135.4978995197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "7574447626d7c9cace4906e0952c7944552d4654",
         "name" : "熊本大学 関西オフィス",
         "place_id" : "ChIJ1WWpqu3mAGARWDhaqL96wuU",
         "reference" : "CmRSAAAA0DvFy6IX_NY5Cz2jepOi48Bixz711f4nt1piBb2EENor4k37fgHeycQbbEr7ncgvTfy25IYDCNaH9nx-2xRNat11Ead6OmMu4gEim4fu9kQx_pZbMz3pmtmLNox211i5EhB8DnV_Um9tG2O3p81JnR0xGhRmeeVEZBPP4-ma3FZciLgH4tHgPw",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区梅田1丁目1−3"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.6988288,
               "lng" : 135.4992485
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7001777802915,
                  "lng" : 135.5005974802915
               },
               "southwest" : {
                  "lat" : 34.69747981970851,
                  "lng" : 135.4978995197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "f69b1ce823d89a9ea006d02fbd9ca30bfc87c8bb",
         "name" : "鳥取大学 大阪オフィス",
         "place_id" : "ChIJrYRtAO3mAGARdeaYpaDhoLA",
         "reference" : "CmRSAAAATT668su_dq_CcxixkALXFca3Vy7Nqg_10QZG8-AeTsqFUQAYPGq1xkhPPSjYfcBIhpLtCBMMEDurVcFJZX4aBtlTcqPcqZPiBy5_Z5TQg1dDwi3kmdY3AwRycqnF9iYGEhBujYTe1_3Ni3Flev8cUlOZGhTMUwd_Qnp6gHy52ZXHoNjA06Ff8Q",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区梅田1丁目1−3"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.698779,
               "lng" : 135.499415
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70012798029151,
                  "lng" : 135.5007639802915
               },
               "southwest" : {
                  "lat" : 34.69743001970851,
                  "lng" : 135.4980660197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "6a2eed19a99074a46dd0e8ddd2a95aa8e81a1e56",
         "name" : "テンプル大学ジャパン大阪校",
         "place_id" : "ChIJrYRtAO3mAGAR4yJYW61zu2A",
         "rating" : 5,
         "reference" : "CmRRAAAA1_yeF02N8ylWliks_BDdPBqKHP4UPJSQEXjAZRULoJifc0N3955NPCnrh1f3Ms1XdNsaiNzZfbwE-4dYgv268gxY-sWIi8zcl6B-geeqNPNwuORd1lQu2YUtpL3H4JcgEhALwCvCrVKUL4FR9WYbHqzEGhQsvV-ByYUqxJYGo01GOb2R9DuA5w",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪府大阪市北区 梅田1-1-3 2100 大阪駅前第3ビル21F"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.699389,
               "lng" : 135.500382
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7007379802915,
                  "lng" : 135.5017309802915
               },
               "southwest" : {
                  "lat" : 34.6980400197085,
                  "lng" : 135.4990330197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
         "id" : "971e11df57c692a38c293b73f4fdef0e607b32da",
         "name" : "(株)留学ジャーナル",
         "opening_hours" : {
            "open_now" : true,
            "weekday_text" : []
         },
         "place_id" : "ChIJrYpW9ezmAGARQzQuq1IsTNM",
         "reference" : "CmRSAAAA19J6yTKBwyHbZ3KIvMwb62SDenXPqATfseTLAIVxL9ojcA2rXfClbxkYr2J6FDhNY5F0g89-jMcii51-PywYURgp6md0vaV4GdJuP1n6q4vsvTnU4yI72EuXQY-3JpnfEhABRvqQI0TMNtOrTEUvwOoXGhQvnYI-y286sLbTnuVFE523111EPQ",
         "scope" : "GOOGLE",
         "types" : [ "travel_agency", "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市 北区梅田1-11−4 大阪駅前第4ビル21F"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.7054727,
               "lng" : 135.5002257
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7068216802915,
                  "lng" : 135.5015746802915
               },
               "southwest" : {
                  "lat" : 34.7041237197085,
                  "lng" : 135.4988767197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "a6373d81d64a659a97e04382716666309f66b811",
         "name" : "大阪工業大学 梅田キャンパス",
         "photos" : [
            {
               "height" : 3120,
               "html_attributions" : [
                  "\u003ca href=\"https://maps.google.com/maps/contrib/113947973414279056061/photos\"\u003emorikawa seiya\u003c/a\u003e"
               ],
               "photo_reference" : "CmRZAAAAGIVOpsM8DRDMyQskBl31EN0NGimNDacXiZTxt5NAgSAY62GNA5d32u8w4aHCyfSyTf3zLXYYlCbPwY8yOW6AZ1B2RoiqFjQDQjUTTsLO6asbcpyfGTTo3A7bAqsdFwfzEhDT9lM6eMrKE5hEjQhXXBStGhTn6jhbykg6fCfRnvUNISVKm5QkXw",
               "width" : 4160
            }
         ],
         "place_id" : "ChIJof-_3JPmAGARo93FQSRGgss",
         "rating" : 3.6,
         "reference" : "CmRSAAAAKPqvXDJ0EdcT0R2Jf46zi9ga0qpgfQHjAuc6lLyLWUnC4yJ6MgoEoJuRcAZEEO3Y3kGLFybXq21kvKKuulL4sijwNaDVQq1ArLm7M2a0N6HKqjKae-lgS9xoA8fE50wiEhCFpm19ZbUQDXSFAWT9pnplGhRllTKxuZbr3aYICYjjElhR6k9mHg",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区茶屋町1番45号"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.6957768,
               "lng" : 135.4945428
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.69712578029149,
                  "lng" : 135.4958917802915
               },
               "southwest" : {
                  "lat" : 34.69442781970849,
                  "lng" : 135.4931938197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "117aa7219918ee80229858c5544aecd165fe36bf",
         "name" : "NIC International College in Japan 大阪校",
         "opening_hours" : {
            "open_now" : true,
            "weekday_text" : []
         },
         "photos" : [
            {
               "height" : 3840,
               "html_attributions" : [
                  "\u003ca href=\"https://maps.google.com/maps/contrib/110299657698368209895/photos\"\u003eNIC International College in Japan 大阪校\u003c/a\u003e"
               ],
               "photo_reference" : "CmRaAAAASaupFhyo1DNkr12K_CwTOTJZANF0cVwdpH3mb_wF5VX2qJ_zMkMcqI5cyh2devsA-mgr7cbEcOgfs8pQAvD9GZFHiNRSK21-or3GYmt_EW5lyQ9jCUKOutONGKEYmCn3EhCQQpVgiMHPY41A7Dj_g2ItGhQOOsc_iD6-5Sos-z8amqiOLxz-Zg",
               "width" : 2560
            }
         ],
         "place_id" : "ChIJs2o0uPTmAGARbF27kapQCco",
         "reference" : "CmRSAAAAvPMy8aIhMyUwkZrimb4JheWw23J4VmsMP0buni_9bjgnDOVSj998k8TRXwbLJdSn708E4Sq5pBy0pNyBGwN4zo1HQnqoIQwaW-5msy3FL1crK5of3hbyiUdyDlEOQ71FEhDwiwd9AkDUs76NxTIKU2kjGhTxtU4tiMHoPO8OPDs8RfmGTAlk0g",
         "scope" : "GOOGLE",
         "types" : [ "university", "school", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市 北区堂島2ー1ー7"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.70794279999999,
               "lng" : 135.4971356
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.70929178029149,
                  "lng" : 135.4984845802915
               },
               "southwest" : {
                  "lat" : 34.70659381970849,
                  "lng" : 135.4957866197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "a467beea92b2994bd271cd7d5315c0868b17f2f9",
         "name" : "宝塚大学 大阪梅田キャンパス",
         "photos" : [
            {
               "height" : 1307,
               "html_attributions" : [
                  "\u003ca href=\"https://maps.google.com/maps/contrib/107307351353889895449/photos\"\u003e宝塚大学看護学部\u003c/a\u003e"
               ],
               "photo_reference" : "CmRaAAAA1SwmpNaN6ozY9lMBG3tHwOAlZ2ihd4zybRvzEqxEu-7r7a9xhjgM63dhjlOjBa1x-5-CBVvRuZrSJVODwH-4R5obd3YUBv3yp3ooQRdyFQJsBgGZhDNaF5ehPLfzC6BhEhAc-xqrLhbCijWULu96HRRFGhTXpjiKud6fMlldqD3_zeGkdG4N4g",
               "width" : 871
            }
         ],
         "place_id" : "ChIJnUzBH5DmAGARfA5nO3CwrTo",
         "rating" : 5,
         "reference" : "CmRRAAAA2XEFz_Jc6vulQuJ7Bu_KZ_RUz2BvS8UD7nYj8E6TFqFCV7mp5oUmhGMaR5njP7quIuiUZZxa3Su0W8ohRwNtk3RWF2Py5ZdU-jLU4SCzLDPBEIdi7ppARiinX_x6bkk_EhC9XOd7NamMjH6lmO4Atf64GhRkXa3uCXGYy2raYH9aZempghDUfQ",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区芝田1丁目13−16"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.7085308,
               "lng" : 135.4985539
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7098797802915,
                  "lng" : 135.4999028802915
               },
               "southwest" : {
                  "lat" : 34.7071818197085,
                  "lng" : 135.4972049197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "79f62dfb063c3c257ad81f38f83989123bf5aa71",
         "name" : "関西学院大学 大阪梅田キャンパス",
         "place_id" : "ChIJUZ25QpDmAGARwEo_iAEALr0",
         "rating" : 1,
         "reference" : "CmRSAAAACA9-YyeWEv8sz8JrzO1JVibcU3wvnNTd0TIk1D62VSdNycAHkk4zgjpZFDHfUrs5v8yZBuXRPzsNuYndymfHijZ13vTS3Yj8oQt41sUHMt_j8lS_C3WAnVpbj9oAYXoaEhDxavR2Tm6AdvK-ll9XlxrGGhTwCzmiVVEwwev7HrQDZ7_yp0DCUA",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区茶屋町19−19 10 階 ,14 階 アプローズ タワー"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.70672520000001,
               "lng" : 135.5032091
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7080741802915,
                  "lng" : 135.5045580802915
               },
               "southwest" : {
                  "lat" : 34.70537621970851,
                  "lng" : 135.5018601197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "571883a01b3890ee138b906399fd31debf76383c",
         "name" : "株式会社アートスタッフ",
         "place_id" : "ChIJlawkO5TmAGAR64UmmsjUoz0",
         "reference" : "CmRRAAAAd-nDDGRYtmnFjUTAivkWbEkBangt4OYiDVVQPcngoy9WaA3Fy87ws4_6EEAdOPJl4zzix9w-x1UJ3k5YVXJbOc87shfU6igQlua8okPFEK2lq5OcnUhxqfEOg1wFvMHTEhCMJCDPp1SHwLm2XgAjD7NAGhQmA826aYa0BbTGVE8Zx6bjopc1cw",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪府大阪市北区中崎西2-6-17 ワオ第1ビル2F,3F"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.6927134,
               "lng" : 135.4904719
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.6940623802915,
                  "lng" : 135.4918208802915
               },
               "southwest" : {
                  "lat" : 34.6913644197085,
                  "lng" : 135.4891229197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "64f9c99bf358e59aeb3544dca74a0a0f54335799",
         "name" : "広島大学 入学センター大阪オフィス",
         "place_id" : "ChIJqW_NJ_TmAGARdTuCbqtOXqM",
         "reference" : "CmRSAAAAFD3fDgh4t28UzOBIhGgrXaTRF7KqDEhslHk2qE8dHbrQN9PTgGMjrL8rIG2P6SPUrNT7xWCNodHY0qGE_8Vgm7Zv_74eJ-OsyPJZ-qFFthx2TKUjyLyNGV2ShVqvqc5IEhAU2cjYN3lEBOmUOZOzuCbOGhQkinFrhbX-Zxxt_Kx8l0XwgV5mtw",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区中之島4丁目3"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.6937378,
               "lng" : 135.5021651
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.6950867802915,
                  "lng" : 135.5035140802915
               },
               "southwest" : {
                  "lat" : 34.6923888197085,
                  "lng" : 135.5008161197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "f6c7c23fc453b3a9a7bc8f4dc9705b1db148c104",
         "name" : "国立大学法人 大阪教育大学天王寺キャンパス",
         "place_id" : "ChIJDXa8qOjmAGARshyx82dcf1o",
         "reference" : "CmRRAAAAH7msqKRQXJ3XdeJqVTijryBDJT0FsLMC8tAM4BJj20KFgDVYnH72YHhboxPF-znHn9mzdZb1Qy8qMYNRApo0p5ozFete8N5whm4T13vfecDha3xxQO1Efvbr1M7GTKBQEhD75XOTfrTiqfzX0n1F66SsGhTNJVEMscIKPCKs6PrTx4HGoYYxbw",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市天王寺区南河堀町4−88"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.7129772,
               "lng" : 135.5010982
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.71432618029149,
                  "lng" : 135.5024471802915
               },
               "southwest" : {
                  "lat" : 34.71162821970849,
                  "lng" : 135.4997492197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "9880d8340a79218f5f30fc7576c13e870b3f80db",
         "name" : "サンダヴィンチ・アートスクール 梅田サテライト",
         "place_id" : "ChIJhTJBLZrmAGARQG2g2SEfLME",
         "reference" : "CmRSAAAAw_vp_A5ywKP5h4mkaQhyWTfQnY1nybS1mzjiHzUKvpe7wZ8BovVp7bESEjKTFpi0e4J7unYTewH77yUU8FJdN_XY6TxAioGN1EH-ppEtGeQ_11o2d7ty_dHYR3EdVx3mEhBrnOAE2kABqFqfiZwTObBSGhQLpQqWXAR1pfXml_G8PeSzsYjgjA",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区豊崎4丁目6−26 北梅田アーキスビル"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : 34.703845,
               "lng" : 135.511256
            },
            "viewport" : {
               "northeast" : {
                  "lat" : 34.7051939802915,
                  "lng" : 135.5126049802915
               },
               "southwest" : {
                  "lat" : 34.70249601970851,
                  "lng" : 135.5099070197085
               }
            }
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/school-71.png",
         "id" : "6b2789d602b77b2ba7504b0e746e53f8db876ee3",
         "name" : "マージャン大学",
         "place_id" : "ChIJP1MN0sbmAGARe1rngN8reO8",
         "reference" : "CmRSAAAAGNbj0auiCLKIAtpUW76PNvX8jT7_BBhq7OR7LbJqbELEtiqRoMqujGuhCx4WAHooJ-wqiYDkBdHpOXpGL_JyMEG0gWaU5e4rc7Dwe2W2pt3QHJWFmKNfgRQaPlc2LqBqEhDK8Q2YDr41cIDm-ITQ3ZoYGhR_e8r0O0oewQ7URFNIlqX4AP9vKQ",
         "scope" : "GOOGLE",
         "types" : [ "university", "point_of_interest", "establishment" ],
         "vicinity" : "大阪市北区天神橋4丁目7−25"
      }
   ],
   "status" : "OK"
}

このように、一度に最大20件返してくれます。

next_page_token

プレイス検索では、最大60件の結果を返すことができます。しかし一度に20件しか返してくれないため、もっと結果が欲しいときは、もう一度リクエストを送って次の20件を取得する必要があります。そのときに用いるのが、next_page_tokenです。次のようにリクエストを送ることで、新たに20件結果を取得できます。検索結果が20件以下の時は、レスポンスにnext_page_tokenは含まれません。

https://maps.googleapis.com/maps/api/place/nearbysearch/json?pagetoken=NEXT_PAGE_TOKEN&key=YOUR_API_KEY

ただし、発行されたnext_page_tokenが有効になるまで少し時間がかかるようで、これが有効になる前にリクエストすると、INVALID_REQUESTというレスポンスが返されます。

types

ここでは、typesにuniversityを指定しました。これは、検索時のジャンルのようなもので、他にはATMconvenience_storetrain_stationなどがあります。以下を参照してください。

プレイスタイプ

プレイスタイプに書いてあったものの引用です。これを引数(TYPE)に加えることでより焦点を絞った検索ができます。「ジャンル」は僕が翻訳というか、TYPEのニュアンスが掴みやすいように整理したものです。検索地域によって含まれるプレイス等に差異があると思いますが、参考程度になればと思います(よく意味の似たものもあり、何が違うのかよくわからないものもありました、新たな発見ができれば修正したいです)

type                   ジャンル                                                                                        
accounting 会計・税理士事務所
airport 空港
amusement_park アミューズメント施設
aquarium 水族館
art_gallery 絵画とかのギャラリー?
atm ATM
bakery パン屋(ミスド・ピザ含む)
bank 銀行
bar 飲み屋(飲食店含む)
beauty_salon ビューティーサロン(?)
bicycle_store 自転車屋さん
book_store 本屋さん
bowling_alley ボウリング場
bus_station バス停
cafe カフェ
campground キャンプ場
car_dealer カーディーラー
car_rental レンタカー
car_repair 車の修理屋さん(板金塗装とか)
car_wash コイン洗車
casino カジノ
cemetery 墓苑・霊園
church 教会
city_hall 市役所・町役場関連
clothing_store 服屋さん
convenience_store コンビニ
courthouse カットハウス
dentist 裁判所
department_store デパート・複合商業施設
doctor 病院(下記のhospitalとの区別が微妙。町の病院ってイメージ)
electrician 電気系統を扱う会社()
electronics_store 家電量販店
embassy 大使館
fire_station 消防署
florist 花屋さん
funeral_home 葬祭場
furniture_store 家具屋さん(ふとん屋さん)
gas_station ガソリンスタンド
gym スポーツ施設
hair_care 美容室
hardware_store 金物店
hindu_temple ヒンドゥー教のお寺?
home_goods_store 日用品のお店
hospital 病院
insurance_agency 保険屋さん
jewelry_store 宝石店
laundry クリーニング店・コインランドリー
lawyer 弁護士(税理士等)事務所
library 図書館
liquor_store 酒店・商店
local_government_office 地方行政施設
locksmith 鍵屋さん
lodging ホテル
meal_delivery ピザ・お弁当とかデリバリーしてくれる店
meal_takeaway テイクアウト(すき家とか)やスナックとか
mosque 神社
movie_rental ビデオレンタル屋さん
movie_theater 映画館
moving_company 引越し屋さん
museum 博物館
night_club ナイトクラブ
painter 塗装屋さん
park 公園
parking パーキング
pet_store ペットショップ
pharmacy 薬局
physiotherapist 整体
plumber 配管工
police 警察署
post_office 郵便局
real_estate_agency 不動産
restaurant レストラン
roofing_contractor 瓦屋さん
rv_park                 快適に安心して車中泊が出来る場所を提供するため日本RV協会が推進してる場所(らしい)。
school 学校
shoe_store 靴屋さん
shopping_mall ショッピングモール
spa 温泉
stadium スタジアム
storage 貸し倉庫
store
subway_station 地下鉄駅
synagogue ユダヤ教
taxi_stand タクシー乗り場
train_station
transit_station 駅・バス停
travel_agency 旅行会社(レンタカー屋さん含む)
university 大学
veterinary_care 動物病院
zoo 動物園

以下、ソースコード(参考)です。引数に、プレイスタイプを打ち込むと、それに従って検索します。引数がないときは半径をaccuracyとして検索し、プレイスを適当に返します。最大60件の結果を返します。next_page_tokenが有効になるまでの時間稼ぎとしてtime.sleepを入れ込んでいます()

# place_search

Places_key = #apiキー

def req_Response(url):
    req = urllib.request.Request(url)
    response = urllib.request.urlopen(req)
    content = json.loads(response.read().decode('utf-8'))
    return content

option = "&radius="+ radius  #引数に指定がないとき500m圏内から適当に色々検索
if len(args) == 2:
    option = "&type="+str(args[1])+"&rankby=distance" #検索するタイプを選択(&距離が近い順にソート)

url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="+ str(lat) +","+ str(Lng) + option + "&language=ja&key=" + Places_key
while 1:
    content = req_Response(url)
    for i in range(0, len(content['results'])):
        places.append(str(content['results'][i]['name']))

    time.sleep(2) #next_page_tokenが有効になるまで少し時間がかかる

    next_page_token = content.get('next_page_token')
    if next_page_token:
        url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?language=ja&pagetoken="+ next_page_token +"&key=" + Places_key
    else:
        break

何か指摘いただけると嬉しいです٩( ´◡` )( ´◡` )۶

github.com

追記

URLリクエストに、language=jaを含めることで、日本語を優先してレスポンスを返してくれます。

HTML + JavaScript でちょっとだけ楽する

部活で、会議の議事録を書くという(多分誰も読んでいない)役割があって、そこに出席者の名前を列挙しなければいけなく…下に簡単に書いてみますと、

  1. 紙媒体で誰が出席してるかチェック

  2. その紙を見ながらパソコンでひたすら名前(名字)を打ち込んでいく

  3. 議題について書き込んでいく

2がとてもめんどくさいなと思っていました。

Macユーザーになる前は、WindowsのOffice(Word)上でフォームアプリケーション(でいいのかな? 手前にウィンドウ表示させてそこで作業するやつ)を作ってチェックボックスにチェックが入っている人の名字をボタン1つで本文に自動入力という感じのマクロを作っていたんだけど、Macに乗り換えてから、それができなくて、毎回人名を手で入力していました。

ちょっとでも楽したいので、ブラウザ上にチェックボックスを配置して、ボタンを押すと、出席者の名字を「、」で区切ったものをアラートしてクリップボードに入れてくれたら助かるかなと思ったので実装してみることにしました。(いちばんやりやすそうだったからブラウザ上にしたけど、他にも方法ないかな?)

できたもの

f:id:ymho_99:20170505205715p:plain

こんな感じ

Who is attend ?

です。ひいらぎファミリーが選択されています。 これをATTEND!すると、

f:id:ymho_99:20170505202847p:plain  こう返してくれる(全員名字がひいらぎだった…) まあ人数は別にいらないけど、なんとなくつけました。

クリップボードへの格納はできなかった(なんかブラウザの仕様でできるできないがあるらしくてめんどくさくなったのと、safariはalertの文章をクリップボードにコピーできる(人工的に)ので今回はやめました)。

所要時間は1時間くらいでした。 名簿は変更が容易にできることを前提として、名簿専用のjsを別に作りました。

index.html

main.js

member.js

style.css

の4ファイルでできてます。mainは主にATTEND!の挙動について、memberは名前一覧、それをindex.htmlのfor文でチェックボックスをくるくる表示してる感じです。 CSSについては、

qiita.com

このページを参考にさせていただきました〜m(__)m

f:id:ymho_99:20170505204117p:plain  [“所属”,”名前”]みたいな感じです。

難しかったこと

選択画面ではフルネームを表示させて、alertするときには苗字だけに文字列をカットするのに、substringで開始位置を0に指定して、indexOfで半角スペースを見つけそれを終了位置にするところで少し手こずった。 それくらい…です。

githubに置いてるのでソースを見たい方はそちらからどうぞ

github.com

学んだこと
membersList[i][1].substring(0,membersList[i][1].indexOf(" "))

とすれば、開始位置は先頭、indexOfの引数の文字の直前が終了位置となって配列の要素それぞれに対し任意の文字を取り出せる。それも含んで、

<form class="FORMBOX" name="XXX">
            <script type="text/javascript">
                for (i = 0; i < membersList.length; i++) {
                    document.write("<input type=\"checkbox\" value=\"" + membersList[i][1].substring(0,membersList[i][1].indexOf(" ")) + "\" id=\"" + i + "\">");
                    document.write("<label for=\"" + i + "\" class=\"checkbox\">" + membersList[i][0] + ": " +membersList[i][1] + "</label>");
                }
            </script>
</form>

htmlにこう書くとmember.jsに登録されている名前の数だけcheckboxを生成できそう。

書き方に関しても、もっといい方法ないかすごく気になるけど、とりあえず、本を欲しいなあ!

www.amazon.co.jp

自宅でルーターを作りたい!その3 〜いろんなアドレス〜

ymho99.hatenablog.jp

前回、前々回とRouting tableについて調べて、なんとなく意味が分かるようになった。 今回はもうちょっと幅を広げてルーターについて調べてみることにする。

3 Minutes Networking No.28

まず、データを転送するとき、宛先IP・MACアドレス、送信元IP・MACアドレスの4つが必要なのだそう。ここでまた一つ疑問。IPアドレスMACアドレスの違いは何なのだろう?両者とも、ぼやっとしたイメージでしか理解してこなかったなあ。

改めて調べてみよう。

IPアドレス

同じサイトでIPアドレスについてまとめられているページがあった、ここを参考にしよう。

3 Minutes Networking No.21

論理アドレスの代表格だそう。論理アドレス?これもよくわからない…調べてみた。論理アドレスの他には、物理アドレスというのがあって、これと対比して考えてみよう。 物理アドレスは、ユニークなビット列で、そのアドレス自体にはなんの意味も持たないらしい。対して論理アドレスはアドレス自体に「何処の・誰」という情報が含まれているらしい。 ほうほう、違いははっきりした!

さらにその情報は「階層型」といってどんどん積み重ねていくことが可能なのか!

f:id:ymho_99:20170429200032g:plain

また画像をお借りしましたm( )m この画像でいう2番のPCなら、ネットワークA内ネットワークA1内ネットワークA1a内2番っていうアドレスになるわけで、この情報が論理アドレス自体がもっている、という理解でいいかな。

サイトを読み進めていくと、MACアドレスとの対比をしながら説明されていたので、ここで一旦MACアドレスについて調べに行くことにしよう。

MACアドレス

www.pc-master.jp

こちらのサイトに例を交えてわかりやすく解説されていました。 はじめの一文でなるほどってなった。

MACアドレスとは、 ネットワーク機器やネットワークアダプタに付いている固有の識別番号です。 LANで接続されている機器やLANの増設アダプタには製造段階で必ず付けるようになっています。 MACアドレスは 0~9、A~Fの16進数で、A0:B2:D5:7F:81:B3 のように表されます。 最初の A0:B2:D5 がベンダーIDといい メーカー名になります。 次の 7F が機種ID、最後の 81:B3 がシリアルIDです。 機器の側面に A0B2D57F81B3 のように連続して記載されていることもあります。 固有の識別番号なので グローバルIPアドレスと同じく 組み合わせは重複しないようになっています。

なるほど、機器が製造されたときに与えられた番号なんだ!PC、ルータ、モバイル端末、なんとハブにまで、MACアドレスが割り当てられているみたい。 ネットワークに入ることができる機器には必ずMACアドレスがあるんだ!

このアドレスは永久的に不変で、IEEEという組織がつけたベンダー(企業)IDとそのベンダーが定めた識別番号によって成り立っているから、すなわちユニークなんだ。この値には通信を行う上での情報はない だからこれは物理アドレスなんだ。

とりあえず、MACアドレスについて理解できたので先程のページに戻って読み進める。

MACアドレスはすでに定められているのに対し、IPアドレス論理アドレス)はネットワーク管理者が自由につけることができるらしい。 また、MACアドレスは機器に対して1つなのに対し、IPアドレスは各機器のネットワークの接続点ごとにつけられているのか。

更にまとめると、

  • IPアドレスネットワークの各機器の接続点ごとにつけられ、例えば、同一ネットワーク内においてNICを取り替えても接続点のIPアドレスは同じ値を持つ。ただし、所属するネットワークが変わると、IPアドレスは変化する。

  • MACアドレス各機器に与えられているユニークな名前のようなもので、NICを取り替えれば値が変わってくる。なんとなく、物理アドレスの「物理」のイメージがつかめた気がする。

更にその下を読み進めます。 論理アドレスは「どこの+だれ」という形になっているらしい。もうちょっと詳細にいえば、「所属するネットワークの番号+ホストの番号」で、当然、所属するネットワークの番号は、接続されているすべてのネットワークでユニークでなければならず(でないと宛先が複数あっておかしなことになるからだと思う)、ホストの番号は所属するネットワーク内でユニークあればいいことになる。

とある2つのネットワークが存在して、接続されているとき、両者の名前は同じであってはならない。 そして、例えば「A」と「B」というネットワークが独立していて、つながっていない場合、それぞれのネットワーク内に「C」という同名のホストが存在してもよいという解釈で合ってるかな。

結局、論理アドレスはすべてユニークであればよいことになるんだなあ!(「C」という同名のホストがあったとしても「所属するネットワークの番号+ホストの番号」で表したときにネットワークの番号である「A」と「B」は違うから、組み合わせるとこれらの論理アドレスは同一でなくなる) これ、足りなくならないのかなと思うけど考えないでおこう…

IPアドレスMACアドレスの違いを理解できたので、本題であるデータのやり取りについて考えていこう。

3 Minutes Networking No.21

このサイトを読み進めていくと、IPアドレスについての項があって、読んでみると、

今現在使われているバージョンは4で将来的には6に変わる

という文に目がついた。これがIPv4とかIPv6とかを表しているのかなあ? となるとこの両者の違いを調べずにはいられないので、ぐぐってみる。

IPv4IPv6

http://www.ncom.ad.jp/images/ipv4v6.pdf

ここにわかりやすい絵と解説がありました! そもそも、IPアドレスは2進数で、terminalとかで見れるやつは10進数16進数に直したものらしい。基数変換はもう学校で習ったのですぐ理解できた。 例えば「192.168.0.1」を2進数に直すと「11000000.10101000.00000000.00000001」となる(ここでのピリオドは区切り!)。 これはバージョン4で、4桁の数字が使われ、32ビットで表現されている。先程考えた、どの範囲でユニークであればよいか〜とかを踏まえて、このバージョンでは最大約42億台のコンピュータが利用できることになるらしい。 対してバージョン6は16桁の数字が使われ128ビットで表現されている。例えば、「2404:6800:8003:0:0:0:0:6a」は16桁。これは桁数が4倍になったので、424億台のコンピュータが利用できることになるらしい。 コンピュータが増えてきて、「ユニーク」に限界が来たからなのかな?とりあえず、そう思うと、さっき浮かんだ「足りなくなるのでは?」という不安がまた当分改善されそう。

そんなことを考えながらもう一度「IPv4IPv6」の検索結果一覧を見ていると面白いページを見つけた。

7 インターネット10分講座:IPv6 - JPNIC

このページでは両者の違いについてこう書かれていました。

具体的な話としては、

グローバルIPアドレスの数が多い

セキュリティ機能を標準で装備している

エンドユーザーの設定が簡単

の3点が大きな違いです。ほかにも色々と違いはあるのですが、これらに比べるとあまり大きな差ではありません。IPv6にしかできないこと、というのはほとんどありませんが、IPv4ではオプション扱いだった機能が標準装備とされ、便利になりました。

グローバルIPアドレス」?今まで使ってきたIPアドレスという言葉と何が違うのだろう…ここでまたこのワードで検索をかける。

www.pc-master.jp

このページでわかりやすく解説がされていました。 まとめてみると、IPv4アドレスが枯渇してゆき、1980年代から爆発的なコンピュータブームにより、42億のアドレスが足りなくなるのではないかという懸念がされるようになり、グローバルIPアドレスプライベートIPアドレスという区別をしようということになった。

グローバルIPアドレス

契約しているプロパイダにつき1つ割り当てられるもので、固有のものであり世界中で重複することはない。モデムやルーターの電源を入れなおすとグローバルIPアドレスが変わることもある。

プライベートIPアドレス

1つのネットワーク内で機器を識別するためのIPアドレス、で各ネットワーク内で重複することはないが、独立した別のネットワークでは同名のものが存在する可能性があるもの。

家にあるプロパイダと契約しているルータが1つあるとすれば、グローバルIPアドレスは1つで、そのルータに接続されている各PCに対して与えられているのがプライベートIPアドレス(あくまでのルータとPC間、ルータとルータ間などでやりとり)、という解釈でいいかな。

このサイトにはこんな感じで書いてあった。

グローバルIPアドレス − @IT ネットワーク用語事典

グローバルIPアドレスとは、インターネットで相手と通信するために持つ、ほかのアドレスと重複しない一意のIPアドレスのこと。TCP/IPでは、通信相手を特定してIPパケットを送信したり、ルーティングするために必要となる。

 グローバルIPアドレスが登場した背景には、IPv4IPアドレス枯渇問題がある。IPv4IPアドレスは32ビットで、おおよそ43億個のIPアドレスを割り当てることができる。しかし、1980年代以降にインターネットが爆発的に成長した結果、IPアドレスを必要とする端末が急増し、43億個だけではいずれ枯渇するのではないかという議論が持ち上がった。

 そこで、すべての端末がインターネットからアクセスできる必要はないという概念により、LAN内のコンピュータには一定の範囲のIPアドレスをプライベートIPアドレスとして割り当てる方針が立てられた。そして、そのLANとWANを接続する機器にのみグローバルIPアドレスを割り当てる形が確立されたのだ。

なるほど、ところでLANとWANって何が違うんだろう?家のルーターの裏をみるとLANとWANの差込口がある。さらにさらに寄り道になるけど、気になったので調べよう。

www.wanichan.com

LAN

Local Area Networkといって、ローカルなエリアでのネットワークという意味らしい。つまりこれが、さっきのプライベートIPアドレスが使用される範囲ということか!

WAN

Wide Area Networkといって、遠く離れた場所がつながっているネットワークらしい。なるほど、これがグローバルIPアドレスでやり取りされるareaということね!

だから、ルーターのWAN口は1つでLAN口はたくさんあるんだ!

自分のグローバルIPアドレスを確認するサイトに出会った。使うかわからないけど一応ここにリンクを貼っとこう。

www.pc-master.jp

何の話だったかな?そうだ、IPv4IPv6の違いを調べていたんだった。割りと理解できたので、例のサイトに戻ってさらに読み進めよう。

IPv4アドレスの例で、さっきもあげた 「192.168.0.1」(16進数)、「11000000.10101000.00000000.00000001」(2進数)

もともとIPアドレスは「どこの+だれ」を表していると知りましたが、この32ビットの数列を16ビットずつに2つに区切ると、まさに前半が「どこの」、後半が「だれ」を表すようになっているらしい。

ネットワーク番号:1100000010101000 ホスト番号:0000000000000001

少し疲れてきたのでここまでにしとこう… 今日はルーターの動作を知るつもりだったけど様々なアドレスについての勉強がメインだった。 確実に理解が捗っているのでこの調子で頑張ろう〜

P.S.

IPv4IPv6には相互互換がないらしい…互換性を持たせる方法的なものがいくつか見ましたが、こちらについては別の機会に触れよう!と思ったことを忘れないようにここに書いておきます。

自宅でルーターを作りたい!その2 〜続Routing table〜

昨日はRouting tableを読むために、用語をひたすら調べるなんてことをやりました。

ymho99.hatenablog.jp

今日はその続きで、実際にRouting tablesにかかれている、127.0.0.1と192.168.0.1について詳しく見てみることにします。 あらためてterminalでnetstat -rnを打ち込む。 あれ〜ぜんぜん違うぞ、学校のwi-fiに繋いでいるとルータが違うからそらそうか!

いまはとりあえず、昨日のRouting tableをもとに調べていこう。

f:id:ymho_99:20170428105148p:plain

昨日読もうとしたサイトをもう一度訪ねます。

3 Minutes Networking No.30

最初に読んだときには飛ばしていましたが、改めて気になる図を発見(画像をお借りしましたm( )m)! f:id:ymho_99:20170428105342g:plain 図の中にありますね、127.0.0.1と192.168.0.1。

あと、127.0.0.0はループバックアドレスといって、パソコン内部のネットワークのアドレスだそう。このパソコンの住所ってことでいいかな。

これを踏まえると、192.168.0.2(自分自身)が、ゲートウェイ(宛先)127.0.0.1に設定されていて、これは内側に向かってパケットが送られていることが分かる。

そして次に、

え~っと、パケットの送り先であるゲートウェイは192.168.0.2。 自分自身ですけど?

まぁこれは、特に決められていない、とでも考えてもらおう。 出口となるポートは、192.168.0.2、つまり自分のNICだ。

うーん、NICってなんだろう? またここでググる

wa3.i-3-i.info

どうやらネットワークカードのことらしい。これはPCの蓋を開けたら入ってるやつ、ということかな。

理解が浅はかですがとりあえず次にいきます。

と思ってふと自分のPCのRouting tablesを眺めてみると、192.168.0.2なんてものが存在しなかった!

うーんと、画像とDestinationが同じなのは 255.255.255.255/32 だけど…これのゲートウェイはlinke#4になってる… そうか!前回確かこれについて調べた。

なんとなく気になったのが「link#4」これはなんだろう? 21.2. ゲートウェイと経路 ここを読んでみたけどよくわからない… こんなページを発見!もろlink#4のことについて聞いてるみたいね! macos - What's the meaning of link#4 in mac's route table? - Super User 唯一のネットワークホスト上で動作するアドレスが物理的に接続されています。 翻訳を駆使して()読んでみると、物理的に接続されたいたらlinkと表示されるみたい。その後に続く番号は、マシンの4つ目のイーサネットカードのことを指しているという解釈でいいのだろうか… さてさて、次はUseの値が大きいものを見ていくことにしました。 0が並ぶ中で、127.0.0.1と192.168.0.1が5000や2000を超えていてよく使われているみたい。 これについては最初に見ていたサイトに戻って解説を読むことにします。 3 Minutes Networking No.30 と思ったけど、今日はここまでにしとこ。 この先踏み込むと、やめられなくなりそう…

自宅でルーターを作りたい!その1 〜Routing table〜 - ひいらぎの日記

ここで出てきた物理的に接続されているイーサネットカードこそがNICであるということかな?

www.sophia-it.com

イーサネットカード NIC」で検索すると上のページに巡り会えた。繋がった! 理解が進んでいることを実感できて嬉しい(≧∇≦)

送り先(NIC)が同じネットワーク内(同じマシンなので当然)でルータを経由する必要が無いからこういう書き方をしているのかな!とりあえず、そう解釈。

もう一度Routing tablesを眺める。

f:id:ymho_99:20170428105148p:plain

この時点でlink#4と書かれているものはすべて同じネットワーク内で送受されていることがわかった。

ではそれ以外を攻める。

先程のサイトを読み続けるとブロードキャストという語が出てきた。聞いたことはあるけど説明しろ!って言われたらできないので改めて調べてみる。

www.itbook.info

こんなページに巡り会えた。

同一ネットワーク上のすべてのホストに対して通信を行う場合に宛先アドレスとして使用されます。 ただし、「コンピュータなどのホスト」に対して設定することは出来ません。

このPCでいう、127.0.0.0内のネットワークのホストすべてに対して通信するときの宛先という意味かな。

ところでホストって何だったっけ?

www.infraexpert.com

ホストについてというより、ルーターについて詳しく解説されているサイトを見つけた。これは後で見そうだから貼っておこう。

ホスト - インターネット用語辞典 - | OCN

あとに見つけたこのサイトでは

ホストとは、ネットワークを通じて端末から送られてくる要求を処理し、端末にその処理結果を提供するコンピュータのこと。

あれ、じゃあパソコンってことかな? 更に読み進めると、下の方に、

インターネットにおいて、ホストといった場合には、ネットワーク上に接続された様々な機器のことを指し、コンピュータのことだけでなく、プリンタやルータのことも含まれます。

なるほど!同一ネットワーク内のホスト、とはそのネットワーク内のPC、プリンタ、ルーターなど、要求を処理するものひとつひとつという意味か!

ここでもとの話に戻って、 「コンピュータなどのホスト」という言葉にルータやプリンタは含まれているのかなあ?これがわからない… これはいまは放置…。

同一ネットワーク上のすべてのホストに対して通信を行う場合に宛先アドレスとして使用されます。

うん、もう一回この文章を読むとなんとなくつかめてきた。

ここでもう一度もとのサイトを見てみる。

f:id:ymho_99:20170428105148p:plain

サイトではdefaultゲートウェイについて説明がなされているが、これは前回理解した。

Destination 対象となるネットワークまたはホスト。「default」はデフォルト・ゲートウエイを表す。この、デフォルト・ゲートウェイというのは、地図に書いていない場所(異なるネットワーク)に行こうとしたときに選択させるってことだと、思う。

自宅でルーターを作りたい!その1 〜Routing table〜 - ひいらぎの日記

これこれ。

ふと、このページの冒頭の「ルーティングテーブルとは」とう文章が目についた。

改めて読んでみると、読める読める!! はじめは何を説明しているのかわからなかったけど、いま読んでみるとすごく読める。 全部じゃないけど意味が分かる!

ルーティングテーブルとは、ルータやPC端末が保持するネットワークの経路情報のことです。ルーティングテーブルには宛先ネットワークアドレスと、その転送先が登録されています。 ネットワークに接続する端末が、ある端末に向けデータを送信しようとするとき、その端末は送信先端末のIPアドレスと自らが保持するルーティングテーブルを参照し、そのデータを送信する宛先を決定します。送信先端末IPアドレスが自らの所属するアドレスと同じネットワークに所属する場合は、直接その端末宛にデータを送信しますが、ルーティングテーブルに登録のないネットワークに所属しているときは、そのデータをデフォルトゲートウェイあてに送信します。現在のネットワークの場合、そのデフォルトゲートウェイにはルータが使用されていますが、そのデータを受信したルータは、データに書かれた宛先ネットワークアドレスと自分の保持しているルーティングテーブルを参照し、転送先を決定し実行します。この時、送信先ネットワークアドレスが、自分のルーティングテーブルにないものだった場合、ルーターはやはりデフォルトとして設定しているルータ宛にそのデータを転送します。こうしてバケツリレー式に転送され、宛先のアドレスを登録しているルーティングテーブルを持ったルータに到達したデータは、ようやく目的の端末に届けられることが出来ると言う訳です。 それでは、その宛先IPアドレスが、この世に実在しないアドレスだった場合、そのデータは永遠に転送され続けるのかというと、そうではありません。現在のIPv4のネットワーク世界では、ルータによる転送は最大255回までと制限されています。それを超える場合はそのデータは破棄されてしまいます。

自宅でルーターを作りたい!その1 〜Routing table〜 - ひいらぎの日記

意味がわからなくて悩んだのはつい昨日の話なのに…

喜ぶのはこのへんまでにして、さらに例のサイトを読み進める。 と思ったら一応読破したみたい。

おっ、このサイト他にもページがあってルーターについても解説されているみたい。

3 Minutes Networking No.28

次はここを読んでさらに理解を深めよう!

自宅でルーターを作りたい!その1 〜Routing table〜

自宅でルータを作ってみてください

情報系の科目が全然ない中、電気に行こうか情報にいこうか相談しに訪ねた先生がこれを提示してくれました。サーバーについては最近学びたかったのでいい機会になると思いました。 まず、「ルーティングテーブル」について調べてみてとのことで、調べてみました。自分なりにまとめたやつをここに書いときます(備忘録ってやつですか?w)。 それでググっても意味の分からない語がいっぱいでこれは1個1個理解しないと進めないと確信したのでまずは知識をつけます。

最初に訪れたサイトにはこう書かれていました。 ルーティングテーブル とは|専門用語集

ルーティングテーブルとは、ルータやPC端末が保持するネットワークの経路情報のことです。ルーティングテーブルには宛先ネットワークアドレスと、その転送先が登録されています。 ネットワークに接続する端末が、ある端末に向けデータを送信しようとするとき、その端末は送信先端末のIPアドレスと自らが保持するルーティングテーブルを参照し、そのデータを送信する宛先を決定します。送信先端末IPアドレスが自らの所属するアドレスと同じネットワークに所属する場合は、直接その端末宛にデータを送信しますが、ルーティングテーブルに登録のないネットワークに所属しているときは、そのデータをデフォルトゲートウェイあてに送信します。現在のネットワークの場合、そのデフォルトゲートウェイにはルータが使用されていますが、そのデータを受信したルータは、データに書かれた宛先ネットワークアドレスと自分の保持しているルーティングテーブルを参照し、転送先を決定し実行します。この時、送信先ネットワークアドレスが、自分のルーティングテーブルにないものだった場合、ルーターはやはりデフォルトとして設定しているルータ宛にそのデータを転送します。こうしてバケツリレー式に転送され、宛先のアドレスを登録しているルーティングテーブルを持ったルータに到達したデータは、ようやく目的の端末に届けられることが出来ると言う訳です。 それでは、その宛先IPアドレスが、この世に実在しないアドレスだった場合、そのデータは永遠に転送され続けるのかというと、そうではありません。現在のIPv4のネットワーク世界では、ルータによる転送は最大255回までと制限されています。それを超える場合はそのデータは破棄されてしまいます。

全然理解できない… ということでもう少し詳しく調べてみました。

3 Minutes Networking No.30

するとこんなサイトに出会いました。

いろいろ頭の中を整理〜。

ルータ

ネットワークとネットワークの最適ルートを選択して繋いでくれる、この最短ルートを見つけることをルーティングという。

ルーティングテーブル

ルーティングするときに見る地図のようなもの、これをもとに宛先のルートを選択する。 netstat -rn をterminalで実行するとRouting tablesなるものが表示された。 f:id:ymho_99:20170427173924p:plain なるほど、これが地図なるものか。 この見方がわからないので、一旦そっちを調べてみよう。これを参考にまとめてみた。

Linuxコマンド集 - 【 route 】 ルーティング・テーブルを表示・設定する:ITpro

Destination

対象となるネットワークまたはホスト。「default」はデフォルト・ゲートウエイを表す。この、デフォルト・ゲートウェイというのは、地図に書いていない場所(異なるネットワーク)に行こうとしたときに選択させるってことだと、思う。

Gateway

ゲートウエイのIPアドレス。「*」は設定されていない。 ん、ゲートウェイってなんだ…ここでさっきのサイトに戻る。 ああ、パケットをどこに送るかの宛先のことだった。でも、同じネットワーク内でのやり取りにはどんなものがあるのだろう??

Flags

ルーティングのフラグ。「U」はルーティングが有効,「H」は対象がホスト,「G」はゲートウエイ,「R」は回復される動的なルーティング,「D」はデーモンまたは置き換えによって書き換えられるルーティング,「M」はルーティング・デーモンまたは置き換えによって書き換えられるルーティング,「A」はaddrconfで設定されたルーティング,「C」はキャッシュのエントリ,「!」は拒否を表す

ほほう、こう区別することで何かいいことがあるのだろうなきっと。とりあえず、今はいいかな…

Refs

ルートの参照数を表しているそう。defaultのrefsは、今PC上で異なるネットワークへの道がどれだけ開かれているのかを表しているのかな?試しにメールアプリを終了して、もう一度コマンドを再入力してみた。すると51だったのが33になった。うん、なるほど、とりあえずこういう解釈でいいのかな。と思ったけど、もう一回メールアプリを起動すると12になってた。あれ、おかしいなあ〜。 10秒くらい時間をおいてもう一回。今度は18になってる。あそうか、常に通信しているわけじゃないのか、こちらがリクエストを送ったとき(あるいはアプリが自ら)だけ道が開かれるなら、時間によって変動する理由もわかる。意図的に違うアプリを起動してみるとやっぱり増えた。いまいち判然としないけど、いまはそういう解釈でいよう。

Use

ルーティングの参照回数だそう。うーむ、わかんないな。もうちょっと調べる。

ネットワークコマンド使い方:route 〜ルーティングテーブルの表示/設定を行う - @IT

こんなサイトがあった。ここには、経路が使用された回数とある、そらそうか。ルーティングとは最短経路を見つけることだから、その参照回数といえば、それが使用された回数となるわけか。

Netif

むむむ、これもよくわからない。かなり時間をかけてやっと見つかった。

http://www.ie.u-ryukyu.ac.jp/~e075730/rep/info1-rep1.pdf

ネットワークインターフェイス名だそう。またわからない用語が出てきたので調べる。

ネットワークインターフェイス - 意味・説明・解説 : ASCII.jpデジタル用語辞典 2つのプロトコル間でのデータやパラメーターの受け渡し、結果の受け取りのための規約がインターフェイスである。(抜粋) なるほど…プロコトル間でのデータのやりとりについて決められているのね。 プロコトル、は理解しているつもりなので想像がつきやすくてよかった。

Expire

この経路情報の有効期限、だそう、もうこれは単語からなんとなく想像できそうな。タイムアウト時刻の判定に使われているんだ!

とりあえず、これでRouting tablesにかかれている内容が読めるようになったぞ。 じゃあ次に実際にリストに含まれている部分について見ていこう!

もう一回見ると、なんとなく、さっきより簡単に見える・・・! 一つ一つみてもいいけど、なんとなく気になったのが「link#4」これはなんだろう?

21.2. ゲートウェイと経路

ここを読んでみたけどよくわからない… こんなページを発見!もろlink#4のことについて聞いてるみたいね! macos - What's the meaning of link#4 in mac's route table? - Super User

唯一のネットワークホスト上で動作するアドレスが物理的に接続されています。 翻訳を駆使して()読んでみると、物理的に接続されたいたらlinkと表示されるみたい。その後に続く番号は、マシンの4つ目のイーサネットカードのことを指しているという解釈でいいのだろうか…

さてさて、次はUseの値が大きいものを見ていくことにしました。 0が並ぶ中で、127.0.0.1と192.168.0.1が5000や2000を超えていてよく使われているみたい。 これについては最初に見ていたサイトに戻って解説を読むことにします。

3 Minutes Networking No.30

と思ったけど、今日はここまでにしとこ。 この先踏み込むと、やめられなくなりそう…

四国に行った!

日帰りで四国に行ってきた。今日は友達と2人。

姫路駅から岡山県まで,黄色い電車に乗った。

岡山駅から瀬戸大橋を渡って,あっという間に高知駅マリンライナーに乗ったけど,めっちゃ早かった。

こんな電車↓

f:id:ymho_99:20170401203630j:plain

高知城を回って,香川県に移動した。

香川といえばうどん!ということで,お昼は当然うどん!ノープランでお店を決めていなかったので,電車で移動しながら決めた。次は絶対計画立てよう!

どーん!

f:id:ymho_99:20170401203948j:plain

すごいボリューム...!

麺の「こし」がとってもよくて美味しかった。

お腹いっぱいになったところで,丸亀城を登った。f:id:ymho_99:20170401204602j:plain坂がすごかった。見るだけで登る気失せて...しかも気温が高くて暑かったし。

上から見た景色はこんな感じ!

f:id:ymho_99:20170401204228j:plain

天気が悪くて本当に残念...お次は琴平へ。

こんぴらさんの愛称で親しまれている,金刀比羅宮へ。ここは,昔来たことがあるけど,奥社までは行けなかったのでリベンジも兼ねて!

琴平「驛」はこんな感じ!セブンイレブンが黒色で京都っぽかった(笑)

f:id:ymho_99:20170401205025j:plain

f:id:ymho_99:20170401205052j:plain

階段をひたすら登ります。丸亀城を登った後なので足に疲れが...

途中まで登ったとこです(↓)まだ半分以上あるかな??この景色は,昔の記憶にすごく鮮明に残ってて懐かしかった。

f:id:ymho_99:20170401205058j:plain

写真を撮る余裕もなく,奥社まで登り続けた。もっと撮ればよかった...

f:id:ymho_99:20170401205039j:plain

ようやく奥社まで行けました!景色最高!でも、雨。傘さして登ったくらい。

でも...ここに来るまでに,地元のお友達とすれ違った気がしたけど,登ることに必死でちゃんと確認できんかった。お友達って言うけど,本当はそうじゃないかも。まあいいや。

帰りは,かなりバテてた,琴平から出てる岡山行き電車に乗った。こんなとこまで岡山行きが来ていることに本当にびっくり!姫路行き電車では大量の人混みに流されて,立ってるのは本当に辛かったけど,そのほとんどが高島駅で降りた。これ覚えとこ!

もうそこからは寝かかっててあんまり覚えてない,けど,もうこれで友達は受験やし,しばらく会えへんのかなあと思って内心悲しかった。

 

P.S

その4日後くらいににカラオケに行けたので,案外すぐ会えた。でもそれ以来。。

 

SublimeTextでLaTeXを使いたい!

TeXのファイルを作成するにあたって、「MacTeX 2016」をインストールし「Tex Shop」を使用していましたが、かねてからソースコードの作成に使用していたSublime Textを用いたいと考えていました。
インターネットで検索すると、「LaTeX Tools」を使用する方法が多数載ってましたが、どうやら古い情報が多く、現在仕様が変更されているものがけっこうあったので、ここで2017年3月の時点での方法をやった通りに書いてみます。
これから記す方法は、「LaTeX Tools」を用いることはせず、Sublime Textに新しい”Build System”を定義することでコードの記述とコンパイルができる、というものです。
こんな状態で始めました。

  • TeX/LaTeXの環境が整っている(以前、「TeX Shop」を使っていたのでMac Tex 2016がインストール済みでした)

以下の手順でやってみました

f:id:ymho_99:20170401211750p:plain
build systemを定義下の画像のような記述が現れたので,ひとまずこれを置き換える。
f:id:ymho_99:20170401212026p:plain

{
"selector": "source.tex",
"shell": false,
"cmd":[
"/bin/sh", "-c", "/usr/local/texlive/2016/bin/x86_64-darwin/platex $file_base_name.tex && /usr/local/texlive/2016/bin/x86_64-darwin/dvipdfmx -p a4 $file_base_name.dvi && /usr/bin/open $file_base_name.pdf"
]
} 

MacTex2016でインストールされたものを参照してるっぽいので,もし,自分のバージョンがわからない時[ls]で/usr/local/texliveを参照して出てきたフォルダ名がバージョンかな...

[⌘(command)]+[S]で名前を「LaTeX2016」として保存すると,これがBuild Systemの一覧に表示された。
[⌘(command)]+[B]でコンパイル。pdfビューアーが自動的に開いて、コンパイルできた。
構文エラーがあれば,画面下のコンソールに内容が表示されそう。
f:id:ymho_99:20170401220918p:plain
f:id:ymho_99:20170401221240p:plain

P.S

Sublime Textのパッケージに「LaTeX Tools」なるものがあると前述しましたが、これを導入しておくと、以下のようにコンパイルせずとも、数式が表示される機能を利用できることに気づきました。
f:id:ymho_99:20170401221243p:plain
これはすごい!