Juliaのはじめ方 - JuliaとTwilioでSMSを送信する方法

July 09, 2021
レビュー担当者

Juliaのはじめ方 - JuliaとTwilioでSMSを送信する方法

この記事はMatthew Gillardこちらで公開した記事(英語)を日本語化したものです。

初回リリースが2012年であるJuliaは、機械学習や分散コンピューティングなど、主に数値・科学計算用に設計されたプログラミング言語です。しかし、汎用のプログラミング言語としても使用できるうえ、興味深い機能も備えています。

本稿では、Juliaの基礎知識とともに、その便利な機能をご紹介します。最後に簡単なスクリプトでTwilio APIを呼び出してSMSを送信する方法をご説明します。

Juliaの使い方

まずは、使用するOSに対応したバージョンのJuliaをダウンロードしてインストールするか、OSのパッケージマネージャーを使用してインストールをします。

Juliaが正しくインストールされているかを確認します。コマンドラインで以下を実行します。

$ julia --version

以下のようにJuliaのバージョンが表示されれば、正しくインストールされています。

julia version 1.7.1

次に、以下のコマンドを実行し、MyFirstJuliaディレクトリを新規作成し、ディレクトリに移動します。

mkdir MyFirstJulia
cd MyFirstJulia

続いてjuliaコマンドを実行して対話式REPLを開始します。Juliaの起動時に、ターミナルに次のような画面が表示されます。

REPL実行

自由にJuliaの使用感を試してみてください。新しい言語を使うとき、私はいつも次のことを確認しています。

  • 基本的な構文 - 数値の追加、文字列の連結、ループ、条件など
  • 関数の定義と呼び出し方法
  • エラーの表示方法
  • データの表現方法
  • 基本的な組み込み型

PythonやJavaScriptなどの言語を使用したことがあれば、Juliaの構文がとても自然であると感じられるでしょう。構文について詳しくは、Julia公式ドキュメントを参照してください。

次に、Juliaの簡単な使用例を紹介します。

julia> x = 10
10

julia> y = x+x
20
  
julia> z = 2x
20

この構文に少し驚く方もいらっしゃるかもしれません。例えば、z = 2xは、数学ではごく普通の式ですが、多くのプログラミング言語はこの構文をサポートしていません。さらに他にも数式と同じ形の構文も見られ、Juliaが科学計算用のプログラミング言語として使われてきたことが納得できます。実に興味深いところです。

Juliaの構文について、ここではこれ以上取り上げませんが、Getting Startedガイドで詳しい説明を確認することができます。構文については、後で実際に使用例を紹介しています。さて、さらにJuliaを使ってみて私が驚いたことをいくつかあげてみましょう。

  • インデックスが1から始まる。["one", "two", "three"][1]"one"になり、配列や文字列のゼロ番目の要素にアクセスするとエラーが返されます。
  • *文字列連結として使用される。例: "Hello" * "world" == "Hello world"
  • 関数の宣言が数式と同様にできる。例: f(x,y) = x+y
  • 関数から簡単に複数の値を返すことができる。次の関数が返すタプルは、構造分解が複雑に思えますが、構文はとてもシンプルです。
julia> sumAndProduct(x,y) = x+y, x*y
sumAndProduct (generic function with 1 method)
  
julia> a,b = sumAndProduct(2,3)
(5, 6)
  • 「逆方向」の除算が可能。例: 2\3 == 3/2
  • 複素数と有理数(分数)がサポートされている。有理数の構文は//を使用し、4//6の正確な値は2/3になります(少数近似やバイナリ近似でない)。
  • 演算子を関数として使用可能。例: +(2,3,4) == 2 + 3 + 4
  • バージョン番号リテラルがある。例: v"2.10" > v"2.9"
    通常の文字列ソートは2.102.9前になるため、これは便利です。

驚いたことはさらに2つあります。

  1. REPLに便利なインラインヘルプがあります。?を入力してヘルプモードを起動し、知りたいことを入力します。
インラインヘルプ
  • Juliaのエラーメッセージは読みやすく、役に立つ内容が多いと感じます。人の言葉で説明、提案をしてくれます。
エラーメッセージ

新しい言語を学ぶときは、考えることがさらにたくさんあります。エラーの処理方法、標準ライブラリ、 非同期コードの記述方法など挙げれば霧がなく、これらはほんの一例です。

あげればきりがなく、これらはほんの一例です。ですが、先にも述べたようにJulia公式ドキュメントがとても役に立ちますし、オンラインコミュニティでの議論を参照することも有益です。

Juliaについての説明は以上です。Juliaについてさらに詳しく知るためのきっかけになれば幸いです。

次に、Juliaを使ったプログラムを構築します。

このチュートリアルでは、Twilio APIを呼び出してSMSを送信するプログラムを構築します。JuliaでHTTPリクエストを送信する方法とJSONの解析方法を扱います。この2つは開発をするにあたって頻繁に行うタスクであり、簡単にこれらの処理ができない言語は使っていて快適ではありません。

Twilio APIを使用してSMSを送信する

Twilio APIを使用したSMS送信のコードは、HTTPリクエストを実行してJSONの応答を解析する必要があります。このために、次の2つの項目が必要になります。

  • Twilioアカウント(こちらのリンクからサインアップするとアップグレード時に無料クレジットを取得できます)。
  • Twilioの電話番号。Twilio ConsoleまたはCLIから取得できます。

必要な依存パッケージのインストール

依存パッケージをJuliaのデフォルトプロジェクトにインストールすると、システム全体で使用できるようになります。後で、プロジェクト固有の環境を作成することも可能です。JuliaのパッケージマネージャーPkgは、REPLから対話モードで使用できます。ターミナルで]を入力して対話モードに入り、次のように依存関係を追加します。

add JSON
add HTTP

上記の2つのコマンドによる出力は長くなるため、ここには記していません。完了すると、~/.juliaに依存関係がインストールされます。依存関係をインストールしたら、Ctrl + CまたはバックスペースキーでPkgを終了し、Ctrl + Dまたはexit()でREPLを終了します。

続いて、ファイルにソースコードを記述し、コマンドラインから実行します。コーディングはお好きなテキストエディターをお使いください。私はEmacsのjulia-modeが気に入っています。VS Codeでも、Juliaを使った開発環境がしっかりと準備されています。

Twilio認証情報の設定

TwilioアカウントSIDと認証トークンが必要になりますが、セキュリティの観点から値はハードコードしてはいけません。代わりに、環境変数として設定することをお勧めします。値はTwilio Consoleで確認できます。以下を実行し、環境に設定します。

export TWILIO_ACCOUNT_SID=ACxxxxxxxxxx
export TWILIO_AUTH_TOKEN=xxxxxxxx

Juliaはコードのこれらの値を読み取るために、ENVというグローバルDict(ディクショナリ)を使用します。

コードの記述

SendSms.jlファイルを作成し、次の内容を記述します。Juliaの特徴が見受けられる行にコメントを追加しておきました。

using HTTP
using JSON


# 位置指定引数と名前付き引数の区切りには「;」を使用する
# ここでは、名前付き引数のみ使用
function send_sms(;message, from, to)

        account_sid = ENV["TWILIO_ACCOUNT_SID"]
        auth_token  = ENV["TWILIO_AUTH_TOKEN"]

        # 文字列補間
        endpoint = "api.twilio.com/2010-04-01/Accounts/$account_sid/Messages.json"
        url = "https://$account_sid:$auth_token@$endpoint"

        # 嬉しい機能:
        #   help?> HTTP.URIs.escapeuri
        #        escapeuri(query_vals)
        #        URIのクエリ部分で通常エンコードされるような値のペアを
        #        パーセントエンコードして連結できる
        request_body = HTTP.URIs.escapeuri([:From => from, :To => to, :Body => message])

        request_headers = ["Content-Type" => "application/x-www-form-urlencoded"]

        try
            response = HTTP.post(url, request_headers, request_body)
            return JSON.parse(String(response.body))
            
        catch e
            
            if e isa HTTP.ExceptionRequest.StatusError
                # レスポンスステータスが 4xxまたは5xxだった場合は
                # APIレスポンスのボディでエラーを投げる
                error(JSON.parse(String(e.response.body))["message"])
                
            else
                # その他のエラーで、ハンドリングしきれないもの
                rethrow()

            end # if

        end # try/catch

end # function

result = send_sms(message="Hello from Twilio! ☎", from="<YOUR_TWILIO_NUMBER>", to="<YOUR_REAL_NUMBER>")
println(result["sid"])

[このコードをGithubで確認する]

JuliaからSMSを送信するために、46行目の<YOUR_TWILIO_NUMBER><YOUR_REAL_NUMBER>にTwilioの電話番号と、あなたの電話番号をそれぞれE.164フォーマットで設定します。次のコマンドをターミナルで実行して、SMSを送ります。

julia SendSms.jl

あなたの電話番号に以下のSMSが届きます。これで、JuliaでSMSを送信できました。

SMS

まとめ

はじめてJuliaをお使いの方は、どのような感想を持たれたでしょうか? 私は、これまでに見たことのない機能がとても興味深く思えました。さらに多くの機能があるため、より大きなプログラム、この言語の高度な機能を利用したものを作りたいと考えています。マクロをはじめ、非同期分散プログラミングは言語マニアの私にとってワクワクする要素です。

JuliaとTwilioでプログラミングをされる方や、興味深いプログラミング言語の情報を共有したい方は、ぜひお知らせください。 I can't wait to see what you build!(何を構築されるか、とても楽しみです!)