タダケンのEnjoy Tech

楽しみながらラクに成果を上げる仕組みを考える

ブログ更新を支える技術

f:id:tadaken3:20181004173547p:plain こんにちは。
タダケン(@tadaken3)だよ。

ブログってはじめるのは簡単。だけど、続けるのは難しい。1年以上続くブログは3割しかいないというデータもある。

上記の記事は、いかにブログの継続が難しいか物語っている。そこで今回はボクが実践しているブログ更新を支える技術をお伝えする。ちょっとしたTipsだが参考になれば幸いだ。

ブログを書くためのマインドセット

ブログを書く上で、ぜひ、読んでほしいのがカカカカックさんの「ブログを書く技術」だ。カカカカックさんは10年にも渡って、技術ブログを書き続けている猛者中の猛者だ。

kakakakakku.hatenablog.com

詳細はぜひ記事を読んでいただくとして、ボクが記事を読んで心に刺さった部分はこの3つ。

  • 「ブログを書く前提で」タスクに着手すること
  • いつ誰が「ブログより仕事が重要」と決めたの?
  • 3ヶ月はKPIなんて考えず、とにかくブログを書き続ければよい

とくに「仕事よりもブログのほうが重要」と言い切るカカカカックさんは本当に強い。まずは、上記の記事を読んでブログを書くマインドセットをアップデートしてほしい。

ブログ仲間を作る

最近、すごく実感しているのがブログ仲間がいると頑張れるということ。このブログをデザインしてくれたろくぜうどんさんからのお誘いで、「週一でブログ更新をする会」」というFacebookグループに入っている。

「週一でブログ更新をする会」ではスプレッドシートに参加メンバーの

  • ブログ名
  • 最終更新日
  • ブログをどれくらい更新していないのか

などの項目が、まとめられている。ブログ更新をしていないとスプレッドシートの色が黄色→赤→黒と変化していって、更新してないことがすぐにわかる。このスプレッドシートの色が変わるとすごく煽られるのだ。

幸い、継続してブログ更新ができているので、今のところ、ボクは煽られたことがない。けど、他の人が煽られているのをみると、頑張って更新しようと思う。

上記のメソッドを色んな人に共有したく、ボクがいま所属している入江開発室のSlackで「週1ブログで更新するチャンネル」を作った。「週一でブログ更新をする会」と同じようにスプレッドシートを使って、お互い励まし合いながらブログを更新している。

f:id:tadaken3:20181004095215p:plain

ちなみにスプレッドシートのテンプレートはこれ。もし使ってみたい方はコピーして使って。スプレッドシートの関数を使って、自動で最終更新日などを取得している。

【公開用】週1でブログを更新する - Google スプレッドシート

チャンネルの様子は、こちらの記事を読むとよくわかるはず。メンバーのもりさんがまとめてくれた。

www.excel-prog.com

「週一でブログ更新をする会」に参考にwrite-blog-every-weekというSlackの運営はじめた人も見つけた。ブログ仲間がほしい人は、こちらに参加するというの良さそう。

kojirooooocks.hatenablog.com

ブログ仲間がいることの重要性

自分の経験を振り返ってみても、仲間がいることがとてつもなく大きい。

ボクはもともと「いつも隣にITのお仕事」というブログで、記事を執筆していた。「いつも隣にITのお仕事」では運営者のタカハシさんのもと、メンバーみんなで一つのブログを運営していく。「いつも隣にITのお仕事」で学んだ経験をもとに始めたのがこのブログだ。

いままで何度もブログに挑戦し、その度挫折を繰り返していたボクだったけど、「いつも隣にITのお仕事」ではブログを継続して更新することができた。それはシンプルだけど

  • 締切があったこと
  • フィードバックしてくる仲間がいたこと

がとても大きかったんだと思う。その時のことは以下の記事にまとめているで、興味がある人はぜひ。

tadaken3.hatenablog.jp

自分のブログがシェアされた通知する

ブログ書いている人はわかると思うが、ブログを書くのって実はむちゃくちゃ時間がかかる。ボクの場合、記事の構成、必要な画像素材の準備、アイキャッチ画像の作成なども含めて、ひとつの記事を書くのに少なくとも2〜3時間はかかっている。



だから、上記でも書いたようにシェアしてもらうとすごく嬉しい。とくにコメント付きでシェアしてくれた人なんかにはメンションして感謝の気持ちを伝えたりもする。

f:id:tadaken3:20181004135609p:plain
シェアしてくれた人にリプライする様子

そのため、Twitterでブログをシェアしてくれた人を検知できるようIFTTTを使って、Slackに通知させるようにしている。やり方は以下の記事を参考に。

starhoshi.hatenablog.com

設定するとこんな感じで通知される。

f:id:tadaken3:20181004140009p:plain
IFTTT経由でSlackにエゴサーチの結果が通知される

参考までに、ボクの検索キーワードを載せておく。ちょっとだけ工夫してあって、自分のアカウントのツイートは除くようにして「ブログのドメインを含むツイート」を通知するようにしている。

tadaken3.hatenablog.jp -from:@tadaken3

苦労して書いた記事を、どんな人が読んでくれていて、どんな風に思われているかを知ることはモチベーションにつながる。これはちょっとした工夫で知ることができる。

どの記事が読まれているのかを毎朝、確認する

基本的にPVなんかはほとんど見ていないのだが、毎朝、どんな記事が読まれているのかは確認するようにしている。どんな記事がよく見られているかを確認して、ブログ運営のヒントにしている。これもSlackに通知するようにしている。

f:id:tadaken3:20181004134710p:plain
毎朝Slackに前日のランキングを通知

こちらの記事を参考に毎朝、ブログ記事別のランキングを通知する。

tonari-it.com

元記事はチャットワークに通知しているが少し改良して、Slackに通知。コードはこちら。

function main(){
  var message = getData();
  sendSlack(message);
}

function getData(){
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var sheetRanking = mySS.getSheetByName("rankingHatenaBlog");
  var yDate = sheetRanking.getRange("C16").getValue();
  yDate = Utilities.formatDate(yDate,'JST','yyyy/MM/dd')
  
  //header
  var message = "はてなブログのランキング(" + yDate + ")\n\n";
  
  //body
  for(var i =1; i<=5; i++){
     var rank = "[" + i + "]"
     var pv = sheetRanking.getRange(i+15 ,4).getValue();
     var title =sheetRanking.getRange(i+15 ,1).getValue();
     message = message + rank + pv + " / " + title + "\n\n";
  }
 
  //footer
  var sheet_url = mySS.getUrl()
  message = message  + sheet_url
  return message
}

function sendSlack(message) {
  var prop = PropertiesService.getScriptProperties();
  var postUrl = prop.getProperty('SLACK_POST_URL');
  var username = 'blog-ranking';  // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

まとめ

以上がブログの更新を続ける上でボクが実践したり、意識していることになる。

  • ブログを書くマインドセットをアップデートする
  • ブログ仲間を見つけて励ましあう
  • ブログをシェアしてくた人を発見してモチベーションにつなげる
  • どんなブログ記事が読まれているかチェックしてブログ運営の参考にする

基本的なことだったりするけど、基本的なことを情熱を持ってやるのが大事。今後も継続してブログ更新を続けていきたい。

おまけ / ブロガー仲間のご紹介

ぼくと関わりのあるブロガー皆さんをご紹介。お仕事などでご縁があったり、上記のブログ更新チャンネルでの仲間をリストアップした。気になるブログがあればぜひ、ブログを読んで感想をTwitterなどでコメントしてほしい!

ご縁のあるブロガーの皆さん

いつも隣にITのお仕事 | 毎日の業務が楽チンに!

Google Apps ScriptやExcel VBAを活用した仕事を効率よく進める技術をノンプログラマー向けにまとめているブログ。僕のブログ師匠であるタカハシさんが運営している。ブログで大切なことはすべてタカハシさんに教わった。

LOGzeudon

僕のブログのデザインをしてくれたデザイナーのろくぜうどんさんのブログ。デザインに困ったらろくぜうどんさんに相談するといい。

teanote00|note

ご縁があってPythonを教えているマーケターのさとうさんのnote。マーケティングやUX・デザインについての記事がアップされている。イベントレポートも多いので楽しい。

好奇心の強い大学生のちょっとした情報発信

同じくご縁があってPythonやSQLを教えている大学生、はやとさんのブログ。すごいガッツのある学生さん。お役立ち情報が多い。

入江開発室 ブログ更新チャンネルのメンバー

IRITEC

入江開発室のまとめあげるいりえもんこと入江さんのブログ。WEBサービス開発の知見が惜しみなく公開されている。いりえもんって流行らせたい。

スキマノート

AIメーカーを作成された2zさんのブログ。AIメーカの開発話や2zさんが作ったサービスのことが 書かれている。倍プッシュ。

岸祐太 / Yuta Kishi|note

数学修士、認定スクラムマスターなどをお持ちの岸さんのブログ。入江開発室での学びを中心に記事を公開している。入江開発室のポートフォリオ制作にも携わった。

ブログ | RUBYDESIGN. (ルビーデザイン)

入江開発室で一番多くのプロジェクトに関与しているデザイナーのマツイさんのブログ。最近、プログラミングも勉強し始めてたそうです。個人的には、初学者視点でのLaravelの記事が好き。

ぺんすけブログ

メンタリングがとても上手なPHPerなぺんすけさんのブログ。とにかく初心者向けに教えるのがとても得意。最近はLaravelの記事を書くのに注力しているらしい。あとポエムにもハマっている。

コバヤシ リョウタ|note

営業からエンジニアに転職しようと決意して入江開発室に飛び込んだコバヤシさんのnote。毎日、「早さこそジャスティス」と叫んでいる。

育児しながら転職する! - 育児と仕事を両立したい!理想の働き方を求めてSESからWEB企業への転職を目指します!

ぺんすけさんのメンティさんのあきさんのブログ。ブログタイトルにもあらわれている通り「育児しながら転職する!」というすごい決意!応援したくなる。

Koushi Kagawa|note

美味しそうな秋刀魚を自慢してくるWEBエンジニアの賀川さんのnote。音楽フェスの話題なども幅広く扱っている。秋刀魚がとにかくうまそう。

基礎から学ぶVBAプログラミング教室

タカハシさんが運営しているノンプロ研究会の一員であるもりさん。最近、入江開発室に入ってきたので、ブログ更新チャンネルに引きずり込んだ。VBAの記事が中心。

よしたく blog

最近、入江開発室に入ったエンジニアのよしたくさんのブログ。よしたくさんはカカカカックさんのブログメンティだったそうで、もちろんブログ更新チャンネルに引きずり込んだ。

kou|note

カカカカックさんからプログラミングを教わったKouさんのnote。カカカカックさんのメンティなので当たり前のように週一で更新してくれると期待。

arutega.jp

最近、入江開発室に入ったデザイナーの平尾さんのブログ。本業デザイナーのブログはやっぱりおしゃれ。海外エンジニアリングとWebデザインについて発信されている。

NARI_Creator - Qiita

入江開発室の「ポートフォリオサイト」を牽引していたNARIさんのQiita。最近、フリーランスになったらしい。

Junjungroove|note

「起業戦闘力」で開発をはじめたエンジニアのたがじぇさんのnote。とにかくエモい。今後はPythonや統計の記事を書くいてく予定とのこと。

B-minor. | フリーランス × エンジニア

入江開発室の「起業戦闘力」プロジェクトでリーダーだったまっきーさんのブログ。フリーランス視点での生きた知識・知恵が公開されている。たぶん。自分からブログ更新チャンネルに入ったのにお尻を叩くと文句を言う。

以上だ。ぜひ皆さんも楽しいブログライフを!

データサイエンティストが選んだ!データ分析を仕事に活かしたい人へオススメの本18選

f:id:tadaken3:20180930021912p:plain こんにちは!
タダケン(@tadaken3)です。

新宿のとあるIT企業でデータサイエンティストとして働いてます。1

データ分析を学びたい人、データ分析でビジネスを改善したい人へ、おすすめの本を紹介していきます。初心者データサイエンティストや、エンジニアさん、マーケターさん、独学でやってたけど基礎を学びたい人などもどうぞ!

ジャンル別に紹介しています!

データ分析を始める前に読む本 / マインドセット

会社を変える分析の力

会社を変える分析の力 (講談社現代新書)

会社を変える分析の力 (講談社現代新書)

  • 作者:河本 薫
  • 発売日: 2013/07/18
  • メディア: 新書

大阪ガスのチーフデータサイエンティストの河本さんの書籍。「なんのためにデータ分析をするのか?」ということを気付かされてくれる一冊です。

ビジネスの現場において、

  • ビジネスにプラスのインパクトを与えるか
  • 正しい意思決定にどれだけ貢献できたか

がいかに重要かということを教えてくれます。難しい数値計算してもビジネスインパクトがゼロの分析だと意味がないですよね。

本物のデータ分析力が身に付く本

続けて大阪ガスの河本さんの本。こちらはワークショップ形式の本で、実際に手を動かしながら読み進めていく、いわば実践の書です。

この本では「課題設定の方法」「データの前処理をきちんとする」ということに紙面の多く割かれています。

実際に分析に使うのはExcelだけなのですが、「課題設定」さえ正しくおこなって、「データの前処理」をきちんとおこなえば、精度の高い分析ができることを実感できると思います。

Google流資料作成術

Google流資料作成術

Google流資料作成術

最初に紹介した2冊が「課題設定」に関する本であるならば、「Google流資料作成術」はデータを使って「いかに人を動かすか」ということにフォーカスした本です。日本語の書籍名だと小手先の資料作成のテクニック本に感じられますが、全く違います。

原題は「Storytelling with data」となっており、

  • データを使って人を動かすストーリーをつむぐ方法
  • そのストーリーを最大限伝えるためのグラフ作成術

について書かれています。今回紹介した本のなかでどれか1冊を選ぶとしたら、間違いなくこの本です。

本ブログでも以前、書評を書いているので詳しく知りたい方はこちらもご覧になってくださいな。

tadaken3.hatenablog.jp

ちなみにTHE GUILDのAndoさんにも、こちらの本を紹介したところ、以下のコメントいただきました。

SQL編 / データを自在に集計するために

10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く

分析用のSQLを勉強するとしたらこの1冊がすごくオススメ。SQLの基本から始まり、具体的で実務レベルで使えるSQLの書き方を学ぶことができます。

データ分析といえばPythonやRじゃないの?と思われた方がいるかもしれません。ですが、企業が取り扱うデータはほとんどの場合、データベースに格納されています。データベースに入ったデータをいちいち開発エンジニアに頼んでいて、データを出してもらっていては、分析も一向に進みません。そのため、データ分析においては、SQLはほぼ必須といっても過言ではありません。

いまやメルカリピクシブクックパッドなどのIT企業ではディレクター・プランナーやマーケターなどの非エンジニアの方が自分でSQLを書いてデータ分析をしています。

逆に言うと非エンジニア職でも、まずはSQLさえかければ、自在にデータを扱えます。大丈夫。この1冊を読めばあなたもSQLが書けるようになるはずです。

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ

こっちのSQL本はデータ分析でよく使うテクニックがまとめられています。中級者向け。「10年戦えるSQL本」を読んでから読むのがおすすめです。

この本の良いところは、Google Big Query・Redshift・HIVE・Spark・PostgreSQLなど、多様なデータベースに対応したSQLがまとめられているところです。コードの検証作業むちゃくちゃ大変だったんだろうなと思わせる一冊。

また、SQLだけでレコメンドエンジンを実装するところまで学べます(若干、やりすぎ感もありますが)。SQL上級者でも、きっと参考になるテクニックが見つかるとお思います。

Python 入門編

みんなのPython

みんなのPython 第4版

みんなのPython 第4版

  • 作者:柴田 淳
  • 発売日: 2016/12/22
  • メディア: 単行本

みんなだいすきPythonさん!Pythonブームが来ているので、巷ではPython関連の入門書がたくさん出版されていますが、この本が一番わかりやすいし、内容も過不足ないと思います。

初版は2006年8月26日に発売されましたが、Pythonのバージョンアップに合わせて、現在は第4版までアップデートされています。歴史の波に揉まれて第4版となっていることもあり、内容はほんとに洗練されています。

Python初心者の方はまずこの1冊を読んで、手を動かしてみることをおすすめします。

Pythonによるデータ分析入門

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

  • 作者:Wes McKinney
  • 発売日: 2018/07/26
  • メディア: 単行本(ソフトカバー)

Pythonで、データ分析をする際によく使うNumpyやPandasについて解説した本。ちょっと分厚い本なので、手元においておいて、リファレンス的に読むのがいいです。最近、第2版が発売されたばかりというのも熱いです。

統計学 入門編

「マンガでわかる統計学」シリーズです。

マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 因子分析編

マンガだからといって侮ってはいけません。専門書だと読む気がなくすような内容も、イラストとストーリーのおかげで比較的楽に読み終えることが出来きるはずです。難しい専門書を読んで理解できずに挫折するぐらいなら、この本を繰り返し読んで、基礎を固めるほうがずっといいです。

3冊とも全部オススメなのですが、3冊のなかでどれか1冊だけ選ぶとすれば「回帰分析編」です。気になる方はまず、「回帰分析編」を読んでみてくださいな。

完全独習 統計学入門

完全独習 統計学入門

完全独習 統計学入門

  • 作者:小島 寛之
  • 発売日: 2006/09/28
  • メディア: 単行本(ソフトカバー)

「これ以上何かを削ったら、統計学にならない」というコンセプトで書かれた本です。といいつつも平均や標準偏差からはじまり、カイ二乗分布、t分布といったところまで網羅されています。

この本を読めば「偏差値70」といわれて、その人がどれぐらいの位置にいるのか、具体的に理解できるようになると思います。

統計学 手を動かして学ぶ

心理統計学の基礎

「統計学をきちんと使えることを目指して初歩から勉強する」場合のテキストとして、この本は「神レベル」だと思います。「統計学的なものの考え方」を身につけるための解説と「実際の分析の方法」を身につけるための解説が、いい感じにミックスされています。数式の解説もすごく丁寧です。

「マンガでわかる統計学」「完全独習 統計学入門」と比べて、少し難しいところもあるかと思いますが、じっくり読むことで、データ分析を進めていく上ので基礎を固めることができる1冊です。

Rによるやさしい統計学

Rによるやさしい統計学

Rによるやさしい統計学

よくわかる心理統計 (やわらかアカデミズム・わかるシリーズ)」の内容を統計用のプログラミング言語Rで実践する本です。

「心理統計学の基礎」が統計の解説書だとすれば「Rによるやさしい統計学」はRの実践書になります。Rを使って統計を学びたい方は「Rによるやさしい統計学」を読みながら、手を動かしてみるとすごく力つきます。

データ分析の実務で役に立つ一冊

統計学が最強の学問である[ビジネス編]

ベストセラーとなった「統計学が最強の学問である」の続編です。

このブログを読んでいる方は「統計学が最強の学問である」を読んだことがあるかもしれませんね。この「ビジネス編」は「統計学が最強の学問である」の内容をビジネスの現場に落とし込んだ1冊です。

「経営戦略・人事・マーケティングなどでの領域でどうやって統計学を活かすのか」といったことに踏み込んで書かれています。また、「統計学が最強の学問である」は統計手法の中でも「回帰分析」に特化していおり、実践しやすいのも良いところです。

前処理大全

データ分析において、前処理は全行程の8割を占めます。その前処理について書かれた本です。

精度の高い分析をするには、データの前処理を丁寧にやることが本当に重要です。

データ分析のさしすせそは

  • さ:さっさと前処理しろ
  • し:しっかり前処理しろ
  • す:素早く前処理しろ
  • せ:正確に前処理しろ
  • そ:早急に前処理しろ

とも、いわれています。何度も言いますが、それぐらい前処理大事です。

GoogleのデータサイエンティストであるTJOさんもこのようにおっしゃています。

この本には、SQL・R・Pythonのそれぞれでデータの前処理をどのようにしたらいいのかまとまられています。読むためにはコードが理解できるぐらいの知識は必要ですが、手元においておくとすごく便利です。

仕事ではじめる機械学習

仕事ではじめる機械学習

仕事ではじめる機械学習

「機械学習をどうやってシステムに落とし込んで設計していくのか」をイメージできる良書です。

この本のいいところは、機械学習の本なのに「機械学習をせずに分析を進めることができない」かがきちんとかかれていることです。上司や取引先に「AIとか機械学習でなんか」と言われたときに読んでおくとすごく助かります。

正直、「機械学習はコストになりやすい技術」です。機械学習をシステム化を検討する場合、負債化させないためにどうしたらいいのかということまで書かれていてとても勉強になります。

番外編

改訂2版 データサイエンティスト養成読本

データサイエンティストの業務領域をさらっと理解するのに適した1冊です。モックなのでサラッと読めるのもよいところです。

数字のモノサシ

数字のモノサシ

数字のモノサシ

イラストレーターの寄藤文平さんが書いた絵本です。この本は統計学の本でもプログラミングの本でもありません。絵本です。

ですが、数量感覚を磨く上でこれ以上の本はないと思っています。例えば、1と100と10000の違いって体感的に把握できていますか?

ナンノコッチャと思いますが、数字に対して、苦手意識がある人はぜひ手にとって読んでみてください。あとイラストが箱庭感あってすごくかわいいです。

まとめ

データ分析に関するオススメの書籍18冊をまとめてみました。

今回、紹介した本を読んで手を動かして実践することで、データ分析のスキルを身につけることができると思います。

最後はとにかく実践です。

最後に少しお願いです。

ここまで読んでいただきありがとうございます。

最後にあなたに少しお願いがあります。この記事が少しでも役に立った、気付きがあったという方は、ぜひこの記事をTwitterにシェアしていただきたいです。

ぜひ、よろしくお願いいたします。 Twitterもやっています。 twitter.com


  1. どんな仕事をしているかは、日経産業新聞のインタビュー記事をご覧ください。tadaken3.hatenablog.jp

Mackerelで部屋のコンディションを監視する

f:id:tadaken3:20180926195437p:plain こんにちは!
タダケン(@tadaken3)です。

季節が変わり目で少し肌寒くなってきましたね。

部屋のコンディション(気温・湿度など)はパフォーマンスに強く影響します。

例えば、ジメジメしていると汗が気になって仕方がなかったり、部屋が寒すぎて集中できなかったり。

今回はMackerelNature Remoを使って部屋のコンディションを監視する方法をまとめました。

Mackerelを採用した背景

部屋のコンディションを監視する上で、やりたかったことは、大きく以下の2つです。

  • 自分の部屋の温度や湿度などのコンディションを数分ごとに記録してグラフで可視化すること
  • 温度や湿度などがコンディションが変化したら通知をすること(湿度が高すぎるなど)

とくに大事なのが2つ目の「部屋の状態が変化したら自動でアラートする」という部分です。部屋の温度や湿度を監視するだけなら、Google Apps Scriptとスプレッドシートだけでも実現できます。

しかし、グラフにして計測するだけとなると、都度、自分でグラフを見にいかなければなりません。快適な環境を維持して、プログラミングやブログ執筆に集中したいのに、それはとてもめんどうです。

そこでサーバー管理・監視ツールのMackerelを使うことにしました。Mackerelには、「サービスメトリックス」という機能があり、サーバーに紐付かないあらゆるメトリックを記録・可視化できます。

mackerel.io

サービスメトリックは利用するのも簡単で、メトリックの投稿はシンプルなHTTP+JSON APIで行えます。投稿してしまえばメトリックは自動的にでグラフ化されて、すぐにMackerelのWEBサービスから確認できます。

もともと、サーバー管理・監視のためのサービスなので、しきい値を設定してSlackやチャットワーク、LINEに通知することも簡単にできます。

また、Mackerelは最初の2週間は無料のトライアルプランで利用でき、その後も(機能は制限されるものの)Free プランに自動的に移行するので、コスト面でも安心です。

単純にMackerelはグラフを見ているだけで楽しいというのもあります。ほんとにMackerelは神サービスですね。

湿度や温度の取得は、Nature Remoで行っています。「温度・湿度」のセンサー部分は、ラズパイや他のセンサーデバイスに置き換えることも可能です。

Nature Remo APIからの湿度・気温データの取得とMarkerelへの投稿については、このためにサーバーを用意するのも大変なので、Google Apps Scriptで実装することにしました。ほんとGASは便利ですね。

システム概要をまとめるとざっくりこのような感じです。

f:id:tadaken3:20180926172948p:plain

必要なアカウントの取得など

今回、必要なのはNature RemoのアクセストークンとMackerelのアカウントです。

Nature Remoのアクセストークンを取得する

まずは以下のサイトにログインして、Nature Remoのトークンを取得します。取得したトークンはどこかにメモしておきます。

home.nature.global

Mackerel のアカウントを作成する

次に、Mackerel のサイトに行きアカウントを作成します。Mackerel ではGoogleやGithubのアカウントでサインアップすることもできます。

mackerel.io

Mackerel のAPIトークンを取得する

アカウントが作成できたら、xメトリックを投稿するためにMackerelのAPIキーを取得します。APIキーはダッシュボードの「APIキータブ」で確認できます。

f:id:tadaken3:20180926144505p:plain

Google Apps ScriptでNatureRemoからデータを取得してMackerelに投稿する

それでは、Google Apps Scriptで実装していきます。NatureRemo APIからデータの取得して、整形して、Mackerel投げるという流れです。Nature RemoとMackerel の認証情報は、スクリプトのプロパティに保存してください。

あとは、このスクリプトを時間トリガーで5分毎に実行するだけです。

function main() {

   var prop = PropertiesService.getScriptProperties();
   var natureRemoApiToken = prop.getProperty('NATURE_REMO_TOKEN');
   var mackerelApiKey = prop.getProperty('MACKEREL_API_KEY');
   var serviceName = 'room-condition';//Mackerelのサービス名を入力
   
   var data = getNatureRemoData(natureRemoApiToken)
   var payload = formatToPayload(data);
   postMackerelServiceMetric(mackerelApiKey, serviceName, payload);
}

//Nature Remo APIから部屋のデータを取得する
function getNatureRemoData(apiToken){
  url = 'https://api.nature.global/1/devices';
  var options = {"headers" : {"Authorization" : "Bearer "+ apiToken}};
  res = UrlFetchApp.fetch(url,options);
  return res
}

//Mackerel用にデータを整形する
function formatToPayload(data){
  var jsonData = JSON.parse(data);
  var te = jsonData[0]['newest_events']['te']['val'];
  var hu = jsonData[0]['newest_events']['hu']['val'];
  var epoch = Date.now() / 1000;
  
  var payload = [
    {
      'name' : 'room.temperature',
      'time' : epoch,
      'value' : Number(te)},
    {
      'name' : 'room.humidity',
      'time' : epoch,
      'value' : Number(hu)},
      
  ];
  return payload 
}

//Mackerelに送る
function postMackerelServiceMetric(apiKey, serviceName, payload) {
  return UrlFetchApp.fetch(
    'https://mackerel.io/api/v0/services/' + serviceName + '/tsdb',
    {
    'contentType' : 'application/json',
    'method' : 'post',
    'headers' : {
      'X-Api-Key' : apiKey
    },
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions' : true
    }
  );
}

まとめ

スクリプトを可動させるとMackerelに気温・湿度のデータが溜まっていきます。こんな感じで、グラフを見たり、しきい値を設定してアラートを飛ばすことができます。

f:id:tadaken3:20180926145042p:plainf:id:tadaken3:20180926145045p:plain
部屋の気温・湿度をグラフで確認したり、しきい値を設定してアラートを飛ばしたりできる

Mackerelをうまく使えば、50行ちょっとのコードで部屋のコンディションを管理できて素敵ですね。みなさんも、季節の変わり目で体調を崩さぬようお気をつけくださいな。

最後に少し宣伝です

本ブログでは、プログラミングやIT技術に関するブログ記事を公開しております。もしよければ、Twitterアカウントをフォローもしくは、ブログの読者登録していただけるとうれしいです!

ぜひ、よろしくお願いいたします。

参考サイト

Mackerel サーバ監視[実践]入門

Mackerel サーバ監視[実践]入門

  • 作者: 井上大輔,粕谷大輔,杉山広通,田中慎司,坪内佑樹,松木雅幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

【フォロワー分析】ツイートを拡散してくれるファンをPythonで見つける

f:id:tadaken3:20180920185152p:plain こんにちは!
タダケン(@tadaken3)です。

SNS運用を勉強しているさなか、フォロワー数2万人のソーシャルメディアマーケターjigen_1(@Kloutter)さんの記事を読みました。

marketeer.jp

SNSマーケティングを考える上でさけてはとおれない口コミの仕組みなどが具体的に書かれており、大変勉強になりました。

jigen_1(@Kloutter)さんの記事によると自分のツイートを拡散してくれそうなファンには3つのパターンがあるそうです。

f:id:tadaken3:20180920154756p:plain 口コミ拡散のためにはコンテンツが1番、では2番は何に?|jigen_1さんが語るツイートが拡散する仕組みとは - marketeer(マーケティア)

今回は、自分のフォロワーさんの中からツイートを拡散してくれそうなファンをPythonをつかってリストアップする方法を解説します。

ツイートを拡散してくれそうなアカウント3パターン

詳細はぜひ元の記事を読んでいただければと思いますが、なぜこの3パターンがツイートを拡散してくれやすいのかというところだけ少し解説しておきます。

パターン①の「フォロー数が少な人」の場合、フォロー数が少ない分、自分のツイートがその人のタイムラインに表示される確率が高いです。また、フォロワーのエンゲージメントが高いのでリツイートされやすい傾向にあります。

パターン②の「ツイート数が多い人」は、いわゆるツイ廃と呼ばれる人たちです。Twitterの滞在時間が長く、躊躇なくリツイートをしてくれる傾向にあります。

パターン③の「インタレストグラフでつながっている人」の場合です。趣味でつながっているアカウントでフォロワーが多く、同じ趣味なのでエンゲージメントが高いのが特徴です。

これらの3パターンの条件に当てはまるアカウントをPythonを使ってリストアップするのが本記事の目的です。

Twitterのデータを分析するための下準備

ではさっそく分析の準備をしていきましょう

Pythonの実行環境は、Google Colaboratory(以下、Google Colab)を使います。Google Colabはブラウザ上で、Pythonを利用することができるので、ちょっとした分析などをするときに非常に便利です。

詳しくは本ブログのGoogle Colabの解説記事をご覧ください。

tadaken3.hatenablog.jp

今回、Twitterのデータを取得するために、Twitter APIを利用します。Twitter APIを利用するためには、Twitter Developerアカウントが必要です。以下の記事を参考にDeveloperアカウントの申請をしてみてください。

masatoshihanai.com

Pythonでフォロワーの情報を取得する

データ分析に必要なライブラリを使えるようにする

さて、それではTwitter APIを使って、フォロワーさんのデータを取得していきましょう。

まず、PythonでTwitterのAPIを操作するためにtweepyというライブラリをインストールします。

#TwitterのAPIを簡単に取り扱えるtweepyをインストール
!pip install tweepy

続いて、tweepyの他に必要なライブラリをimportしていきます。

#必要なライブラリをインポート
import time
import tweepy
import pandas as pd
from tqdm import tqdm

Twitter APIを利用するための認証情報をtweepyにセットしていきます。

#TwitterAPIを使うための必要な情報を記載
#各種キーは、api.twitter.comから取得してください
CONSUMER_KEY = "your consumer key" 
CONSUMER_SECRET = "your consumer secret"
ACCESS_TOKEN = "your access token"
ACCESS_TOKEN_SECRET = "your acess token secret"

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth ,wait_on_rate_limit = True)

これでTwitter APIからデータを取得する準備が整いました。

自分のフォロワーのリストを取得する

まずは自分のフォロワー一覧のデータを取得したいと思います。search_idに自分のアカウントIDを入力して、情報を取得していきます。

#まずはフォロワー一覧を取得したいと思います。
#search_idにフォロワーの情報を取得したいユーザーを指定します。

search_id = "tadaken3"

#Twitter API経由でフォロワーのIDを取得します。
followers_ids = tweepy.Cursor(api.followers_ids,
                                id = search_id,
                                cursor = -1).items()

#取得したフォロワーの情報をリストに保存していきます。
followers_list = []
for follower_id in followers_ids:
    followers_list.append(follower_id)

取得したフォロワーのリストと自分のフォロワー数が一致するか確認します。

#念の為フォロワー数と一致するか確認
print ("your followers:" + str(len(followers_list)))

f:id:tadaken3:20180920161621p:plain

フォロワーさんのプロフィール文、フォロワー数などの情報を取得していく

では、取得した自分のフォロワーのリストから、各フォロワーさんの情報を取得していきます。取得できる情報は以下の記事を参考にしてみてくださいな。

syncer.jp

今回は、分析に必要な以下の情報を取得して、表にまとめていきます。

  • Twitter ID
  • プロフィール文
  • フォロワー数
  • フォロー数
  • ツイート数
  • アカウント作成日
  • 鍵付きアカウントかどうか
#取得したフォロワーのリスト情報をもとに、各フォロワーのプロフィール情報やフォロワー数などの情報を取得します。
df = pd.DataFrame()

for follower in tqdm(followers_list):
  user = api.get_user(follower)  
  user_id     = user.screen_name
  description = user.description     #プロフィール文
  followers   = user.followers_count #フォロワー数
  friends     = user.friends_count   #フォロー数
  tweets      = user.statuses_count  #ツイート数
  created_at  = user.created_at      #アカウント作成日
  protected   = user.protected       #鍵付きアカウントかどうか
  
  data = pd.Series([user_id, 
                    description, 
                    followers, 
                    friends, 
                    tweets, 
                    created_at, 
                    protected])
  df = df.append(data, ignore_index=True)
  time.sleep(.26) #15分間で900ユーザー分のみのデータしか取得できないので簡易的にスリープして対応

  
#わかりやすいようにデータフレームにヘッダーを追加します。
df.columns = ['user_id', 
              'description', 
              'followers', 
              'friends',
              'tweets',
              'created_at',
              'protected']

実行すると、このような形でプログレスバーが進んでいき、ユーザーの情報を取得していきます。フォロワー数が多い方は少し時間がかかるかもしれません。

f:id:tadaken3:20180920162016p:plain

データの取得がおわったら、データの中身を確認します。

#データの確認
df.head()

f:id:tadaken3:20180920162031p:plain

無事にデータが取得できましたね。

ここでいったん、csvファイルに取得したデータを保存しておきましょう。

#ファイルを保存する
from google.colab import files

df.to_csv("follower_list.csv")
files.download("follower_list.csv")

条件に合わせてデータを抽出する

ここからが本題です。取得したフォロワーの情報から「自分のツイートを拡散してくれやすい人」を抽出してきましょう。

ひとまず、おさらいです。以下の3パターンですね。

  • パターン①:フォロー数が少ないアカウント(3〜300人ぐらい)
  • パターン②:ツイート数が多いアカウント(10000ツイート以上)
  • パターン③:インタレストグラフ(趣味)でつながっているアカウント

パターン①:フォロー数が少ないアカウント

まず「フォロー数が少ないユーザー(≒自分のツイートがタイムラインに表示される確率が高いユーザー)」を抽出していきます。

特定の条件に一致するデータを抽出する場合、pandasのqueryメソッドを使います。 またsort_value関数でデータの並び替えをすることもできます。

#パターン①:フォロ−数が少ないアカウントを抽出する
#queryでフォロ−数が3〜300人で、鍵付きじゃないアカウントを抽出
#さらにsort_valuesでフレンド数で照準に並び替える
df.query('3<friends<=300 and protected==0').sort_values(by=['friends'])

f:id:tadaken3:20180920162902p:plain

パターン②:ツイート数が多いアカウント

次に、「ツイート数が多いユーザー(≒ツイッターが好きでとにかくリツイートしてくれる可能性が高いユーザー)」を抽出していきます。 先ほどと同じようにqueryメソッドを使います。

#パターン②:ツイート数が1万以上のアカウント
df.query('tweets>=10000 and protected==0').sort_values(by=['tweets'],ascending=False)

f:id:tadaken3:20180920162914p:plain

パターン③:インタレストグラフ(趣味)でつながっているアカウント

最後の「インタレストグラフ(趣味)でつながっているユーザー」を抽出してみます。

str.containsをつかってプロフィールに特定の文字列が含まれているユーザーを抽出してみます。 例えば、プロフィールに「Python」が含まれているフォロワーさんをリストアップしてみます。

#パターン③:インタレストグラフが近いユーザー。
#str.containsでdescriptionで'Python'を含むユーザーを抽出

df.query('description.str.contains("Python")')

f:id:tadaken3:20180920162932p:plain

応用編:パターン①とパターン②の両方の条件に当てはまる場合

もちろん、これらを組み合わせてフォロワーさんをリストアップすることもできます。 例えば、パターン①とパターン②を組みあせて抽出した場合はこのようになります。

#パターン①とパターン②の組み合わせ
df.query('friends<=300 and tweets>=10000 and protected==0')

f:id:tadaken3:20180920162948p:plain

おまけ: サンプルコードを含むGoogle Clolabノートブック

今回、作成したGoogle Colabのノートブックはこちらに保存しています。サンプルコードはすべてノートブックに保存してますので、ぜひお試しください。

まとめ

今回は、Twitterで自分のツイートを拡散してくれそうなファンをPythonを活用してリストアップしてみました。

Pythonを使うとツイッターの分析もはかどりますね。

最後にあらためて「ツイートを拡散してくれそうなアカウント3パターン」をまとめます。

Point!!
  • フォロー数が少ないアカウント
  • ツイート数が多いアカウント
  • インタレストグラフでつながっているアカウント

最後に少し宣伝です

本ブログでは、Pythonやデータ分析に関するブログ記事を公開しております。もしよければ、Twitterアカウントをフォローもしくは、ブログの読者登録していただけるとうれしいです!

ぜひ、よろしくお願いいたします。

「Vue.jsとFirebaseで作るミニWebサービス」は個人でWEBサービスを作ってみたい人にピッタリの本

f:id:tadaken3:20180913193239p:plain こんにちは!
タダケン(@tadaken3)です。

今回は「Vue.jsとFirebaseで作るミニWebサービス」という本をご紹介します。本書はWebサービスを作ってみたい人にまさにピッタリの本です。

著者は「ためしがき」開発者のnabettuさん

「ためしがき」というWebサービスを開発された@nabettuさんによって書かれたものです。

「ためしがき」は、商用利用可能な日本語のフリーフォントをお好きな言葉・文章で試すことができるWebサービスです。

商用可能なフリーフォントで一度にたくさん試すことができて、WEBサイト作成やデザイン作成時のフォント探しにとても便利なサイトです。

はてなブックマークを2000以上を集め、驚異的な注目を集めています。

百聞は一見にしかずなので、まだ触ったことがない方は、ぜひ「ためしがき」を触ってみてください。丁寧に作られたユーザーインターフェース、遊び心のあるアニメーションなど、とても勉強になります。

tameshigaki.jp

その@nabettuさんが、ミニWEBサービス(シングルページアプリケーション)の作り方を教えてくれるのが本書です。

本書を書かれた経緯については@nabettuさんのブログにまとめられています。

サービスを作って人に使ってもらうってめっちゃ楽しいからみんなやろうぜ ってのを伝えたいなってのがまず最初にありまして、

「でもWebサービス開発って結構ハードル高いんでしょう?」って人も一回小さいものを作ってみるとなんとなく流れがわかるので最小限のコンパクトな形にまとめました。

著書「Vue.jsとFirebaseで作るミニWebサービス」が発売されました!🎉本に込めた想いと経緯など - フロントエンドの地獄

これは読むしかありませんね。

本書では、

  • ユーザーインターフェイスを構築するためのJavasricptのフレームワークVue.js
  • Googleが提供するモバイルアプリやWebサービスを開発するためプラットフォームFirebase

を組み合わせてWebサービスを開発していきます。

ちなみになぜVue.jsなのか?なぜFirebaseなのか?ということも上記のブログに書かれています。

いきなりデブロイするところからはじまる

Webサービス開発については、いろいろな技術書がありますが、この本の中でとくに素敵だなと思ったのが、いきなり「サービスをデブロイする」ところからはじまることです。

デプロイとはサイトをサーバーなどに公開して、他の人が利用可能な状態にすることです。基本的なVue CLIの使い方とfirebaseの設定を方法を解説した後、WEBサービスをすぐにデプロイしてしまいます。

最初にデブロイするサイトは、Vue CLIのテンプレートから作られた簡単なものです。ですが、まずデプロイすることで、自分がWebサービス開発の一歩を踏み出したんだという気分になり、一気にテンションがあがります。

ボクは、動いているサイトを見て、テンションもあがり学習意欲もアップしました。

”完成”するまでデプロイはしないものと思っている方もいるのではないでしょうか。Webサービスには”完成”などという段階は存在しません。Webサービスにとってローンチは、数あるマイルストーンの一つにすぎないのです。

引用: 「Vue.jsとFirebaseで作るミニWebサービス」P.16

まずデプロイする理由としては、以下の2つがあげられています。

  • ローカル環境と本番環境が違うことで起きる問題を先に解決できる
  • 見える形にしておくことで、友人などに途中経過をみせてフィードバックをもらいやすくなり、モチベーションの維持につながる

とくに個人開発においては2つ目の理由が大きいと思います。機能を追加したり、デザインを変更した結果を、すぐさま他人に見せてフィードバックしてもらうことで、反応を見ながら、開発を進めることができます。

そのあとは、少しずつ機能を追加していき、そのたびにデプロイして進めていきます。

オリジナルのMarkdownエディタが作れるようになる

また、本書では、

  • Firebaseを利用したログイン認証の実装方法
  • データベースの作成とデータ保存・取得方法
  • Webサービスとして公開するために必要最低限のこと(見た目やセキュリティ対策など)

といったことも学べます。最終的には以下のようなマークダウンエディタを作成することができます。1

mymarkdown

Markdownエディタの作成を通して、Webサービスを開発する上で、基本となるユーザーの管理方法だったり、データの保存・取得方法などを学ぶことができます。加えて、セキュリティ対策などの面に触れている点もとても実用的です。

Webサービスを作りたい、個人開発者を目指しているという方はぜひ本書をお手にとってみてください。本書の内容を学ぶことで、Webサービスを開発する上で、必要な要素を一通り学ぶことができると思います。

改訂新版 Vue.jsとFirebaseで作るミニWebサービス (技術書典シリーズ(NextPublishing))

改訂新版 Vue.jsとFirebaseで作るミニWebサービス (技術書典シリーズ(NextPublishing))

最後に少し宣伝です

今、ボクが所属しているWebサービス開発者集団「入江開発室」のメンバーで「LIKE IT」というサービスを作っています。「LIKE IT」もVue.js + Firebaseで作成していて、「Vue.jsとFirebaseで作るミニWebサービス」を読んだことをきっかけに開発に取り掛かりました。

「LIKE IT」は、自分の好きな本をコメントを付けて、SNSで紹介するサービスで、10月中のリリースを目指しています。

f:id:tadaken3:20180913213332g:plain

「LIKE IT」についての情報は、ボクのTwitterや本ブログで公開していく予定です。

LIKE ITにご興味を持っていただけた方は、Twitterアカウントをフォローもしくは、ブログの読者登録していただけると開発の励みになります!

ぜひ、よろしくお願いいたします。


  1. デザインは超適当です。

人生初!OSSにPull Requestを送ってMergeされた話

f:id:tadaken3:20180920111337p:plain こんにちは!
タダケン(@tadaken3)です。

人生初、オープンソースソフトウェア(OSS)にプルリクエスト(Pull Request)を送りました。

LaradockというDockerでLaravel環境を作るためのOSSで、小さい修正なのですが、無事にマージされました!OSSにプルリクを送るのは、今年の目標の一つだったので、達成できてすなおにうれしいです。

実際のプルリクエストはこちらです。

github.com

本記事では、OSS開発に貢献するために、OSSにプルリクエストを送る方法をまとめました。

実際のコードとドキュメントの内容が異なっていた

事の発端は、あるプログラミング初心者さんからの質問でした。

f:id:tadaken3:20180909143903p:plain

ボクは入江開発室というWEBサービスの開発をしているオンラインサロンに所属しています。

初心者向けのプロジェクトとして、Laradockを使ってあるWEBサービスのクローンを作るプロジェクトがあります。

ボクはメンターの一人としてお手伝いをさせていただいています。

そのときは、Laradockを使ったLarvelの環境構築をお手伝いしていたのですが、その初心者さんの質問により、教材に使っているブログ記事env-exampleの記載が異なっていることがわかりました。

よくよく調べてみると、公式ドキュメントと実際のコードの記述が異なっていることがわかりました。ブログ記事はもちろん修正したのですが、もともとブログ記事は公式ドキュメントを参考に作ったので、これはほかにも混乱する人が出るなと思い、Laradockの公式ドキュメンを修正すべく、プルリクエストをあげようと決意しました。

OSSにプルリクエストするまでの手順

リポジトリのフォークする

まずはプルリクエストをあげたいプロジェクトをコピーして、自分のアカウントにリポジトリの複製を作成します。この作業を「フォーク」といいます。

基本的に他人のリポジトリに対して権限がないためファイルを追加したらり、変更する書き込むことはできません。一方、フォークしたリポジトリは自分の所有物なので、自由に変更ができます。

OSSにプルリクエストを上げる場合は、まずは対象のリポジトリをフォークします。

プロジェクトをフォークするには、githubの右上にある「Fork」ボタンを押します。

f:id:tadaken3:20180909123054p:plain

すると「自分のユーザー名/リポジトリ名」でリポジトリが作成されます。

今回、Laradockのリポジトリをボク(tadaken3)がフォークしたので、「tadaken3/laradock」というリポジトリが作られます。

f:id:tadaken3:20180909123102p:plain

プログラムの追加・修正

forkしたリポジトリは自分のものなので、自由にいじっても問題ありません。forkしたリポジトリを使って、コードを追加したり、ドキュメントを修正していきます。作業が終わったら、コミットしてプッシュします。

プルリクエストの作成

コミットしたらいよいよ、プルリクエストの作成です。フォークした自分のリポジトリにある「New pull requests」ボタンを押します。

f:id:tadaken3:20180909123507p:plain

すると、どのリポジトリのどのブランチに対して、プルリクエストをするか選択画面が表示されます。プルリクエストを取り込んでもらいたいブランチにを選択し、“Create pull request” ボタンを押します。

f:id:tadaken3:20180909123530p:plain

Pull Requestのメッセージを書く

プルリクエストについて、どこをどのように変更したかを説明する文章を書きます。基本的には英語です。Google先生などに頼りながら頑張って書きましょう。つたない英語もで誠意を持って書けばきっと伝わると思います!

無事、マージされてcontributorsの一員に!

あとはマージされるのを楽しみに待ちます。ボクの場合は3日ほどでマージされました。

f:id:tadaken3:20180909124634p:plain

ちょっとした修正ですが、これでLaradockを使い始める際の障壁を一つ取り除けたのかなと思っています。

まとめ

今回はOSSにプルリクエストを送る方法をまとめてみました。

  • リポジトリをフォークする
  • コードを追加・修正する
  • フォークしたリポジトリからもとのリポジトリにプルリクエストをあげる

です。

意外と自分にもできそうじゃありませんか?

Laradockにプルリクエストを送ったことで、こんな小さな修正でも「OSSコミュニティの世界に貢献した」という経験を手に入れることができました。

プルリクエストを出すのに必要なのは、ほんのちょっとした勇気です。あなたが困っていることはきっと他の誰かが困っていることです。ぜひ今日から、世界を良くするための一歩を踏み出してみてください。

この記事が、あなたのOSSデビューの助けになることを切に願っています。

Twitterのフォロー・読者登録をお願いします

タダケンのTwitterアカウントをフォローもしくは、ブログの読者登録していただけると更新の励みになります!ぜひ、よろしくお願いいたします。

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

『人生は、運よりも実力よりも「勘違いさせる力」で決まっている』はあなたの価値観を一変させる悪魔の本

f:id:tadaken3:20180811115931p:plain

こんにちは!
タダケン(@tadaken3)です。

このブログもおかげさまで、読者登録数が256人となりました。読者登録数が100人以上のブログは、はてなブログ全体の上位5%というデータもあります。

https://cdn-ak.f.st-hatena.com/images/fotolife/i/iruca21/20170412/20170412230635.gif 出典:はてなブログの読者数から考えるブロガーレベル - Iruca Log

ここまで更新を続けてこれたのもすべて読者のあなたのおかげです。これからも日々、ブログでの情報発信を頑張っていきたいと思いますのでよろしくお願いします。

さて、本題です。このブログは技術ブログなので、技術書以外の書評はあまり書かないようにしているのですが、あまりにも素晴らしい本を見つけたので紹介します。正直、この本には人生を変えうる力があります。

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

  • 作者:ふろむだ
  • 発売日: 2018/08/09
  • メディア: 単行本(ソフトカバー)

「分裂勘違い劇場」のふろむださんとは?

この本は「分裂勘違い劇場」という有名ブログを運営しているふろむださん(@fromdusktildawn)によって書かれた本です。

ふろむださんは、複数の企業を創業し、そのうちの一社を上場させています。「分裂勘違い劇場」のブログもはてなブックマークのホットエントリーの常連で、推定読者は数百万人にのぼります。

あなたもきっと一度ぐらいは記事を見たことがあると思います。そのふろむださんの初の書籍です。

また、初の書籍にも関わず、本書のアマゾンの書籍ランキングもすでに11位となっているもようです。 国民的アイドルの欅坂を超えるってすごくないですか?


はてなブログ界隈では知らない人のいないあの有名アルファブロガーのフミコフミオさん(@Delete_All)も絶賛しています。

delete-all.hatenablog.com

錯覚資産を獲得しろ!

さて前置きが長くなりましたが本題です。

この本に書かれていることを一言で要約すると「錯覚資産を獲得しろ」です。

「錯覚資産」とは著者の造語で「他者による自分への有利な勘違い」のことです。人間は気づかない(無意識)うちに、さまざまな錯覚(勘違い)をしています。その錯覚を利用して、自分を助けてくれる資産とすることが成功への筋道になると著者は語ります。

人間の心の動きからどのように錯覚がおきるのかを説明し、そこから「錯覚資産」という概念と、その効果について丁寧に解説されています。最終的には、錯覚資産を意識的に活用する方法まで記されています。

錯覚資産を獲得することで、仕事での成果を獲得しやすくなります。成果を出すことで、よりよい仕事環境を手に入れ、さらに錯覚資産を獲得するといった形で雪だるま式に錯覚資産を獲得できます。

錯覚資産をうまく利用することで人生にポジティブなフィードバックループを回すことができるようになると力強く説きます。

図解するとこんな感じです。


錯覚資産という概念は、それを知っているだけで、本当に人生に大きなアドバンテージを得ることができます。

あなたもぜひ本書を手にとってみて、「錯覚資産」を獲得してみませんか?

ちなみにこの書評も『人生は、運よりも実力よりも「勘違いさせる力」で決まっている』の文法、メソッドに則って書いています。もしこの書評のトリックを知りたい方は、ぜひ本を読んでみてください。マジでおすすめです。

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

人生は、運よりも実力よりも「勘違いさせる力」で決まっている

  • 作者:ふろむだ
  • 発売日: 2018/08/09
  • メディア: 単行本(ソフトカバー)

読者登録をお願いします

本ブログではデータ分析・サービス開発・初心者向けのプログラミング解説についての記事を公開しています。よろしければ読者登録もしくはタダケンのTwitterアカウントを(@tadaken3)をフォローしていただけると更新の励みになります。

tadaken3.hatenablog.jp

tadaken3.hatenablog.jp

scheduleライブラリを使ってPythonスクリプトを定期実行しよう

f:id:tadaken3:20180730005910p:plain こんにちは!
タダケン(@tadaken3)です。

定期実行といえば真っ先にcronが思い浮かびますが、scheduleはcronを代替するPythonライブラリです。cronにくらべ読みやすく、非常にシンプルです。

windowsでも動作しますし、cronが使えない環境なんかでちょっとした処理をPythonで実行できたりするので、便利です。

scheduleのコンセプト

ジョブのスケジュール実行は、標準モジュールを駆使して、実装することも可能です。ですが、scheduleを使うことでコードを非常にシンプルに保つことができます。

scheduleは「Python job scheduling for humans.」というコンセプトで作成されたライブラリです。直訳すると「人間のためのジョブスケジューラ」でしょうか。Rubyのclockworkにインスパイアされて作成されたようです。

けっこう便利のライブラリなのですが、Qiitaとかを見ていると、自前で実装しているケースがよく見られるので、scheduleの紹介記事を書いてみました。

scheduleを使ってみる

pipをつかってscheduleをインストール

$pip install schedule

scheduleライブラリの書き方は非常にシンプルです。以下のように処理時間を細かく指定して実行できます。

#coding:UTF-8
import schedule
import time

def job():
    #ここにメインの処理を書く
    print("時間ですよ~")

#10分毎にjobを実行
schedule.every(10).minutes.do(job)

#毎時間ごとにjobを実行
schedule.every().hour.do(job)

#AM10:30にjobを実行
schedule.every().day.at("10:30").do(job)

#月曜日にjobを実行
schedule.every().monday.do(job)

#水曜日の13:15にjobを実行
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

scheduleを使うと簡単にジョブスケジューラを実装することができます。windowns環境でcronが使えなかったりするときに、pythonで処理をスケジュール実行できるので便利です。

僕の場合、スクレイピングとか定期的に走らせたいときに重宝しています。

参考資料

最後に少しお願いです。

ここまで読んでいただきありがとうございます。

最後にあなたに少しお願いがあります。この記事が少しでも役に立った、気付きがあったという方は、ぜひこの記事をTwitterにシェアしていただきたいです。

はてなブックマークをしていただく形でも大丈夫です。コメント付きだと、もっと嬉しいです。

ぜひ、よろしくお願いいたします。

↓Twitterもやっています。 twitter.com

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Laravelの開発環境をLaradockを使って構築する方法

f:id:tadaken3:20180629232929p:plain こんにちは!
タダケン(@tadaken3)です。

今回は、PHPフレームワーク「Laravel」の開発環境の構築方法についてまとめました。本記事では、Dockerを用いたLaradockを使って開発環境を構築する方法をご紹介します。Laradockを使い、以下の構成の開発環境を作成していきましょう。

  • WEBサーバー:Nginx
  • DBサーバー:MySQL
  • DBクライアントツール:phpMyAdmin

LaradockはいくつかのDockerfileとcomposeの設定ファイルで構成されています。例えば、WEBサーバーをApacheに変更したり、DBサーバーをPostgreSQLに変更したりといったこともできます。

動作環境は「macOS High Sierra v10.13.4」です。

Laradockファイルの取得

まずMyProject(お好きな名前)を作成して、そこにLaradockを配置していきます。最終的には以下のような構成になります。

/MyProject
├── laradock
└── src ... (ここにLaravelが配置される)

まずはMyProjectディレクトリを作成し、Laradockを取得します。

$ mkdir MyProject
$ cd  MyProject
$ git clone https://github.com/LaraDock/laradock.git
$ cd laradock

では、laradockディレクトリに入って早速使ってみましょう。

Laradockの設定ファイルを編集する

最初にenv.sampleファイルをコピーして.envファイルを作成します。この.envファイルに環境構築時の設定情報を書き込んでいきます。

$ cp env-example .env

まずはDATAの保存する場所を変更します。標準の設定だとルートディレクトリの配下にファイルが永続化されていたようです。

今回は開発環境ということで、MyProject配下のlaradockディレクトリにファイルを保存するように変更します。

# .env
# Choose storage path on your machine. For all storage systems 

- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=.laradock/data

続いて、MySQLの設定を変更します。標準の設定だとMySQLのバージョンが「latest」となっています。2018年4月19日にリリースされたMySQL 8.0が最新版となります。

ただ、今回は開発環境ということで、最新版のバージョン8.0ではなく、バージョン5.7.22に固定したいと思います。(MySQL8.0はまだリリースされたばかりで一部対応していないツールなどもあるためです)

また、MySQLコンテナが立ち上がる際に作成されるデータベースやユーザー、パスワードなども変更しておきます。

# .env
### MYSQL #################################################
MYSQL_VERSION=5.7.22 # versionを固定
MYSQL_DATABASE=homestead #データベース名を変更
MYSQL_USER=homestead #ユーザー名を変更
MYSQL_PASSWORD=hogehoge #パスワードを変更
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

Docker コンテナを起動する

.envファイルの編集が終わったら、nginx、mySQL、 phpMyAdminのDockerコンテナを立ち上げていきます。(初回はDockerイメージを取得するため時間がかかるかもしれません)

$ docker-compose up -d nginx mysql phpmyadmin

問題なく起動したら http://localhost へアクセスします。

まだ Nginx の 404 ページが表示されていますが、ここに” Laravel “がインストールされることになります。

f:id:tadaken3:20180629230557p:plain

http://localhost:8080にアクセスするとphpMyAdminツールの画面が表示されます。さきほど、.envで設定したユーザー名でログインできるか確認しておきましょう。

f:id:tadaken3:20180629230520p:plain

Workspaceコンテナへの接続

laravelでの開発を行うためにはどうしてもcomposerやnodeなどのツール類が必要になってきますが、これら必要なツールを一式用意してくれるコンテナイメージがworkspaceです。

workspaceコンテナはLaradockでコンテナを立ち上げた際に同時に起動されています。

docker-compose psでコンテナが立ち上がっているか確認します。

$ docker-compose ps
           Name                          Command              State                    Ports                  
--------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp                                
laradock_mysql_1              docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp                  
laradock_nginx_1              nginx                           Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp                                
laradock_phpmyadmin_1         /run.sh supervisord -n          Up      0.0.0.0:8080->80/tcp, 9000/tcp          
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp

もし起動していなければ、直接起動します。

$ docker-compose up -d workspace

Laravelのインストール

では、いよいよLaravelのインストールをおこなっていきます。Laravelのインストールをするためworkspaceコンテナに接続します。

$ docker-compose exec --user=laradock workspace bash

workspaceコンテナでは composer をはじめ、開発に必要な多くのコマンドが利用できる状態になっています。workspaceコンテナ内でcomposerを使いLaravelのプロジェクトを作成します。

/var/www# composer create-project laravel/laravel src

ちなみにデフォルトでは、workspaceの/var/wwwはプロジェクトルートにマウントされています。そのため、MyProjectの下にappディレクトリが作成され、その下にlaravelのファイルが保存されていきます。

MySQLの接続設定

では、workspaceコンテナで作業を進めていきます。MySQLへ接続できるようにしておきます。laravelのプロジェクトの配下に.env.sampleファイルをコピーして.envファイルを作成します。Laradockの.envファイルとは異なるのでご注意ください。

# cd src
# cp .env.example .env

DBで始まる部分を編集し、MySQLの接続設定を書き込んでいきます。先程、作成したデータベース名、ユーザー名などを入力します。

#.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=hogehoge

Laravel には、認証用にデフォルトでテーブル定義が用意されていますので、それを作成してみます。

/var/www/src# php artisan migrate
/var/www/src# php artisan key:generate

データベースへの接続が問題なければ、マイグレーション情報を格納する migrations テーブルをはじめ、いくつかのテーブルが作成されているのが確認できると思います。

設定が終わったら一度、workspaceコンテナから抜けましょう。

最後にLaradockの.envファイルを編集して、アプリケーションのPATHを変更します。APP_CODE_PATH_HOSTの部分を変更するとworkspaceのマウント箇所、nginxの参照先が変わります。

############################
# General Setup
############################

### Application Path
# Point to your application code, will be available at `/var/www`.

APP_CODE_PATH_HOST=../src/

変更が終わったら、nginxコンテナを再起動します。

$ docker-compose up -d nginx

では、ふたたび、http://localhost へアクセスします。 するとLaravelのサイトが表示されます。

f:id:tadaken3:20180629230429p:plain

これでLaradockを使ったLaravelの環境構築は終わりです。Laravel便利ですね。

最後に少しお願いです。

ここまで読んでいただきありがとうございます。

最後にあなたに少しお願いがあります。この記事が少しでも役に立った、気付きがあったという方は、ぜひこの記事をTwitterにシェアしていただきたいです。

はてなブックマークをしていただく形でも大丈夫です。コメント付きだと、もっと嬉しいです。

ぜひ、よろしくお願いいたします。

JSONデータをjqコマンドを使ってシュッと加工する

f:id:tadaken3:20180523231854p:plain こんにちは!
タダケン(@tadaken3)です。

最近、Nintendo Laboのリモコンカーにハマっています。リモコンって大人になってもおもしろいですね。

プログラミングやデータを分析をしているとJSON形式のデータを扱うことが多いと思います。今回はJSON形式のデータをシュッと加工できるjqというツールをご紹介します。

jqとは

jqとはJSONデータからいい感じにデータを加工するコマンドラインツールです。APIをコールしたりすると、JSONで返ってくることがほとんどだと思います。そんなときちょいちょいと加工するときにとても便利です。1

Macにjqをインストールする

今回はMacにHomebrewを使ってインストールします。[^1]HomebrewとはMacOS用のパッケージ管理ツールです。ぼくは基本的に何かツールを入れる際はなるべくHomebrewを介してインストールするようにしています。

Homebrewをソフトウェアやライブラリを導入するのが楽になりますし、ソフトウェアのアップデートなどもおこないやすくなります。詳しくは以下の記事を見てみてください。Homebrewについての解説記事はいつか書きたいなと思います。

macOS 用パッケージマネージャー — Homebrew

さて、話が少し脱線してしまいましたが、jqをbrewを使ってインストールします。ターミナルで以下のコマンドを実行するとjqがインストールされます。

$ brew install jq

インストールが終わったら、jqが正しく動作するか確認します。

以下のコメンドを実行してコマンドのヘルプが表示されるか確認しましょう。

$ jq --help

このようにhelp画面が表示されたらオッケーです。

f:id:tadaken3:20180523215800p:plain

jqを使ってJSONを加工する

サンプルデータの作成

まず、サンプルデータを作成します。sample.jsonというファイルにJSON形式でデータを保存します。

ちなみにデータの中身はぼくが欲しいものです。プレゼントは誕生日の前後365日間受け付けております。

$ echo '{"items":[{"item_id":1,"name":"スタンディングデスク","price":30000},{"item_id":2,"name":"Oculus Go","price":25000}]}'  >> sample.json

実行すると、sample.jsonが作成されていると思います。

jqコマンドを使ってJSONデータをいい感じに表示する

では、さっそくjqコマンドを試していきましょう。

まず、jsonデータの中身を確認します。JSONはいかんせん、見にくいので、jqを使うといい感じに整形して表示してくれます。

サンプルのコマンドを見るとjqのあと「.」(ドット)がありますが、これは「ルート」を表しています。JSONはだいたい入れ子になっているかと思いますが、「.」(ドット)は起点から表示させるという意味になります。

$ jq . sample.json 
{
  "items": [
    {
      "item_id": 1,
      "name": "スタンディングデスク",
      "price": 30000
    },
    {
      "item_id": 2,
      "name": "Oculus Go",
      "price": 25000
    }
  ]
}

さきほどのjsonデータがいい感じに表示されていますね。

jqコマンドを使ってJSONデータからデータを抽出する

では続いて、jqのフィルタを使って、中身を取り出していきましょう。

JSONデータを見るとitemsのなかに配列でデータがはいっています。例えば、itemsの一つ目のデータを取得してい場合は.items[0]と指定します。

$ jq '.items[0]' sample.json
{
  "item_id": 1,
  "name": "スタンディングデスク",
  "price": 30000
}

「スタンディングデスク」の情報が取得できましたね。

では今度はitemsの中に入っているjsonからnameのデータだけ抜き出していきます。フィルタは'.items[].name'のように書きます。

$ jq '.items[].name' sample.json
"スタンディングデスク"
"Oculus Go"

見事に「スタンディングデスク」と「Oculus Go」が表示されました。

ちなみにダブルクォートを消したいときは、-rオプションを使います。ほかのコマンドにパイプで渡したいときに使います。

$ jq  -r '.items[].name' sample.json
スタンディングデスク
Oculus Go

いやすごい便利ですね。

長くなってきたので、今回は説明を省略しますが、jqにはほかにも強力な機能があって、オブジェクトを作ったり、CSV形式に変換したいといったこともできます。 例えば、以下のようにフィルタを設定してあげると、ヘッダーを付けて、カンマ区切りでデータを出力できます。

jq  '["name", "price"],  ( .items[] | [ .name, .price] ) | @csv ' sample.json
"name","price"
"スタンディングデスク",30000
"Oculus Go",25000

まとめ

今回、jsonを加工するための、jqコマンドをご紹介しました。まとめると

  • jqコマンドを使うとJSONをコマンドでいい感じに加工できる
  • 「.」(ドット)がルートを表す
  • フィルタを使って中身のデータを抽出していく

です。jqコマンドはとても強力なので、JSONを加工するときは非常に強い味方になってくれるはずです!

参考資料

読者登録をお願いします

本ブログではプログラミングについての記事を公開しています。よろしければ読者登録していただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

↓Twitterもやっています。 twitter.com

tadaken3.hatenablog.jp

新しいLinuxの教科書

新しいLinuxの教科書


  1. 今回はMacでのインストール方法を紹介していますが、LinuxやWindows版もあります。

テーブル作成権限がないときにSQLで擬似テーブルを作成する方法

f:id:tadaken3:20180508212442p:plain こんにちは!
タダケン(@tadaken3)です。

データ分析をしていて、「ちょっとしたテーブルを作りたいな〜。けど、テーブルを作成する権限ないわ〜。つらたん」ってときありませんか? ありますよね?

そんなときにWITH句を使ってちょっとしたテーブルを作成する方法をご紹介します。

標準SQLの場合

WITH mst_human_sex AS (
             SELECT 0 AS sex, '不明' AS sex_name
   UNION ALL SELECT 1 AS sex, '男性' AS sex_name
   UNION ALL SELECT 2 AS sex, '女性' AS sex_name
   UNION ALL SELECT 9 AS sex, '適用不能' AS sex_name )
SELECT *
FROM mst_human_sex;

SELECTとUNION ALLを組み合わせてテーブルを作ります。結果はこのようになります。 標準SQLに準拠しているため、多くのデータベースで動くと思います。

sex sex_name
0 不明
1 男性
2 女性
9 適用不能

UNION ALLが比較的重たい処理なので、レコード数が多くなってくるとパフォーマンスに影響が出てくるかもです。

PostgreSQLの場合

PostgreSQLでは同様のことをVALUES句を使って実現できます。可読性も上がりますし、パフォーマンスも優れているため、出来る限りVALUSE句を使って疑似テーブルを作成したほうがよいでしょう。1

WITH mst_human_sex (sex, sex_name) AS (
   VALUES
    (0 , '不明') 
 ,  (1 , '男性')
 ,  (2 , '女性')
 ,  (3 , '適用不能')
)
SELECT *
FROM mst_human_sex;

ちなみに、PostgreSQLの場合、VALUES句はSELECT句と等価なため、SELECTが使えるところなら、どこでも使えます。例えば、

VALUES (1, 'one'), (2, 'two'), (3, 'three') 
ORDER BY 1 desc;

とすると

COLUMN1 COLUMN2
3 three
2 two
1 one

のようにORDER BYも適応されてカラム1の降順で返ってきます。

連番を用いてテーブルを作成する

連番を生成したいときは、generate_series関数が使えます。

WITH series AS
-- 1から5までの連番を作成する
  (SELECT generate_series(1, 5) AS idx)
SELECT *
FROM series;
idx
1
2
3
4
5

まとめ

今回、テーブル作成権限がない場合にちょっとした疑似テーブルを作成する方法をお伝えしました。疑似テーブルはあくまで一時的なものなので、継続的な利用が見込まれたり、他のSQLで使用するシーンがでてきたら、きちんとテーブルとして準備するようにしましょう!

読者登録をお願いします

本ブログではプログラミングについての記事を公開しています。よろしければ読者登録していただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。


  1. PostgreSQLと書いていますが、SQL-99に準拠しているものはVALUESが使えます。

新しい技術に出会える熱いイベント! 「技術書典4」の参加レポート

f:id:tadaken3:20180422221923p:plain こんにちは!
タダケン(@tadaken3)です。

今日は、秋葉原UDXで開催された技術書典4というイベントに参加してきました。参加レポートをまとめてみました。

技術書典とは

技術書典とは、「技術書」をテーマとする同人イベントです。誰でもお世話になったであろう「技術書」がたくさん集まっているイベントです。それだけでワクワクしますね。技術書典のWebサイトに、イベントの主旨が説明されていますので引用します。

新しい技術に出会えるお祭りです。 技術書典は、いろんな技術の普及を手伝いたいとの想いではじまりました。 技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める、技術に関わる人のための場として『技術書典』を開>催します。

過去に3回開催されており、今回は4回目の開催だったようです。ちなみに僕は初参加です。東京はこういうニッチだけど濃いイベントがたくさん開催されているのがいいですよね。前回の技術書典3では、サークル数は合計193サークル(個人170・企業23)、来場者数は3100人だったそうです。すごいですね。

技術書展の当日の様子

入場まで

11時開場とのことだったので、1時間前の10時に秋葉原駅に到着しました。今日はめっちゃ天気が良くて良かったです。さっそく会場のUDXに向かうとすごい人でした。

f:id:tadaken3:20180422102028j:plain
整理券配布の並び列

技術書展では整理券による入場制度が採用されていました。

①まず、整理券をもらうために並ぶ ②整理券に記載されている番号で順番に入場できる

といった感じです。入場できる番号は技術書典のサイトで確認できます。今回は1時間前にいって、整理券をもらうのに10分程度並びました。整理券番号は393番でした。

整理券をもらったあとはプロントで朝食を食べながら、開場まで待機していました。開場11時時点では整理券番号500まで入場できたので、開場後すぐに入場することができました。確実に欲しい本がある場合は、一時間前ぐらいには会場にいっておくことをおすすめします。

f:id:tadaken3:20180422202035j:plainf:id:tadaken3:20180422202707p:plain
入場できる整理券番号はサイト上で確認できる。

並んでいる間、運営さんの「技術季報」を1000円で買うこともできるので、サークルマップや寄稿記事を読みながら入場まで待ちます。ちなみにサークルマップ、サークルリストは公式サイトからも確認できます。また、「技術季報」は入場してから買うこともできます。

f:id:tadaken3:20180422204953j:plainf:id:tadaken3:20180422205004j:plain
技術季報

会場にはこんなポスターが貼られてました。自分で写真を撮るの忘れたでのTwitterから引用させていただきます。

サークル会場の様子

開場時間の11時をすぎると、前の列から運営さんに案内され順々に入場してきます。

まず、会場に入るとすごい熱気でした!

「技術季報」にのっていたサークルリストを数えると、今回の技術書典4は、なんと246ものサークルが参加されていたようです。前回が193なので、50以上も参加サークルが増えているのですね。年々規模が大き聞くなっているようですね。

ちなみに、会場に入るとまずトートバックがもらえます。この中に手に入れた戦利品を入れていくことになります。ただあくまで簡易用のトートバックなので、大きめのリュックなどを持参するほうが良いと思います。両手が空いていると見本誌なども読みやすいので。

f:id:tadaken3:20180422210518j:plain
入場時にもらえるトートバック

販売されている技術書は、ソフトウェア(プログラミングやデザイン、プロジェクト運営など)に関するものから、ハードウェア(ラズパイや電子工作など)まで、さまざまな分野のものがあります。

ブロックチェーンに関する書籍やチャットボット、スマートスピーカーのスキル開発に関する本など、今流行りの技術に関する書籍なども見られました。1冊だいたい500円から1500円ぐらいです。感覚的には1冊1000円のものが一番多かった気がします。だいたいどのサークルも見本誌を用意してくれているので、手にとって内容を確認することができます。

本を選ぶのに夢中で会場の写真を取っていなかったので、またまたTwitterから引用させていただきます。

200を超えるサークルが参加していることもあり、前日までに、ざっとサークルリストに目を通しておくと効率的にサークルを回れます。技術書典公式サイトでは、アカウント登録すると、サークルリストチェックリストが使えるので、そちらを活用するのもいいと思います。

サークルを回っているうちに、今まで知らなかった技術やおもしろそうな技術の本が見つかったりしてついつい財布のひもが緩みがちなので、1000円札を大量に用意しておくことに越したことはないです。

ぼくはPython周りの本を中心にこんな戦利品を手に入れました!プログラミング以外では「Paper Robotics」という紙で作るロボットがあって思わず衝動買いしてしまいました。

まとめ

技術書典はいろいろな技術書が集まる祭典でした。見たことない技術なんかにも本当にワクワクするイベントでした。個人的に技術書典をより楽しむには、

  • 確実に手に入れたい本がある場合開場の1時間前にいくとよいかも。ただ整理券配布方式なので、時間は有効に使える
  • できれば大きめなリュックを持っていく。大量の1000円札は忘れずに
  • 前日までにサークルリストをざっとながめておくとよい。公式がサークルチェックリストも用意してくれているので有効に活用を!

などをやっておくといいかなと!

次回はサークル側で参加したいなと思います。

読者登録をお願いします

本ブログではプログラミングについての記事を公開しています。よろしければ読者登録していただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

サンプルデータ投入済みのPostgreSQL環境をDockerを使って作成する

f:id:tadaken3:20180402204001p:plain こんにちは!
タダケン(@tadaken3)です。

SQLの練習やSQLのサンプルコードを書くときに、手軽なサンプルデータがはいったデータベースが欲しくなることってありますよね?ボクの場合、ブログでSQLの記事を書く時に、SQLのコードを試す環境があればいいのになと思う時があります。

ということで、Dockerを使ってPostgreSQLチュートリアルのサンプルデータを投入したDockerイメージを作成しました。Dockerイメージの作成手順をまとめています。1

作成したDockerイメージはDocker Hubにアップロードしていますので、データ投入済みのDockerイメージを利用したい場合は、記事の最後にあるを「データ投入済みのDockerイメージを取得する」の部分をご覧ください。

ベースとなるPostgreSQLのコンテナを作成する

まずはベースとなるpostgreSQLのコンテナを作成します。

docker runコマンドで postgreSQLのイメージからコンテナが作成しましょう。ローカルにイメージファイルがない場合は、最新版がダウンロードされます。今回はsampledbという名前でコンテナを作ります。

$ docker run --name sampledb -d  postgres

コンテナができたら、中身を確認しましょう。コンテナの中を確認するには、docker execコマンドを使います。

$ docker exec -it  sampledb /bin/bash

コンテナの中に入ったら、psqlコマンドでpostgreSQLの中身を見ていきましょう。

psqlはpostgreSQLを操作するためのコマンドです。Uオプションでユーザー名を選んで、データベースに接続します。ユーザー名をpostgresにして、データベースに接続します。

$ psql -U postgres

すると、このような感じで、psqlコマンドでデータベースと対話的に問い合わせを行えます。

f:id:tadaken3:20180402202037p:plain

psqlコマンドの使い方は以下のサイトを参考にしてみてください。

dev.classmethod.jp

Postgreチュートリアルからサンプルデータをダウンロードする

ここからは、一旦コンテナから抜けて、ホスト上で作業をします。

サンプルのデータを用意して、それをコンテナ内に設置していきましょう。サンプルデータはPostgreSQLのチュートリアルサイトからダウンロードしてきます。チュートリアルサイトにはDVDレンタルショップのデータが用意されています。サイトからzipファイルでダウンロードしましょう。

www.postgresqltutorial.com

zipファイルをダウンロードしたら、ファイル解凍します。

$ unzip dvdrental.zip

中にはdvdrental.tarというファイルが入っていいます。このファイルをリストアして、データを再現します。dvdrental.tarの中には、DVDレンタルショップにまつわる15個のテーブルが格納されています。データのテーブル間の関係を表すER図はこちらです。

f:id:tadaken3:20180331075035p:plain
DVD RENTAL SHOPのER図

ホストとコンテナ間でファイルをやり取りするにはdocker cpコマンドを使います。今回はホストからコンテナにdvdrental.tarファイルをコピーします。

# コンテナ名:ディレクトリを指定することでホストのファイルをコピーする
$ docker cp dvdrental.tar sampldb:/tmp/dvdrental.tar

これで、dvdrental.tarファイルがホストからsampledbコンテナ内の /tmpディレクトリにコピーされます。

データベースの初期化設定をする

データベースの初期化時の設定する内容は/docker-entrypoint-initdb.dにシェルスクリプトかSQLで保存します。/docker-entrypoint-initdb.d.sqlファイルや.shファイルを置いて置くことで、初回起動時に実行してくれます。

今回はcreate_db.shというファイルを用意しました。中身は以下のとおりです。

#!/bin/sh

# psqlコマンドでdvdrentalというデータベースを作成する
psql -U postgres -c "create database dvdrental"

# dvdrental.tarからリストアをする
echo "import dvd rental data..."
pg_restore -U postgres -d dvdrental /tmp/dvdrental.tar

先程、/tmpディレクトリにdvdrental.tarをコピーしたの同様に、create_db.shをコンテナにコピーします。

# create_db.shを/docker-entrypoint-initdb.dにコピーする
$ docker cp create_db.sh sampldb:/docker-entrypoint-initdb/create_db.sh

作成したコンテナからデータ投入済みのイメージを作成する

コンテナからDockerイメージを作成するには、docker commitコマンドを使用します。sampledbというコンテナをもとに、tadaken3/postgres-dvdrental-databaseというイメージを作成します。

$ docker commit sampledb tadaken3/postgres-dvdrental-database

では、作成したイメージ(tadaken3/postgres-dvdrental-database)を元にdvdrental-dbというコンテナをあらためて作ります。

$ docker run -d --name dvdrental-db tadaken3/postgres-dvdrental-database

先程、ご紹介したdocker execコマンドとpsqlコマンドを組み合わせて、きちんとデータベースが作られているか見ていきます。

$ docker exec -it dvdrental-db psql -U postgres -d dvdrental -c "\dt"

するとテーブル一覧が表示され、正しくサンプルデータが取り込まれていることが確認できました。

f:id:tadaken3:20180402202720p:plain

データ投入済みのDockerイメージを取得する

今回作成したDockerイメージはDocker Hubにアップしています。docker pullコマンドでイメージを取得することができますので、もしPostgreSQLのサンプルデータが必要な場合はぜひ活用してみてください。

$ docker pull tadaken3/postgres-dvdrental-database

Dockerfileと必要なファイルをまとめたものはこちらです。

github.com

まとめ

今回はDockerを使って、サンプルデータが投入された状態のPostgreSQL環境の作り方を紹介しました。

  • PostgreSQLのサンプルデータは、公式のチュートリアルからダウンロードできる
  • Dockerを使って、データベースの初期化設定をする場合は /docker-entrypoint-initdb.d を使う

こういった環境を用意しておくとSQLのコードを試すときに便利ですね。

読者登録をお願いします

本ブログではプログラミングについての記事を公開しています。よろしければ読者登録していただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

参考資料

dev.classmethod.jp

kakakakakku.hatenablog.com


  1. 本記事では、Dockerの詳しい説明やインストール方法はこちらをご覧になってみてください。https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html

【Python】誰でも簡単に予測モデルが作れるProphetでTOPIXの予測モデルを作ってみた

f:id:tadaken3:20180324123817p:plain こんにちは!
タダケン(@tadaken3)です。

今回は時系列予測ツールProphetを使って、過去のデータから未来を予言する予測モデルの作成を試してみました。 ビジネスでは日々発生する時系列データ(DAU、売上など)に対する予測を作成する必要があります。

Prophetを使うことで、とても簡単に予測モデルを作ることができます。Prophetはオープンソースで開発されておりPythonとRのライブラリが公開されています。今回はTOPIXのデータを使用して、Python版のProphetの使い方を解説します。

Prophetを使ってあなたも予言者に

PorphetとはFacebookが作成した時系列データの予測ツール です。Prophetには、「Forcasting at Scale.」というコピーが掲げられており、このような特徴があります。

  • 分析のエキスパートでなくても、簡単に時系列データの予測ができる
  • 予測モデルの結果も視覚的に把握できる
  • ドメイン知識をもとにモデル調整も直感的にできる

データを用意するだけで精度の高い予測モデルを簡単に作ることができます。また作ったモデルを視覚的に把握することができるので、モデルのチューニングも行いやすいのがメリットです。

ちなみにProphetは予言者という意味になります。

TOPIXのデータを準備する

TOPIXのcsvファイルを取得する

実際のビジネスの現場ではDAUなどKPIの予測に使うことが多いと思いますが、今回はTOPIXのデータを使用して予測モデルを作っていきます。

TOPIXのデータはWall Street Journalのサイトからダウンロードできます。今回は2000年1月1日から2018年3月23日のデータを使用しました。

Quote Not Found - Wall Street Journal

期間を指定して「DOWNLOAD A SPREADSHEET」を押します。

f:id:tadaken3:20180324111619p:plain
Wall Street Journalのサイトからデータをダウンロードする

PandasでProphetに取り込むための前処理を行う

今回はGoogle Colaboratory(以下、Colab)を用いて分析をしていきます。

まずは先程、ダウンロードしたCSVファイルをColabに取り込みます。

#CSVファイルの読み込み
from google.colab import files
uploaded = files.upload()

Colabでローカルファイルを取り扱う方法については、こちらの記事を参考にしてください。

tadaken3.hatenablog.jp

続いて、読み込んだデータをデータフレームで扱えるようにします。

# 読み込んだデータをpandasのdataframe扱えるようにする
import io
import pandas as pd
import numpy as np

df = pd.read_csv(io.StringIO(uploaded['HistoricalPrices.csv'].decode('utf-8')))

# 中身を確認する
df.head()

f:id:tadaken3:20180324111914p:plain
データの確認をする

データフレームをProphetにインプットする形に前処理をします。 ここで一つ注意があります。入力に使用するカラム名とデータの中身を以下の形式にする必要があります。

カラム名 備考
ds datetime 時系列情報(タイムスタンプ)
y 数値 実績値

また数字の変動が大きい場合は対数変換(log)をしておくと精度が上がります。 今回は、TOPIXの終値を使って、モデルを作成します。

カラム名やデータの形式をこのように変換します。 データはグラフで確認もしておきましょう。

# prophetでモデルを作成する際は、datetimeをdsカラムに、yに値を入れる。
# inputは必ずこの形式に。
%matplotlib inline
import matplotlib.pyplot as plt

df['ds'] = pd.to_datetime(df['Date']).dt.date #date型に変換
df['y']  = np.log(df[' Close']) #データの変化が大きいため、対数変換をする。
df['y'].plot()

f:id:tadaken3:20180324025829p:plain
TOPIXのデータ

これで準備が整いました。

データをもとに予測モデルを作成する

prophetのインストールとモデルの作成

まずはpipでprophetをインストールします。

!pip install fbprophet

インストールが終わったら、さっそく予測モデルを作成していきましょう。

Prophetではいろいろなパラメータをつかって予測モデルをチューニングすることができるのですが、今回はデフォルト設定で作成します。

from fbprophet import Prophet

#デフォルト設定でモデルを作成する
model = Prophet()
model.fit(df)

これで予測モデルができました。簡単ですね。

モデルをもとに未来予測をしてみる

では、作成したモデルを使って、未来予測をしてみましょう。 予言者の本領発揮です。

#モデルをもとに予測をする
# periodに期間を入れる。この場合365日分の予測値が出力される
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

結果はデータフレームでこのような形で返ってきます。

f:id:tadaken3:20180324113056p:plain
予測モデルの結果

yhatが予測値になります。対数変換しているので、e(約2.6)をyhatの値で乗算するともとに戻せます。 この場合、2019年3月23日の予測値は約7.48なので、実際にTOPIXの値としては、1786.46になります。

数値で見てもいいのですが、Prophetにはビジュアライズの機能もあります。

#予測モデルをグラフで表示
model.plot(forecast);

f:id:tadaken3:20180324025852p:plain
Prophetの予測モデル

黒い点が実際の値、青い濃い線が予測モデルになります。2013年以降上昇トレンドがつついており、2019年も上昇するトレンドが続きそうですね。

予測モデルの構成要素

トレンドや周期性についての分析結果は、model.plot_components()にて見ることができます。

#トレンドや周期性を表示する
model.plot_components(forecast)

f:id:tadaken3:20180324030010p:plain
構成要素のグラフ
上から、トレンド性、年周期性、週周期性のグラフです。 それぞれのグラフから以下のようなことが読み取れます。

  • [トレンド性] 2012年の年末から上昇トレンド。2013年のはじめからにトレンドが緩やかになっている
  • [年周期] 2月から5月にかけては上昇する周期性がある
  • [週周期] 土日が下がっているように見えるが、これは相場閉まっているため。

直感的でわかりやすいですね。

予測モデルの精度を検証する

検証用データの生成

では続いて、この予測モデルがどれくらいの精度があるのか検証していきます。

精度検証をするには、prophetのdiagnosticsクラスを使います。 diagnosticsは日本語で「診断」という意味になります。

#diagnosticsは日本語で診断
from fbprophet import diagnostics

#精度検証をする。horizonに検証したい期間を入力する
cv = diagnostics.cross_validation(model, horizon='365 days')
cv.tail()

f:id:tadaken3:20180324113757p:plain

詳しい説明は省きますが、cross_validationメソッドを使うと、交差検証法という手法で、訓練データとテストデータに分けて、何度か予測値の算出を行ってくれます。cvの中身をを簡単に説明します。yが実績値、yhatが予測値になります。この2つの差がどれくらいあるのかを計算してモデルの精度を検証します。

MAPE(平均絶対誤差率)を使って予測モデルの精度をはかる

今回はMAPE(平均絶対誤差率)という指標を使います。実績値に対して予測値にどれくらい誤差率があるのかという指標になります。

cvのデータをもとに以下のように計算できます。

def cal_mape(df):
    return((df['yhat'] - df['y']).div(df['y']).abs().sum()*(1/len(df)))
 
cal_mape(cv)

f:id:tadaken3:20180324115349p:plain
MAPEの計算。画像では他の指標も算出はしています。

今回モデルで365日の予測を行った場合のMAPEの値は2.8%でした。MAPEは小さいほど精度が高いということになります。

上記に加えて、100日、150日、200日、250日ごとにMAPEの値を計算するとこのようになります。

f:id:tadaken3:20180324115117p:plain

150日を超えたあたりから予測の精度が低下していますね。 実際はここからモデルを調整して予測の精度を上げていくことになります。

まとめ

Prophetの基本的な使い方を解説しました。 Prophetは簡単に時系列分析ができ、非常に強力なツールですので、ぜひみなさんも試してみてはいかがでしょうか。

今回、実施祭に使用したColabのノートブックはこちらになります。 実際に試してみたい方はぜひ参考にしてみてください。

drive.google.com

参考資料

facebook.github.io

d.hatena.ne.jp

data.gunosy.io

funyakofunyao.click

読者登録をお願いします

本ブログではプログラミングについての記事を公開しています。よろしければ読者登録していただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

↓Twitterもやっています。 twitter.com

免責事項:当ブログのご利用につきましては、全ては自己責任、自己判断でお願いいたします。何らかのトラブルや損失・損害等発生した場合、当ブログでは一切の責任を負いかねます。投資は自己責任で。

tadaken3.hatenablog.jp

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方