akiyoko blog

akiyoko の IT技術系ブログです

GoGetSSL で SSL証明書を更新するための手順

現在運営している某サイトを SSL化していて、その SSL証明書を GoGetSSL という海外の販売所(販売代理店)で購入・申請していたのですが、最近、更新時期が近づいてきたので更新作業をしたのです。作業自体は小一時間ほどで終わったのですが、事前にあれこれ調べた時間の方が掛かったなぁ、と。更新作業自体が頻繁に発生することもないので、次に作業するときの備忘録として書き残しておきたいと思います。


《過去記事》
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp



条件

  • 前回と同じドメイン認証(DV)証明書「RapidSSL」を購入
  • CSR の内容は同じ(つまり今回は再作成しない)
  • ドメインは「お名前.com」で管理している
  • サーバは Ubuntu、Nginx でドメインの設定をしている

SSL証明書の更新手順

1)Whois情報公開代行設定を解除

お名前.com の ドメインNavi にログインし、「ドメイン設定」->「ドメインWhois情報変更」から、対象のドメイン名をクリックして「登録者情報の変更」にチェックを入れると登録者情報が表示されるので、住所などの情報が正しいか確認しておきます。

f:id:akiyoko:20170612014828p:plain

次に、「Navi TOP」のドメイン一覧から、対象のドメインの「Whois情報公開代行」の「解除する」をクリックして、Whois情報公開代行の設定を解除します。

f:id:akiyoko:20170612015159p:plain


Whois情報公開代行サービスを解除したら、Whois検索で、自分で取得したドメインの Whois情報を確認しておきます。Registrant(登録者名)に自分の登録者情報が表示されていれば OKです。

Whois検索 - お名前.com




 

2)前回と同じ種類・ブランドのSSL証明書を購入

GoGetSSL にログインします。

https://my.gogetssl.com/

f:id:akiyoko:20170612015333p:plain


「Manage SSL certificate」をクリックしてSSL証明書の一覧を表示して、前回のオーダー(RapidSSL Standard)の「View」をクリックします。

f:id:akiyoko:20170612015731p:plain


「Start Renewal」をクリックします。

f:id:akiyoko:20170612015922p:plain


今回はまとめて 3年分を選択します。

f:id:akiyoko:20170612015958p:plain


PayPal で購入しました。
f:id:akiyoko:20170612020034p:plainf:id:akiyoko:20170612020156p:plain





 

3)CSRを作成(今回はしない!)

更新の度に新しいCSRを生成する必要はありますか


更新の度に新しいキーペアファイルを作成し、新しいキーペアファイルより生成した新しいCSRで申請することをお勧めします。
同じキーペアファイルを利用し続けるのではなく、サーバIDの更新の度に新たなキーペアに切り替えることがセキュリティ上も理想的です。

またMicrosoft IIS 5.0など、ウェブサーバアプリケーションによっては、前回取得時と同じCSRで取得したサーバIDでは、インストールができない仕様のものもあります。


Symantec Managed PKI for SSL サポート


ということで、セキュリティ上はアレかもしれませんが、きちんと管理できているのでそのまま前回の CSR を使い回すことにします。



 

4)CSRを申請

SSL証明書の一覧から「Generate」をクリックします。
f:id:akiyoko:20170612020252p:plain

Order Type Renewal order
Web Server Software OTHER(「Nginx」は選べなくなったようです)
Paste your CSR 前回の CSRをまるごとコピペ
Please select signature algorithm SHA2

と適宜入力して「Validate CSR」をクリックします。
f:id:akiyoko:20170612020333p:plain

「Get WHOIS email」をクリックし、送達可能なメールアドレスを選択して、「Next Step」をクリック。
f:id:akiyoko:20170612020524p:plain

氏名、メールアドレス、電話番号などを適宜入力後、「Complete Generation」をクリックします。
f:id:akiyoko:20170612020619p:plain

完了しました。証明書の一覧画面を見てみます。
f:id:akiyoko:20170612020724p:plain

まだ「Processing」になっています。
f:id:akiyoko:20170612020824p:plain


しばらくすると、メールバリデーションのための確認メールが届くので、メール中のリンクをクリックします。
f:id:akiyoko:20170629135745p:plain:w400


「承認します」をクリック。
f:id:akiyoko:20170612020931p:plain


「Active」になりました。
f:id:akiyoko:20170612021004p:plain

「Valid from」「Valid till」が更新されています。
なお、3年分更新しましたが、1ヶ月のボーナスが付いているようです。
f:id:akiyoko:20170612021157p:plain


最後に SSL証明書と中間証明書をダウンロードします。
f:id:akiyoko:20170612021302p:plain



 

5)サーバのSSL証明書を更新

以降、サーバのIPアドレスを「52.xxx.xxx.xxx」、ドメインを「akiyoko.com」、アプリ名を「akiyokoproject」として進めます。


クライアント(Mac)からサーバに SSL証明書と中間証明書を転送します。

$ scp -i ~/.ssh/aws_p1.pem ~/Downloads/www_akiyoko_com.crt ubuntu@52.xxx.xxx.xxx:/tmp/
$ scp -i ~/.ssh/aws_p1.pem ~/Downloads/www_akiyoko_com.ca-bundle ubuntu@52.xxx.xxx.xxx:/tmp/

次に、Ubuntu 上で、SSL証明書を前回のものから入れ替えます。

$ sudo cp /etc/nginx/conf/akiyokoproject.crt /etc/nginx/conf/akiyokoproject.crt.201606
$ sudo cp /etc/nginx/conf/akiyokoproject.key /etc/nginx/conf/akiyokoproject.key.201606

$ sudo cp /tmp/www_akiyoko_com.crt /etc/nginx/conf/akiyokoproject.crt
### 中間証明書を連結する
$ cat /tmp/www_akiyoko_com.ca-bundle | sudo tee -a /etc/nginx/conf/akiyokoproject.crt


CSRを新しく生成した場合は、秘密鍵(/etc/nginx/conf/akiyokoproject.key)を新しく書き換えておきます(今回は書き換えません)。


SSL証明書・秘密鍵のオーナーが root.root、パーミッションが 644 になっていることを確認。

$ ls -al /etc/nginx/conf/
total 40
drwxr-xr-x 2 root root 4096 Jun 10 20:08 .
drwxr-xr-x 6 root root 4096 Jul  8  2016 ..
-rw-r--r-- 1 root root 5070 Jun 10 20:09 akiyokoproject.crt
-rw-r--r-- 1 root root 4749 Jun 10 20:08 akiyokoproject.crt.201606
-rw-r--r-- 1 root root 1111 Jul  8  2016 akiyokoproject.crt.orig
-rw-r--r-- 1 root root 1704 Jul  8  2016 akiyokoproject.key
-rw-r--r-- 1 root root 1704 Jun 10 20:08 akiyokoproject.key.201606
-rw-r--r-- 1 root root 1704 Jul  8  2016 akiyokoproject.key.orig


Nginx をリロードします。

$ sudo service nginx reload


完了したら、SSL証明書のチェックをします。

Check SSL Installation. Test SSL now!
でチェック可能です。

「akiyoko.com」などと入力すると、診断結果が出力されます。

f:id:akiyoko:20170612021520p:plain

f:id:akiyoko:20170612021552p:plain


あるいは、
https://cryptoreport.geotrust.com/checker/views/certCheck.jsp
の方がスッキリしていていいかもしれません。


最後に忘れずに、Whois情報公開代行設定を再設定をして完了です。

「AWS認定 ソリューションアーキテクト - アソシエイト試験」の再認定試験に合格しました

二年前に取得した「AWS認定 ソリューションアーキテクト - アソシエイト(AWS Certified Solutions Architect - Associate)」(SAA)が失効しそうになっていたため、急遽、先月末の「AWS Summit Tokyo 2017」で再認定試験を受けてきました。


結果は合格だったのですが、再試験を思い立ったのが試験日の一週間前ということもあり、短期間でどうやって知識を戻していったのかを書き残しておきたいと思います。


f:id:akiyoko:20170629100319p:plain:w500



AWS 認定試験の種類や前回の勉強方法については、以下を参照ください。

《過去記事》
akiyoko.hatenablog.jp



まず、AWS の再認定試験については、

  • 二年ごとに再認定が必要
  • 再認定試験の試験要覧は、通常の認定試験と同じ
  • 再認定試験は料金が半額(ソリューションアーキテクト- アソシエイトの場合は、通常 16,200円 → 8,100円)

とのことです。 *1


AWS Recertification(再認定)」には、再認定試験を受ける以外にも「一つ上のレベルのプロフェッショナル試験を受けてもいいよ」と書かれています。しかしながら、インフラはもともと得意分野ではなく、準備期間も短かったこともあり、今回は見送ることにしました。


6ヶ月・3ヶ月・1ヶ月前に、「AWS認定資格有効期限(残りXか月)についてお知らせ」などという通知メールが来ていたものの、あまり更新する予定も無かったのですが、高い受験料が「今なら半額」となると話は変わってきます(直前で気付きました・・)。ちなみに、プロフェッショナルレベル試験の試験料が半額になるワンタイムバウチャー(割引は1回のみ有効)も通知メール内に提示されていました。



 

試験対策の履歴

今回の再認定試験対策の履歴です。

AWS Black Belt Online Seminar

AWS Summit Tokyo 2017」の一週間前に「AWS 認定試験取得に向けて」というタイトルの Black Belt の Webinar があったのですが、これが今回の再受験のきっかけでした。



本家 AWS からこういった情報が提示されるのは今回が初めてではなかったでしょうか。非常にありがたいです。

あと、毎回「どうやればいいんだっけ?」と悩んでしまう試験の申込み方法(スライド19〜26)なども載っているので、こちらも地味にありがたいです。


試験準備の例として、

というサンプルケースが、スライド40くらいから紹介されています(ちなみに、ほぼ同じものが「AWS 認定 – 認定の準備」でも紹介されています)。

「ステップ2: 認定試験ガイド、サンプル問題の確認」は当然として、ホワイトペーパーや FAQ、その他のリファレンスを読むのが王道でしょうか。「ステップ6: 認定試験準備ワークショップの受講」も有用かと思います。今年の AWS Summit でも一日限りの座学ワークショップとして実験的に開催されたとのことです(申し込みが殺到していたようですね) *2

「ステップ7: 模擬試験の受検」については、次回機会があれば試してみようかと考えています。割引きバウチャーも貰ったので。


認定試験準備におすすめのホワイトペーパーとして、

が挙げられていました。英語なので全部読むのはアレとして、出題傾向はこれで掴めるかと思います。

また、認定試験準備に向けて確認しておくべき FAQ として、

  • Amazon EC2
  • Amazon S3
  • Amazon VPC
  • Amazon Route 53
  • Amazon RDS
  • Amazon SQS

が挙げられていました。これらのプロダクトについては細かな点も含めて重点的にやるようにというお達しと捉えてもいいかもしれません。

スライド60から、その他のリファレンス(日本語中心)が紹介されていますので、そちらも要チェックかと。


 

参考書

「ソリューションアーキテクト - アソシエイト試験」の合格対策本を使って勉強しました。準備期間が一週間と短かったこともあり、これ一冊オンリーでした。

これは本当に良かったです。正直なところ、これが無ければ今回合格していなかった可能性も大いにあります。


この合格対策本の良いところは、他の本にあるような細かなケーススタディやマネジメントコンソールの操作方法のキャプチャなど(試験対策としては無駄な情報)が一切無く、AWS試験によく出題されるような知識に特化している点です。短い時間で知識を詰め込むには最適の本でした。

また、こんなのさすがに試験に出ないだろといった基本レベルの知識もまとめられているので、頭の中をスッキリ整理できたのも良かったです。



試験会場での注意点

試験当日の持ち物に注意しましょう!


試験の申し込みをすると「試験の購入確認」というメールが届きますが、このメールを印刷したものと、「写真付きの身分証明書」が必要です。

前者はぶっちゃけ印刷しておかなくても(メールが見れさえすれば)何とかなりますが、後者は・・・。

試験当日のご本人確認

試験当日は15分前までに会場へお越しください。 このメールを印刷し受験者認証コードをプロクター(試験監督員)にご提示ください。またご受験の際は2種類の身分証明書が必要となります。 1つは公的機関が発行した写真付きの身分証明書、もう一つはクレジットカード、銀行カード、社員証などになります。(米国の社会保障カードは身分証明書として認められません)個人の持ち物は教室に持ち込むことができませんので、会場に用意された場所へお預けください。


 

おまけ

試験後、会場に用意されていた「認定ラウンジ」に初めて足を運んでみました。

休憩所としてテーブルと椅子、ちょっとしたお菓子(プレミアムうまい棒)と飲み物が用意されていました。会場はどこも混雑しているので、貴重な休憩スペースです。といっても、特に用事もなかったのですぐに退散しましたが。

f:id:akiyoko:20170531122224j:plain:w400

「ビットコインとか勉強会#8」に参加してきました

会場

FinoLab
〒100-0004 東京都千代田区大手町1丁目6−1(大手町ビル4階)

Twitter

twitter.com



Coincheck様、いつもお世話になっています。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin



 

全体の感想など

勉強会#4勉強会#5 に続いて、「ビットコインとか勉強会」の参加は三度目でした。ビットコインの注目度が高いからでしょうか、月に一度以上のハイペースで勉強会が開催されているようですね。


<過去記事>
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp


会場はほぼ満員。
ビットコインを取り巻く FinTech の過熱ぶりの一端が今回も伺えました。

勉強会の内容は結構エンジニア寄りで、「ビットコインアドレス生成のロジック」と「Poloniex API解説(Lending編)」でした。


ビットコインアドレスについては、少し前に社内向けに作成した資料でビットコインアドレス、秘密鍵、公開鍵の三点セットについてまとめたことがあったので、非常に興味深かったです。

f:id:akiyoko:20170629001805p:plain:w500

f:id:akiyoko:20170629001818p:plain:w500


ビットコインアドレスの生成過程で当然、セキュリティや暗号技術の話も出ていたのですが、その中でも、


私も気になった、量子コンピュータ問題。

公開鍵はトランザクションに含まれているため、自分以外の誰でもアクセスできる状態です。量子コンピュータが実現したら、公開鍵から秘密鍵が推測されてしまうのでは?と私も思って質問してみたのですが、そんな状態になったら SSL や SSH などの他の暗号技術が破られてしまうので、ビットコインどころじゃなくなるとのこと。 *1 そうなる前に、開発者が暗号方式を変更するなりして何とか対応するでしょう、とのことでした。なるほど、納得です。


そして、たまたま 8ヶ月ほど前の記事を見つけたのですが、

量子コンピューターの暗号解読からビットコインを守るには、ビットコインのプロトコルに新しい量子暗号化技術を組み込む必要がある。実はこうした技術は既に存在しており、問題はそれを導入するかどうかだ。


量子コンピューターがビットコインを滅ぼす日 | ワールド | 最新記事 | ニューズウィーク日本版 オフィシャルサイト」より

などと書かれていました。大丈夫・・・ですよね??



 

ビットコインアドレス生成のロジック

村田 智英氏

  • Bitcoin address って?
  • 1から始まるのが普通のアドレス(P2PKH: pay to publish key hash)
  • 3から始まるのは(P2SH)マルチシグネチャで利用
    • segwitはBIP142あたりを参照??
  • 秘密鍵
    • 復元フレーズは秘密鍵を復活させるために使う
    • Secp256k1(楕円曲線)
  • 公開鍵
    • 秘密鍵から生成
    • Bitcoin addressを作るのに使う。暗号化に使うわけではない。
    • 通常は圧縮した公開鍵を使う
  • ハッシュ関数
  • SHA256(シャーニゴロと読む?)
    • Bitcoinだけでなくopensslなどほかでもよく使われている
    • SHA-2の中に、SHA-256 や SHA-512 がある
  • ripemd160
    • SHA256よりも短いハッシュが得られる
  • base58
    • base64から読み間違えやすい文字を(6文字)削ったもの
  • 公開鍵にSHA256を二回通して、頭の4byteを文字列に付けてbase58encodeしたもの
  • WIF
    • wallet import format
    • 秘密鍵をWIF形式でインポートしたりエクスポートしたりする
  • Bitcoin address ができるまで
    • 1. 秘密鍵を作る
    • 2. 公開鍵を作る
    • 3. SHA256を通す
    • 4. RIPEMD160を通す
    • 5. 先頭に0x00(バージョン番号)をつけて
      • a. checksum計算
      • b. 先頭4バイトをチェックサムにする
    • 6. b.で出来たものを 5. の後ろにつける
    • 7. base58エンコード
  • 秘密鍵はネット上に置いておくと危ない!!
    • ハードウェアウォレット、紙、鉄の板 etc


ビットコインとは何か? 第3回:ビットコインの仕組み(アドレスの作成から送金まで) - ビットコインの解説 | Bitcoin日本語情報サイト」というサイトで、今回説明した秘密鍵からビットコインアドレス生成までの流れをポチポチとボタンを押しながらシミュレートすることができます。非常に分かりやすいですね。

その他、

も有用かと。

ビットコインの技術的な詳細については、この「マスタリングビットコイン」が詳しいです。






 

Poloniex API解説(Lending編)

古酒 慎也氏



  • API documentation
  • Public API Method と Private API Method
  • Exchange:現物で売買するときのアカウント
  • Margin Trading:レバレッジを効かせて売買する
  • Lending:ユーザー間で貸し借りするサービス
    • 例えば 0.1%/日の複利で、年利44%
  • Margin Buy => BTCを借りてXRPを買う
  • Margin Sell => XRPを借りてBTCを買う?


前回(ビットコインとか勉強会#3)では、自動取引プログラムの作り方を発表したとのことです。


Poloniex の API については今回始めて知ったのですが、どんなものか触ってみたいなぁと思っていた矢先、日経ソフトウェア 7月号で「Python で「ビットコイン」システムトレード」という連載が始まったということを知り、早速買って読んでみた次第です。


その後、fin-pyもくもく会 #6」という勉強会に参加し、API を使ったプログラムを自作し始めるのですが、それはまた別のブログで。

「Rails 5.1 + Webpacker + Vue.js 入門」に参加してきました

会場

港勤労福祉会館 / 第一洋室
東京都港区芝 5丁目18-2


 

全体の感想など

会場に Wi-Fi がなくて苦労しました。仕方なくスマホをテザリングして GitHub からソースコードをクローンしたり。。


勉強会の内容は、(jQuery でゴチャゴチャやっている)既存の Rails アプリを Vue.js で書き換えるという想定でのハンズオンでした。
せっかくなので、Rails は新しい 5.1 を採用し、5.1 系で正式に取り込まれた Webpack も使っていこうという趣旨だったので、それ目当てに結構人が集まっていたようでした。


私自身としては、Rails に全然慣れていないのでよく分からないところもあったり、そもそもフロントエンドに明るいわけではないので、バシバシとコードを叩いて試してみるというのではなく、「ふーん」という感じでデモ実装を眺めていた感じでした。


以下、乱暴なメモを列挙しますが、後で資料がいろいろとアップされていたのでそちらを参照した方がよいかと思います。


qiita.com



ハンズオン

  • Rails 5.1 で正式に Webpack が取り込まれた。
  • elm って何だ?
  • Rails業界に限って言えば、コア技術は収束に向かっていく??
  • form_with? form_tag, form_for に次ぐ新しいディレクティブ
  • Webpack とは何ぞや?
    • JS内で import を使えるようにするもの
    • ファイルを分割できる
  • Yarn は npm を便利にしたもの。Rails 5.1 では Yarn を使うらしい

などなど。

ここらへんの最新事情については、「Railsフロントエンド技術の今とこれから - Hack Your Design!」を読むのが分かりやすいと思いました。


「ブロックチェーンと、僕らの未来。」に参加してきました

会場

Startup Hub Tokyo
東京都千代田区丸の内2-1-1 明治安田生命ビル TOKYO創業ステーション1F




ブロックチェーンと言えば・・。
Coincheck様、いつもお世話になっております。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin


 

全体の感想など

「ブロックチェーンと、僕らの未来。」というブロックチェーン関連の勉強会に参加してきました。・・と言っても、二ヶ月ほど前のイベントです。4月の後半から5月にかけては個人的に忙しくてブログ更新が全然できていませんでした。。

有料のイベントでしたが、会場は満員で熱気がありました。ハードフォーク問題の真っ只中だったからでしょうか。


講師は、Bitcoin School Teachers の皆さん。
その中の佐々木徹氏が、ココスタ というオンライン教育サービス上で「ビットコイン?「もう」か「まだ」かに結論を」という講座を有料公開していたのですが、イベントが終わってすぐに全部見ました。


OTC市場(相対相場)でビットコイン価格が決まるため、時価総額(Market Cap)を見る、という内容だったかと。
暗号通貨の Market Cap は、
Cryptocurrency Market Capitalizations | CoinMarketCap
で見ることができます。

暗号通貨全体の時価総額に対するビットコインの占有率(ドミナンス)は、
Global Charts | CoinMarketCap
で確認できます。4月の段階では 60〜70%ほどありましたが、現在は 50%を切っている状況です。

あと、BTC/CNY のチャート に注目という情報も。キリ番に反応するクセがあるそうです。



あとまだ読み終わっていませんが、


を読み始めています。

いつものようにメモ書きを。



 

ビットコインを利用した新しい試み「KIZUNA」

藤本真衣氏(株式会社グラコネ)

  • 寄付したお金がちゃんと届いているのか?という懸念、手数料が高いなどの不安・不満を解消
  • 寄付金の流れの透明化+寄付した人の評価
  • 将来的は、「寄付」ではなく「自立」(クラウドファンディングの土台)へ
  • 誰もがチャレンジできる世界へ
  • 「直接全額送金できるクラウドファンディングプラットフォーム」
  • オープンソース化
  • ICO(Initial Coin Offering)
  • EdTech Global と協力してルワンダに支援
  • BitBiteCoin.com を運営


 

ブロックチェーンと起業

篠原裕幸氏(株式会社シビラ)

  • 2013年くらいからビットコイン事業
  • 今は CtoC が隆盛(Airbnb, Uber, mercari, etc..)だが、まだ中央に搾取する誰かが存在している
    • これからは間違いなく Peer to Peer。これを実現するのがブロックチェーン
  • 世界中の46%のインターネットに繋がっている。その中でスマホを持っているのが28%
  • 2020年までに500億のデバイスがインターネットに繋がる(IoT時代の到来)
    • それに比べるとスマホなんて所詮3%程度
  • クラウド型のサービスではスケールしない
    • P2P で直接繋がる必要がある
  • AIが直接会話をするための手段・技術が、ブロックチェーン
  • Decentralized のその先へ
  • 国際送金を無料にするサービスを作成中
  • DAO(Decentralized Autonomous Organization):分散型自動化組織
  • IPO(Initial Public Offering)から ICO(Initial Coin Offering)へ
  • 全ての端末、全ての人に責任と自由が与えられる


 

ブロックチェーン、暗号通貨を支える技術

今井崇也氏(フロンティアパートナーズ合同会社、United Bitconers Inc.)


  • ビットコインとブロックチェーン:暗号通貨を支える技術」の翻訳を担当
  • パブリックチェーン vs プライベートチェーン
    • パブリックチェーンは信頼する人を通す必要がない
  • ビットコインの問題として、秒間のトランザクション数が低い、決済完了まで10分掛かる、etc
  • United Bitcoiners はマイクロペイメントの会社
  • マイクロペイメントとは・・
    • 1取引あたり0.1円未満
    • 手数料0.00001%未満
    • 全世界で秒間1000万取引以上(⇔クレジットカードは5万トランザクション)
    • マシンtoマシンの取引
  • 人間が立ち入る必要がない
  • インセンティブモデル
  • ビットコインのブロックチェーンを使って実現化を目指す
    • レイヤを分けて(セカンドレイヤ?)、決済の結果だけを使う??

 

ビットコイン投資の行方、暗号通貨と経済・市場

佐々木徹氏(株式会社ファム)

  • ビットコイン愛好家&トレーダー
  • BitcoinGeekend を YouTube で運営(英語)
  • 「人生のモヤモヤの7割8割は、お金が透明になっていないことに起因している」
  • ビットコインは USD/JPY と比較しすると、野獣
    • 昨年の USD/JPY は一番値動きしたときで 7.5% ⇔ ビットコインは 31%
  • Hard Fork 問題?
    • 参加をしている人が増えた?
  • その他にもいろいろ問題が

matplotlib のグラフに日本語を表示する方法(文字化け対応)

今回の内容は、Jupyter Notebook 上で matplotlib を利用したグラフを描画する際に日本語のラベル名が文字化けしてしまう事象への解消方法です。


ローカルの実行環境は以下の通り。

  • MacOS Sierra 10.12.3
  • Python 2.7.12 (Anaconda 4.2.0)
  • Jupyter Notebook 4.2.0
  • pandas 0.18.1


 

困ったこと

(ipynb ファイルの先頭部分はこのような感じで書いています。)

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
% matplotlib inline

plt.style.use('ggplot')


例えば、次のようなデータがあるとして、

df = pd.DataFrame({u'データ1': [0, 2, 4],
                   u'データ2': [1, 2, 3]})
df

f:id:akiyoko:20170409131243p:plain:w150


matplotlib を利用して Jupyter Notebook 上にグラフを描くと、何もしないデフォルトの状態では、タイトルや判例、XY軸のラベル名などの日本語が文字化けして(いわゆる「豆腐」になって)しまいます。

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131300p:plain



ここで、Mac にデフォルトでインストールされているゴシックフォント「AppleGothic」を指定すると、ほとんどの文字化けは解消されますが、まだ一部の文字(「ー」や「・」など)が文字化けしてしまいます。

font = {'family': 'AppleGothic'}
matplotlib.rc('font', **font)

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131622p:plain



 

解決策

いろいろ調べてみると、フリーで使える TrueType フォントである「IPAex ゴシック」フォントを利用するのが一番手っ取り早そうでした。


以下の手順で解決できました。

  • 1)IPAex ゴシックフォントをインストール
  • 2)matplotlib のフォントキャッシュを削除


 

1)IPAex ゴシックフォントをインストール

IPAexフォントのダウンロードページから「IPAexフォント Ver.003.01」をクリック。
http://ipafont.ipa.go.jp/node17#jp

f:id:akiyoko:20170409130932p:plain

IPAexゴシック(Ver.003.01) のリンクから「ipaexg00301.zip(3.92MB)」をダウンロードします。

f:id:akiyoko:20170409131004p:plain


「~/Library/Fonts/」に .ttfファイルをコピーして、フォントをインストールします。

$ cp ~/Downloads/ipaexg00301/ipaexg.ttf ~/Library/Fonts/

なお公式ページは「/Library/Fonts」へのインストールを推奨していますが、私はいつもユーザ単位でインストールしています。


ちなみに、「/System/Library/Fonts/」は Mac のシステムが使用するフォントが格納されているので、ここには追加しないように注意。



2)matplotlib のフォントキャッシュを削除

次に、「~/.matplotlib/」直下のフォントのキャッシュを削除します。

$ rm ~/.matplotlib/fontList*.cache





最後に、確認。

font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131800p:plain





以下のサイトを参考にしました。

(参考)


 

もっと便利に使う(matplotlibrc を作成)

「~/.matplotlib/matplotlibrc」を作成し、そこに利用する font.family などの指定をしておくと、matplotlib がその設定ファイルを優先的に読み込んでくれるようになります。


以下のファイルを作成します。

~/.matplotlib/matplotlibrc

font.family         : IPAexGothic



この設定ファイルを書いておくと、

font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)

の設定は不要になります。


反映されない場合は、以下のコマンドを実行すれば解消するかもしれません。

$ rm ~/.matplotlib/fontList*.cache


 

参考

matplotlib.rc() で指定する暫定的な方法ではなく、恒久的に文字化け対策をしたい方には、この本をオススメします。


Matplotlib の日本語文字化け対策について 9ページも割いて詳細に解説しています。それだけでなく、Jypyter Notebook の基礎的な部分から応用編まで幅広く収録してあり、ボリュームも400ページ超えで大満足の一冊です。

pandas.DataFrame で時系列データの手習い

前回・前々回と、pandas.DataFrame の基礎編についての記事を書きましたが、

その応用編として、時系列データを扱うための手習いとして pandas.DataFrame をいろいろ弄ってみようと思っています。


なおこれまで同様、ローカルの実行環境は以下の通りとなっています。

  • MacOS Sierra 10.12.3
  • Python 2.7.12 (Anaconda 4.2.0)
  • Jupyter Notebook 4.2.0
  • pandas 0.18.1



まずは、import などの諸設定。

import glob

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

pd.options.display.max_rows = 10

plt.style.use('ggplot')
font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)

 

CSVファイルからデータを読み込む

例えば、1日分のデータとして以下のような CSVデータを想定。
一列目(date)が日付なのですが、「yymmdd」形式で出力されています。

date,expected_value,preliminary_value,name,confirmed_value
160301,,,,
160301,0,-100,銀行券要因,
160301,-7200,-10000,財政等要因,
160301,-7200,-10100,資金過不足,
160301,6000,6000, ,
160301,7500,7500, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,-300,-300, ,
160301,-100,-100, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,, ,
160301,,-200, ,
160301,+13100,+12900, ,
160301,,, ,
160301,,, ,
160301,+0,+0, ,
160301,+13100,+12900,合計,
160301,+5900,+2800,当座預金増減,
160301,,2592700,当座預金残高,
160301,,2336500, ,
160301,,1896900, ,
160301,,1896900, ,
160301,,256200, ,
160301,,,マネタリーベース,
160301,,積み期間(2/16~3/15日)の所要準備額(積数),積み期間(2/16~3/15日)の所要準備額(積数),1917300
160301,,積み期間(2/16~3/15日)の所要準備額(1日平均),積み期間(2/16~3/15日)の所要準備額(1日平均),66100
160301,,3/2日以降の残り要積立額(積数),3/2日以降の残り要積立額(積数),3300
160301,,3/2日以降の残り要積立額(1日平均),3/2日以降の残り要積立額(1日平均),200


まずは、CSVデータの読み込み。

CSV データの一列目の日付文字列を DatetimeIndex オブジェクトに変換して、index 列として読み込んでいます。

(参考)pandasで様々な日付フォーマットを取り扱う - Qiita

date_parser = lambda d: pd.datetime.strptime(d, '%y%m%d')
df = pd.read_csv(
    '/Users/akiyoko/PycharmProjects/marketstat/downloads/boj/2016/160301.csv',
    index_col='date', parse_dates=True, date_parser=date_parser,
    na_values=' ',  # たまに「name」列に ' ' が入っているので NaN に変換
)
df

f:id:akiyoko:20170409232420p:plain:w400


na_values オプションは、CSV 読み込み時に特定の値(今回の場合は半角スペース)を NaN に変換してくれるので便利です。



 

特定の列が NaN の行を除外

「name」列や「preliminary_value」列が NaN の行を除外します(不要なので)。

(参考)http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

df = df.dropna(subset=['name', 'preliminary_value'])
df

f:id:akiyoko:20170409232651p:plain:w400


 

特定条件の行だけを抽出

「name」列が「当座預金残高」になっている行だけを抽出します。

df = df[df['name'] == '当座預金残高']
df

f:id:akiyoko:20170409232706p:plain:w400


 

特定の列だけを抽出

「expected_value」列と「confirmed_value」列を除外します(不要なので)。

(参考)http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html

df = df.drop(['expected_value', 'confirmed_value', 'name'], axis=1)
df

# 以下のように残すカラムだけ指定しても、同じ結果が得られる
# df = df[['preliminary_value']]

f:id:akiyoko:20170409232719p:plain:w150



 

ラベル名を変更

column名を「preliminary_value」から「当座預金残高」に変更します。

(参考)https://nkmk.github.io/blog/python-pandas-dataframe-rename/

df = df.rename(columns={'preliminary_value': u'当座預金残高'})


次に、index名を「Date」に変更します。

df.index.names = ['Date']
df

f:id:akiyoko:20170409232732p:plain:w150


 

値を int型に変換

ここで、「当座預金残高」列のデータの値は object 型になっています。

df[u'当座預金残高']
Date
2016-03-01    2592700
Name: 当座預金残高, dtype: object


object型のままだとグラフにできないので、int型に変換します。

(参考)Python pandas strアクセサによる文字列処理 - StatsFragments

df[u'当座預金残高'] = df[u'当座預金残高'].astype(int)
df[u'当座預金残高']
Date
2016-03-01    2592700
Name: 当座預金残高, dtype: int64



 

実践編

次に、一定期間分(2016〜2017年分)の CSVデータを読み込んでみます。

# 時系列データ(日銀の当座預金残高)を読み込む
df_boj = pd.DataFrame()
date_parser = lambda d: pd.datetime.strptime(d, '%y%m%d')
paths = glob.glob('/Users/akiyoko/PycharmProjects/marketstat/downloads/boj/201[67]/*.csv')
for path in paths:
    df = pd.read_csv(path,
                     index_col='date', parse_dates=True, date_parser=date_parser,
                     na_values=' ')
    # 「name」列や「preliminary_value」列が NaN の行を除外
    df = df.dropna(subset=['name', 'preliminary_value'])
    # 「name」列が '当座預金残高' になっている行だけに絞る
    df = df[df['name'] == '当座預金残高']
    # 「expected_value」列と「confirmed_value」列を除外
    df = df.drop(['expected_value', 'confirmed_value', 'name'], axis=1)
    # column名を「preliminary_value」から「当座預金残高」に変更
    df = df.rename(columns={'preliminary_value': u'当座預金残高'})
    # index名を「Date」に変更する
    df.index.names = ['Date']
    # object型のままだとグラフにできないので int型に変換
    df[u'当座預金残高'] = df[u'当座預金残高'].astype(int)
    # 行を末尾に追加
    df_boj = df_boj.append(df)

# なお、column数が1つだけの場合はyオプションは不要
df_boj.plot()
df_boj

f:id:akiyoko:20170409232752p:plain:w150

f:id:akiyoko:20170409232810p:plain



ここで、2016年の時系列データ(日経平均株価)を読み込んでみます。

# 時系列データ(日経平均株価)を読み込む
df_n225 = pd.read_csv('n225.csv', index_col='Date', parse_dates=True, usecols=['Date', 'Adj Close'])
df_n225 = df_n225.sort_index()
df_n225 = df_n225.rename(columns={'Adj Close': u'日経平均株価(終値)'})
df_n225.plot()
df_n225

f:id:akiyoko:20170409232828p:plain:w180

f:id:akiyoko:20170409232857p:plain



単純に、二つのグラフを同じ図上に表示してみます。
日経平均株価の値が相対的に小さすぎて、地を這うようなグラフになってしまいました。

ax = df_boj.plot()
df_n225.plot(ax=ax)

f:id:akiyoko:20170409232940p:plain



見やすいように倍率を調整してみます。

adj = df_boj[u'当座預金残高'].mean() / df_n225[u'日経平均株価(終値)'].mean()
ax = df_boj.plot()
(df_n225 * adj).plot(ax=ax)

f:id:akiyoko:20170409232953p:plain



最後に、期間を合わせてみます。

start_date = '2016-01-01'
end_date = '2016-12-31'
span = pd.date_range(start_date, end_date)
df_2016 = pd.DataFrame(index=span)
df_2016 = df_2016.join(df_boj[start_date:end_date])
df_2016 = df_2016.join(df_n225[start_date:end_date] * adj)
df_2016.plot()
df_2016

f:id:akiyoko:20170409233012p:plain:w250

f:id:akiyoko:20170409233028p:plain




 

参考

Pandas について本格的に勉強するならこちらの本を。


Jypyter Notebook の勉強をするならこの本を。