タダケンのEnjoy Tech

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

Macで画面を録画してGIFに変換する方法

f:id:tadaken3:20171013002002p:plain

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

ブログやTwitterなどでアプリの操作方法を伝えたい場合に、動画で表現できるとわかりやすいですよね。

とくに自分の作ったアプリ、ツールをGithubに公開するときにGIF動画で、アプリのデモがあるとわかりやすさ倍増です。

今回は、Macで画面を録画する方法と録画したファイルからGIF動画を作る方法をご紹介します。

f:id:tadaken3:20171012235025g:plain

QuickTime Playerで画面を録画する

画面を録画するにはMacの標準ソフトであるQuickTimePlayerを使います。QuickTimePlayerがない場合はこちらからダウンロードしてください。

QuickTimePlayerはLaunchpadから「その他」で見つかると思います。

f:id:tadaken3:20171012233609j:plain

画面を収録するには、QuickTimePlayerを起動し、ファイル>新規収録画面をクリックします。 f:id:tadaken3:20171012233659p:plain

すると「画面収録」という画面が立ち上がります。赤い丸をクリックします。

f:id:tadaken3:20171012233734p:plain

下記の画面がでできます。マウスをドラッグして録画する範囲を指定できます。すると画面撮影が始まります。

f:id:tadaken3:20171012233811p:plain

撮影を終了したい場合は、メニューバーにある停止ボダンをクリックするか、Command + Control + esc キーを同時に押すと撮影終了です。

これで.mov形式のファイルができました。

f:id:tadaken3:20171013004331p:plain

FFmpegを使ってmovファイルをgifに変換する

FFmpegは動画や音声を記録・変換・再生するためのソフトです。コマンドラインから使用することができるので、大量の動画などを処理するときや処理を自動化したいときに便利です。

いくつかGUIのGIF変換アプリを試してみたのですが、細かいオプションも指定できるので、FFmpegのほうが個人的には楽でした。

FFmpegをインストールする

FFmpegはHomebrewを使ってインストールします。

$brew install ffmpeg

インストールできたら、無事に動くか確認しましょう。「ffmpeg -version」でバージョンを確認します。

$ffmpeg -version
ffmpeg version 3.3.4 Copyright (c) 2000-2017 the FFmpeg developers

という感じで表示されれば成功です。

ffmpegコマンドでmovからgifに変換する

では、早速GIF画像に変換します。オプションはたくさんあるのですが、よく使うのは以下ものです。

  • -i:元となるmovファイルを指定
  • -r:フレームレート
  • -ss:開始時間
  • -t:開始時間からの経過時間

フレームレートは高いほどGIF画像がなめらかになりますが、ファイルサイズも大きくなります。

例えば、mov形式のファイルをフレームレート10でGIFに変換する場合は下記のコマンドを実行します。

$ffmpeg -i input.mov -r 10 output.gif

再生時間を指定して変換する場合はこのようになります。動画の最初から10秒間の部分だけGIFに変換されます。

 $ffmpeg -i input.mov -r 10 -ss 00:00:00.000 -t 00:00:10.000 output.gif

その他のオプションは

$ffmpeg -h

で確認できます。

まとめ

今回は

  • QuickTime Playerで画面を撮影する方法
  • ffmpegを使ってコマンドラインからGIFに変換する方法

をお伝えしました。

画面操作を撮影して、GIF動画に変換するケースは結構あると思いますので、知っておくと便利なテクニックです。とくにMacのアプリを人に紹介する場合など重宝します。

追記:2018/08/17

パレットを指定して作成すると、きれいなgifがつくれます。

$ffmpeg -i input.mov -vf palettegen -y palette.png
$ffmpeg -i input.mov -i palette.png -lavfi paletteuse -y -r 24 output.gif

詳しくは以下の記事も参考にしてみてください

craftzdog.hateblo.jp

読者登録、Twiiterアカウントのフォローをお願いします!

本ブログではプログラミングや仕事効率化に関する情報を公開しています。よろしければ、ブログの読者登録もしくはTwitterアカウントをフォローしていただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

Googleスプレッドシートで作成したグラフをブログやSNSで公開する

f:id:tadaken3:20171007140128p:plain

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

Googleスプレッドシートの便利な機能をご紹介します。

スプレッドシートで作成したグラフは画像やインタラクティブなグラフとして公開することができます。スプレッドシートのデータが更新されると、公開したグラフもきちんと自動で更新されます。

今回はサンプルとして、ドル円の為替レートのグラフを作成して、ブログで公開する方法をお伝えします。

スプレッドシートの関数で為替レートの取得する

スプレッドシート為替レートを取得するにはGoogleFinace関数を使います。GoogleFinace関数を使うと株式市場のデータを簡単に取得できます。1

書き方 GOOGLEFINANCE("証券のティッカーシンボル","属性",開始日,終了日)


今回のサンプルでは、ドル円の為替レートを取得するため、ティッカーシンボルを「currency:usdjpy」、属性を「price」にします。日付はTODAY関数を使って直近30日分を取得しています。2

直近30日のドル円を取得 =GOOGLEFINANCE("currency:usdjpy","price",TODAY()-30,TODAY())


A1セルに上記の関数を入力するとこのように為替レートが取得できます。

f:id:tadaken3:20171007134010p:plain

GoogleFinace関数で取得した為替レートは毎日更新されます。為替レートのデータを使って折れ線グラフを作成します。

f:id:tadaken3:20171007134107p:plain

グラフを画像を公開する

作成したグラフを公開するにはグラフ右上の「メニュー」からプルダウンで「グラフを公開」を選択します。

f:id:tadaken3:20171007134326j:plain

グラフを公開する方法を選ぶとURLが発行されます。そのままブログやTwitterなどで公開しましょう。

f:id:tadaken3:20171007134423p:plain

画像リンク以外にも「インタラクティブなグラフ」iframeによるグラフの埋め込みも選ぶことができます。ただ、ブログやSNSで公開するのであれば、スマホタブレットから閲覧されることもあるので、画像リンクにすることをオススメします。

「画像リンク」にした場合も、スプレッドシートのデータが更新されると、グラフの画像も最新のものが参照されます。

今回作成したグラフをブログに貼り付けるとこんな感じです。こちらのグラフは常に直近30日の為替レートのグラフが表示されます。

https://docs.google.com/spreadsheets/d/e/2PACX-1vTmsE8ge5LiVeWR6oX7V-DSuGgKeitoCy90j1U9uTR9umulosZ5C87FtNpjV06-RrVdG_XaJRlATLpO/pubchart?oid=1901886125&format=image

グラフを「ウェブに公開」した場合も、スプレッドシート自体は公開されません。あくまで、グラフのみ公開されます。

まとめ

今回はスプレッドシートで作成したグラフをブログ・SNSで公開する方法をお伝えしました。

今回のサンプルではGoogleFinace関数を使って為替レートを取得していますが、ImportHTML、ImportXML関数を使えば、証券・為替以外のデータも使ってグラフを作成することができます。

tonari-it.com

これらのテクニックと合わせてみると、様々なデータのグラフを作ってウェブで公開できます。

読者登録、Twiiterアカウントのフォローをお願いします!

本ブログではプログラミングやデータ分析に関する情報を公開しています。よろしければ、本ブログの読者登録もしくはTwitterアカウントをフォローしていただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。


  1. 対応しているのが市場が主に米国のニューヨーク証券市場、NASDAQなので、残念ながら日本市場に上場している企業の株価は2017/10/07時点では取得できません。

  2. 詳細はこちらをご覧ください。GOOGLEFINANCE - ドキュメント エディタ ヘルプ

「はじめてのハッカソン」に参加して感じたハッカソンの魅力とは

f:id:tadaken3:20170925212148p:plain

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

9月23日にハッカソン初心者向けのイベント「はじめてのハッカソン」に参加してきました。

ハッカソンに参加したのは、はじめての経験で、学びも多かったです。ハッカソンで感じたことをシェアします!

ハッカソンでサービス開発を企画から実装までいちから体験

ハッカソンとは、プログラミング用語のHack(ハック)とmarathon(マラソン)を組みあせた造語です。エンジニア、デザイナー、プランナーが集まって、企画からアプリ・サービス開発をおこなうイベントです。

日本では2013年ごろから話題を集め、今では様々なテーマ、地域でハッカソンが開催されています。

要はサービス開発の企画から実装までを一日とか数日で体験できるイベントです。

ハッカソンでどんなサービスを作ったのか

でハッカソンでどんなものを作ったのか。

僕達のチームが選んだテーマは「グローバル」でした。

企画自体はイノベーションカードというものを使っていくつかある質問に答えたり、グループワークしながら企画を考えていく形式でした。

f:id:tadaken3:20170925204222j:plainf:id:tadaken3:20170925204514j:plain
みんなでアイデアをだしあって企画を考えます。

企画内容を詰めていって「国境を超えて伝わる楽しさ」を感じてもらえるよう言葉を使わずにコミュニケーションできるWEBサービスを作ることに決定しました。

WEBサービスの名前は「Hello World」

文字で説明するよりも実際に作ったものを見てもらったほうがわかりやすいと思いますので、こちらをご覧ください。

f:id:tadaken3:20170925204657p:plain
みんなで作った「Hello World」というコミュニケーションサービス

いろいろな国の人とコミュケーションするために、文字を介さず絵文字だけでコミュニケーションすること目的としています。

具体的には、

  • 今いる場所をクリックするとその場所にユーザーアイコンが出現
  • 入力フォームから絵文字を選択すると、そのサイトを見ている人全員にメッセージを送信する

という機能があります。

企画段階では、

  • 個々のユーザーにメッセージを送信できる。
  • メッセージ送信したら矢印でアニメーションが表示される
  • ユーザーが送信したら、絵文字の履歴がアクティビティとして表示される

などの機能も検討していたのですが、実装が全然に間に合いませんでした笑

未実装の機能の他にも色々と課題はあるものの、一日で企画検討からサービス実装までおこなうという経験を一通り経験でき、すごい刺激的でした。

ハッカソン当日の流れ

当日の流れはざっくりこのようになります。

  • ハッカソンの説明
  • チーム分け(主催者側で事前に決定)
  • テーマをもとに企画検討
  • 採用技術・仕様検討
  • 実装
  • 発表

11時頃からはじまって、お昼ぐらいまで使って企画を練っていきました。お昼休みを挟んで、採用技術・仕様検討を行い、その後に実装。5時半頃に発表という感じでした。企画から実装まで一気におこなうので、あっという間に時間が過ぎていきました。

f:id:tadaken3:20170925205355j:plain
作ったサービスを紹介する様子

当日の様子は同じチームのまどぎわさんもブログにまとめていますので、参加したいなと思っている方は、こちらもぜひご覧くださいな。

madogiwa0124.hatenablog.com

「はじめてのハッカソン」ではみんなで和気あいあいと楽しめる

今回、参加した「はじめてのハッカソン」は、ハッカソン初心者のためのゆるーいハッカソンとして位置づけられています。参加する前は、技術的に不安があったのですが、実際に参加してみると、スタッフさんのサポートや、参加者の皆さんの和気あいあいと雰囲気もあり、とても楽しい時間を過ごすことができました。

とくに「はじめてのハッカソン」ではアイデアや技術レベルを競ったりすることもなく、できたものをゆるーく発表していく感じなので、技術的に不安があったり、はじめてハッカソンに参加される方にはうってつけのイベントだと思います。

ハッカソンにはプログラミング大好き人間が集まっている

チームのメンバーは

  • Sler出身でプログラミングスクールに通われているまどぎわさん
  • とあるベンチャー企業のチーフエンジニアであるやのうさん
  • 同時に3つのインターンに通っている学生さん
  • 仕事でたまたま関西から東京にきて、当日に飛び込み参加のフリーランスエンジニアさん(すごいバイタリティ)

など、いろんな人が参加していてとても刺激的でした。いろんなバックボーンの人がいる中が、ひとつ共通点があるとすると「みんなプログラミングがチョー好き」。

企画のときも、仕様検討のときもみんなで技術が好きなのでワイワイと盛り上がりました。

企画段階では熱くなって、激しい意見交換をする場面もありました。でも、それは少ない時間の中でもより良いもの作りたいという思いからくるものです。

いざ実装がはじまると、皆さん、ものすごい早さでコーディングしていきます。

ボクはサーバーサイドを担当させてもらったんですが、一緒にやらせてもらった「やのうさん」のコーディングの早さやコードレビューの凄さにビビりまくりでした。

普段独学で勉強することがほとんどだったので、他人のコーディングの方法やシステムの設計方法を垣間見れて非常に勉強になりました。

(あと、Golangをもっと勉強しよう。Golangもっと勉強しよう。)

ハッカソンを通して、自分の足りていないことや今後チャレンジしたいことを見つけられたのも良い経験です。

まとめ

ハッカソンはいつか参加してみたいと思っていたものの、技術的にレベルが高い人向けのイベントだと思っていたので、参加をためらっていました。

ですが、実際に参加することで、自分の課題も見つかりましたし、何よりみんなでワイワイいいながら、ひとつのもの作るというのは非常に楽しかったです。

技術的に不安があって、ハッカソンに参加してみたいという方には、「はじめてのハッカソン」はすごいオススメです。

直近では10月14日にIBMさんとコラボしての「IBM Cloud(Bluemix) × IoT はじめてのハッカソン」の開催が予定されています。

ぜひ、あなたも「はじめてのハッカソン」にチャンレジしてみてはいかがでしょうか。

hackathon.connpass.com

フォロワーになってください!

本ブログではプログラミングを学習する上で役立つ情報を公開しています。よろしければ、本ブログの読者もしくはTwitterアカウントのフォロワーになっていただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

三日坊主を防ぐ仕組みをGoogle Apps Scriptで作る

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

新しいことを始めようと意気込んでみても三日坊主になってしまったことはありませんか。

例えば、ジム通い。

通い始めた直後はモチベーションも高く意気揚々と筋トレに勤しんでいくのですが、ときには天気が悪いことを理由に、ときには仕事が忙しいことを理由に、だんだんジムに行かなくなってしまいます。

そんなことではいけない!これではムキムキマッチョになれない!

意志の力に頼らずジムに通えるようにしようと考え、三日坊主を検知したらGoogle Apps Scriptで通知する仕組みを作ってみたところ、これが自分の三日坊主を防ぐのに大いに役立ちました。

今回は三日坊主を克服するための仕組みをGoogle Apps Scriptで作る方法をご紹介します。 ジム通い以外にも、習慣化したいものに応用できるはずです。

三日坊主克服システムの概要

三日坊主克服システムの仕組みを簡単にご説明すると

  • ジムに行った履歴を残して管理する
  • 最後にジムに通った日から3日経過すると通知が送られる
  • ジムに行った記録はボタン一つで簡単に残せるようにする

です。

三日坊主が検知されるとこのように通知が送られます。

f:id:tadaken3:20170921235328j:plain

三日坊主克服システムはWEBサービスを組み合わせて構築しました。 もちろん無料でできます。

利用したサービス・役割は以下の通りです。

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

f:id:tadaken3:20170922114518p:plain

スマートフォンスプレッドシートの連携をIFTTT、それ以外の部分をGoogle Apps Scriptが担っています。

では、さっそく作成方法をご説明します。

IFTTTとGoogleスプレッドシートを連携してジムに行ったことを簡単に記録できるようにする

IFTTTとは

まず、IFTTTとGoogleスプレッドシートを連携させてスマホで簡単に押せる「ジムに行った」ボタンを作ります。

IFTTTを簡単に説明すると「あるWebサービスとあるWebサービス間を自動的に連携する」WEBサービスです。

ifttt.com

例えば、「もしTwitterに投稿したら、Facebookにも同じ投稿をする」といった「Applets」を簡単に作れます。詳しいことは省略しますが、IFTTTを使うとさまざまなWEBサービスを簡単に連携できるようになり、大変捗ります。

「もしスマートフォンウィジェットにあるボタンを押したら、○○をする」というAppletsも作ることができます。

こちらを使って「もしスマートフォンウィジェットにあるボタンを押したら、スプレッドシートに日時を記録する」というAppletsを作成します。

IFTTTをダウンロードする

まずはIFTTTのアプリが必要になりますので、アプリストアで「IFTTT」と検索するか、こちらからダウンロードしてください。1

IFTTT on the App Store

IFTTT - Google Play の Android アプリ

アプリを起動したらアカウント作成画面が出てくると思いますので、「Googleアカウント」「Facebook」アカウントでログインするか、新たにアカウントを作成してください。

新しいアプレットを作る

アカウントの作成ができたら、トップの右下にある「My Applets」をタップします。ここに作ったAppletsが保存されます。

では、早速、新しいAppletを作成ましょう。Applet作成するには、右上の「+」をタップします。

f:id:tadaken3:20170922000025j:plain


するとこのような画面がでてきます。

f:id:tadaken3:20170922000145p:plain

IFTTTは「if this then that」の略でthisの部分に「きっかけ」(トリガー)、thatの部分に「行動」を指定することでAppletが作られます。

「this」の部分をタップして、トリガー部分を設定します。「button widget」を検索して選択します。

f:id:tadaken3:20170922000206j:plain

「Chose trigger」とトリガーを選ぶよう指示が出ますので、そのまま「Button press」を選びます。

f:id:tadaken3:20170922000223j:plain

次に「行動」部分の「that」を設定します。今度は「Goole Drive」を検索してタップしてください。

f:id:tadaken3:20170922082614j:plain

「Choose action」と促されますので「Add row to spreadsheet」(スプレッドシートに行を追加)を選択します。 f:id:tadaken3:20170922000349j:plain

続いて、スプレッドシートの設定になります。

「Spreadsheet name」の部分はお好きなスプレッドシート名を入力ください。該当するスプレッドシートがない場合は、自動で作成されるのでご安心ください。

「Formatted row」の部分は記録される行の内容になります。今回は時間だけがわかればいいのでOccurredAtだけ残してあとは削除してしまいましょう。

「Drive folder path」の部分はスプレッドシートの保存場所になりますので、こちらもお好きなところに変更してください。

f:id:tadaken3:20170922000622j:plain

完了したら「next」をタップします。

Appletが作られます。最後に「Edit title」でわかりやすい名前を設定しておきましょう。

これでボタンが作成されました。スマートフォンの設定でウィジェットにIFTTTアプリを追加すると、先ほど作成されたボタンが表示されるかと思います。

f:id:tadaken3:20170922000806j:plain

早速ボタンを押してテストしてみましょう。

このようにスプレッドシートにボタンを押した時間が記録されます。

f:id:tadaken3:20170921233435p:plain

Point IFTTTとGoogleスプレッドシートを連携させる

Google Apps Scriptで最後にジムに行った日から何日経過したか計算する

IFTTTのタイムスタンプを日付に変換する

ここからはGoogle Apps Scriptを使って経過日数を計算していきます。2 まずIFTTTで記録したタイムスタンプそのままだと、日付の計算ができないので日付型に変換する関数を作ります。

//IFTTTの日付形式から通常の日付に変換
function toDateFromIFTTT(str){
  str =  String(str);
  str = str.replace(/at.*/,"")//正規表現でatより後ろの部分を削除
  d = new Date(str);
  return d;
}

日付から経過日数を計算する

IFTTTでは、ボタンを押すたびに最終行に行が追加される仕様になっています。

そこで、最終行にセットされた日付から経過日数を算出します。 経過日数を算出するために、スプレッドシートの計算式を使っています。計算式をスクリプトで埋め込む方式だとスプレッドシートを確認した際も自動で計算されるからです。

計算式をセットするスクリプトをこのように追加します。

var ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得
var sheet = ss.getSheetByName("log"); //シートを取得

//シートの最終行に経過日を計算する式をセットする
function setFormuraLastRow(){
  //シートの使用範囲のうち最終行を取得
  var maxRow = sheet.getDataRange().getLastRow(); 
  //A列の最終行の値を取得
  var str  = sheet.getRange(maxRow,1).getValue();
  //スプレッドシート用の式
  var code = '=TODAY() - TO_DATE(B'+ maxRow+')';
  //フォーマットした日付をセット
  sheet.getRange(maxRow,2).setValue(toDateFromIFTTT(str));
  //式をセットする
  sheet.getRange(maxRow,3).setFormula(code);
}

試しにsetFormuraLastRow関数を実行すると、B列に日付のデータ、C列に経過日数が表示されているかと思います。

f:id:tadaken3:20170921233732j:plain

C列では「=TODAY - TO_DATE(B1)」という式をセットして、経過日を計算しています。

Point Google Apps Scriptで最後に行動した日からの経過日数を計算する

Google Apps ScriptでLINEに通知を送る

LINE Notifyのアクセストークンを取得する

LINEに通知を送るには、「LINE Notify」という仕組みを使います。

まず、LINEアプリからLINE Notifyのアカウントを友達として追加します。

次にLINE NotifyのページにLINEアカウントでログインしてアクセストークンを発行します。

アクセストークンはGoogle Apps ScriptからLINEに通知するために必要になりますので、メモしておきましょう。

わからない場合はこちらの解説記事も参考にしてみてください。

qiita.com

Google Apps ScriptでLINE通知を実装する

では、スプレッドシートに戻って、Google Apps Scriptで通知部分を実装してきましょう。

//LINEに通知を送る関数
function sentToLine(message){
  var token = "先程取得したアクセストークン";
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}     
   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

これですべての部品が整いました。

Point LINE NotifyでGoogle Apps Scriptから通知を送る

三日坊主克服システムの完成!

では、三日坊主克服システムを完成させましょう。main関数を作って、メインルーチンを実装します。スプレッドシートの値を取得して、経過日が3日もしくは7日以上であれば、LINEに通知をするようにします。

完成形のプログラムはこのようになります。

var ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得
var sheet = ss.getSheetByName("log"); //シートを取得

function main(){
  setFormuraLastRow()
  var maxRow   = sheet.getDataRange().getLastRow();
  var passDate = sheet.getRange(maxRow,3).getValue();
  var message  ="";
  //経過日が3日もしくは7日以上だったらLINEに通知を送る
  if (passDate==3 || passDate>=7){
      message = "最終トレーニングから"+ passDate + "日経過しました";
      sentToLine(message);
  }
}

//IFTTTの日付形式から通常の日付に変換
function toDateFromIFTTT(str){
  str =  String(str);
  str = str.replace(/at.*/,"")
  d = new Date(str);
  return d;
}

//シートの最終行に経過日を計算する式をセットする
function setFormuraLastRow(){
  var maxRow = sheet.getDataRange().getLastRow(); 
  var str  = sheet.getRange(maxRow,1).getValue();
  var code = '=TODAY() - TO_DATE(B'+ maxRow+')';
  sheet.getRange(maxRow,2).setValue(toDateFromIFTTT(str));
  sheet.getRange(maxRow,3).setFormula(code);
}

//LINEに通知を送る関数
function sentToLine(message){
  var token = "先程取得したアクセストークン";
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}     
   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}



最後にスクリプトのトリガーを設定します。main関数を通知を送りたい時間帯を選んで日タイマーでセットします。

f:id:tadaken3:20170921234555j:plain

Point トリガーを設定してスケジュールでスクリプトを実行する

まとめ

今回は、Google Apps Scriptで三日坊主克服システムの作り方を解説しました。

を組み合わせて仕組み化しました。

仕組み化することで意識せずに三日坊主を検知できるので、今までよりは三日坊主を克服しやすくなったと思います。

あなたが、三日坊主を克服して新しい習慣を身につけられることを祈っています。

最後に尊敬するTestosterone先輩の名言を掲載します。

読者、フォロワーになってください

本ブログではPythonGoogle Apps Scriptの役立つテクニックを公開しています。よろしければ、本ブログの読者もしくはTwitterアカウントのフォロワーになっていただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。


  1. 本記事ではアプリの画面で説明していますが、PCからブラウザ経由でもアプレットの作成ができます。

  2. スプレッドシートのシート名はlogに変更していますので、ご注意ください。

【Python】チャットワークに通知を送るスクリプトをより実用的に改良する

f:id:tadaken3:20170917160104p:plain

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

先日、「いつも隣にITのお仕事」に、Pythonを使ってチャットワークに通知を送る方法について解説した記事を寄稿しました。

tonari-it.com

Requestsモジュールを使いチャットワークAPIにアクセスして、メッセージを送る方法を解説しました。「いつも隣にITのお仕事」では、プログラム初心者向けの内容にフォーカスしているため、Requestsモジュールの使い方を中心にご紹介しています。

ですが、このままだと、

  • ルームIDやメッセージ内容を変更する度に、コードを変更する必要がある
  • スケジュールで定期的に実行する際に実行ログが出力されない

などの課題があります。

そこで本ブログでは、チャットワークに通知を送るPythonスクリプトをより実用的なコードに改良する方法をご紹介します。1

argparseを使ってパラメータを管理する

argparseモジュールはコマンドラインのインタフェースを簡単に作成できる標準モジュールです。

Pythonプログラムを実行した際にコマンドライン引数を設定できます。メッセージ内容やルームIDをコマンドラインから指定できるようになります。

#!/usr/bin/env python

import argparse

def main():
    # パーサの作成
    psr = argparse.ArgumentParser()
    # -m / --message というオプションを追加.デフォルトは 'hello! '
    psr.add_argument('-m', '--message', default='hello! ')
    # コマンドラインの引数をパースしてargsに入れる.エラーがあったらexitする
    args = psr.parse_args()
    # argsからmessageに格納された引数を取り出す
    print(args.message)

if __name__ == '__main__':
    main()


実行時にコマンドラインで引数を指定しないとデフォルトの内容、引数を指定した場合は引数の内容が表示されます。

$ python sample_argparse.py
hello! 
$ python sample_argparse.py -m 'Good Bye!'
Good Bye!

loggingを使ってログを出力する

Pythonでログ出力を実装するためには標準モジュールのloggingを使います。

loggingを使うと、ログをレベル分けしたり、ログ出力のフォーマットを設定できます。loggingの詳しい使い方は以下の記事が参考になります。

www.sejuku.net

ログの設定を以下のように記述します

logger = logging.getLogger(__name__)
# 出力するログレベルの設定。INFO以上のログが出力されるようになる
logger.setLevel('INFO')

# ログのファイル出力先を設定
fh = logging.FileHandler('chatwork.log')
logger.addHandler(fh)

# ログのコンソール出力の設定
sh = logging.StreamHandler()
logger.addHandler(sh)

# ログのフォーマット設定
formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)


ログを出力をしたい場合、ログを出力したいタイミングの箇所で以下のように記述します。

logger.info('これは正常動作です')
logger.warning('実行可能だけども警告があります')

チャットワークに通知するスクリプトを改良する

では、これらを踏まえて、チャットワークへ通知するスクリプトを改良してみましょう。

main関数を作って、メインルーチンを記述しています。APIキーとルームIDのデフォルト値はご自身が使うものに変更してください。2

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import argparse
import requests
import logging

def main():
    # ロガーを呼び出し
    logger = get_logger()

    # 処理が開始されることをロギング
    logger.info('start')
    
    # コマンドライン引数からルームID、メッセージ内容を取得
    psr = argparse.ArgumentParser()
    psr.add_argument('-a', '--apikey', default='#Your Chatwork API KEY')
    psr.add_argument('-r', '--roomid', default='Your Room ID')
    psr.add_argument('-m', '--message', default='にゃんぱすー')
    psr.add_argument('--version', action='version', version='%(prog)s 1.0')
    args = psr.parse_args()
    
    # エンドポイントの生成
    ENDPOINT = 'https://api.chatwork.com/v2'
    post_message_url = '{}/rooms/{}/messages'.format(ENDPOINT, args.roomid)

    # チャットワークAPIにポストする場合のヘッダー、パラメータを設定
    headers = { 'X-ChatWorkToken': args.apikey}
    params = { 'body': args.message }
    
    # ポストリクエストを実行
    r = requests.post(post_message_url,
                        headers=headers,
                        params=params)
    # ステータスコードが200(成功)以外の場合、警告をする
    if r.status_code != 200:
        logger.warning(r.text)
    
    # 処理が終了したことをロギング
    logger.info('end')

# ロガーの設定
def get_logger():
    logger = logging.getLogger(__name__)
    logger.setLevel('INFO')
    
    fh = logging.FileHandler('chatwork.log')
    logger.addHandler(fh)
    
    sh = logging.StreamHandler()
    logger.addHandler(sh)
    
    formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
    fh.setFormatter(formatter)
    sh.setFormatter(formatter)
    return logger

if __name__ == '__main__':
    main()

では、「chtwk.py」というファイルに保存して実行してみましょう。

コマンドラインからの入力を受け付けて、ログもきちんと出力されていますね。chatwork.logファイルにも実行した結果が記録されているはずです。 f:id:tadaken3:20170917154920p:plain

チャットワークにもコマンドラインで設定したメッセージ内容で通知が送られています。 f:id:tadaken3:20170917154943p:plain

まとめ

ちょっとしたツールでもキチンと作っておくと、再利用できるようシーンが増えます。結果的には業務の時間短縮につながったり、メンテナンスしやすくなりますので、意識しておくと良いのではないでしょうか。

今回作成したコードはGithubにもおいてありますので、ご参考に!

読者登録をお願いします

本ブログではPythonGoogle Apps Scriptの役立つテクニックを公開しています。よろしければ読者登録もしくはTwitterアカウントのフォローをしていただけると更新の励みになります。ぜひ一緒にプログラミングを学びましょう。

みんなのPython 第4版

みんなのPython 第4版


  1. 元ネタはこちらの記事です。pythonで小さなツールを作る時のtips - Qiita

  2. APIキーについてもコマンドラインから取れるようにしていますが、変更して使うケースが少なければ、環境変数に入れて管理する方法もあります。こちらを参考に。【Python】トークンなどの認証情報は環境変数で管理しよう - 肩の力を抜いて

ゼルダ開発者に学ぶチーム全体の生産性を上げる方法

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

日本最大のゲーム開発者向けカンファレンス「CEDEC 2017」が9月1日まで行われていました。ボクの好きなゲームの一つ「ゼルダの伝説 ブレス オブ ザ ワイルド」(以下、BotW)についても多くセッションが開かれてました。

今回はBotWのセッションを読んで学んだこと、感じたことをまとめてみました。

自作のバグ検知ツール「ZELDA_ERROR」で制作効率が上がった

たくさんのセッションが公開されたのですが、個人的に注目したのがこちらの記事です。

jp.ign.com

簡単にまとめると、

BotWは任天堂の歴史の中でも今までにない規模の制作規模だったそうです。制作規模が大きいため、バグも大量に発生し、面白さを検証するためのテストプレイもままならない状態でした。

QAエンジニアである大礒さんが、BotW専用のデバッグツール「ZELDA_ERROR」を作って、効率的にバグ報告をできるようにしました。

通常、ゲームのソフトの開発は制作の終盤にデバックを行なうのですが、「ZELDA_ERROR」のおかげ開発の初期からデバックを効率的に行なうことができ、その効果も制作サイクルを早く回せました。

という内容です。

道具を作ってチームの力を最大限に活かす

ボク自身もBotWは100時間以上遊びましたし、いち任天堂ファンとして、開発の裏側の話を知って単純にすごいなと思いました。

※我が家のニンテンドースイッチ

「ZELDA_ERROR」の記事を読んで一つ思い出したことがあります。

任天堂の元社長、故・岩田さんとほぼ日の糸井さんのとある対談記事です。

当時ふたりは「MOTHER2 ギーグの逆襲」というスーパーファミコンのソフトの開発を行っていました。

開発は難航し4年間たっても完成の目処が見えない状態でした。あまりにも開発が難航したため岩田さんが助っ人として、開発陣に加わったときのエピソードです。

当時の状況を二人はこのように振り返っています。

糸井
あー、もっともですね(笑)。
で、そのときに岩田さんが
なにからはじめたかというと、
まず、道具をつくりはじめたんですよね。
つまり、目の前に大きな問題がごろごろあって、
すごくたいへんだぞ、というときに、
直接は、それに取りかからなかった。
だから、離れたところから見ると、
ぜんぜん手をつけてないように見えたんです。
ところが、それは、問題を片づけていくための
道具をつくっていたんだよね

岩田
はい。

糸井
(まわりのスタッフに向かって)
おもしろいんだよ、これは。
問題を1個ずつ片づけていくかというと
そうじゃないんだ。
いったん、道具をつくっておいて、
「みんなが使える道具をつくりましたから、
これで、あなたはここをつくってください」
というふうに建て直していったんだ。
つまり、道具さえできたら、
あとはやるだけなんですっていう
やり方をしていましたよね。
HOBO NIKKAN ITOI SHINBUN - 1101.com

このとき、岩田さんが具体的に作った「道具」は、当日まだ珍しかった電子メールだそうです。システムを社員一人ひとりのPCに入れさせて、コミュニケーションを円滑化しました。

開発がうまくいってない原因として、コミュニケーションがうまくいっていないと分析したんでしょうね。今でこそメールなんか当たり前ですが、1990年代の話ですから驚きです。

他にも岩田さんは、ファイルの更新状況を管理するために、バージョン管理システムを構築して、MOTHER2の開発効率を劇的に改善しています。1

岩田さんは、いきなりソフトの開発に入らず、みんなが使えるツールを作って、チーム全体の生産性をアップしました。

結果4年間も開発が難航していたMOTHER2が、岩田さんが開発に入ってから1年で発売までこぎつけました。

任天堂の大磯さんがおこなった「ZELDA_ERROR」を作って、チームの開発力を底上げするというのも、岩田さんのやり方そのままです。

岩田さんのDNAはしっかりと任天堂の開発陣に受け継がれているんだなと感じました。

目の前の問題にすぐ取り掛かる前に

とくに忙しくて切羽詰まっているときほど、目の前の問題をすぐに解決しようと手を動かしがちです。

ボクなんかもタスクがたくさんあって消化できるかわからないときほど、不安になってすぐに目の前の課題から手を付けがちでした。

ですが、むかしに岩田さんのツールを作る方法を知ってから、

  • もしまた同じような問題が起きたらまた時間がかかってしまうのではないだろうか
  • そもそも何が本当に問題なのだろうか

ということを一度立ち止まって考えるようになりました。

そして、自分でも自動化したりツールを作ってみたいと思いプログラミングを学び始めました。

プログラミングを少しずつ学んで行く過程で、ちょっとずつ自分の業務を自動化していきました。

時にはそれをチームに公開して他の人も使えるようにしてきました。

もちろん岩田さんや大礒さんのようなすごいツールではありませんし、日々の問題を解決する本当にちょっとしたプログラムだったりします。

それでも、作ったツールが増えれば増えるほど、仕事はどんどん自動化され、楽になっていきました。

まとめ

みんなが使えるツールを作って、チーム全体の生産性をアップするメソッドは、チームで仕事をすすめていく上で非常に役に立つ考え方です。

プログラミングの強みは、ツールを自分で創ってしまえるところだと再認識しました。

プログラミングを学んで、個人の生産性だけでなく、チームの生産性をアップしていけるといいですね。

読者登録をお願いします

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

岩田さん 岩田聡はこんなことを話していた。

岩田さん 岩田聡はこんなことを話していた。

新装版 ほぼ日の就職論。「はたらきたい。」 (ほぼ日ブックス)

新装版 ほぼ日の就職論。「はたらきたい。」 (ほぼ日ブックス)

ゼルダの伝説 ブレス オブ ザ ワイルド - Switch

ゼルダの伝説 ブレス オブ ザ ワイルド - Switch

【Python】トークンなどの認証情報は環境変数で管理しよう

f:id:tadaken3:20170909203312p:plain

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

今回はPythonのプログラムを書く際のちょっとした小ネタをご紹介します。 認証情報などうっかり外部に漏らしてしまうと大事になる情報を安全に取り扱う方法を解説します。

WEB APIを利用するときに認証情報をコードに記述していると、、、

WEB APIを利用をするプログラミングを作る場合、トークンなどの認証情報をコード内に記述する場合があるかと思います。

例えば、このようにGETリクエストをしてWEB APIを利用するケースです。

import requests

url = 'www.samlple.co.jp/api/v1'  #ダミーのURLです。
token = 'hogehogehogehoge'
headers = { 'SampleToken': token }

requests.get(url, headers=headers)

自分ひとりで使う場合はとくに問題なさそうです。

ですが、コード内に認証情報が埋め込まれているため、他人に共有する際に、そのまま認証情報を公開してしまうということが考えらます。(ボクも社内のWikiにコードを公開した際に、うっかり認証情報を載せてしまったことがありました、、、)

社内の場合は、それほど大きな問題にはならないですが、もしインターネット上に公開した場合、最悪アカウントが乗っ取られて悪用されるケースもあります。とくにGithubにコードをアップするときなどは要注意です。

Amazon Web Serviceのインスタンスが乗っ取られて190万円の請求がきたというような事例もあります。1

d.hatena.ne.jp

認証情報を環境変数で管理する

そのために認証情報はプログラム上に直接書かずに、読取専用のファイルなどでしっかり管理するのが安全です。

ただ、ちょっとしたコードを作るために、毎回認証情報用のファイルを作ったりするのもめんどうなので、認証情報をOSの環境変数に保存するという方法があります。

環境変数(かんきょうへんすう)はOSが提供するデータ共有機能の一つ。OS上で動作するタ>スク(プロセス)がデータを共有するための仕組みである。 環境変数 - Wikipedia

環境変数トークンなどを保存しておき、コードを実行する際に必要な場合は、それらを呼び出して使います。

Pythonの場合、標準のosモジュールで環境変数を設定できます。

“SAMPLE_API_TOKEN"という環境変数に"hogehogehogehoge"というトークンを保存する例です。

import os

# 環境変数を設定する
os.environ["SAMPLE_API_TOKEN"] = "hogehogehogehoge"



環境変数は一度設定すれば、それ以降は永続的に使えます。 環境変数を読みこむには以下のように記述します。

import os

# 環境変数を読み込む
token = os.environ["SAMPLE_API_TOKEN"]

#もしくは
token = os.environ.get("SAMPLE_API_TOKEN")



一番最初に載せたサンプルのコードを書き換えるとこのようになります。

import os 
import requests

url = 'www.samlple.co.jp/api/v1'  #ダミーのURLです。
token = os.environ["SAMPLE_API_TOKEN"]
headers = { 'SampleToken': token }

requests.get(url, headers=headers)

まとめ

これで他人にコードを共有する際も認証情報は公開せずに管理できます。ちょっとしたことなのですが、うっかりやってしまいがちなので、セキュリティ的に認証情報は環境変数で管理することをオススメします。

読者登録をお願いします

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

みんなのPython 第4版

みんなのPython 第4版


  1. リンク先のケースでは、不正に利用されたため無事に請求が免除されたようです。

プログラミングを習得するには、とにかく写経することがオススメ

f:id:tadaken3:20180325120346p:plain

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

プログラミングを学習する方法は、たくさんあります。入門書、プログラミングのスクール、オンラインでの学習サイト、プログラミングの入門動画などなど。たくさんの方法があってどれが効果的なのか迷ってしまいますよね。

そんなあなたに取って置きの方法をお伝えします。それは写経です。ボクはプログラミングを習得するには「写経」が一番いいと考えています。

とにかく書き写す

プログラミングをはじめて学ぶ方は、まずはサンプルコードをひたすら書き写すのがオススメです。プログラミングは「言語」なので、習得するにはどうしても書いて覚える必要があります。言語なので書けば書くほどうまくなるというのが持論です。

書いているうちにその言語の特徴や文法が体に染み付いてきますし、「書いて動かす」を繰り返すことでプログラミングの勘所みたいなものが養われます。とくにプログラミング初心者にわからなくても書いて覚える写経が効果的です。

書くことでわからないところが明確になる

最初はサンプルプログラムの意味がわからないかもしれません。ですが、それは初めて学ぶことなので当たり前です。本をサラッと一回読んだだけで理解できるのであれば、誰も苦労はしないでしょう。

意味がわからないながらも、コードを自分で打ち込んでいきます。サンプルコードを打ち込んだ後、実際動くかどうか試してみます。するとたいていの場合、うまく動かなかったり、エラーコードが表示されます。

でも、決してめげないでください。

エラーメッセージが出ている場合は、エラーメッセージを読んでみましょう。もしわからなければ、Googleで検索してみます。どの辺に間違いがあるか当たりがつくかもしれません。

もしエラーメッセージを見てもわからなければ、打ち込んだコードとサンプルコードをもう一度チェックしてみましょう。以外なところでタイプミスをしていませんか。

また理解していないメソッドやキーワードがあれば、それを覚えておきましょう。今はわからなくてもあとで調べてみて理解できるかもしれません。

そうやって試行錯誤しているうちにプログラムがやっと動くようになりました!おめでとうございます。

きっと本をサラッと読んだだけでは、理解したかどうかもあやふやだったところまで、理解できたのではないでしょうか。

これが写経の効果です。実際に書いて動かすことで、プログラミングは上達します。

「ほんたった」があると写経が捗る

写経をするときは、本をたてておくブックスタンドがあるととても便利です。コレはあるのとないので大きく違うので、プログラミングを始めようと思ったら、まず買っておくべきです。

個人的には、EDISONの「ほんたった」がオススメです。「ほんたった」は折りたたみ式のブックスタンドでカバンに入れて持ち運びができるので、会社・自宅の両方で使えます。気分転換にスタバで写経したりもできます。

折りたたみができる分、通常のブックスタンドよりも若干高めですが、それでも2500円程度です。

「ほんたった」は通常のバインダーに加えて補助バインダーがついてるので、ページがめくりやすいところも気に入っています。

EDISON ほんたった黒(ハードケース入り)

EDISON ほんたった黒(ハードケース入り)

まとめ

写経は泥臭い方法かもしれませんが、プログラミングを習得するに、より確実な方法です。1日5分でいいので、プログラミングの写経を始めてみませんか。きっと効果が実感できるはずです。

読者登録をお願いします

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

はてなブログにコマンド一発で投稿するPythonスクリプトを作ってみた

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

はてなブログへの投稿を少しでも便利にしたいと思い、テキストファイルをはてなブログに投稿するPythonスクリプトを作成しました。使い方をご紹介します。

github.com

はてなブログは、はてなブログAtomPubというAPIを公開しています。認証形式はOauth2、WSSE、BASICに対応しています。今回のスクリプトではWSSE認証で、ブログの投稿を行っています。1

はてなブログ投稿スクリプトの使い方

事前準備

以下の環境で動作することを確認しています。Python3のスクリプトです。

  • python: 3++
  • system: mac OS X, windows 7

まずスクリプトをGitHubからDLします。

$git clone https://github.com/tadaken3/hatenablog_post.git


もしくはGithubのページにアクセスして、「Clone or download」ボタンを押してダウンロードします。

f:id:tadaken3:20170824152859p:plain

依存関係のあるPythonライブラリはrequestschardetです。requestsはHTTPライブラリ、chardetはファイルの文字コードを調べるのに利用しています。pipでインストールしましょう。

$pip install requests
$pip install chardet


次に認証情報をスクリプトに埋め込みます。hatenablog_post.pyファイルの以下の部分を変更します。

username = 'username'
api_key  = 'API key'
blogname = 'yourblogname.hatenablog.com'


usernameは、はてなのIDです。api_keyとblognameは、はてなブログの管理画面から「設定>>詳細設定」で確認することができます。AtomPubの欄に記載があります。例えば、このブログの場合は「tadaken3.hatenablog.jp」です。2

f:id:tadaken3:20170824145612p:plain

これで準備がオッケーです。

ブログを投稿してみる

hatenablog_post.pyと同じディレクトリにブログ原稿を保存します。ファイルの1行目がタイトル、2行目以降が本文になります。例えばblog.mdというファイルを作ってブログタイトルと原稿本文を書いて保存してみましょう。

作成したファイルを引数にとって、スクリプトを実行します。

$ python hatenablog_post.py blog.md


うまくいくとブログに下書きに記事が反映されます。ブラウザではてなブログにアクセスして確認してみてください。

f:id:tadaken3:20170824150058p:plain

まとめ

cotEditorという軽量のテキストエディタを使用して、ブログ原稿を書いてます。cotEditorはPythonスクリプトで機能を拡張できるようだったので、今回のスクリプトを作成しました。自分がラクをしたいので。3

今回はテキストのみですが、いずれは画像も含めて一発で投稿できるようにしたいと思っています。

参考サイト

みんなのPython 第4版

みんなのPython 第4版


  1. 本記事で紹介したスクリプトは参考サイトにあるkaraageさんの記事をベースにしています。Python3で動くようにしたのとファイルの取扱などを改良しています。

  2. api_keyなどは環境変数に入れて参照することをおすすめします。ネット上にうっかり公開しないよう気をつけましょう。

  3. ちなみにこのままだと諸事情によりcotEditorで動きません。微妙に改良したのはこちらです。

いまこそプログラミングを学んで自由を手に入れよう。

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

ボクはもともと経理部出身だったのですが、独学でプログラミングを勉強して、現在はデータアナリストとして仕事をしています。

プログラミングを学んだことで、ボクは人生は大きく変わりました。プログラミングは自由を手に入れる切符です。プログラミングを学ぶ人が増えるといいなと思い、この記事を書きました。

プログラミングは時間を生み出すスキルである

プログラミングは、英語や簿記といったスキルとくらべて、特徴的なところがあります。それはプログラミング自体が時間を生み出すスキルであることです。

プログラミングを学ぶと、様々なタスクをPCにやってもらうことができます。しかも、人間が手作業で行うより、PCは高速かつ正確にタスクを処理します。手作業だと半日かかっていた集計作業が、プログラミングを学ぶことでたったの5秒で終わるといったことも珍しくありません。

もちろんプログラムを作成するのに時間がかかりますが、一度作ってしまえば、その後も集計作業は自動で処理できます。空いた時間にさらにプログラミングの技術を高めていけば、より高度なこともプログラミングできるようになります。こなせるタスクは増える一方で、それにかかる時間は減っていくという減少が発生します。

プログラミングを学ぶ→時間ができる→さらにプログラミングを学ぶ→さらに時間ができる

というサイクルが回り始めます。プログラミングを学ぶことで時間の複利効果の恩恵をうけることができるのです。

自分のやっている仕事をひとつ自動化してみる

プログラミングを学ぶ上でよくある悩みが、基本的な文法な内容を学んだあと何を作っていいのかわからないという悩みです。

まずは自分のやっている仕事をひとつ自動化するプログラムを作ってみることをおすすめします。いきなりすべてを自動化することは難し位と思いますので、ほんの少しのタスクを自動化することを考えてみるといい勉強になります。

また、プログラミング言語にはC、Java、Ruby、Python、Javascriptなどたくさんの言語があります。たくさんありすぎて迷ってしまいますね。ですが、仕事を自動化するためには何を勉強すればいいのかという観点であればおのずと学ぶべきことが見えてきます。

例えば、

などの方法があります。

勉強することはたくさんある。それを乗り越えるメリットもたくさんある

プログラミングを学ぶ始めると、学ぶべきことがたくさんがあるなと感じます。

基本的なインターネット通信の基本的な仕組み、OSの成り立ち、コードのバージョンを管理する方法といったことやきれいなコードを書く方法や実用に耐える設計手法、ソフトをテストする方法などあげればキリがありません。

ボク自身もまだまだ勉強中ですし、新たに学ぶ分野で「入門書を買ってきて、本に書かれているとおりにススメてみたけどうまく動かない」といったことはしょっちゅうあります。

ですが、わからないことをググったりしながら、エラーコードと悪闘しながら、少しずつできることを増やしています。スキルを身につけると達成感があり、もっとプログラミングについて勉強したいと思うようになりました。

学習することはたくさんありますが、それを乗り越えることでできることがどんどん増えていくというのは、ものすごい充実感があります。まるでモンハンでどんどんと強いモンスターを倒す感覚です。

あなたが今持っているスキルと組み合わせれば鬼に金棒

あなたはセールスマンでしょうか❔それともデザイナー?銀行員でしょうか?

であれば、プログラミングを学ぶことは大きなチャンスです。プログラミングを学ぶことでスキルの掛け算が発生します。 プログラミングだけが得意なエンジニアはたくさんいますが、スキルを組み合わせることで、あなたの市場価値を一気に高めることができます。

  • マーケティング☓プログラミング
  • デザインセンス☓プログラミング
  • 金融知識☓プログラミング

また、あなたが今持っている知識を活かして、WEBサービスやアプリを作ることができるかもしれません。自分でWEBサービスを作って生活していければ、会社をやめて独立することだって可能です。

クラウド会計ソフトのfreeeを立ち上げた佐々木さんはエンジニア経験のなマーケッターだったのは、ボクを勇気づけてくれました。

読者登録をお願いします

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

みんなのPython 第4版

みんなのPython 第4版

Google Apps Scriptでfreeeの取引データを取得してスプレッドシートに保存する方法

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

前回は、freeeのAPIを利用するためにOauth2認証にそって、アクセストークンを取得する方法を解説しました。

tadaken3.hatenablog.jp

今回は、取得したアクセストークンを利用して、freeeの取引データをAPI経由で取得して、スプレッドシートに書き出してみます。アクセストークンさえ取得できれば、あとは簡単です。1

前回のおさらい

前回はアクセストークンを取得して、取得したアクセストークンを使って事業所のデータを取得し、ログに出力するところまで解説しました。

簡単におさらいしておくと

  1. alertAuthメソッドでfreeeの認証をおこなう
  2. getCompanyIdで認証後に取得したアクセストークンを利用し、事業所のデータを取得

という流れです。前回のコードはこちら。

//先程取得したAppID・Sceretを入力
var appId = "あなたのApp id";
var secret = "あなたのシークレット";

// 認証のエンドポイントとなるダイアログを表示します。
function alertAuth() {
  var service = getService();
  var authorizationUrl = service.getAuthorizationUrl();
  var template = HtmlService.createTemplate(
    '<a href="<?= authorizationUrl ?>" target="_blank">認証</a>. ' +
    '認証が完了したら再度操作を行ってください。');
  template.authorizationUrl = authorizationUrl;
  var page = template.evaluate();
  SpreadsheetApp.getUi().showModalDialog(page, "認証が必要です");
  Logger.log("認証が切れています");
}

//freeeAPIのサービスを取得
function getService() {
  return OAuth2.createService('freee')
      .setAuthorizationBaseUrl('https://secure.freee.co.jp/oauth/authorize')
      .setTokenUrl('https://api.freee.co.jp/oauth/token')
      .setClientId(appId)
      .setClientSecret(secret)
      .setCallbackFunction('authCallback')
      .setPropertyStore(PropertiesService.getUserProperties())
}

//認証コールバック
function authCallback(request) {
  var service = getService();
  var isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証に成功しました。タブを閉じてください。');
  } else {
    return HtmlService.createHtmlOutput('認証に失敗しました。タブを閉じてください。');
  }
}

//認証後、取得したアクセストークンを元にfreeeAPIからカンパニーIDを取得する
function getCompanyId() {
  var freeeApp = getService();
  var token = freeeApp.getAccessToken();
  var options =
   {
     "method"  : "get",
     "headers" : {"Authorization" : "Bearer "+ token}

   };
  var res = UrlFetchApp.fetch("https://api.freee.co.jp/api/1/companies",options);
  Logger.log(res)
}

以下はレスポンスの例になります。ログにこのようなデータが出力されているはずです。

{
  "company" : {
    "id" : 1,
    "name" : "freee事務所",
    "name_kana" : "フリージムショ",
    "display_name" : "freee事務所",
    "role" : "admin",
    "account_items" : [ ... ],
    "taxes" : [ ... ],
    "items" : [ ... ],
    "partners" : [ ... ]
  }
}

事業所のデータからカンパニーIDを取得する

次に、この事業所のデータからカンパニーIDを取り出します。カンパニーIDはfreeeの事業所識別するIDです。取引データを取得・追加するときに必要になってきます。2

JSON形式で保存されているので、getCompanyIdメソッドを以下のように書き換えます。

APIの詳細は以下もご覧ください。

freee APIドキュメント

function fetchFreee(url) {
  var freeeApp = getService();
  var token = freeeApp.getAccessToken();
  var options =
   {
     "method"  : "get",
     "headers" : {"Authorization" : "Bearer "+ token}

   };
  var json = UrlFetchApp.fetch(url,options).getContentText();
  var jsonData = JSON.parse(json);
  return jsonData
}

function getCompanyId() {
  var jsonData = fetchFreee("https://api.freee.co.jp/api/1/companies")
  var companyId = jsonData['companies']['0']['id'];
  return companyId
}

データを取得するたびにfreeeのAPIにアクセスするため、処理を抽象化して、fetchFreeeメソッドを追加しています。fetchFreeeはエンドポイントとなるURLを渡すことでJSONを返します。

取引一覧のデータを取得する

freeeでは、取引という概念で収入と支出を管理しています。発生日、支払期日、金額、支払残額、収入か支出か、決済口座などの情報が取引データを見るとわかります。

取引の一覧を取得すること、スプレッドシート上で収支の分析ができるようなります。

取引のAPIに関する情報はこちらをご覧ください。

freee APIドキュメント

今回は試しに取引発生日、収支のタイプ、金額、備考欄を取得してみます。 JSONがネストしているので注意してください。また、今後スプレッドシートでやり取りしやすいように二次元配列で値を返すようにしています。

function getSalesData() {
  var companyId = getCompanyId();
  var dealsData = fetchFreee("https://api.freee.co.jp/api/1/deals?company_id=" + companyId);
  
  //deals
  var dataCnt = dealsData["deals"].length;
  var arr = [];
  
  for(var i=0; i<dataCnt; i++){
    var issue_data   = dealsData["deals"][i]["issue_date"]
    var type         = dealsData["deals"][i]["type"]
    var amount       = dealsData["deals"][i]["amount"]
    var description  = dealsData["deals"][i]["details"][0]["description"]
    arr.push([issue_data, type, amount, description])
  }
  return arr
}

取得したデータをスプレッドシートに書き出す

最後に取得したデータをスプレッドシートに書き出すメソッドを追加します。dataというシートを事前に作成しておいてください。実行すると取得したfreeeの取引のデータが出力されます。

//detaというシートに取得したデータを書き出す。
function setDataToSheet(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('data'); 
  var arr = getSalesData()
  var lastRow = arr.length;
  var column = arr[0].length;
  Logger.log(arr)
  sheet.getRange(2,1,lastRow,column).setValues(arr);
}

ちょっと長くなってしまったので、すべてまとめたものはGistにおいておきます。

freee-get-deals.gs · GitHub

まとめ

今回はfreeeのAPIを使って

  1. カンパニーIDを取得
  2. 取引一覧のデータを取得
  3. 取得したデータをスプレッドシートに書き出す

上記の3つをおこなう方法を解説しました。freee自体で様々な指標を確認することはできるのですが、スプレッドシートに書き出すことで、自分自身で経営分析をいろいろな観点でできるようになります。

このブログについて

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも) 読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。


  1. freeeのAPIを利用するには、法人プランの場合、ライト、ビジネス、エンタープライズ。個人プランの場合はスターター、スタンダード、プレミアムのいずれかを利用している必要があります。

  2. アカウントに2つ以上事業所を登録している方は、操作したい事業所のカンパニーIDを取得しましょう。

スプラトゥーン2がさらに楽しくなるイカしたWebサービスとかを集めてみた

f:id:tadaken3:20180325125803p:plain

こんにちは!
ケッチャプが好きなタダケン(@tadaken3)です。

「スプラトゥーン2」が楽しすぎて、生産性がガタ落ちの毎日です。 お察しください。

スプラトゥーン2は7月21日に発売され、発売日3日で67万本を販売したニンテンドースイッチの大人気ゲームです。 ニンテンドースイッチ本体が120万台の販売台数だそうで、装着率はなんと55%。 ニンテンドスイッチユーザーのふたりにひとりがスプラトゥーン2を遊んでいる計算になります。

今回はスプラトゥーン2関連のイカしたWEBサービスをまとめました。1

ブキとギア構成を探せる「イカクロ」

「イカクロ」はスミ・ソニアンさんが公開しているスプラトゥーン2のギア構成の投稿&検索サイトです。

ブキ毎に人気のギア構成を調べることができます。自分の使っているブキでは、流行りのギア構成をチェックしてみるといいかもですね。 ちなみにボクはヒッセン・スプラマニューバをメインで使っています。

www.ikaclo.jp

スプラユーザーを探せる「イカナカマ2」

スプラトゥーンの交流サービス「イカナカマ2 」です。Twitterアカウントで、スプラトゥーン2の仲間を見つけたり、チームを作って交流することができます。 前作のスプラトゥーンに引き続き、スプラトゥーン2にも対応されています。中の人はナカノイカ2さん

スプラトゥーン2はリーグマッチやローカルプレイなど、みんなで遊ぶモードもより強化されてますので、イカナカマ2でイカしたナカマを見つけれると、スプラトゥーン2がより楽しめること請け合いです。

ikanakama.ink

関東の企業が集まって対戦する「Splathon」

WEBサービスではありませんが、関東近郊の企業が集まって、企業対抗のスプラトゥーン大会「Splathon」が開催されています。 主催はデジタルコンサルティング・インターネットメディア事業をおこなっているspeeeです。 参加企業にはドワンゴ、CyberAgent、博報堂、シャープ、スクウェア・エニックスなど挙がっておりそうそうたるメンツです。

過去のSplathonの様子はこちら。楽しそうです。

tech.speee.jp

tech.speee.jp

ぜひ参加してみたいです。

Switchの在庫状況を通知する「nintendo-switch-checker」

ニンテンドースイッチはスプラトゥーン2の人気も相まって、品薄でなかなか手に入らない状況です。 スプラトゥーン2を遊びたいんだけど、ニンテンドースイッチ本体を手に入れるのに苦労しているあなた。 「nintendo-switch-checker」を使ってみてはいかがでしょうか。

nintendo-switch-checkerはニンテンドーSwitchの在庫状況を通知してくれるGolangで書かれたアプリです。 作者ははやぶささん

仕組みは、Google App Engine上で動かして、ニンテンドーストア、各家電サイトをクロールして、在庫情報を通知してくれるというものです。 通知はSlackとLINE Notifyに対応している模様。

まだSwitchをゲットできてない方はこちらを活用してみると、Switchがゲットできるかもしれません。

github.com

まとめ

スプラトゥーン2はまだまだ始まったばかり。アップデートは1年間。フェスは2年間にわたり開催予定と公式に発表されています。 イカしたWEBサービスを活用して、スプラトゥーン2をよりエンジョイできるといいですね。

ボクはガチマッチのウデマエS+を目指して頑張りたいと思います!

今回の記事はいかがでしたか?

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも) 読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。

スプラトゥーン2 ザ・コンプリートガイド

スプラトゥーン2 ザ・コンプリートガイド


  1. ご紹介しているサービスは、すべて非公式のものになります。任天堂株式会社とは一切関係のないサービスです。

Google Apps Scriptでfreee APIのアクセストークンを取得する

f:id:tadaken3:20180325120255p:plain

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

前回はクラウド会計ソフトfreeeの概要とプログラマにfreeeをオススメする理由をご説明しました。 freeeはクラウド会計ソフトの中でもっともAPIが充実しているのがオススメの理由でした。

tadaken3.hatenablog.jp

今回は実際に、Google Apps ScriptでfreeeのAPIを利用する方法をお伝えします。今回は最初の一歩としてAPIを操作するために必要なアクセストークンの取得方法を解説します。

freeeのAPIを利用するには、法人プランの場合、ライト、ビジネス、エンタープライズ。個人プランの場合はスターター、スタンダード、プレミアムのいずれかを利用している必要があります。

freeeのAPIを利用するには

freeeのAPIはOAuth2.0というプロトコルに対応しています。オーオースと読みます。GoogleスプレッドシートからfreeeのAPIを利用するには、Google Apps Scriptを利用します。Google Apps ScriptでOAuth2.0の形式にのっとって、アクセストークンの発行を行ないます。

本記事ではOAuth2.0自体の詳しい説明はしませんが、ご興味がある方は以下の記事が参考になります。

murashun.jp

Google Apps ScriptでOauth2ライブラリを利用する

Google Apps ScriptでOauth2を利用するには、「apps-script-oauth2」ライブラリを利用します。 「apps-script-oauth2」はGoogleのエンジニアが作成したライブラリです。

https://github.com/googlesamples/apps-script-oauth2

ライブラリを利用するには、ツールバーの[リソース]->[ライブラリ]を選択して以下のIDを入力します。

プロジェクトキー 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

f:id:tadaken3:20170731141636p:plain

最新のバージョンを選択して保存してください。本記事執筆時点ではバージョン21が最新です。

また、freee側にGoogle Apps Scriptをアプリとして登録する必要があります。その際にスクリプトIDが必要になるのでメモをしておきます。

スクリプトIDはスクリプトエディターのツールーバーの[ファイル]->[プロジェクトのプロパティ]から確認できます。

f:id:tadaken3:20170731141654p:plain

freeeにアプリの登録をする

freee APIを利用するアプリケーションをfreeeのWEBサイトから登録します。

登録により、アプリケーションのIDとSecretが発行されます。登録するためには会計freeeにログイン後、以下のサイトにアクセスします。

https://secure.freee.co.jp/oauth/applications

アプリケーション名、コールバックURIを入力し保存します。(入力内容は登録後にも編集できます)

アプリケーション名はお好きな名前を入力ください。サンプルでは「スプレッドシート」としています。

コールバックURIは先程取得したスクリプトIDを利用します。スクリプトIDの部分を変更して以下のURLを登録します。

コールバックURIhttps://script.google.com/macros/d/{スクリプト ID}/usercallback

f:id:tadaken3:20170731141713p:plain

保存を押すと登録が完了し、App IDとSecretが発行されました。こちらをメモしておきます。これで準備はすべてが整いました。

f:id:tadaken3:20170731141731p:plain

Google Apps Scriptをスプレッドシートに作成する

実際のスプレッドシートで動かすGoogle Apps Scriptのコードを作成していきます。以下のコードをスプレッドシートのスクリプトエディタに入力します。

//先程取得したAppID・Sceretを入力
var appId = "あなたのApp id";
var secret = "あなたのシークレット";

// 認証のエンドポイントとなるダイアログを表示します。
function alertAuth() {
  var service = getService();
  var authorizationUrl = service.getAuthorizationUrl();
  var template = HtmlService.createTemplate(
    '<a href="<?= authorizationUrl ?>" target="_blank">認証</a>. ' +
    '認証が完了したら再度操作を行ってください。');
  template.authorizationUrl = authorizationUrl;
  var page = template.evaluate();
  SpreadsheetApp.getUi().showModalDialog(page, "認証が必要です");
  Logger.log("認証が切れています");
}

//freeeAPIのサービスを取得
function getService() {
  return OAuth2.createService('freee')
      .setAuthorizationBaseUrl('https://secure.freee.co.jp/oauth/authorize')
      .setTokenUrl('https://api.freee.co.jp/oauth/token')
      .setClientId(appId)
      .setClientSecret(secret)
      .setCallbackFunction('authCallback')
      .setPropertyStore(PropertiesService.getUserProperties())
}

//認証コールバック
function authCallback(request) {
  var service = getService();
  var isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証に成功しました。タブを閉じてください。');
  } else {
    return HtmlService.createHtmlOutput('認証に失敗しました。タブを閉じてください。');
  }
}

//認証後、取得したアクセストークンを元にfreeeAPIからカンパニーIDを取得する
function getCompanyId() {
  var freeeApp = getService();
  var token = freeeApp.getAccessToken();
  var options =
   {
     "method"  : "get",
     "headers" : {"Authorization" : "Bearer "+ token}

   };
  var res = UrlFetchApp.fetch("https://api.freee.co.jp/api/1/companies",options);
  Logger.log(res)
}

Google Apps Scriptを動かしてみる

まずはalertAuthメソッドで認証をおこないます。alertAuthメソッドを実行するとスプレッドシートに画像にあるダイアログが出てきます。「認証」をクリックし、そのままfreeeのアカウントで許可をしてください。

f:id:tadaken3:20170731141753p:plain

許可するとアクセストークンが取得できるので、取得したアクセストークンを使ってfreeeのAPIを操作します。 サービスオブジェクトに対して、getAccessTokenメソッドを実行することでトークンが取得できます。

Point var freeeApp = getService();
var token = freeeApp.getAccessToken();

サンプルでは取得したトークンをもとにAPI経由でカンパニーIDを取得しています。 getCompanyIdメソッドを実行するとカンパニーIDがログに出力されます。

まとめ

今回は、Google Apps Scriptでfreeeのアクセストークンを取得する方法をお伝えしました。 まとめると

  • Oauth2ライブラリの利用方法
  • freeeのアプリ登録方法
  • Google Apps Scriptでのアクセストークン取得方法

になります。

これでGoogle Apps Scriptでfreee APIを操作する準備が整いました。次回もGoogle Apps ScriptでfreeeのAPIを操作するテクニックをお伝えしていきますね。どうぞ、お楽しみに!

今回の記事はいかがでしたか?

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも) 読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。

フリーランスエンジニアにオススメの会計ソフト「Freee」で決まり!

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

クラウド会計ソフトはフリーランスや副業をしている方にとっても強い味方です。今回はクラウド会計ソフトの概要とオススメのサービスについてまとめました。

クラウド会計を利用して経理・決算業務をラクしちゃいましょう!

クラウド会計ソフトとは?

フリーランスや副業をする上で避けては通れない経理作業と確定申告。私たち日本人には納税の義務が課せられていますから、所得があるならば納税をしなければいけません。

事業に関係する日々出ていくお金と入ってくるお金を、会計的なルールに則って全て記録しておく必要があります。

そして年が明けますと年末までの記録を元にあれこれ計算をして確定申告書類を作成して税務署に提出をします。これが結構、大仕事です、

本来の仕事で忙しいのに、皆さんのための協力な味方がクラウド会計ソフトです。クラウド会計ソフトを使えば、煩雑な経理・確定申告業務が大幅に効率化できます。

クラウド会計ソフトのメリット

クラウド会計ソフトのメリットを具体的にご紹介します。

OS、端末を選ばない

従来型インストール型の会計ソフトの多くはWindowsにしか対応してなかったりします。ただエンジニア・デザイナーとして仕事している方のMacを使っている方も多いと思います。

一方でクラウド会計ソフトはネット上のサービスですので、OSや端末を選びません。ブラウザさえ使えれば、Windows以外のPCやタブレットなどからも利用することができます。

ネットバンクやクレジットカードのデータを自動で取得できる

ネットバンクやクレジットカードのデータを自動で取り込むことができます。細かい設定などは必要ですが、最初に登録しておけば、多くの取引を自動で処理することができます。

税法改正などにあわせて常に最新のバージョンが利用できる

従来型のインストール会計ソフトですと税法の快晴などに合わせて、最新版を購入し直さなければなりません。バージョンアップするたびに費用がかかります。平成31年10月には消費税法改正(8%→10%)も控えています。しかし、クラウド会計ソフトの場合は、月額またな年額の課金制ですので、常に最新版が利用できます。これは大きな魅力です。

クラウド会計ソフトはたくさんあるけど、結局どれがいいの?

「Freee」と「MFクラウド会計」「やよい会計オンライン」など多くの種類があります。とくに有名なのはクラウド会計ソフトの元祖「Freee」とマネーフォワードが提供する「MFクラウド会計」の2つです。「Freee」と「MFクラウド会計」を比較している記事はネット上でもたくさん見つかります。基本料金、使いやすさ、サポートの充実度を比較されています。

ただ、もしあなたが「プログラミングができる」もしくは「プログラミングに興味がある」というのであれば、ボクは「Freee」を圧倒的にオススメします。

www.freee.co.jp

Freeeは圧倒的にAPIが充実している

正直なところ、基本的なサービスは「Freee」も「MFクラウド会計」もそれほど大きな違いはありません。少なくとも経理処理をして、決算をすることは確実にできます。

では、なぜ「Freee」をおすすめするのでしょうか。

それはFreeeはWebAPIが非常に充実しているからです。

APIが充実しているのでプログラミングができれば、経理処理を自動化できます。例えば、エクセルやスプレッドシートで、細かい経費の管理をしているとします。Freeeであれば、VBAやGooogle Apps Scriptを使って、ボタン一発でFreeeに登録することができたりします。今のところ、仕訳データの記録や取得ができるのはFreeeだけです。(MFクラウド会計は請求書のみAPIが提供されています)

ほかにも、日々の売上データを取得してダッシュボードを作成し、経営分析を行なったりすることもできます。

Freeeが提供しているサービス以外の部分も、自動化したり機能を拡張していくことができるのです。開発者コミュニティも用意されていて、わからないことはFreeeの開発者に問い合わせることも可です。

また、APIが充実しているので、今後Freeeのデータを活用したサービスもたくさん生まれてくると予想されます。すでにAIでの経営分析のサービスを提供する会社もでてきました。

www.freee.co.jp

まとめ

今回はクラウド会計ソフトの概要とFreeeをなぜオススメするのかについてまとめました。 もし、あなたがエンジニア・デザイナーであれば、クラウド会計ソフトは「Freee」を利用されることを強くオススメします。

またこのブログでGoogle Apps Srciptとスプレッドシートを使って、Freeeを操作するテクニックをまとめていく予定です。

どうぞ、お楽しみに!

今回の記事はいかがでしたか?

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも)読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。