週末ライダーの朝は早い

週末ライダーのバイク以外のメモ

Hello Worldなんていらない。新たにプログラミング言語を習得する時に作るべきプログラム

あるプログラミング言語を習得しようとして、「言語名 入門」 などで検索して出てくる入門サイトには、必ずと言っていいほど最初の例として Hello World と出力させようとします。当たり前ですが、これだけできても何の役にも立ちません。
なので、自分が思う、Hello Worldに代わるプログラムについて書きます。

なぜHello Worldではダメなのか

冒頭にも書きましたが、ただ決まった文字列を出力するだけプログラムなんていうのは作る意味がありません。たしかに標準出力というのは一番基本的なプログラムかもしれませんが、あまりにも基本的すぎます。
プログラムを書くということは何かしらのアプリケーション(Web、ネイティブアプリ、バッチ処理...)を作ることになりますが、殆どの場合それらはデータベースとの接続や、外部APIなどと連携します。
どうせ作るならそういった用を含んだ簡単なプログラムを作って、その中で言語ごとの関数や書き方をマスターしていったほうがいいです。

対象となる人

既に何かしらの言語をある程度触っている人が、新たに別の言語を習得する必要がある時 がメインの対象となるかと思いますが、もちろん何の言語も知らないプログラミング初心者の方も、この方法で始めてもいいと思います。
いきなり「Hello World」と出力するプログラムを書いてみましょう と言われるより、こんなアプリケーションを作ってみましょう と言われてそれに向けて色々調べていくほうが作っていく実感とかつながりとかを意識しやすいでしょう。(自分はそうでした)

ブログの更新通知

では本題ですが、Hello Worldの代わりに作るべきプログラムは、ブログの更新通知 です。
更新通知のサービス自体は、各種ブログサービス、RSSなどで提供されていますが、これって実はプログラミング言語の修得にはちょうどいい例なんです。

最終的なゴール

更新通知としてやりたいことは、以下のことです。

  • 30分毎に対象のブログ(URL)に対してアクセスをする
  • 新たに更新された記事があれば、Twitterに「タイトル URL」をツイートする

ものすごく単純な内容ですが、処理を細かく書き出すと、基本的な処理が色々と詰め込まれています。
以下、プログラムの流れと、必要になる(修得できる)であろう技術を簡単に書いてます。関数の例はPHPの場合です。

メインのプログラムの流れ

  • 指定したURL(ブログトップ)からHTMLソースを取得する
    file_get_contents()を使います。
  • 取得したHTMLソースから記事一覧部分のソースを抜き出す
    preg_match()等の関数を使います。正規表現の勉強になります。
    new DOMDocument してxmlとして読み込むと、XMLの勉強になります。
  • 記事一覧部分のソースから、各記事のタイトル、URL等を抜き出す
    記事ごとにかたまりがあるので、そのかたまりごとに処理をします。ループ処理の勉強になります。
  • 抜き出したURLが既にDBに保存されているか(すでにツイート済みか)チェックする(DBへのselect)
  • 既に存在していればスキップ、存在していなければ通知対象
  • 抜き出したタイトル、URLをもとに、通知内容の文字列を生成する
    定型文の中に埋め込む場合、sprintf()とか使えそうです。
    Twitterに投稿する場合、文字数にも注意します。長ければ切り出します。文字列の扱い方の勉強になります。
  • 生成した文字列をTwitterAPIを使ってツイート ここは外部のライブラリを使うことになると思いますが、それも要素のひとつです。
  • ツイートが成功したURLを保存する(DBへのinsert)

外部APIとの連携

今回はTwitterの例ですが、その他SlackやInstagramなどAPIを提供しているところはだいたい同じような流れです。

  • Twitter Developerでアプリを作成
  • consumer_key, consumer_secret, access_token, access_token_secretを取得
  • 公式のAPIドキュメントを見て、エンドポイント、パラメータ等を確認する

サーバの設定

  • cronで30分毎に実行されるように設定する

追加機能

以下の追加機能を実装すると、より実践的な内容になります。画面については、Webアプリケーションの作成で欠かせないMVCの概念を勉強するために作ってみたほうが良いです。

  • 過去にツイートしたURLの一覧を画面で確認できるようにする(タイトルや更新日時等の情報も一緒に)
  • 処理実行時のログを出力する(日付ごとのファイル)
  • 処理中にエラーがあった場合はメールに通知

このプログラムを作る上での注意点

更新されているかどうかを対象のURLにアクセスして確認するので、必要以上にアクセすることはやめましょう。
最悪使っているサーバからのアクセスを遮断されます。

プログラミング超初心者が初心者になるためのPython入門(1) セットアップ・文字列・数値編

まとめ

これならどの言語でも実装できそうなのと、基本的なことが色々詰まっているので、新たな言語を始めるときには良い例かなと思います。