mcommit's message

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

Elixir入門 ~12日目 eclipseでerlangのデバッグ環境を作る~

昨日はerlangについて調べてみた結果を書いたけど、今日はソースをぼちぼちとみてみた。

mcommit.hatenadiary.com

ソース少し読んでみたが、ちまたで言われるerlangの並列性の本質が知りたくなったので本格的に調べてみることにした。
そもそも、Elixirを勉強するはずだったのになんでこんなことをしているんだろう。もはやElixirなど何も関係なくなってしまっている・・・

注意

タイトルに書いたerlangデバッグ環境というのはerlangの処理系、つまりertsのデバッグ環境をさしています。
.erlで書いたerlangのコードのデバッグ環境のことではありません。

続きを読む

Elixir入門 ~11日目 Erlangについて調べてみる~

前回はElixirでHTTPするコードを書いてみた。

mcommit.hatenadiary.com


mixを使えば比較的短い行数でHTTPアクセスするコードが書けることは分かったけど、これでは正直Elixir/Erlangの良さが分からない。

そもそもElixir/Erlangは並列計算にメリットがある言語とされている。どのようにそれが実現されているのかがよく分かっていない。

多分Elixir言語の勉強をこのまま続けても組み込みソフトの開発をメインでやっている自分には直接的(Elixirを活用するという意味で)なメリットを得られることはあまりなさそう。

せっかくならElixir/Erlangがどのように並列プログラミングのコンテキストを確立しているかを知っておいた方が今後のために意味がありそうな気がしてきた。

ということで勉強の主旨を変えてErlang/BEAMのレイヤーについて勉強してみることにする。飽きたら多分やめる。

参考資料

ソースコード

ビルドするときにも入手したが、Erlangのソースは、

https://www.erlang.org/downloads

で入手できる。tar.gz で80MBくらいある。

ソース構成は別途まとめてみるとして、

とりあえずErlangの言語処理系に関するコードは

otp_src_20.1/erts

に配置されている。

コードはどうも全てCで書かれているようだ。

一方でライブラリ類は、

otp_src_20.1/lib

に配置されているみたいだが、こちらのソースは全て拡張子が .erlになっているのでerlangで書かれているようだ。

BEAM Book

ErlangVMはBEAMと呼ばれる仮想マシン。BEAM Book という資料はあるらしいとのこと。

github.com

からPDFが入手できるので読んでみる。

参考書籍

そもそもElixirの勉強から始めたのでErlang言語についてもよく知らないので一応参考書籍を買ってみた。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

プログラミングErlang

プログラミングErlang

中古だと多少なりと値段が下がっているので求めやすい。
※戦闘機本はだいぶ前に買ったけど数ページ読んでBOOK OFFに売った記憶がある。

戦闘機本には、ErlangVMであるBEAMに関する説明はない。あくまでErlang言語としても解説書といった感じだ。

ネット上の情報

その他にネット上の情報も参考にさせて頂きました。

blog.etsukata.com

こちらの記事のリンクを流し読みしてみる。


比較的短時間で読めたのはこちらの記事。

jlouisramblings.blogspot.jp

但し、ErlangのR15について述べた文章とのことなので、恐らく現在のR20.1と食い違う部分はあるんだろう。


読んでわかったこ

ErlangVMはスタックマシンではない。レジスタマシンだ。

スタックマシンではなくてレジスタマシンということは分かったがレジスタマシンのメリットはよく分かっていない。
そもそもVMである以上レジスタだのスタックだのと言ったところでどちらもメモリ上で実現されていることに変わりはないはずだ。
Erlangではレジスタの一部をCPUの物理的なレジスタに割り当てているとのこと。(文脈からすると386系だとEAXレジスタのことっぽい)

BIF(Built In Functions)

Erlangには強力な組込関数群が提供されているらしい。
ソースを見ていてもBIFのプレフィックスで始まるファイルとか関数がある。

これらは組込関数に関係したものだということだろう。

jlouisramblings.blogspot.jp

スケジューラの動作について

分かったことよりよく分からない事の方が多い。
少なくともR15では、スケジューラをコアに対して1つ割り当てるという方式だったようだ。
Erlangの設計者はマルチコアについてしっかりと熟知した上でErlangのスケジューラを実装しているというのはなんとなく伝わってきた。

H/Wを意識しながら言語を実装したとなると、Erlangの特性はOS依存になるということになる。

JLOUIS Ramblings: How Erlang does scheduling

の記事でも

Erlang usually has a thread per core you have in the machine. Each of these threads runs what is known as a scheduler. This is to make sure all cores of the machine can potentially do work for the Erlang system. The cores may be bound to schedulers, through the +sbt flag, which means the schedulers will not "jump around" between cores. It only works on modern operating systems, so OSX can't do it, naturally.

と書かれていた。

マルチコアの技術は、ムーアの法則に陰りが見えてから急激に進化しているようなので当然のようにも思える。
逆に言うとこれからの言語は、言語レベルでマルチコア化を意識していることが大きなメリットになるんだろう。


といっても組み込み界隈にマルチコア/並列特化言語でのプログラミングの時代が来るとは思えない。
だいぶ前にDUAL COREマイコンを使った開発をしたことがあったけど、基本的には互いのコアで何をしているかとか意識しなくてよい構造で作るのが正解だった気がする。
そもそもコア間で同期とかとったらマルチにしているメリットなんてない。

汎用OSだとコアをどう扱うかというのは難しいように思う。コア毎への最適なタスクの割り当てとかパッとイメージできない。設計しようとするとCPUに関するかなり膨大な知識が必要になるんじゃないだろうか。


その他(英語訳について)

訳がわからない単語とかちょくちょく出てくる。

  • yield

コンピュータサイエンスの文脈では「生成する」の意味で使うことが多いみたい。
今まで意味を気にしてなかったけど、Rubyの yieldはブロックの処理を実行する機能なのでこれは、恐らく「明け渡す」「譲る」の意味なんだろう。

yielding だと「降伏する」という意味になるらしい。

日本語でもそうだけど、こういう1つの単語にいろんな意味を割り当てるのはやはりよくない気がする。

同じような例で、マイコンのマルチファンクションGPIOもバグがでやすい。何処がよくないのか調べるのも時間がかかる。

1単語=1目的

がいい。

  • forgoes

「なしで済ませる」「見合わせる」という意味。

forgoes throughput for lower latency.

低レイテンシによるスループットの低下

と訳すようだ。(Google翻訳による)

これもすぐにはピンとこなかった。

  • From time to time

随時。

  • a quite intricate process

かなり複雑なプロセス。


英語の翻訳は根性で乗り切るしかないな。


BEAM BOOKは丁寧に解説が書かれている印象があるが、ソースを軽く見たけど解説とソースとの対応関係が分からない。

もう少し、PDFの方を読んでからソースを見た方がいいかもしれない。

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 というバージョンが出ているのでそっちの方がいいかも。

続きを読む