シュンカの日記

基本的に書きたいことを書いていくスタイル。

嫁がつみたてNISAをはじめてからの実績(2018年4月~2019年12月)

こんにちは、もう2020年がはじまりましたね。
ぼくの嫁は2018年4月に急に思い立ったように「わたし、投資はじめるわ」と宣言してから、かれこれ1年8か月つみたてNISAを続けています。
ちなみに、ぼくは一般NISAを利用していたのですが、飽き性な嫁も続けられている圧倒的な楽さと、20年×40万円という期間の長さ×投資額を考慮して今年からつみたてNISAに変更してみました。

そんな嫁の運用の実績をまとめてみようと思います。

つみたてNISAの運用実績(嫁ver.)

嫁:+98,345円

買付金額 累計買付金額 評価金額 損益(円) 損益(%)
2018 330,000 330,000 299,507 △30,493 △10.18%
2019 400,000 730,000 828,345 +98,345 +11.87%

2018年末には△10%だったのに、2019年はマイナス分をさらにプラスに変えてトータルでは+11%以上まであがりました。
たまたま運がよかったっていうのもあるかもしれないけど、低いときにもあきらめずにコツコツ積み立てたからこそ、ここまで上がったのかな~と思っています。

それに一度積み立て金額と商品を設定してしまえば、あとはボーっとしていても証券会社が投資信託を購入してくれる。正直ものすごい楽だ。

買っている商品

ちなみに嫁が購入している商品はこれら。

  • eMAXIS Slim先進国株式インデックス(月10,000、ボーナス月10,000)
  • ニッセイ外国株式インデックスファンド(月10,000)
  • 楽天・全世界株式インデックスファンド(月10,000、ボーナス月10,000)

嫁の選定基準は「世界に投資してるやつ買えば、分散投資になると思ってる」だそうだ。

eMAXIS Slim先進国株式インデックスはMSCIコクサイインデックスをベンチマークにしている投資信託で、日本以外の先進国を投資の対象にしている、らしい。

「MSCI-KOKUSAIインデックス」とは?
MSCI(モルガンスタンレー・キャピタル・インターナショナル)社が提供する世界の株式を対象とした指数、MSCI All Country World Index (ACWI:アクイ)から、新興国と日本を除外したものがMSCI-KOKUSAIインデックス(MSCIコクサイ指数)です。また、MSCI World Index (MSCI先進国株指数)から日本を除いたインデックスでもあります。この指数は1986年3月31日に算出が開始されてから30年の実績のある指数で、多くの投資家によって日本を除く先進国株式投資の物差し(ベンチマーク)として使われています。
(楽天証券HPより 学ぼう!「MSCI-KOKUSAIインデックス」の魅力 | 特集 | 楽天証券

「eMAXIS Slim」シリーズは運用手数料が安くて初心者におすすめだと他のブログなどで勉強して購入を決めたようだ。
そしてなぜか全く同じベンチマークのニッセイ外国株式インデックスファンドを購入している。なぜだ、分散投資はどうした?しかも運用コストを比較しても「eMAXIS Slim」シリーズのほうが安いのに。。。

さいごに楽天・全世界株式は、FTSEグローバル・オールキャップ・インデックスをベンチマークにしている。
MSCIコクサイインデックスとの違いは、ベンチマークを作っている会社が違うってのと、あとは投資対象の国が若干異なるらしい。

ぼくがつみたてNISAをはじめた理由

積み立てる商品・金額設定を一度してしまえば、そのあとは楽

最初は商品もたくさんあるし、なににいくら投資するか結構考えて設定することが必要になるが、そのあとはボーっとしててもよいのが魅力だ。数年おきにポートフォリオを見直すというのは必要になるとは思うが。

20年間×40万円の運用益が非課税

つみたてNISAのメリットとしてあげられるのが通常、投資信託で利益を出した場合20%が税金としてひかれてしまう。例えば、10万円の利益をだしても、手元には8万円しか残らない。しかしつみたてNISAの場合この20%が非課税になるため、10万円まるまる手元に残るのだ。

20年間の複利効果を得ることができる

投資信託で得た運用益を元本に足して、どんどん運用金額を増やしていくことが複利効果の魅力だ。
例えば、40万円を年間3%で20年間運用した場合、

元本 運用益 元本+運用益
1年目 400,000 12,000 412,000
2年目 812,000 24,360 836,360
3年目 1,236,360 37,090 1,273,450
4年目 1,673,450 50,203 1,723,654
5年目 2,123,654 63,709 2,187,363
6年目 2,587,363 77,620 2,664,984
7年目 3,064,984 91,949 3,156,934
8年目 3,556,934 106,708 3,663,642
9年目 4,063,642 121,909 4,185,551
10年目 4,585,551 137,566 4,723,118
11年目 5,123,118 153,693 5,276,811
12年目 5,676,811 170,304 5,847,116
13年目 6,247,116 187,413 6,434,529
14年目 6,834,529 205,035 7,039,565
15年目 7,439,565 223,186 7,662,752
16年目 8,062,752 241,882 8,304,635
17年目 8,704,635 261,139 8,965,774
18年目 9,365,774 280,973 9,646,747
19年目 10,046,747 301,402 10,348,149
20年目 10,748,149 322,444 11,070,594

なので、最終的には1107万となり、
何もせずに20年間×40万円=800万円ためておくのと比べて、300万程度上積みすることができる。

さらに普通に投資していたらここから300万×0.2=60万円 税金でもってかれてしまうが、NISAであれば300万の利益をそのまま享受できる。

非課税と複利効果のメリットを両取りできるのはとても魅力的だ。

嫁がリングフィットアドベンチャーにはまった話

ぼくの嫁がリングフィットアドベンチャーというゲームにどはまりしています。
このゲーム、試しにぼくもやってみたのですがたかがゲームと侮ることなかれ。
このリングフィットアドベンチャーによって、我が家はジムと化しました。

f:id:nukano0522:20191231092838j:plain

出会い

きっかけは嫁のひとことだった。
「わたし、ガッキーになりたい。リングフィットアドベンチャーやってガッキーになりたい。」
任天堂switchのゲームのCMで女優の新垣結衣さんがやってるのを見て感化されたようだ。
まずガッキーになれないことは置いておいて、リングフィットアドベンチャーというゲームでダイエットしたいと言っているようだった。
また嫁のいつもの癖(すぐあきる)だろうと適当に流していたが、3日おきくらいに嫁の「ほしいよ~」「かってよ~」攻撃が行われた。

嫁との2週間ほどの攻防を経て、ついにぼくは折れることにした。

他のブログでも、リングフィットアドベンチャーを3か月やって実際に痩せたという記事があったりして、ぼくも少し興味がでてきたのだ。

嫁の喜ぶ顔みたさ半分、ぼくの興味半分で購入を決意したぼくたちだったが、
その後なんども近くの家電量販店に足を運んだものの、いつ行ってもリングフィットアドベンチャーは売り切れていた。
その時点で発売から約1か月半もたっていたのにだ。

嫁は「入荷未定」のポップが貼られたリングフィットアドベンチャーの空き箱を見てはがっかりすることを繰り返しながら「クリスマスまでにほしい。年末年始休暇はリングフィットアドベンチャーしまくるの。」と謎の決意を述べていた。
クリスマス直前になって、嫁が通販サイトで定価の1.5倍くらいの高値で転売されているのをポチろうとしているのを止めながら、少し離れた駅の家電量販店に行ってみた。

そこで初めて「予約受付中」のポップが貼られたリングフィットアドベンチャーと出会った。
店員さんによると、嫁の夢である「クリスマス前」にリングフィットアドベンチャーは入荷されるということで、嫁は大喜びだった。
喜びすぎて、結局嫁のクレジットカードでどや顔で予約購入していた。

冒険のはじまり

リングフィットアドベンチャーを手に入れた嫁の冒険がはじまった。
このゲームはswitchの左右のコントローラーをそれぞれリングと足にセット、プレイヤーの動きをよみとって実際に体を動かすとストーリーが進んでいくというゲームだ。
ちなみにこのリング、普通に筋トレ器具みたいだ。結構弾力があって、内側に押し込んだり、外側に引っ張ったりすると結構腕がきつい。
ストーリーを進めたりするときにAボタンを押す感覚で内側に押し込まないといけないから、基本ずっと筋トレだ。

さらに、冒険中は実際にジョギングをしないとキャラクターも進まない。己の足で進まなければストーリーを進めるどころか、チュートリアルすらクリアできないのである。

ちなみに、ゲーム中に登場する「魔物」と呼ばれる敵を倒すには、腕、腹、脚、ヨガの4種類のトレーニングで攻撃しなければならない。嫁は敵が出てくるたびにスクワットをしたり、バンザイプッシュ(リングを頭上で押し込むトレーニング)をしたりして「きゃーなにこれ」「きっつ」「・・・きつ」「涙」とかなり頑張りながら戦っている。嫁曰く「ヨガのやつは楽。あとスワイショウも楽。」らしい。

まだきっと序盤だが引き続き嫁の冒険を応援していきたい。

嫁がはまった理由を考えてみる

このリングフィットアドベンチャーに嫁がはまった理由を考えてみる。
飽き性な嫁はひどいものだと3日経たずに飽きるのだが、すでに5日も続けている。(今後は分からないが)

冒険以外にもコンテンツが多い

ちなみにぼくもやってみたが、冒険以外にもリングや脚を使ったミニゲームや、体力・筋力測定のメニュー、あとは気になる部位に効くトレーニングをカスタマイズできるなど、結構いろいろあって楽しい。
きちんと正しい姿勢でできているかもチェックしてくれるので一人で筋トレするより圧倒的にモチベーションも維持できる。

運動のログが残る

あとは日々のログを見れるのも、嫁にとってはうれしいらしい。何分トレーニングしたか、とその中身(スクワットを何回したのかとか)、何キロカロリー消費したのかとかも日単位と累計回数で確認できる。「積み上げた努力」が自動で目に見えるというのは楽だし(嫁はそういう記録つけるのすらめんどくさがる)、嘘つけないし、よさそうだ。

運動をはじめるハードルが低い

嫁はいままでも「ジムに通ってみたい」「ヨガに通ってみたい」「ランニングはじめる」となんども挑戦をしてきたが、なんども挫折してきた。まず、トレーニングウェアに着替えることのハードルが越えられない、次に家をでること、そこまでしてやっとトレーニングをやるかやらないかというハードルにぶち当たる。
しかしリングフィットアドベンチャーはテレビの前に適当な恰好で立ってswitchのホームボタンを押せば始められる。
運動を始めるまでのハードルがボタン一つしかない。だから続いてるような気もする。

おわりに

今後も嫁を応援したいと思う。
年末年始で体がなまっている人、ぜひやってみてください。
(まだ売り切れてるのかな・・・

2回転職を重ねて感じたこと

4月から社会人6年目に突入しましたが、2か月前ほどに2回目の転職をしました。
なので、早くも(?)3社目となります。

1社目に2年、2社目に3年在籍し、そして今の会社に転職して2か月ほど経ちました。

1社目は中小SI、2社目はIT系のコンサル、そして今回はWeb系の事業会社に転職しました。
業界は全部バラバラですが職種に大きな変化はなく、基本的には”データ”にかかわる仕事をすることが多い5年間でした(データウェアハウス、レポーティング、DB管理、たまにデータ分析的なことなど)。

なので、転職しているからといってまったく新しいことに挑戦しているわけではなく、いろんな会社でデータにまつわるキャリアを伸ばしているという感じです。
ちなみに1社目→2社目の主な転職動機は給料を上げるためで、2社目は終盤望まないプロジェクトにアサインされることが多くなってしまい3社目に移った、という感じです。

転職してよかった~という点もあるにはあるんですが、いろんなところで書き尽くされているようなこととあまり違わないので、今回は転職を重ねるのも考え物だなぁ~という点をいくつか書いておきます。
もしこれから転職を考えている人の参考になれば。

■またイチから実績を積まねばならない
まぁ当たり前っちゃ当たり前なんですが。

業界内で多数の実績残してて有名な人は別だと思いますが、そうではない人は前職までの実績ってある意味白紙になってしまうわけです。
1年2年積み重ねてきたものってバカにできません。
その時間で多くの人と一緒に仕事をして、評価されて(されないこともありますが)、また新たな仕事に取り組んで・・・といったことを繰り返すことで築き上げてきた信頼を、新しい会社でまた築いていかなければなりません。

結局、面白い仕事ややりがいのある仕事って、ある程度実績積んで信頼されている人に回ってくるもんじゃないですか。

そういう良きサイクルを作り上げるまでにまた1年2年愚直にがんばらねばと思うと、けっこうしんどいな~と思っちゃいます。

なので、今の会社で人間関係がうまくいっていて、キャリア形成も望む方向に進んでいる人は、安易に転職することはお勧めしないです(そもそもそんな人は転職しないか?)

■人間関係もイチから
1点目と似ていますが、人間関係もイチから築かなければならんです。

ぼくなんかは打ち解けるまでにそれなりに時間がかかるほう(半年~1年とか)なので、これもけっこうつらいところではあります。

これは賛否両論ありそうですが、一緒に飲みにいけるようになったり、プライベートでも会うような仲になれたほうが仕事ってうまく回ることが多くなる気がしています。
仕事って基本的に行きたくないもんですが、人間関係がうまくいっていれば楽しいと感じることも多いですしね。

相手の懐に入るのがうまいとか、コミュニケーション大好き、みたいな人はいいんですけどね。

■転職1年目の給料はなんだか微妙
なにが微妙って、ボーナスが満額もらえないことですね。
中途入社だと賞与の評価期間の一部しか在籍しないパターンになることがほとんどだと思うので、その分ボーナスも按分されてしまいます。

また転職1年目でいきなり最高評価!ってのは普通の人はないと思うので、ボーナスはそこそこに収まって年収も微妙(前職より下がる?)なんてことになる可能性が高くなるんじゃないでしょうか。

100マン~200マンの年収アップで転職しているんであれば前職よりアップでしょうが、
現状維持の年収であれば、実質は下がることになると思います。

■1回転職しちゃうと何回でもやれそうな気持ちになっちゃう
別に転職することが悪いこととはおもってませんが、なんか会社で嫌なことがあったり思い通りにならないことがあると「転職するかな~」と安易に考えてしまうようになりました。

これは1社目のときはなかった感情なんですが、2社目(そして今も)からは「ま、最悪やめればいいしね~」っていうある意味開き直ったようなことを考えるようになったんですね。
最初の転職って不安も大きいしけっこうハードル高いもんだと思うんですが、1回キメてしまうと2回目以降はすごく簡単に見えてしまうんですよね。

ちゃんと目的意識をもってやらねばいかんことは分かってはいるんですが・・・。
ジョブホッパーにならないように気を付けたいです。

ま、ここもその人の考え方次第なのかな。




転職を2回重ねて感じたこと(主にデメリット)を書いてみました。

新しい環境で新たな気持ちで仕事ができるのが転職の一番のメリットだと個人的に思ってますが、上記のようなこともあるってことで。

とりあえず今の会社で適度にキャリア形成しつつ、(なるべく長く働けるように)適度にがんばっていきます。

Apache上でFlaskを動かすまで(Apache2+wsgi+Flask)

PythonのフレームワークであるFlaskでWebアプリを作成中。
Web上で公開したいため、Apacheと連携させるまでの手順を書く。

ここでは、開発環境(ローカル)でFlaskの動作検証を実施するとともに、その後本番環境(本番Apache)上で動かすまでの手順を書いていく。

環境

※下記は全てインストール済の前提で進めていく

  • OS:Raspbian(Raspberry Pi 3)
  • Pythonバージョン: 3.6.3
  • ウェブサーバー:Apache2

なおPythonアプリの場所は、/var/www/html/flask
でやっていくが、適宜、各々の環境に置き換えてほしい。

参考

qiita.com

開発環境での動作検証

Flaskインストール

pip install flask

テストアプリ作成

[/var/www/html/flask/Hello.py]

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=80)

本番環境(公開サーバー)で動かす

apache2のインストール

apache2は既にインストール済の前提だが、なければ下記

 sudo apt-get -y install apache2

mod_wsgiのインストール

mod_wsgi(ウィズギー)は、PythonフレームワークとApache2を連携させるためのインターフェースモジュール。らしい。
wsgi無しでは、PythonをWebサーバーと連携できないので、インストールが必要。※一応cgiを使うという手もある

sudo apt-get -y install libapache2-mod-wsgi

wsgiファイルを作成

/var/www/html/flask にwsgiファイルを作成する。
[/var/www/html/flask/test.wsgi]

import sys, site

#pythonのpathを指定
site.addsitedir('/path/python3.6/site-packages') 

#wsgi, Flaskファイルのディレクトリを指定
sys.path.insert(0, '/var/www/html/flask')
from Hello import app as application

apache2の設定ファイルでVirtualHostを追加

バーチャルホストを使えば、一つのドメインで複数のサイトを作ることができる。
デフォルト(80番)でよければいいが、自分は既に別サイトで使用していたので、ポート8080番でVirtualHostを追加する。

念の為、デフォルトの設定ファイルはいじらず、新しく作る。

sudo cp 000-default.conf 001-default.conf

下記コードを追加する。
[/etc/apache2/sites-available/001-default.conf]

<VirtualHost *:8080>

 WSGIDaemonProcess test user=pi group=pi threads=5
 WSGIScriptAlias / /var/www/html/flask/test.wsgi

<Directory /var/www/html/flask>
 WSGIProcessGroup test
 WSGIApplicationGroup %{GLOBAL}
 WSGIScriptReloading On

 Require all granted
</Directory>
</VirtualHost>

apache2の設定ファイルでポートを追加

上記でポートを追加した場合、設定ファイルの編集が必要。
(従って、ここは本筋ではない)
ports.confを編集して、とりあえず8080番を追加

[/etc/apache2/ports.conf]

   # If you just change the port or add more ports here, you will likely also
   # have to change the VirtualHost statement in
   # /etc/apache2/sites-enabled/000-default.conf
  
   Listen 80
   
 #以下を追加
   Listen 8080
   
   <IfModule ssl_module>
       Listen 443
   </IfModule>
 
  <IfModule mod_gnutls.c>
      Listen 443
  </IfModule>

ルーターの設定でポートを追加する

(上記同様、本筋では無いが)ルーターの設定で、今回新しく追加したポートを公開する必要がある。
今回で言えば8080番を公開する必要がある。
やり方は、ルーターの種類によって異なってくるかと思うので割愛。



以上。ポート8080番で、Flaskアプリケーションが実行できればOK。
f:id:nukano0522:20180430144544p:plain

CakePHPプロジェクト作成時のhtaccessの設定方法

CakePHPのプロジェクトを作成したまではいいが、htaccessの設定に不備があるようで、CSS等のファイル読込がうまくいかなかった。

不備事象

下記のように、「URL rewriting is not properly configured on your server」というエラーメッセージが表示される。CSS等のファイルも読み込まれていないようである。
f:id:nukano0522:20180328161929p:plain

環境、前提

OS:Raspbian
Webサーバー:Apache

また、ここでは、/path/toというディレクトリ配下に、appというCakePHPプロジェクトを作成した前提で話をすすめる。

対応

.htaccessを有効にする

そもそも.htaccessの読込が有効化されていなかったようなので、apacheの設定ファイルを編集する。

以下を追記する。
[apache2.conf]

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

ちなみにmod_rewrite.soの場所は予め調べておく。
f:id:nukano0522:20180331153536p:plain

.htaccessのoverrideの設定を変更

apacheの設定ファイルに下記を追記

[apache2.conf]

<Directory /path/to/app>
    Options FollowSymLinks
    AllowOverride All 
</Directory>

参考:公式サイト
https://book.cakephp.org/3.0/en/installation.html#url-rewriting

.htaccessを編集

.htaccessのファイルを編集する。
こちらも公式サイトを参考。

[/path/to/app/.htaccess]

<IfModule mod_rewrite.c>
    RewriteEngine on
    #RewriteBaseの記述を追加
    RewriteBase   /app
    RewriteRule    ^$    webroot/    [L] 
    RewriteRule    (.*)  webroot/$1    [L] 
</IfModule>

[/path/to/app/webroot/.htaccess]

<IfModule mod_rewrite.c>
    RewriteEngine On
    #RewriteBaseの記述を追加
    RewriteBase /app/webroot
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^ index.php [L] 
</IfModule>

参考:公式サイト
https://book.cakephp.org/3.0/enひょうじされるようになりました。ml#url-rewriting


以上、ちゃんとひょうじされるようになりました。
f:id:nukano0522:20180331155444p:plain

長時間労働で得たもの失ったもの

去年の夏頃から参画していたプロジェクトがようやく一段落したので、久しぶりの更新。

今回のプロジェクトは、今の会社に転職して3つ目のプロジェクトで、それなりに大変で労働時間も多かった。
その中で得たもの失ったものを書いていく。

プロジェクトの超概要

あまり細かいことは書けないが、ざっくりいうとシステム開発の案件である。
もう少し言うと、今流行り(もうコモディティ化している?)のデータ分析の基盤を導入するプロジェクトになる。

細かい話をすると、データウェアハウスの構築、集めたデータを可視化する(レポーティング)プロジェクトとなる。


様々な役割がある中で、自分は2つの領域の担当を任された。

短納期かつ(データ分析基盤としては)大規模な案件であり、(自分も含め)経験の少ない若手中心のメンバー構成であったため、労働時間は大きくなりがちだった。

難易度が高くタスク量が多い中でいかにして残業を減らすか、というのも大切なテーマかとは思うが、ここでは触れないでおく。
たくさん残業をしてしまった反省みたいなものは別途行うものとして、ここではたくさん残業をしてしまったことを通して得られたこと/失ったことを書き留めておく。

ちなみに、残業時間は平常時が40時間/月くらいで、ピーク時は80時間/月であった。
これを多いと捉えるか少ないと捉えるかは人によりけりだと思うが、自分にとっては「長時間」であることを断っておく。

長時間労働で得たもの

やり抜く力/責任感

正直何度か投げ出したい気持ちに駆り立てられた(実際、体調不良でもないのに休んだこともあった)が、結果的にやり遂げることができた。

クライアントのためや同僚のためにがんばった、、、というのもないわけではないが、
途中で投げ出したら結局自分が後悔すると思ったから、というのが正直なところ。

これを責任感と呼べるかどうかはわからないが、最後までやり抜いたことは事実なので、自分のキャリアの中で大きな糧になったということにしておく。
実際、”責任感”という観点で上位者にもそれなりに評価してもらった。

また、難易度の高い仕事を最後までやれたのは、多少自信にもなった。

しかし、結果的にやり遂げられたが一歩間違えれば投げ出してしまっていたのかもしれないと考えると、”責任感”も結果論でしか無いんじゃないか、とも思う。

何とか最後まで続けられた要因として個人的に思うのは、「やばいな」と思ったときに休んでリフレッシュしたことが良かった(サボりと非難されても何も言い返せない。そういう意味だと自分は責任感なんてものは持ち合わせていないのかもしれない)

連帯感が得られる

夜遅くまで一緒に働いていると、謎の連帯感が生まれる。
やはり苦労を共にすることで信頼感や親密さが生まれるのだろうか。
(だからといって長時間残業を推奨しているわけではないことは、ここでも断っておく。)

こういった経験は、後々また一緒に働くことになったらプラスに作用するかもしれない(しないかもしれない)。

お金

幸い(当然そうあるべきなのだが)、残業した分はきっちりお給料に反映された。

自分は忙しさによるストレスを、暴飲暴食、夜遊びに発散するタイプではないので、働いた分だけお金がたまることになった。
(結局、これからの結婚資金に費やすことにはなりそうだが、残業代でまかなえると思えば得をした気分である)

サラリーマンである以上、また成果主義に完全に移行しきれていない日本の現状においては、残業はお金を貯める一つの方法ではあるので、ある意味では長時間労働も悪いことだとは言い切れないと思っている。

長時間労働で失ったもの

心のゆとり

朝起きるのがツライことが多かった。
出勤してみると意外と大丈夫なのだが、目が覚めたときに「今日も資料作成して会議に出て夜まで働くのか」と想像すると気が滅入った(結果、休んだこともあった)。

これは長時間労働というより仕事内容と自分のメンタルの問題なのかもしれないが。

でも、できれば夜遅くまで仕事はしていたくないマインドなので、長時間労働によって心のゆとりが奪われていたのは間違いないと思う。

せっかく自由な時間が使える休日も、抜け殻のように眠ることが多かった。

仕事以外の人間との交流

半年間、同じ会社の同じプロジェクトのメンバーとずっと一緒にいたような印象がある。

休日もどこか出かけようかというモチベーションがないことが多く、定期的に会っていた友人達ともここ半年間は疎遠になってしまった。
当然、新しい人と知り合うなんてことはまったく無かった(人見知りなので、あまり望んではいないけど)

趣味の時間

平日は仕事以外の時間がなかなか確保しづらく、
(繰り返しになるが)休日は仕事をしないはずなのに、平日の反動からか活動的になれなかった。

週に3~4回ほどランニングをするのが日課になっていたが、ここ半年は週1~2回、ひどいときはまったく走らないなんてこともあった。

運動がストレス解消に一役買っていたところもあるので、
   
  仕事が忙しい→ゆとりがなくなる→運動しない→仕事に身が入らない

の悪循環に陥っていた。

長時間労働は総じて良くないことが分かった

少なくとも自分にとっては、長時間労働はメリットよりデメリットのほうが多いと感じた。

一時的にお金は稼げるかもしれないが、メンタルを壊して働けなくなってしまえば、長期的には損してしまう。

自分のメンタルも強くないことがわかったので、心が壊れない程度に仕事量を調節してもらうとか、周りをもっと頼るとか、働き方をもっと考えなければならないと感じている。

以上。

python+selenium+PhantomJSでスクレイピングしたデータをMySQLに格納するまで

python+selenium+PhantomJSでスクレイピングしたデータをMySQLに格納するまでの手順です。
RUNNETというマラソンのポータルサイトがあるんですが、そこから大会のエントリーリストを取得し、MySQLにデータを格納します。

ちなみにRUNNETからはいろんな大会が見れていいんですが、欲しくない情報もいっぱいあるので、自分の欲しい大会情報だけ抽出して管理できたらな~と思いやってみました。

環境など

OS:Raspbian
Python:3.6.3(pyenv)
スクレイピング対象のWebページ:RUNNET(https://runnet.jp/entry/runtes/user/pc/RaceSearchZZSDetailAction.do)

selenium+PhantomJSをインストール

まずは、seleniumをインストールします

pip install selenium

PhantomJSをインストールします

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/ #PATHの通ったディレクトリにコピーする
sudo apt-get install -y libfontconfig1 fonts-migmix #スクリーンショットを撮るために必要

以下コマンドでバージョン名が確認できればインストールされています。

phantomjs -v

Webページ(RUNNET)からデータを取得する

Webページを開く

Webページ(RUNNET)を開いてみます。

###test.py###
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("http://runnet.jp/entry/runtes/user/pc/RaceSearchZZSDetailAction.do")

スクリーンショットを取って処理内容を確認することができます。

###test.py###
driver.save_screenshot('test.png')

test.pngを開くと以下のようになっています。RUNNETの大会検索のページを開くことができています。
f:id:nukano0522:20180108160339p:plain

要素にアクセスし、検索条件を指定する

このままだと余計な大会も検索されてしまうので、検索条件を指定して結果を絞り込みたいです。
ここでは、”フルマラソン”を検索条件に指定して、フルマラソンの大会リストを取得してみます。
開発者ツール(F12)から、フルマラソンの要素を調べます。
f:id:nukano0522:20180108161557p:plain

「id="dummy_distance02"」とあるので、下記のようにidを指定してやると、要素にアクセスできます。

###test.py###
#フルマラソン
elem_distance = driver.find_element_by_id("dummy_distance02")
elem_distance.click()

先ほどと同様に、スクリーンショットを確認してみます。”フルマラソン”にチェックが付いています。
f:id:nukano0522:20180108162102p:plain

開発者ツールから検索ボタンの要素を調べ、検索ボタンをクリックします。

###test.py###
#検索ボタンをクリック
elem_search=driver.find_element_by_id("easy_search")
elem_search.click()

フルマラソンの大会リストを取得する

各大会のクラス名は、下記のように「class="item"」となっています。この中に、大会名、開催場所、開催日といった欲しい情報が入っています。
f:id:nukano0522:20180108172951p:plain

ですので、For文を利用して、各itemに対して大会の情報を取得していきます。

###test.py###
info=[] #各大会の情報を格納するためのリストを定義
for e in driver.find_elements_by_css_selector(".item"):
	try:
		info.append({
			'name':e.find_element_by_css_selector(".title_run").text, #大会名
			'date':e.find_element_by_css_selector(".date").text, #開催日
			'place':e.find_element_by_css_selector(".place").text, #開催場所
		})
	except:
		pass

取得したデータをMySQLに格納する

MySQLでテーブルを作成しておく

いったんMySQL環境から、テーブルを作成します。

create table test_entry_list(name varchar(256), date varchar(100), place varchar(100));

MySQL-pythonをインストール

pythonからMySQLを扱うために、”MySQL-python”というライブラリを使います。
インストールします。

pip install MySQL-python

pythonからMySQLに接続する

pythonに戻ります。
データベース名、ユーザー名、パスワードを設定し、MySQLに接続します。

###test.py###
import MySQLdb
#MySQLにデータ格納
conn = MySQLdb.connect(db='DB名', user='ユーザー名', passwd='パスワード', charset='utf8mb4')
c = conn.cursor()

テーブルにデータを格納する

先ほど作成したテーブル”test_entry_list”に、info内の大会情報を格納します。
For文を利用して、1大会ずつ順番にINSERTしていきます。

###test.py###
#1大会ずつテーブルに格納
for dict in info:
	c.execute('insert into test_entry_list values(%(name)s, %(date)s, %(place)s)', {
	'name':dict['name'], 
	'date':dict['date'], 
	'place':dict['place'],
	}
	)
conn.commit() #コミット
conn.close()

テーブルにデータが格納されているか、確認してみます。
f:id:nukano0522:20180108171201p:plain

うまくいってます。

参考書籍