/var/log/messages

Feb 22, 2019 - 3 minute read - Comments - programming

Metaprogramming Elixir (11)

直前エントリのハマり方が超酷い。今回どうなるのかorz

リトライしてみます

とりあえず本文の機械翻訳確認しつつ再度すすめる方向にて。

最初のソレから

あなたは私たちの最後の演習であなたのメタプログラミングスキルを次のレベルに引き上げ、あなたの Elixir の兵器庫に追加するための必須のツールをいくつか作成しました。 それでは、真面目な作業から抜け出して、Elixir が本当にどれだけ拡張性があるかを探りましょう。 フラットテキストファイルや Elixir のデータ構造からコードを生成するだけではありません。 GitHub のパブリック API から直接モジュールの機能を定義する Hub ミックスプロジェクトを作成しましょう。 関数呼び出しから直接プロジェクトに Web ブラウザを起動する機能を備えた、私たちの公開リポジトリに関する情報を埋め込んだモジュールを作成します。

で、ここから mix でプロジェクト作成しているのですが、ここで既に微妙だったです。

とりあえず

mix.exs の記述について確認した方が良いのかな。手元の Elixir のバージョンが

Elixir 1.7.3 (compiled with Erlang/OTP 21)

とのこと。確認したところでは

  • {:ibrowse, "~> 4.4"}
  • {:poison, "~> 4.0"}
  • {:httpotion, "~> 3.1"}

でどうなるか。あるいは逆に

  defp deps do
    [
      {:ibrowse, "~> 4.1.0"
      {:poison, "~> 1.3.0"},
      {:httpotion, "~> 1.0.0"}
    ]
  end

てしてみる、という手はアリかもしれません。両方やってみる方向。

やってみます

$ mix new hub
$ cd hub

以下でトライ。

  defp deps do
    [
      {:ibrowse, "~> 4.4"},
      {:poison, "~> 1.3.0"},
      {:httpotion, "~> 1.0.0"}
    ]
  end

当初、ナチュラルなボケをカマシていたのは秘密。

$ mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
New:
  httpotion 1.0.0
  ibrowse 4.4.1
  poison 1.3.1
* Getting ibrowse (Hex package)
* Getting poison (Hex package)
* Getting httpotion (Hex package)

記載を機械翻訳してみます。て直前エントリで羅列してました。再掲が以下です。

  • メインの hub.ex モジュールを開き、リモート API からコードを生成
  • GitHub のパブリック API にアクセスして GitHub のユーザー名の下にあるすべてのリポジトリを取得し、JSON 本体を Elixir マップにデコード
  • 次に、各結果から、関数名がリポジトリの名前で、関数本体が各 GitHub プロジェクトに関するすべてのデータである関数を定義
  • 最後に、リポジトリの名前を受け取り、そのURLに対してWebブラウザを起動するgo関数を定義

ここで、hub/lib/hub.ex 投入なのか。

defmodule Hub do
  @moduledoc """
  Documentation for Hub.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Hub.hello()
      :world

  """
  Httpotion.start
  @username "yamanetoshi"

  "https://api.github.com/users/#{@usernae}/repos"
  |> HTTPotion.get(["UserAgent": "Elixir"])
  |> Map.get(:body)
  |> Poison.decode!
  |> Enum.each fn repo ->
      def unquote(String.to_atom(repo["name"]))() do
        unquote(Macro.escape(repo))
        end
      end

      def go(repo) do
        url = apply(__MODULE__, repo, [])["html_url"]
        IO.puts "Launching browser to #{url}..."
        System.cmd("open", [url])
      end
end

で、iex -S mix してみたら以下な出力 (末端のみ)。


21:47:11.304 [error] Loading of /Users/rms/Documents/elixir/metaprogramming-elixir/hub/_build/dev/lib/httpotion/ebin/Elixir.Httpotion.beam failed: :badfile 

 
21:47:11.304 [error] beam/beam_load.c(1428): Error loading module 'Elixir.Httpotion':
  module name in object code is Elixir.HTTPotion



21:47:11.304 [error] beam/beam_load.c(1428): Error loading module 'Elixir.Httpotion':
  module name in object code is Elixir.HTTPotion


 
21:47:11.304 [error] Loading of /Users/rms/Documents/elixir/metaprogramming-elixir/hub/_build/dev/lib/httpotion/ebin/Elixir.Httpotion.beam failed: :badfile 

 
== Compilation error in file lib/hub.ex ==
** (UndefinedFunctionError) function Httpotion.start/0 is undefined (module Httpotion is not available)
    Httpotion.start()
    lib/hub.ex:15: (module)
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6

どうも Httpotion というナニが unavailable らしい。

  Httpotion.start

てしてました。以下に修正してリトライ。

  HTTPotion.start

出力が以下。

== Compilation error in file lib/hub.ex ==
** (Poison.SyntaxError) Unexpected token: R
    lib/poison/parser.ex:56: Poison.Parser.parse!/2
    lib/poison.ex:83: Poison.decode!/2
    lib/hub.ex:21: (module)
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6

以下の部分らしい。

  |> Poison.decode!

色々試しているのですが

駄目状態。別件対応あるので今日も一旦置きます。ソースは以下で。

defmodule Hub do
  @moduledoc """
  Documentation for Hub.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Hub.hello()
      :world

  """
  HTTPotion.start
  @username "yamanetoshi"

  "https://api.github.com/users/#{@username}/repos"
  |> HTTPotion.get(["UserAgent": "Elixir"]).body
  |> Poison.decode!
  |> Enum.each fn repo -> 
      def unquote(String.to_atom(repo["name"]))() do
        unquote(Macro.escape(repo))
      end
    end

    def go(repo) do
      url = apply(__MODULE__, repo, [])["html_url"]
      IO.puts "Launching browser to #{url}..."
      System.cmd("open", [url])
    end
end

以下な出力です。

$ iex -S mix
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Compiling 1 file (.ex)
warning: parentheses are required when piping into a function call. For example:

    foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

    foo(1) |> bar(2) |> baz(3)

Ambiguous pipe found at:
  lib/hub.ex:21


== Compilation error in file lib/hub.ex ==
** (ArgumentError) cannot convert the given list to a string.

To be converted to a string, a list must contain only:

  * strings
  * integers representing Unicode codepoints
  * or a list containing one of these three elements

Please check the given list or call inspect/1 to get the list representation, got:

[UserAgent: "Elixir"]

    (elixir) lib/list.ex:826: List.to_string/1
    (httpotion) lib/httpotion.ex:157: HTTPotion.request/5
    lib/hub.ex:19: (module)
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6

とほほ。

Metaprogramming Elixir (10) 環境設定

comments powered by Disqus