/var/log/messages

Mar 1, 2019 - 2 minute read - Comments - programming

プログラミング Elixir (22)

13.9 変換: 最初の n 個を取り出す、の節。パイプで繋いで head する的な機能ですね。

Enum.take

を使う、とのこと。

  def process([user, project, count]) do
    Issues.GithubIssues.fetch(user, project)
    |> decode_response
    |> convert_to_list_of_maps
    |> sort_into_ascending_order
    |> Enum.take(count)
  end

要工夫

という練習問題が出てますね。曰く

データを、章の冒頭サンプルのようなカラムに変換するコードが書けるか考えてみよう。

とのこと。章の冒頭サンプルって何でしたっけ。現時点での実装を動かしてみます。

$ mix run -e 'Issues.CLI.run(["elixir-lang", "elixir"])'
** (FunctionClauseError) no function clause matching in Issues.CLI.process/1    
    
    The following arguments were given to Issues.CLI.process/1:
    
        # 1
        {"elixir-lang", "elixir", 4}
    
    Attempted function clauses (showing 2 out of 2):
    
        def process(:help)
        def process([user, project, count])

動かない、と思ったら process の定義がダウトでしたorz

  def process([user, project, count]) do

上のようになっていたので以下に修正orz

  def process({user, project, count}) do

老人なので kindle だと識字率がアレ (言い訳orz) なのです。そして、再度実行してみると以下。

$ mix run -e 'Issues.CLI.run(["elixir-lang", "elixir"])'
Compiling 1 file (.ex)
warning: function Poison.parser/0 is undefined (module Poison is not available)
Found at 2 locations:
  lib/issues/github_issues.ex:16
  lib/issues/github_issues.ex:20

** (UndefinedFunctionError) function Poison.parser/0 is undefined (module Poison is not available)
    Poison.parser()

ライブラリ取得していないのかな。と思ったら mix.exs 上書きしてなかた。ええと、mix deps.get してリトライしてみるに出力が以下。

** (UndefinedFunctionError) function Poison.parser/0 is undefined or private

なんだろう。

  def handle_response({ :ok, %{status_code: 200, body: body}}) do
    { :ok, Poison.parser.parse!(body)}
  end

  def handle_response({ ___, %{status_code: ___, body: body}}) do
    { :error, Poison.parser.parse!(body)}
  end

Poison.Parser ですねorz そしてリトライしてみたら以下。

$ mix run -e 'Issues.CLI.run(["elixir-lang", "elixir"])'
Compiling 1 file (.ex)
warning: the underscored variable "___" appears more than once in a match. This means the pattern will only match if all "___" bind to the same value. If this is the intended behaviour, please remove the leading underscore from the variable name, otherwise give the variables different names
  lib/issues/github_issues.ex:19

とほほ過ぎる。以下の部分ですね。

  def handle_response({ ___, %{status_code: ___, body: body}}) do
    { :error, Poison.Parser.parse!(body)}
  end

最初のアンスコは一つでした。そして何も出力されない状態orz

$ mix run -e 'Issues.CLI.run(["elixir-lang", "elixir"])'
Compiling 1 file (.ex)

問題処理

IO.inspect してみます。

  def process({user, project, count}) do
    Issues.GithubIssues.fetch(user, project)
    |> IO.inspect
    |> decode_response
    |> convert_to_list_of_maps
    |> sort_into_ascending_order
    |> Enum.take(count)
  end

データは取得できてる模様。。Enum.take の出力も 4 件になってました。戻りが表示できないナニだから何も出力されないと判断します。

ちなみに

一件あたりの情報がけっこうでかい。番号と created_at と title はそれぞれ

  • number
  • created_at
  • title

で取り出し可能ですね。ここで一旦エントリ投入します。