mcommit's message

ソフトウェア開発の仕事をしているsimotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

Elixir入門 ~10日目 Elixirでお宝データをゲットしてみた・mix,HTTPoisonの使い方とか~

Elixirを勉強する上で、肩慣らしにお宝画像のデータを集めるスクリプトを書いてみたいという記事を書いたけどmixの使い方がよく分からなかったので、憂さ晴らしにRubyでやりたいことを明確化していた。

mcommit.hatenadiary.com

何事もやるべきことを明確にして、小さな一歩を踏み出すことが重要だ。あとは、このRubyで書いたコードをElixirに変換するだけという状態だ。

今日は改めてmixとHTTPoisonの使い方とか調べてみてようやくElixirでもお宝をゲットする方法が分かった。

続きを読む

Linux Mint のデフォルトパスワード(live session password)

Mintをインストールするときは、インストーラーに従って適当に入力した後はPCをほったらかしにすることが多い。
インストーラとして動作するの、 live session というらしい。

で、しばらくしてPCを見ると画面がロックされてて、

「え!?」

なったので。

インストール時のユーザー名とパスワードは

user : mint
password : なし(そのままエンターキーを押す)

でよいみたい。

インストールはたまにしかしないけど、たまにしかしない分よく忘れるので書いておく。

参考

Installation screen expects Username and Password? - Linux Mint Forums

Rubyによるお宝データ探し

少し前の話ですが、elixirの勉強をしているのですが勉強がてら面白いスクリプトは書けないものかと考えていたら、はてなのホットトピックに面白い記事が上がっていました。

umihiro.hateblo.jp

サイトを見てみると美女の画像が沢山!

ということでElixirで画像を収集するスクリプトを書こうと考えているのですが、mixの使い方とかよくわからないので勉強が必要。


とりあえずRubyで書いてからそれをElixirに落としてみようということで書いてみました。

require 'net/http'
require 'uri'

url = URI.parse('http://umihiro.hateblo.jp/entry/20170925/1506349877')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) do |http|
        http.request(req)
end

urls = res.body.scan(/https:\/\/lh3.googleusercontent.com\/.*JPG/)

urls.each do |url|
  treadure_url = URI.parse(url)
  req = Net::HTTP::Get.new(treadure_url.path)
  http = Net::HTTP.new(treadure_url.host, treadure_url.port)
  http.use_ssl = true
  res = http.request(req)

  filename = File.basename(treadure_url.path)
  File.open(filename, "wb") do |f|
    f.write(res.body)
  end
end

うむ。お宝ゲットだぜ。

スクリプトは20行前後。Rubyさん、サンクス。

umihiro.hateblo.jp

勝手ながら画像参照させて頂きます。ありがとうございます!
どの画像も、コンパニオンの皆さんが綺麗に撮られている・・・素晴らしい!

追記 [2017-10-18]

無事、Elixir でもお宝画像の集めのスクリプトがかけました。Rubyと比べてもステップ数的には遜色ない感じです。

まぁ Elixir をこんなことに使ってもあまりメリットを活かせているとは言えないとは思いますが・・・

mcommit.hatenadiary.com

Elixir入門 ~9日目 erlang・elixirをビルドしてインストールしなおした~

前回の記事、

mcommit.hatenadiary.com

から少し時間が空いてしまった。

HTTPoisonがすぐに動かせなくなってモチベーションが下がったことと、仕事が忙しかったというのが理由というか言い訳。

HTTPoisonが動かない理由がElixirのバージョンが古いということだったので、気合を入れてErlangのビルドからやり直してみた。

環境の作り直しということでapt-get でインストールしたerlang/Elixirは削除した後、自分でコンパイル&インストールする。

erlangのビルドとインストール

erlangのビルドとインストールについては、本家の installation_guide のページを確認して試してみた。

Erlang -- Building and Installing Erlang/OTP

上記サイトに書いてある通りなのでここでは書くことはあまりないが、引っかかった点として

ncurses というライブラリに依存していたのでインストールした。

$ sudo apt-get install ncurses-dev

これが無いと ./configure 時点で怒られる。

あと、SSLは使うだろうから

$sudo apt-get install libssl-dev

をたたいたくらいだろう。

ビルドもそんなには時間がかからなかった。

Elixirのビルド・インストール

Elixir の際とのInstalling Elixirに説明が書いてある。

elixir-lang.org

要は、githubからcloneしてビルドするだけ。

注意 2017-10-15

と思っていたらgithubのソースはbuildのステータスがfailingになっていた。

念のため、最新のリリース版をビルドすることにする。

$ wget https://github.com/elixir-lang/elixir/archive/v1.5.2.zip
$ unzip v1.5.2.zip
$ cd elixir-1.5.2
$ make test

ビルド中は緑の点々がコンソールに出力されている・・・

無事完了。iex,mixともに順調に動いている。

HTTPoisonを使って任意のURLからgetすることもできた。

HTTPのアクセスができたのでいろいろ遊んでみたいことがある。今日はこれくらいにしておく。

Raspberry Pi 用にGDBをクロスコンパイルしてリモートデバッグしてみた

デバッグに便利なGDBですが、Raspberry Pi用にクロスコンパイルしてリモートデバッグを試してみました。

GNU関係のソフトは、必ずしもバージョンが新しければよいというわけではない(むしろ新しいバージョンだと思いもよらないバグがあったりする)のですが、今回はなんとなく新しめということで8.0で試してみました。
※よく見ると gdb-8.0.1.tar.gz というバージョンが出ているのでそっちの方がいいかも。

続きを読む

Elixir入門 ~8日目 HTTPoisonを動かすにはElixir1.2が必要だった~

昨日の続き。

mixが動くようになって、 mix.exs を編集して mix deps.get でモジュールをダウンロードするところまではできた。

と、思っていた。


今日はGithub

github.com


を参考にいざ動かそうとしたら以下のようなエラーメッセージがでた・・・

今度はなんだ?いい加減エラーメッセージでコンソールが真っ赤に染まるのには飽きてきた。

$ 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のバージョンアップから試そう。

Elixir入門 ~7日目 mixが動かない原因が分かった~

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の使い方を知るには、

elixirschool.com

がよさそう。

早速 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.exsの編集

mix.exs がRubyでいうところのGemfileに相当するファイルのようだ。

github.com

qiita.com

GithubやQiitaの記事などを参考にさせて頂き適当に編集。

mix deps.get が失敗した

$ 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だが案の定時間が大幅にずれていた。
時刻を合わせて再度試したらうまくいったようだ。いろいろとトラブルが発生するものだ・・・


続きは明日にしよう。