デバッグに便利なGDBですが、Raspberry Pi用にクロスコンパイルしてリモートデバッグを試してみました。
GNU関係のソフトは、必ずしもバージョンが新しければよいというわけではない(むしろ新しいバージョンだと思いもよらないバグがあったりする)のですが、今回はなんとなく新しめということで8.0で試してみました。
※よく見ると gdb-8.0.1.tar.gz というバージョンが出ているのでそっちの方がいいかも。
昨日の続き。
mixが動くようになって、 mix.exs を編集して mix deps.get でモジュールをダウンロードするところまではできた。
と、思っていた。
今日はGithub
を参考にいざ動かそうとしたら以下のようなエラーメッセージがでた・・・
今度はなんだ?いい加減エラーメッセージでコンソールが真っ赤に染まるのには飽きてきた。
$ iex -S mix Erlang/OTP 18 [erts-7.3] [source] [64-bit] [async-threads:10] [kernel-poll:false] ==> httpoison warning: the dependency httpoison requires Elixir "~> 1.2" but you are running on v1.1.0-dev == Compilation error on file lib/httpoison/base.ex == ** (CompileError) lib/httpoison/base.ex:452: function '<-'/2 undefined (stdlib) lists.erl:1337: :lists.foreach/2 (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
「httpoison を動かしたかったらElixir 1.2 を入れな!」
ということらしい。
httpoison のバージョンとかおとしたらもしかしたら動くのかもしれないが今日はやめておく。
その前に一言。
やりたいことができないこんなElixirじゃ、ぽいぞん。
そもそもどのレイヤーで依存関係が発生しているのかよく分からないがそんなに動かなくなるものかね・・・
mix 動かしたいだけなのに。
まぁ愚痴ってもしょうがないので今度はElixirのバージョンアップから試そう。
mix が動かない原因が分かった。
「elixir iex INFO REPORT」
でググるといくつか情報が出ていて、日本語の情報だとQiitaのこちらの記事が参考になりそうです。
qiita.com
※参考にさせて頂き、ありがとうございます (m_m)
ということで、原因は要するに、 Erlang/OTPとElixirのバージョンの相性ということで間違いなさそう。
Linux環境では基本的にapt-getでインストールしていたけど、インストールされるOTPのバージョンが違うために偶然にもうまく動くパターンもあった。
多分apt使うときにupdateとか叩き忘れているという・・・
手元で確認したバージョンとかの組み合わせを一応あげておきます。
OS | Elixir | Erlang/OTP | 動作 | インストール方法 |
---|---|---|---|---|
Linux Mint | Elixir 1.1 | 18 | OK | apt |
Linux Mint | Elixir 1.1 | 20 | NG | apt |
Windows10 | Elixir 1.1 | 20 | OK | インストーラ |
さて、とりあえず手元にうごく環境もあるということでmixの勉強をしてみる。
Mixの使い方を知るには、
がよさそう。
早速 mix new で新しいプロジェクトを作る。
やりたいのはHTTP通信(クライアント側)HTTPクライアントの機能を使ってみたいのでプロジェクト名はhttpとした。
HTTPPoisonというモジュールがあるらしい。
$ mix new http * creating README.md * creating .gitignore * creating mix.exs * creating config * creating config/config.exs * creating lib * creating lib/http.ex * creating test * creating test/test_helper.exs * creating test/http_test.exs Your mix project was created successfully. You can use mix to compile it, test it, and more: cd http mix test Run `mix help` for more commands.
$ mix deps.get
が bundle install 相当のコマンドになるようだ。
最初にmix deps.getを実行したときにモジュールの取得に失敗していた。
20:10:50.392 [error] SSL: :certify: ssl_handshake.erl:1474:Fatal error: certificate expired Failed to check for new Hex version Failed to fetch record for 'hexpm/httpoison' from registry (using cache) 20:10:50.393 [error] SSL: :certify: ssl_handshake.erl:1474:Fatal error: certificate expired 20:10:50.394 [error] SSL: :certify: ssl_handshake.erl:1474:Fatal error: certificate expired
ログをみてみるとSSL認証で失敗しているらしい。Elixirを試しているのはVM Ware Player上のLinux Mintだが案の定時間が大幅にずれていた。
時刻を合わせて再度試したらうまくいったようだ。いろいろとトラブルが発生するものだ・・・
続きは明日にしよう。
今日はmixを使っていろいろ試してみようと思ったらmix コマンドがちゃんと動かなかった。
どうもelixir/erlangのインストールに失敗してたっぽい。
$ mix =INFO REPORT==== 10-Sep-2017::17:13:16 === application: logger exited: {{shutdown, {failed_to_start_child,'Elixir.GenEvent', {undef, [{gen,debug_options,[[]],[]}, {'Elixir.GenEvent',init_it,6, [{file,"lib/gen_event.ex"},{line,538}]}, {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,247}]}]}}}, {'Elixir.Logger.App',start,[normal,[]]}} type: temporary ** (Mix) The task app.start could not be found
インストールしたけど使っていなかったwindows版だとこんなエラーメッセージでてない・・・
C:\>mix ** (Mix) "mix" with no arguments must be executed in a directory with a mix.exs file Usage: mix [task] Examples: mix - Invokes the default task (current: "mix run") mix new PATH - Creates a new Elixir project at the given path mix help - Lists all available tasks mix help TASK - Prints documentation for a given task C:\>mix -v Erlang/OTP 20 [erts-9.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] Mix 1.5.1
elixir入門者過ぎてこのエラーメッセージの意味がわからないけどなんか必要なライブラリとか入っていないような感じだろうか。
明日ちゃんと調べてみよう。
今日は帰りが遅くなったのであまり時間が取れない。
ファイルの読みこみだけ試してみた。
CSV形式のファイルを読んでみる。
sample.csv とする。
aaa,1 bbb,2 ccc,3
ファイルアクセスはFileモジュールを使うらしい。
読み込みはreadかopen
iex(1)> File.read("sample.csv") {:ok, "aaa, 1\nbbb, 2\nccc, 3\n"}
結果はタプルで返ってくる。
最初の
:ok
はアトム型といってrubyのシンボル相当らしい。
タプルで結果が返ってくるのは違和感があるが、読み込み結果を何らかの形で返す必要があるのでこういう仕様なんだろう。
存在しないファイルを指定すると
{:error, :enoent}
という結果が返ってくる。
カンマ区切りの分割にはStringのsplit関数が使えるらしい。
結果はリストになる。
iex(1)> String.split("aaa","bbb","ccc", ",") ["aaa", "bbb", "ccc"]
複数行・複数カラムの扱いはEnumモジュールのeachとかを使うとrubyみたいな感じでかけるらしい。
今日は疲れてるので早く寝よう、また明日だ。