まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

2014年12月

git の submodule コマンドは、バージョンが 1.7.10 以前のものだと http ではリクエストができない、という問題があるようです:
HTTPS cloning erros

一方、現在の CentOS 6 で普通に(デフォルトで) git を導入すると、そのバージョンは 1.7.1 でした。つまり CentOS 6 で普通に git をインストールすると、上記の問題に該当するバージョンが導入される、ということになります:
# git --version
git version 1.7.1

これが問題になるケースもあると思われます。というわけで、git のバージョンを手動で上げる手順を紹介します。以下の例は CentOS 6(64bit) 向けのバージョン 1.7.11.3 を導入する場合ですが、こんな感じ:
# curl -LO http://pkgs.repoforge.org/git/git-1.7.11.3-1.el6.rfx.x86_64.rpm
# curl -LO http://pkgs.repoforge.org/git/perl-Git-1.7.11.3-1.el6.rfx.x86_64.rpm
# yum erase perl-Git
# yum localinstall git-1.7.11.3-1.el6.rfx.x86_64.rpm perl-Git-1.7.11.3-1.el6.rfx.x86_64.rpm

該当の2モジュールを curl コマンドで取得し、現在のものを消してから、yum localinstall で取得したモジュールを使ってインストールしています。

最後に git のバージョンを確認します:
# git --version
git version 1.7.11.3

成功!
 

今年(2014年)の10月31日より、オープンデータ高度化の一環で総務省統計局より政府統計データの多くが Web API にて公開されました:
API機能で利用できる統計データの拡充 -統計におけるオープンデータの高度化- (PDF)

この公開された政府統計データ(eStat)を使ったサンプルを紹介します。
top_header_logo



まず、この政府統計データを使う上での利用者登録と、アプリケーション登録が必要です。利用者登録は以下のページから行います:
利用登録・ログイン

メールアドレスやパスワードを登録し、最終的にアクティベートまで行い、利用登録が完了すると上記ページからログインできるようになります。

ログイン後にアプリケーション登録を行います。「アプリケーションIDの取得」をクリックして、アプリケーションの名称、URL 、概要を入力し、「発行」ボタンをクリックすると appId と書かれた箇所にアプリケーション ID が表示されます。これは後から使う情報になるのでメモするなどしておきます(以下、appId を XXXXXXXXXX として説明を続けます):
2014121501


なお、1つの利用IDで最大3つまでのアプリケーションが登録できます。ウェブ上に公開されているアプリケーションから利用する場合はその URL を指定する必要があります。公開されていないアプリや、テスト目的で利用したい場合はURLに http://localhost/ を指定すればいいようです。


アプリケーションの登録が完了し、appId が取得できたら早速 API を利用してみましょう。まずはどのような統計データが公開されているのか、その一覧を取り出してみます。

データリストを取得するには、以下の URL に GET アクセスします:
http://statdb.nstac.go.jp/api/1.0b/app/getStatsList?appId=XXXXXXXXXX&statsCode=ZZZZ

getStatsList では URL パラメータが2つ指定されています。appId には上記で取得したアプリケーション ID を、そして statsCode には政府統計コードを指定します。例えば平成22年に実施・更新された国勢調査のデータを取得するのであれば、政府統計コードは 00200521 になるので、こんな感じです:
http://statdb.nstac.go.jp/api/1.0b/app/getStatsList?appId=XXXXXXXXXX&statsCode=00200521
(XXXXXXXXXX = 取得したアプリケーションID)

結果は以下の様な XML フォーマットで取得できます:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GET_STATS_LIST xsi:noNamespaceSchemaLocation="http://statdb.nstac.go.jp/api/1.0b/schema/GetStatsList.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RESULT>
  <STATUS>0</STATUS>
  <ERROR_MSG>正常に終了しました。</ERROR_MSG>
  <DATE>2014-12-15T15:15:36.690+09:00</DATE>
 </RESULT>
 <PARAMETER>
  <LANG>J</LANG>
  <STATS_CODE>00200521</STATS_CODE>
 </PARAMETER>
 <DATALIST_INF>
  <NUMBER>4180</NUMBER>
  <LIST_INF id="0000030001">
   <STAT_NAME code="00200521">国勢調査</STAT_NAME>
   <GOV_ORG code="00200">総務省</GOV_ORG>
   <STATISTICS_NAME>昭和55年国勢調査 第1次基本集計 全国編</STATISTICS_NAME>
   <TITLE no="00101">男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別</TITLE>
   <CYCLE>-</CYCLE>
   <SURVEY_DATE>198010</SURVEY_DATE>
   <OPEN_DATE>2007-10-05</OPEN_DATE>
   <SMALL_AREA>0</SMALL_AREA>
  </LIST_INF>
  <LIST_INF id="0000030002">
   <STAT_NAME code="00200521">国勢調査</STAT_NAME>
   <GOV_ORG code="00200">総務省</GOV_ORG>
   <STATISTICS_NAME>昭和55年国勢調査 第1次基本集計 全国編</STATISTICS_NAME>
   <TITLE no="00102">男女の別(性別)(3),年齢各歳階級(103),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別</TITLE>
   <CYCLE>-</CYCLE>
   <SURVEY_DATE>198010</SURVEY_DATE>
   <OPEN_DATE>2007-10-05</OPEN_DATE>
   <SMALL_AREA>0</SMALL_AREA>
  </LIST_INF>
  <LIST_INF id="0000030003">
    :
  </LIST_INF>
    :
    :
 </DATALIST_INF>
</GET_STATS_LIST>

<DATALIST_INF> の中に複数の <LIST_INF> 要素があり、それら1つ1つが異なる統計データを示しています。また個々の統計データにはデータの説明文なども含まれており、 <LIST_INF id="YYYYYYYYYY"> の YYYYYYYYYY 部分が ID として区別されています。これでどのような統計データがあるか、の一覧が管理されています。


また、統計データの種類を1つ指定して、実際の統計データを取得するには getStatsData を使います:
http://statdb.nstac.go.jp/api/1.0b/app/getStatsData?appId=XXXXXXXXXX&statsDataId=YYYYYYYYYY

パラメータの appId には getStatsList の時と同様にアプリケーション ID を、また statsDataId には getStatsList で取得したデータID(上記の赤字で示されている部分)を指定します。 上記例の一番上にある「昭和55年国勢調査の年齢5歳階級別の人口データ」であれば 0000030001 なので、以下の様な URL になります:
http://statdb.nstac.go.jp/api/1.0b/app/getStatsData?appId=XXXXXXXXXX&statsDataId=0000030001

そして、この結果は以下の様な XML フォーマットで取得できます:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GET_STATS_DATA xsi:noNamespaceSchemaLocation="http://statdb.nstac.go.jp/api/1.0b/schema/GetStatsData.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RESULT>
  <STATUS>0</STATUS>
  <ERROR_MSG>正常に終了しました。</ERROR_MSG>
  <DATE>2014-12-15T15:15:38.380+09:00</DATE>
 </RESULT>
 <PARAMETER>
  <LANG>J</LANG>
  <STATS_DATA_ID>0000030001</STATS_DATA_ID>
  <DATA_FORMAT>X</DATA_FORMAT>
  <START_POSITION>1</START_POSITION>
  <METAGET_FLG>Y</METAGET_FLG>
 </PARAMETER>
 <STATISTICAL_DATA>
  <TABLE_INF id="0000030001">
   <STAT_NAME code="00200521">国勢調査</STAT_NAME>
   <GOV_ORG code="00200">総務省</GOV_ORG>
   <STATISTICS_NAME>昭和55年国勢調査 第1次基本集計 全国編</STATISTICS_NAME>
   <TITLE no="00101">男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別</TITLE>
   <SURVEY_DATE>198010</SURVEY_DATE>
   <TOTAL_NUMBER>3651</TOTAL_NUMBER>
   <FROM_NUMBER>1</FROM_NUMBER>
   <TO_NUMBER>3651</TO_NUMBER>
  </TABLE_INF>
  <CLASS_INF>
   <CLASS_OBJ id="cat01" name="全域・集中の別030002">
   <CLASS code="00700" name="全域" level="1"/>
   <CLASS code="00701" name="人口集中地区" level="1"/>
  </CLASS_OBJ>
  <CLASS_OBJ id="cat02" name="男女A030001">
   <CLASS code="000" name="男女総数" level="1"/>
   <CLASS code="001" name="男" level="1"/>
   <CLASS code="002" name="女" level="1"/>
  </CLASS_OBJ>
  <CLASS_OBJ id="cat03" name="年齢5歳階級A030002">
   <CLASS code="000" name="総数" level="1" unit="人"/>
   <CLASS code="001" name="0-4歳" level="1" unit="人"/>
   <CLASS code="002" name="5-9歳" level="1" unit="人"/>
   <CLASS code="003" name="10-14歳" level="1" unit="人"/>
     :
  </CLASS_OBJ>
  <CLASS_OBJ id="area" name="全国都道府県030001">
   <CLASS code="00000" name="全国" level="1"/>
   <CLASS code="00001" name="全国市部" level="1"/>
   <CLASS code="00002" name="全国郡部" level="1"/>
   <CLASS code="01000" name="北海道" level="1"/>
   <CLASS code="02000" name="青森県" level="1"/>
   <CLASS code="03000" name="岩手県" level="1"/>
     :
  </CLASS_OBJ>

  <DATA_INF>
   <NOTE char="***">当該数値がないもの</NOTE>
   <NOTE char="-">当該数値がないもの</NOTE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="00000" time="1980000000" unit="人">117060396</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="00001" time="1980000000" unit="人">89187409</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="00002" time="1980000000" unit="人">27872987</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="01000" time="1980000000" unit="人">5575989</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="02000" time="1980000000" unit="人">1523907</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="03000" time="1980000000" unit="人">1421927</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="04000" time="1980000000" unit="人">2082320</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="05000" time="1980000000" unit="人">1256745</VALUE>
   <VALUE cat01="00700" cat02="000" cat03="000" area="06000" time="1980000000" unit="人">1251917</VALUE>
     :
  </DATA_INF>
 </STATISTICAL_DATA>
</GET_STATS_DATA>

この結果(<STATISTICAL_DATA>)は以下のように読み解けます。

まず、<CLASS_INF> を見ることで、データは4つのカテゴリ分類がされています。まず cat01 が「全域(00700)か、人口集中地区(00701)か」を示しています。

次に cat02 は男女別分類をしています。男女総数のデータ(000)なのか、男性のみのデータ(001)なのか、それとも女性のみのデータ(002)なのか、という分類のようです。

そして cat03 は年齢を5歳区切りにした分類です。全年代(000)、0~4歳(001)、5~9歳(002)、・・といった具合で分類されていることが分かります。

最後に area が都道府県別分類をしていることが分かります。全国(00000)、全国市部(00001)、全国郡部(00002)、北海道(01000)、青森(02000)、・・・といった具合のようです。


続いて <DATA_INF> 内の <VALUE> 部分が実際の数値データになっています。例えば先頭にあるこのデータ:
<VALUE cat01="00700" cat02="000" cat03="000" area="00000" time="1980000000" unit="人">117060396</VALUE>
これは cat01=00700, cat02=000, cat03=000, area=0000 という属性が付与されているので、エリアは全域、男女総数、全年代の全国での人口総数を意味していて、その数値が 117060396 (人)である、ということが分かります。

したがって、例えば年代毎の全国の人口分布を調べたいのであれば、cat01=00700, cat02=000, area=00000 で固定して、cat03 が 001 以上のものをフィルタリングして調べればよい、ということになりますね。 


なお、Web API の app と getStats***** の間に json を入れると、出力結果が XML ではなく JSON フォーマットになります。JSON で必要な場合はこちらを使ってください:
http://statdb.nstac.go.jp/api/1.0b/app/json/getStatsList?appId=XXXXXXXXXX&statsCode=00200521
http://statdb.nstac.go.jp/api/1.0b/app/json/getStatsData?appId=XXXXXXXXXX&statsDataId=0000030001






 

拙作マンホールマップに登録されている多くのマンホールのうち、都道府県庁所在地の代表的なマンホールをまとめて紹介します。

画像をクリックするとマンホールマップ内のページに移動します。なお「代表的なマンホール」の基準は僕の独断です(苦笑):

#都道府県都道府県庁所在地マンホール解説
1 北海道 札幌 雪の結晶
2 青森県 青森 ねぶた祭り
3 岩手県 盛岡 「下水」
4 宮城県 仙台 七夕祭り
5 秋田県 秋田 竿燈祭り
6 山形県 山形 ベニバナ
7 福島県 福島 シジュウカラ、桃、ケヤキ
8 茨城県 水戸
9 栃木県 宇都宮 イチョウ
10 群馬県 前橋 バラ
11 埼玉県 さいたま 桜、サクラソウ
12 千葉県 千葉 コアジサシ、ケヤキ、大賀ハス
13 東京都 東京 ソメイヨシノ、イチョウ、ユリカモメ
14 神奈川県 横浜 ベイブリッジ
15 新潟県 新潟 波、夕日、カモメ
16 富山県 富山 アザミ
17 石川県 金沢 兼六園
18 福井県 福井 フェニックス
19 山梨県 甲府 なでしこ
20 長野県 長野 御柱祭
21 岐阜県 岐阜 鵜飼い
22 静岡県 静岡 サッカー
23 愛知県 名古屋 名古屋城、シャチホコ
24 三重県 ヨット、つつじ
25 滋賀県 大津 ユリカモメ、観覧車、琵琶湖大橋、花火、山桜
26 京都府 京都 御所車
27 大阪府 大阪 大阪城
28 兵庫県 神戸 神戸港
29 奈良県 奈良 鹿
30 和歌山県 和歌山 手鞠、カモメ
31 鳥取県 鳥取 しゃんしゃん傘
32 島根県 松江 武家屋敷
33 岡山県 岡山 桃太郎
34 広島県 広島 カープ坊や
35 山口県 山口 ホタル
36 徳島県 徳島 徳島市章
37 香川県 高松 瀬戸大橋、オリーブ
38 愛媛県 松山 ヤブツバキ
39 高知県 高知 市章とS(Sewerage)
40 福岡県 福岡 鳥、ヨット、街並み
41 佐賀県 佐賀 ムツゴロウ
42 長崎県 長崎 アジサイ
43 熊本県 熊本 イチョウ
44 大分県 大分
45 宮崎県 宮崎 花菖蒲
46 鹿児島県 鹿児島 島津氏家紋
47 沖縄県 那覇 沖縄電力





唐突ですが、無料が好きです(笑)。

個人でいくつかのウェブサービスを運用しています。今は3つのサーバーを公開していますが、1つは自宅サーバー、1つは AWS の無料枠、そしてもう1つは月額500円程度の安い VPS を使っていました。

月額500円でサーバーが使える国内のサーバー業者、というのは自分がここと契約した頃には1箇所しかなかったと思っています。ただ最近は同価格帯のサーバーを提供する業者は珍しくなくなってきています。価格競争からサービスの質で競う時代になりつつあると思っています。

で、上記3サーバーのうち、最後の月額500円で運用していた VPS を最近 IDCF クラウドに乗り換えました。乗り換え元となった業者のサービスに不満があったわけではなく、色々比較して、迷った末での決断でした。 何故自分が乗り換えを決意したのか、についてまとめてみました。


まずは「月額500円」の内訳です。この500円で何が(どこまでのサービスが)提供されるのか、という内容を紹介します。

IDCF クラウドの「月額500円から」と言われているクラウドサーバーインスタンスですが、これは S1.light と呼ばれているクラスのインスタンス1台目にかかる料金です。「1台目」という表現をした理由は、「最初の1台目は月額500円だが、2台目以降は条件が異なる」という背景があるからです。

IDCF クラウドの料金についてはこちらを参照いただきたいのですが、S1.light インスタンスの料金(月額500円)の内訳をスペックと併せて紹介しておきます:
リソーススペック1ヶ月の値段
CPU0.8GHz x 1200円
RAM(メモリ)1GB
OSCentOS 6.5 64bit0円
HDD15GB300円
グローバルIPアドレス1つ500円(ただし最初の1つは0円)
ネットワーク I/O-(月3,240GB以内であれば)0円

こんな感じです。注意していただきたいのはグローバルIPアドレスで、1つ発行につき500円かかります。ただし最初の1つだけは無料です。その結果、最初の1台については500円で、2台目以降についてはグローバルIPアドレスが必要であれば1000円、不要であれば500円、ということになります。 またネットワークは転送量が月に3,240GB以内であれば追加料金はかかりません(自分の場合はまず超えません)。なお OS は CentOS や Ubuntu を使い場合には無料ですが、RHEL や Windows の場合はライセンスが必要なため有料です。

数字に現れにくい所として、IDCF クラウドのサーバーインスタンスの CentOS 上にはキャッシュメモリが用意されていません。つまり物理メモリである 1GB が全てということになります。不安を感じる人がいるかもしれませんが、その分が多いとは言えないディスクに回されている、と解釈することもできます。

またネットワークは非常に強力です。インフラとしては 2Gbps が用意されており、またそのデータセンターも日本国内にあるため、ネットワークパフォーマンスは非常に良好です。詳しくはこちらのブログエントリも参照ください:
http://dotnsf.blog.jp/archives/1015492815.html


もう1点、実は IDCF クラウドには「オブジェクトストレージ」と呼ばれる S3 互換のストレージサービスがあります:
オブジェクトストレージ

このストレージはストレージ利用量と、ネットワークI/Oの両方に課金されますが、ストレージ利用は 50GB までは無料。そしてネットワーク I/O は IN が 0 円、OUT が1GBにつき 10 円(ただし IDCF サービス内での I/O は無料)とされています。

つまりオブジェクトストレージに格納する際の転送料は無料で、オブジェクトストレージから取り出す際の転送料は、取り出し先が IDCF クラウドインスタンスであれば無料、それ以外の自分のPCやIDCF ではないクラウドインスタンスなどに転送した場合は1GB毎に10円かかる、ということです。

したがって、保存データが 50GB 以内であれば、ですが、IDCF クラウドインスタンスのデータベースをバックアップして格納するような使い方や、そのバックアップを IDCF クラウドインスタンス内に取り出してリストアする、といった利用用途であれば、一切追加料金がかからないということになります。無料でストレージまで付いてくるとは太っ腹・・・

と、以上に紹介してきたようなサービスや高性能まで付いた上で月500円、ということなります。これは本当にお得だと思いました。加えて、2台目以降は1台につき(グローバル IP アドレスが必要な場合だと) 500 円ではなくなるのですが、1台運用の前提で考えると、この IDCF は非常にコストパフォーマンスの高いクラウドサーバーインスタンスである、といえると思っています。

以上の内容を総合的に比較/判断して、乗り換えを決意したのでした。












 

ネットワークパフォーマンス(端的に言えば回線速度)の計測方法は多々有りますが、クラウドのネットワークパフォーマンスを計測しようとすると、1つ問題が生じます。

多くのクラウドでは、サーバーインスタンス契約後に使えるインターフェースが SSH に限られています。つまりテキストのコンソール画面だけが使える状況です。その制約の中で「どこまでわかりやすくネットワークパフォーマンスを 計測できるか?」という課題があるのでした。

 自分が使っているのは speedtest と呼ばれるツールです。この導入から利用、そして実際の出力結果までを紹介します。

まず導入方法ですが、おそらく最も簡単で多くのケースで利用できるのが、この wget を使ったやり方です:
# cd /usr/local/bin
# wget -O speedtest-cli https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
# chmod +x speedtest-cli
上記例では /usr/local/bin という Path の通ったディレクトリにあらかじめ移動してから、そこにダウンロードしてくる、という方法を取っています。これで speedtest-cli という実行ファイル(実体は Python スクリプト)が用意できました。

そのまま(パラメータなしで)実行するだけでもアップロード速度とダウンロード速度を計測してくれます:
# speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Kddi Corporation (XXX.XXX.XXX.XXX)...
Selecting best server based on latency...
Hosted by Too late (Ishikari) [847.06 km]: 38.316 ms
Testing download speed........................................
Download: 47.94 Mbits/s
Testing upload speed..................................................
Upload: 23.04 Mbits/s
# 

ダウンロードが 47.94 Mbps、アップロードが 23.04 Mbps という結果でした。まあこれは実行タイミングにも影響されると思いますが、1つの目安にはなると思います。

そして、このツールの特徴の1つでもある "--share" オプションがあります。これを付けて実行すると、実行結果を png 画像にして提供してくれます:
# speedtest-cli --share
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Kddi Corporation (XXX.XXX.XXX.XXX)...
Selecting best server based on latency...
Hosted by Too late (Ishikari) [847.06 km]: 38.316 ms
Testing download speed........................................
Download: 47.94 Mbits/s
Testing upload speed..................................................
Upload: 47.94 Mbits/s
Share results: http://www.speedtest.net/result/3980766722.png
# 

"Share results:" に書かれた URL にアクセスすると、このような画像が表示されます:


上記例は僕の自宅内のサーバーから行ったもので、契約している au ひかり(KDDI)から実行されたことも判別してくれています。また総合判断としての "GRADE: B" という記載もされています。

面白そうだったので、いくつかの環境から実行してみました:

(AWS EC2)


(DTI ServerMan/VPS)


(IDCF)



AWS の EC2 が "GRADE: A+" で速いことになってる!(悪意なし) ネットワークそのものは速いんでしょうかね、でも体感に直結しないのはやはり海外リージョンのせいなのか。。

そして IDCF クラウド、うちの au ひかりよりも速いってこと!? こうなると自宅サーバーで運用中のサービスの移行も検討しないといけないかな・・・


このページのトップヘ