Nerves에서 target (Raspberry Pi 등)으로 움직일 때는 이쪽, host (macOS 등)로 움직일 때는 그쪽

9840 단어 NervesElixir
(이 기사는 "#NervesJP Advent Calendar 2019"의 7 일째입니다)
어제는 요스케의 "Nerves와 GraphQLsever의 조합을 생각하는 "Poem""입니다! 이쪽도 꼭 꼭!

소개



  • 날씨 웹 서비스 (Livedoor Weather Web Service / LWWS)을 사용해 주셔서 일기 예보의 정보를 취득해 Twitter에 중얼거리는 것을 Nerves로 해 보았습니다
  • Nerves를 사용하여 Raspberry pi2에서 Twitter 게시

  • 이것을 할 때 개발 도중에 일일이 microSD 카드에 구워 Nerves 위로 움직이는 것이 귀찮다고 생각했습니다
  • 조금 곤란한 적이있었습니다

  • 조금 곤란한 것의 구체적인 예



  • Nerves에서 움직이는 것을 호소하기 위해 "I use Nerves. I like it!"를 삽입하려고합니다
  • .

    lib/weather/forecast.ex
    defmodule Weather.Forecast do
      def run({city, name}) do
        description =
          "http://weather.livedoor.com/forecast/webservice/json/v1?city=#{city}"
          |> HTTPoison.get!()
          |> Map.get(:body)
          |> Poison.decode!()
          |> Map.get("description")
          |> Map.get("text")
          |> String.split()
          |> Enum.reduce_while("#{name}\n", fn s, acc ->
            if String.length(acc <> "#{s}\n") < 140 - String.length(i_use_nerves()),
              do: {:cont, acc <> "#{s}\n"},
              else: {:halt, acc}
          end)
          |> Kernel.<>(i_use_nerves())
      end
    
      def run do
        cities() |> Enum.random() |> run
      end
    
      defp i_use_nerves do
        "I use Nerves. I like it!"
      end
    
  • 이렇게 쓰면 microSD 카드에 구워 Nerves로 움직이고 있을 때는 문제 없습니다만, 개발 도중에 host(macOS등)로 움직이고 있을 때는, "I use Nerves. I like it!" 없음
  • 결국 마지막은, Nerves 로 움직이기 때문에, 그런 사소한 것 신경쓰지 않아도 좋을지도 모릅니다
  • 이 상태로, Twitter에 투고할 때까지를 테스트하고 싶을 때에는, "I use Nerves. I like it!"가 들어 버리므로, 조금 거짓말쟁이가 됩니다
  • 무엇인가 컴파일 스위치라고 할까 그런 것으로, target(Raspberry Pi등)로 움직일 때는 이쪽, host(macOS등)로 움직일 때는 그 쪽이 할 수 없는 것인가라고 조사해 보았습니다

  • Mix.target() => (사용할 수 없음)


  • mix nerves.new hello_nervesconfig/config.exs 할 수있는 Mix.target() 설명이있었습니다

  • config/config.exs
    if Mix.target() != :host do
      import_config "target.exs"
    end
    
  • 이것으로

  • lib/weather/forecast.ex
      defp i_use_nerves do
        if Mix.target() != :host do
          "I use Nerves. I like it!"
        else
          ""
        end
      end
    
  • 무슨 일이 일어나는지 궁금해.
  • 그러나 이것을 microSD 카드에 담그고 Raspberry Pi2로 움직여도 움직이지 않습니다
  • Mix.target() 왜 사용할 수 없는 오류가 나옵니다

  • 해결책



    lib/weather/forecast.ex
      defp i_use_nerves do
        if Application.get_env(:hello_nerves, :target) != :host do
          "I use Nerves. I like it!"
        else
          ""
        end
      end
    
  • 다른 좋은 방법이있을 수 있습니다
  • 여기에서 얻은 지식은 jbernardo95/cronexNerves 응용 프로그램에서 사용하려고 할 때 Mix.env를 사용할 수없는 과도한 오류가 발생했으며 오류를 조사 할 때 어딘가 들었던 이야기라고 핀

  • if (condition, clauses)의 condition을 != 대신 ==로 작성하고 싶습니다.


  • 2019/12/22 추가
  • if Application.get_env(:hello_nerves, :target) != :host 부분
  • Nerves on Raspberry Pi 2에서 움직여 보았습니다
  • iex> Application.get_env(:hello_nerves, :target)
    :rpi2
    
  • MIX_TARGET로 설정 Targets TAG가 반환되는 것 같습니다
  • if Application.get_env(:hello_nerves, :target) == :rpi2 라고 쓸 수 없는 것은 아니지만, 다른 Target에서도 움직이는 것을 생각한다(갖고 있지 않지만 )와,

    요약


  • Leap before you look

  • 다음 번



    다음 번은 포지로의 "만들어 배우는 Nerves, BBB로 CO2 계측"입니다! 이쪽도 꼭 부디~

    좋은 웹페이지 즐겨찾기